PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF
*--------------------------------------
* SYSCALL (AUXLC to AUXLC)
* Used by user & kernel for inter bank Calls 
* In:
*   X = SYSfnc.Index
*   Y,A = free for Inline param
*--------------------------------------
				jmp A2osX.SYSCALL1
*--------------------------------------
* LIBCALL (AUXLC to AUXLC)
* Used by user 
* In:
*   Y = LIB.ID
*   X = LIBfnc.Index
*   A = free for Inline param
*--------------------------------------
				jmp A2osX.LIBCALL1
*--------------------------------------
* MLICALL (AUXLC to MAINLC)
* Used by Kernel
* In:
*   X = MLI Function
*	A = Param Count
*--------------------------------------
				jmp A2osX.MLICALL1
*--------------------------------------
				.BS $BE10-*
*--------------------------------------
				jmp (pCode)				pCodeJmp
				jmp (pLib)				pLibJmp
				jmp (pDrv)				pDrvJmp
				jmp (pDev)				pDevJmp
				.BS $BE20-*
*--------------------------------------
GO.Reset		jsr GO.A2osX
				jmp K.KernelRun
*--------------------------------------
*     *** MUST BE REINTRANT ***
*--------------------------------------
A2osX.SYSCALL1	bit KERNEL.SYSCALL.FLAGS,x
				bpl	.8					in $E000, no BNK change
				
				sta .7+1				save A		(Func Arg)

				lda KERNEL.SYSCALL.FLAGS+1,x		Get Target BNK
				
				cmp $D000				#RRAMWRAMBNK1 or #RRAMWRAMBNK2
				beq .7					same as actual BNK...go restore A and JMP
				
				stx .6+1				save X		(Func ID)

				tax						set Target BNK in x
				lda $D000				get source BNK
				bit $C000,x				switch to Target BNK
				bit $C000,x
				pha						
				
				jsr .6					go to kernel.....

				stx .5+1				save X
				plx						get back Source BNK
				bit $C000,x
				bit $C000,x
.5				ldx #$FF				Self Modified
				rts						Unmodified Carry
				
.6				ldx #$FF				Self Modified
.7				lda #$FF				Self Modified
.8				jmp (KERNEL.SYSCALL,x)
*--------------------------------------
A2osX.LIBCALL1	pha						No need to save X, K.GetMemPtrA will leave it unmodified
				tya						Get LIB hMem in A
				jsr K.GetMemPtrA		Get LIB Code Segment (MemMgr in $E000, no BNK change)
				>STYA pLib
				pla
				jmp (pLib)
*--------------------------------------
A2osX.MLICALL1	stx .1
				sta MLICALL.PARAMS
				jsr GO.ProDOS
				jsr MLI
.1				.BS 1
				.DA MLICALL.PARAMS
				jsr GO.A2osX
				rts
*--------------------------------------
GO.ProDOS		lda $D000				We re coming from AUXLC, saving bank...
				sta GO.A2osX.BNK+1
				
				php
				clc
				.HS	2C					bit abs
				
GO.A2osX		php
				sec
				
				sei
				
				sta A2osX.SaveA
				stx A2osX.SaveX
				sty A2osX.SaveY
				
				pla						Restore P in A for later
				
				plx						Get PC and add 1 for return
				ply
				inx
				bne .1
				iny
				
.1				stx GO.EXIT.JMP+1
				sty GO.EXIT.JMP+2

				ldy pStack
				
				bcs GO.A2osX.BNK		if CS, go AUXLC
				
				bit RRAMWRAMBNK1		Go MAINLC (ProDOS), always BNK1
				bit RRAMWRAMBNK1

				tsx
				stx A2osX.SaveSX
				ldx	A2osX.SaveSM
				txs
				sta CLRALTZP
				bra GO.EXIT

GO.A2osX.BNK	ldx #RRAMWRAMBNK1		Self Modified, initialized to BNK1 for INIT3

				bit $C000,x
				bit $C000,x
				
				sta SETALTZP
				tsx
				stx A2osX.SaveSM
				ldx	A2osX.SaveSX
				txs
*--------------------------------------
GO.EXIT			sty pStack
				pha						push P on stack
				ldy A2osX.SaveY
				ldx A2osX.SaveX
				lda A2osX.SaveA
				plp
GO.EXIT.JMP		jmp $FFFF				Self Modified
*--------------------------------------
A2osX.SaveA		.BS 1
A2osX.SaveX		.BS 1
A2osX.SaveY		.BS 1
*--------------------------------------
BrkHandler		bra *
*--------------------------------------
IrqHandler		bra *
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.GP
LOAD SYS/KERNEL.S
ASM
