Код из Robotz 0.65a
Пояснения:
Assembler: Microsoft M80
ISR прерывает выполнение в multi bank mode: спрайты с 2-х байтными gaps в отдельном 64К банке с доступом стековыми операциями, операции память-память происходят в основной RAM
PGE_OFF - макро, выключающее банкинг и включающее 64K main RAM в адресное пространство 8080 на Векторе
XTB_SP - стек для ISR в основной памяти (предустановлен при настройке рендерера спрайтов)
XTB_RDM - слово-состояние порта 10h (банк со спрайтами, куда нужно переключиться по выходу из ISR, также предустановлено заранее)
Код:RamDrv EQU 10h PGE_SET Macro out RamDrv EndM PGE_OFF Macro xra a PGE_SET EndM ;=========================================== ; Tile Renderer Interrupt Service Routine ;------------------------------------------- ;INPUT: <BC> stack top restore value ;OUTPUT: none ;=========================================== IsrXTB: shld XTB_HL pop h shld XTB_RET push PSW lxi h,0 dad SP ; <CY> is FUBARed shld XTB_ESP PGE_OFF ; assumption is that XTB_SP is in main RAM bank DB (lxi SP) XTB_SP: DW 0 push d push b call SndCBH ; call sound/SFX callback hook with assumption ;PGE_OFF ; that SndCBH will set STACK access to main RAM pop b ; bank 0 on return (PgeRDM set satisfies this) pop d DB (mvi a) XTB_RDM:DB 0 PGE_SET DB (lxi sp) XTB_ESP:DW 0 ; entry stack pop PSW push b ; restore stack, corrupted by XTB_RET pop b ; using <BC> DB (lxi h) XTB_HL: DW 0 ei DB (jmp) XTB_RET:DW 0




Ответить с цитированием