Код:
; macro
macro border color
ld a,color
out (#fe),a
endm
macro set_page pagenum
ld a,pagenum
ld bc,#7ffd
out (c),a
endm
macro stop
jp $
endm
;try-catch macro {
macro try catch_addr
ld hl, catch_addr
call begtry_subr
endm
macro epop_2
ld hl,(esp)
inc hl,hl,hl,hl
ld (esp),hl
endm
macro raise exception
ld sp,(esp) ; restore alt stack
pop de ; pop adress of main stack
pop hl ; pop adress of "catch"
ld (esp),sp ; store alt stack
ex de,hl
ld sp,hl
ld a,exception
ex de,hl
jp (hl)
endm
macro epush_hl_sp
ld (tsp),sp ; save main stack
ld sp,(esp) ; restore alt stack
push hl ; push catch_adress to alt stack
ld hl,(tsp) ;
push hl ; push main stack top to alt stack
ld (esp),sp ; save alt stack
ld sp,(tsp) ; restore main stack
endm
macro endtry
call endtry_subr
endm
;} try-catch macro
device ZXSPECTRUM128
org #6000
init
di
; устанавливаем обработчик исключений на процедуру по адресу catch0
try catch0
call setup
call start
; снимаем обработчик исключений по endtry
endtry
ld a,'A' ;ok
ret
; сюда попадём по raise с любой глубины
catch0
ld a,'B' ;plan 'B' =)
ret
;
ifused begtry_subr
begtry_subr
epush_hl_sp
ret
endif
ifused endtry_subr
endtry_subr
epop_2
ret
endif
;----------------------------------------------------------------
setup
call set_screen
ret
start
ret
set_screen
di
call cls
call scr_grid
ei
ret
cls
ld hl,#4000
ld de,#4001
ld bc,#17ff
ld a,#00
ld (hl),a
ldir
ret
scr_grid
ld hl,#5800
ld de,#5802
ld b,12
scr_grid_lp1
push bc
ld bc,#20
ld a,#0f | #40
ld (hl),a
inc hl
ld a,#0f | #00
ld (hl),a
dec hl
ldir
ld bc,#20
ld a,#0f | #00
ld (hl),a
inc hl
ld a,#0f | #40
ld (hl),a
dec hl
ldir
; вызываем исключение:
raise 1
pop bc
djnz scr_grid_lp1
ret
program_end
;{DATA ---------------------------------------------------------------
data_start
;alternative exceptions stack top:
estack_top equ #bfff
esp dw estack_top ;alt stack pointer storage
tsp dw #0000 ;main stack pointer temp storage
data_end
;DATA }
savesna "try_catch_sample.sna",#6000
display "program lenght", /a, program_end - init
display "data lenght", /a, data_end - data_start
Ну, то есть идея проста: по инструкции