; Xbyte.asm. Handles switching between Lisp and the Alto emulator.
; deleted uPC stuff December 16, 1982  10:29 PM van Melle
; Last change May 14, 1981  12:46 AM by Beau Sheil 
; Tone change March 30, 1981  7:56 PM by Beau Sheil 
; Phrase change November 23, 1980  5:51 PM by Beau Sheil 
; Chord change November 19, 1980 10:31 AM by Beau Sheil 

; Procedures defined
	.ent	CallFn, Iresume, InitLispRegs

; statics defined
	.ent	Bcpl, SubrArgsOffset, SubrBase

; statics used
	.extd	TopLevelFrame, lvNIL

; Lisp extended Nova instructions - dispatch into microcode
	.dusr	MBI        = #67400	; (vahi, vahi) - Lisp ucode
	.dusr	ILispRegs  = #67411	; InitLispRegs() -> memory config
	.dusr	CALLFN     = #67417	; (numargs, lvFname)

	.ZREL
Bcpl:		bcpl			; global page 0 statics
SubrArgsOffset:	0
SubrBase:	0

	.SREL
Iresume:	resume
CallFn:		callfn
InitLispRegs:	.ilr

	.NREL

; *** This is the point to which control is returned from Lisp ***

bcpl:	sta	3, NSA		; save for nargs to subr call
	lda	0, SubrArgsPtr	; addr of first arg
	lda	1, c3
	sub#	1, 3, szr	; skip if nargs eq 3
	jmp	not3
	lda	1, c4
	add	0, 1, snr	; addr of third arg - always skips
not3:	lda	1, SubrArgsOffset
	lda	3, SubrBase
	add	2, 3		; addr of procedure static 
	lda	2, TopLevelFrame ; restore stack ptr
	sta	1, 3,2		; sets up xtra args
	lda	1, c2
	add	0, 1		; addr of second arg
	jsr	@ 0, 3		; indirect to bcpl code thru static
NSA:		3		; with NumSubrArgs arguments

; Entry for Iresume - AC0 has value. 
resume:	mov	0, 3		; addr of result
	lda	0, 0,3		; load hi and lo words into ACs
	lda	1, 1,3
	MBI			; back to Lisp with result in ac0/1

SubrArgsPtr:	210		; addr where ucode leaves first subr arg
c2:	2
c3:	3
c4:	4

; CallFn(#args, lvFname) - calls a Lisp function from bcpl code. No return
callfn:	CALLFN

; InitLispRegs(X) -> puts ucode params into X!0 et sequa
.ilr:	ILispRegs
	jmp	1,3


	.END