Почитав замечательную статью в журнале DeJa Vu #0A "Программирование - быстрая процедура печати спрайтов через стек от WoodlandStudio." - решил попробовать реализовать. В итоге получаю видеоэффекты и зависание после секунд работы.
Суть моей задачи такова. Для примера на прерываниях висит музыка и кое какой вывод графики стеком. Всё работает.
Eсть необходимость "читать" через стек данные из памяти в регистр DE во время прерывания... И тут наступают грабли.
Для примера соорудил код:
Код:
INT_VECTOR=#BE00
INT_HANDLER=#BFBF
STACK_MAIN=#7FFF
STACK_IM2=INT_HANDLER-1
ORG #8000
START:
DI
LD SP,STACK_MAIN
LD HL,INT_VECTOR
LD BC,#00BF
LD (HL),C
INC HL
DJNZ $-2
LD (HL),C
LD A,INT_VECTOR/256
LD I,A
IM 2
EI
MAIN_LOOP:
; тут читаем стеком данные из памяти и кидаем на экран для примера
; EI:HALT тут нет, т.к прерывание должно приходить во время работы чтения стеком.
;Если LD SP,SPR1 закоментить зависать перестает, но ясно что выводит мусор :)
LD (STK1+1),SP
LD SP,SPR1
LD HL,#4000
DUP 16
POP DE
LD (HL),E
INC HL
LD (HL),D
INC HL
EDUP
STK1 LD SP,#0000
JP MAIN_LOOP
SPR1 DS #20,#FF
MAIN_ISR:
PUSH IX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
EXX
EX AF,AF'
PUSH IY
PUSH HL
PUSH DE
PUSH BC
PUSH AF
; тут музыка и графика стеком выводится
POP AF
POP BC
POP DE
POP HL
POP IY
EX AF,AF'
EXX
POP AF
POP BC
POP DE
POP HL
POP IX
RET
; Обработчик прерываний
ORG INT_HANDLER
EX DE,HL
EX (SP),HL
LD (SaveRET+1),HL
EX DE,HL
POP DE
LD (SaveSP+1),sp
LD SP,STACK_IM2
CALL MAIN_ISR
SaveSP LD SP,#0000
EI
SaveRET JP #0000
В чём же может быть проблема? Что-то к вечеру совсем не соображу...