99 lines
2.8 KiB
Plaintext
99 lines
2.8 KiB
Plaintext
;***************************************
|
||
;* TIPC Scheme '84 Runtime Support *
|
||
;* Assembler Macros *
|
||
;* *
|
||
;* (C) Copyright 1984,1985 by Texas *
|
||
;* Instruments Incorporated. *
|
||
;* All rights reserved. *
|
||
;* *
|
||
;* Date Written: 19 April 1984 *
|
||
;* Last Modification: 06 January 1986 *
|
||
;***************************************
|
||
; Adjust page number prior to store into pointer
|
||
adjpage MACRO reg
|
||
sal reg,1
|
||
ENDM
|
||
|
||
; Convert page number from physical representation to logical page
|
||
corrpage MACRO reg
|
||
shr reg,1
|
||
ENDM
|
||
|
||
; Test if an object in Scheme's memory has been "marked" by
|
||
; the Garbage Collector as referenced. If the GC "marked" bit
|
||
; is set in the "field" specified, a branch is taken to "label."
|
||
markedp MACRO field,label
|
||
cmp byte ptr field,0
|
||
jl label
|
||
ENDM
|
||
|
||
; Push the page number and displacement components of a Scheme
|
||
; pointer onto the runtime stack (parameter passing mechanism)
|
||
pushptr MACRO addr
|
||
push addr.car ; push the displacement
|
||
mov AL,addr.car_page ; load the page number,
|
||
and AX,PAGEMASK ; isolate it, and
|
||
push AX ; push it on the stack
|
||
ENDM
|
||
|
||
; Pop the page number and displacement components of a Scheme
|
||
; pointer from the runtime stack and restore a memory location
|
||
; (parameter return mechanism)
|
||
popptr MACRO addr
|
||
pop AX ; Retrieve the page number and
|
||
mov addr.car_page,AL ; update pointer in Scheme's memory
|
||
pop addr.car ; Restore displacement in memory
|
||
ENDM
|
||
|
||
; Save the registers in the macro's argument (a list) in the local
|
||
; stack in the variables "save_xx", where "xx" is the register name.
|
||
save MACRO regs
|
||
irp rr,<regs>
|
||
mov [BP].save_&&rr,rr
|
||
endm
|
||
endm
|
||
|
||
; Restore the registers in the macro's argument (a list) from the local
|
||
; stack in the variables "save_xx", where "xx" is the register name.
|
||
restore MACRO regs
|
||
irp rr,<regs>
|
||
mov rr,[BP].save_&&rr
|
||
endm
|
||
endm
|
||
|
||
; Push multiple
|
||
pushm MACRO objs
|
||
irp oo,<objs>
|
||
push oo
|
||
endm
|
||
endm
|
||
|
||
; Pop multiple
|
||
popm MACRO objs
|
||
irp oo,<objs>
|
||
pop oo
|
||
endm
|
||
endm
|
||
|
||
; Call Lattice C routine: C_call rtn,<regs>
|
||
; A call is made to "rtn". If "rtn" has not been declared, an "extrn"
|
||
; declaration is generated. "<regs>", if specified is the list of
|
||
; registers which are to be saved prior to the call (see the "save"
|
||
; macro above).
|
||
C_call macro rtn,regs,esp
|
||
IFNB <regs>
|
||
irp rr,<regs>
|
||
mov [BP].save_&&rr,rr
|
||
endm
|
||
ENDIF
|
||
IFNB <esp>
|
||
mov AX,DS ; make ES point to the current
|
||
mov ES,AX ; data segment
|
||
ENDIF
|
||
IFNDEF rtn
|
||
extrn rtn:near
|
||
ENDIF
|
||
call rtn
|
||
endm
|
||
|
||
|