
Сообщение от
Biland
Код:
;hl адрес спрайта
Код:
;вот это вешаем на прерывание
ISR_sub
di
ex (sp),hl ;обмениваем вершину стека и содержимое HL
ld (imm_jp),hl
pop hl ;заменяем испорченное слово спрайта
push bc ;на текущее слово находящееся в BC
ld (imm_sp),sp
ld sp,ISR_sp
;здесь идет обработка прерывания
; ...
;----------------------------------
ld sp,$
imm_sp equ $-2
ei
jp $
imm_jp equ $-2
Подскажите, здесь приведён пример с прерыванием и выводом графики. Вроде бы разобрался, даже будет работать, если в этот момент не спрайты рисуются. Но возникает вопрос. Если стек
SP был на одном адресе, то при переходе на прерывание он уменьшается. Здесь где выделено, он уже уменьшенный и
imm_sp он присваивается, уменьшенный, а не каким он был изначально. Ведь выход не
RET, а
JP. Значит он не увеличится сам. Как это понять? Не должен ли быть он между PUSH и POP?
И ещё,
Код:
ld (imm_jp),hl
jp $
imm_jp equ $-2
это то же, что и
Код:
ld (imm_jp+1),hl
imm_jp jp $
?
здесь похоже на ошибку.
оно должно выглядеть так
Код:
;hl адрес спрайта
Код:
;вот это вешаем на прерывание
ISR_sub
di
ex (sp),hl ;обмениваем вершину стека и содержимое HL
ld (imm_jp),hl
pop hl
ld (imm_sp),sp
;заменяем испорченное слово спрайта
push bc ;на текущее слово находящееся в BC
ld sp,ISR_sp
;здесь идет обработка прерывания
; ...
;----------------------------------
ld sp,$
imm_sp equ $-2
ei
jp $
imm_jp equ $-2