home *** CD-ROM | disk | FTP | other *** search
- 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
-