home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
languags
/
xlisp
/
xlisp11.ark
/
SETJMP.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-10-12
|
2KB
|
94 lines
;setjmp/longjmp support for Aztec C
;Mark E. Mallett 830127
;
public setjmp_
public longjmp_
;
; setjmp i = setjmp(env)
;
; returns 0 if setting
; val if longjmping
;
setjmp_:
DB 0EDH,073H ; LD (nn),SP
DW osp ; nn..
pop h ; Get return address
shld raddr ; Save it
pop h ; get address of env buffer
shld envadr ; Save it
DB 011H ; ld de,nn .. Find the end of the jmp buffer
DW 10 ; nn
DB 019H ; ADD HL,DE
shld nsp ; Save so I can pick it up...
DB 0EDH,07BH ; ... here ( ld sp,(nn) )
DW nsp ; ..NN..
push b ; save things in jmp buffer
db 0DDH,0E5H ; push ix
db 0FDH,0E5H ; push iy
lhld raddr ; save return address
push h
lhld osp ; save original stack pointer
push h
lxi h,0 ; set return value to 0
shld val
jp ljret ; go return as if from longjump
; longjmp longjmp (env,val)
; returns val to where setjmp was called
;
longjmp_:
lxi h,2 ; Find addr of env
dad sp ; .
mov e,m ; get it in de
inx h
mov d,m
inx h
DB 0EDH,053H ; ld (nn),de
DW envadr
mov e,m ; get value
inx h
mov d,m
DB 0EDH,053H ; LD (nn),de
DW val ; NN
; Here to return from setjmp/longjmp
ljret:
DB 0EDH,07BH ; LD SP,(NN)... Get jmp buffer address
DW envadr ; ..NN..
pop h ; Get old stack pointer value
shld osp ; Save it
pop d ; Get old return address
mov m,e ; Put it on the old stack
inx h
mov m,d
db 0FDH,0E1H ; pop iy
db 0DDH,0E1H ; pop ix
pop b
lhld val ; Get value to return
DB 0EDH,07BH ; LD sp,(nn)
DW osp ; NN
ret ; Return to setjmp caller
envadr: ds 2 ; Address of jmp buffer
nsp: ds 2 ; New stack pointer
osp: ds 2 ; Old stack pointer
raddr: ds 2 ; Return address
val: ds 2 ; Value to return
end