Я уже запилил как было в первом посте, как понял где баг. Мне с DE выгоднее работать.
Вид для печати
Я уже запилил как было в первом посте, как понял где баг. Мне с DE выгоднее работать.
drbars, ecли на четном адресе живет то можно один inc hl заменить на inc l
Нет, я вот что не понимаю:
Произошло прерывание, надо снять адрес возврата со стека, и сохранить его на будущее. Так как там будет JP по адресу, со стека адрес надо снять, но не испортив регистров.
Адрес сохранен, регистры на своих местах, SP как был до прерывания.Код:EX DE,HL
EX (SP),HL
LD (SaveRET+1),HL
EX DE,HL
POP DE
А если вот так:
Меньше на 2 команды и быстрее на 8 тактов. Разве не то же самое делает?..Код:EX (SP),HL
LD (SaveRET+1),HL
POP HL
Во втором случае ты восстанавливаешь HL ведь. Этот регистр не очень удобен в работе. Процедура обработки прерывания позволяет восстанавливать только один из регистров во время снятия данных стеком.
Хм, я, наверное, не то курю, но на мой взгляд после обоих вариантов все регистры остаются на своих местах (кроме SP, который в обоих вариантах на 2 больше чем на входе, т.е. опять же такой, как был до сигнала прерывания). Поэтому, как кажется, неважно, что восстанавливать - главное, чтобы в итоге было восстановлен все. При то, что во втором варианте код короче и быстрее.
Почему один? EX (SP),HL сохраняет HL на стеке, POP HL его восстанавливает. DE и все остальное, кроме SP, не изменяются на всем протяжении, потому что потом идет PUSH всех, а в конце POP всех и прямой JP на адрес возврата. Там ничего не должно теряться в обоих вариантах.
TomCaT, ты абсолютно прав
но тема здесь немного другая
необходимо после восстановления адреса возврата и стека
восстановить испорченную память что мы и делаем обновляя ее DE у медноногова
и push reg у AlCo
Код: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
Код:ex (sp),hl ;забираем со стека адрес возврата
ld (imret),hl ;сохраняем адрес возврата
pop hl ;забираем hl
ld (imstek),sp ;сохраняем стек
push bc ;либо push de в зависимости от того каким регистром берем спрайты
ld sp,int_sp
call proc_int
ld sp,$
imstek equ $-2
ei
jp $
imret equ $-2
:v2_dizzy_facepalm:
Вот же, обработчик по сути рассчитан на то, что в DE то же, что было в (SP-2) до прихода прерывания...
Все, понял, спасибо. Хитро-о, однако.