;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; JAN 2, 1982	user level abort() for BCS C, vers 1.44	      ;
; uses MAC with CMAC.LIB and BDS.LIB, suitable for 8080       ;
; by Ernest E. Bergmann					      ;
;    Physics, Building #16				      ;
;    Lehigh University					      ;
;    Bethlehem, Pa. 18015				      ;
;							      ;
;	To use:	initialize in main():	abort(); /* =0 */     ;
;					next: ...	      ;
;		subsequently, at			      ;
;		any level:		abort(); /* #0 */     ;
;	will cause program flow back to			      ;
;	main() at location "next:"			      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	maclib	bds
	maclib	cmac

	direct
	define	abort
	enddir

	prelude	abort

	reloc lhld,spsave	; first time: (spsave)=0
	mov	a,h		; is it first time?
	ora	l
	reloc jz,initab		; if so, initialize
	xchg			; save (spsave) in de
	reloc lhld,bcsave	; restore original bc
	mov	b,h
	mov	c,l
	reloc lhld,pcsave	; restore original ret addr
	xchg			; (spsave) back to hl
	sphl			; old sp restored
	push	d		; restoring original ret addr
	ret			; abort() <> 0 for
				; subsequent calls

initab	pop	d	; here if first time called
	dad	sp	; initializes spsave,pcsave,bcsave
	reloc shld,spsave
	xchg
	reloc shld,pcsave
	push	h
	mov	l,c
	mov	h,b
	reloc shld,bcsave
	lxi	h,0	; return abort() = 0
	ret		; for initial call

bcsave	dw	0
pcsave	dw	0
spsave	dw	0

	postlude abort

	end
