;процедура обработки прерывания с восстановлением поврежденных данных
;при доступе к стеку
;регистровая пара для доступа к стеку BC
im_routine
di ; di
;сохраняем HL и забираем адрес возврата из прерывания
xthl ; ex (sp),hl
;сохраняем его
shld im_ret ; ld (im_ret),hl
;забираем HL
pop h ; pop hl
;сохраняем его чтобы не потерять при манипуляциях с SP
shld im_hl ; ld (im_hl),hl
;сохраняем флаги
push psw ; push af
;вычисляем корректный адрес стека программы
lxi h,2 ; ld hl,2
dad sp ; add hl,sp
;сохраняем стек программы
shld im_sp ; ld (im_sp),hl
pop psw ; pop af
;восстановлением поврежденые данные регистром BC
push b ; push bc
;задаем стек прерывания
lxi sp,im_stek ; ld sp,im_stek
;сохраняем все регистры кроме HL
push psw ; push af,bc,de
push b
push d
;-----------------------------
;ISR
;здесь прерывание
;-----------------------------
;восстанавливаем регистры
pop d ; pop de,bc,af
pop b
pop psw
;восстанавливаем HL
lxi h,2121h ; ld hl,#2121
im_hl: equ $-2
;восстанавливаем стек
lxi sp,3131h ; ld sp,#3131
im_sp: equ $-2
ei ;ei
;возвращаемся из обработки прерывания
jmp 0c3c3h ; jp #c3c3
im_ret: equ $-2
[свернуть]