
; TASM code for relative jumps
; it's easy to extend this to all types of jumps using the macros
; I copy RELJMP and RELCALL to ALTLCD for use.


;-----------------------------------------------------------------------
; MACROS
;-----------------------------------------------------------------------

#DEFINE  REL_JMP(xx)    	lxi d, (xx-$-6)\ call RELJMP
#DEFINE  REL_JNZ(xx)   	 	lxi d, (xx-$-6)\ cnz RELJMP
#DEFINE  REL_JZ(xx)    		lxi d, (xx-$-6)\ cz RELJMP
#DEFINE  REL_CALL(xx)    	lxi d, (xx-$-6)\ call RELCAL
#DEFINE  REL_CNZ(xx)    	lxi d, (xx-$-6)\ cnz RELCAL
#DEFINE  REL_CZ(xx)    		lxi d, (xx-$-6)\ cz RELCAL

;---------------------------------------------------------------------
RELJMP:	
	XTHL			; stack = (old HL), HL = retloc, DE = rel offset
	dad	D		; stack = (old HL), HL = jump location, DE = rel offset
	XTHL			; stack = (jump location), HL = old HL, DE = rel offset
	RET			; transfer control top of stack

;---------------------------------------------------------------------
RELCALL:	
	xthl			; stack = (old HL), HL = retloc, DE = rel offset
	push	H		; stack = (retloc) (orignal HL) HL = retloc, DE = rel offset
	dad	D		; stack = (retloc) (orignal HL) HL = call location DE = rel offset
	pop	D		; stack = (original HL) HL = call location DE = retloc
	xchg			; stack = (original HL) HL = retloc, DE = call location				
	XTHL			; stack = (retloc), HL = original HL  DE = call location
	push	D		; stack = (new call location) (ret LOC) HL = original HL  DE = call location
		
	RET			; transfer control top of stack

