home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
bss
/
pup.arc
/
ABORT.ASM
next >
Wrap
Assembly Source File
|
1984-11-06
|
2KB
|
113 lines
title Program Abort Functions
name abort
include model.ash
include lattice.ash
;
;Multi-level program error return functions.
;
;set_abor()
;
;Set to return to after set_abort() if a
;function calls frc_abort(). This assumes
;that the first thing after set_abort() is
;was_abort(), like so:
;
; set_abort(0);
; if(was_abort()) {
; do whatever ...
; }
; function();
;
;Where function() is presumably the actual
;function that invokes frc_abort, or one of
;its called functions.
;
; The argument to set_abort(arg) is necessary,
;otherwise Lattice will not put SP into BP
;(trying to be smart.)
;
;frc_abor()
;
;Does a jump to the abort address presumably
;set by set_abor().
;
;was_abor()
;
;Returns true if return from the function was
;done by the frc_abor function. Once read,
;it clears itself to zero.
;
;NOTE:
; These are currently hardcoded for small
;and large models; 16 bit code addresses only.
;
; Lattice puts SP into BP before calling
;a function; all we have to do to restore the
;original stack pointer is to save this BP
;value and use it later.
;
dseg
abflag dw (?) ;1 == aborted
rbp dw (?) ;BP save
rds dw (?)
res dw (?)
addr dw 0 ;func address
endd
cseg
;
;Set the abort jump address to after func()
;(Cant use macros FUNC and ENDF since we mush
;BP etc.)
;
public set_abor
set_abor proc
mov dx,bp ;orig. BP,
push bp ;into DX
mov bp,sp
mov bx,ds ;orig. DS
push ds ;into BX
mov ax,data
mov ds,ax
mov ax,[bp+2] ;get our return
mov addr,ax ;address,
mov rbp,dx ;save BP,
mov rds,bx ;save DS,
mov res,es ;save ES,
mov abflag,0 ;no abort
pop ds
pop bp
ret
set_abor endp
;
;Execute an abort.
;
public frc_abor
frc_abor proc
mov ax,data
mov ds,ax
push addr ;set ret addr
mov abflag,1 ;flag abort,
mov bp,rbp ;get old BP,
mov es,res ;DS and ES
mov ds,rds
ret ;return old BP
frc_abor endp
;
;Return true if the error abort was taken.
;
func was_abor
mov ax,data
mov ds,ax
mov ax,0
xchg ax,abflag
endf was_abor
endc
end