NEW
PREFIX
AUTO 4,1
*--------------------------------------
* SYSCALL (AUXLC to AUXLC)
* Used by user & kernel for inter bank Calls 
* In:
*   X = SYSfnc.Index
*   Y,A = free for Inline param
*--------------------------------------
GP.CodeStart	jmp GP.SysCall
*--------------------------------------
* LIBCALL (AUXLC to AUXLC)
* Used by user 
* In:
*   Y = LIB.ID
*   X = LIBfnc.Index
*   A = free for Inline param
*--------------------------------------
				jmp GP.LibCall
*--------------------------------------
* AppleTalk MLICALL (AUXLC to MAINLC)
* Used by user
* In:
*   Y,A = Params
*--------------------------------------
				jmp GP.AtkCall
*--------------------------------------
* ROMCALL (AUXLC to ROMLC)
* Used by Kernel
* In:
*   X = ROM Function
*	Y,A = Param
*--------------------------------------
				jmp GP.RomCall
*--------------------------------------
* BADCALL
*--------------------------------------
				lda #MLI.E.BADCALL
				sec
				rts
*--------------------------------------
* SLEEP
*--------------------------------------
GP.Sleep		php
				sei

				phy
				ldy #S.PS.A
				sta (pPs),y
				
				txa
				iny						#S.PS.X
				sta (pPs),y
				
				pla
				iny						#S.PS.Y
				sta (pPs),y
				
				pla
				iny						#S.PS.P
				sta (pPs),y

				pla						get PC LO
				plx						get PC HI
				
				inc						Advance one byte because of return by RTI
				bne GP.Sleep2
				inx
				
GP.Sleep2		ldy #S.PS.PC
				sta (pPs),y

				txa
				iny						#S.PS.PC+1
				sta (pPs),y

				tsx
				
				inx						
				inx						keep PC HI,LO from KERNEL jsr PSExec/PSResume
				
				inx						Stack Ptr is $1ff if empty
				
				txa
				
				beq .3

				tay						Save !Byte count for later
				
.2				pla
				>PUSHA
				inx
				bne .2
				
				tya
	
.3				>PUSHA					push CPU Stack BC to restore on top of Soft Stack

				inc $1fe				PC=PC+1
				bne .4
				inc $1ff				because of RTI
				
.4				lda (pPs)
				ora #S.PS.F.SLEEP
				sta (pPs)
				
				lda #0					cld,clc,cli
				pha
				rti						exit to kernel with CC
*--------------------------------------
*     *** MUST BE REINTRANT ***
*--------------------------------------
GP.SysCall		dec IRQ.InKernel

				pha
				phy
				ldy #S.PS.A
				sta (pPs),y
				
				txa
				iny						#S.PS.X
				sta (pPs),y
				
				pla
				iny						#S.PS.Y
				sta (pPs),y
				
				tay
				pla
				
				jsr K.SYSCALL2
				bcc .2					no error quit...
				
				tax						CS,A=0 ?
				beq .3					Yes, BLOCKING I/O

.2				inc IRQ.InKernel
				rts						Unmodified Carry

.3				pla						get PC LO
				plx						get PC HI				
*				sec
				sbc #2					move back JSR GP.SysCall -3 (jsr $BF00) +1 (RTI) 
				bcs .4
				
				dex
				
.4				inc IRQ.InKernel
				bra GP.Sleep2
*--------------------------------------
GP.LibCall		dec IRQ.InLib

				pha						No need to save X, K.GetMemPtr will leave it unmodified
				tya						Get LIB hMem in A
				jsr K.GetMemPtr			Get LIB Code Segment (MemMgr in $E000, no BNK change)
				>STYA .1+1
				pla
.1				jsr $FFFF				SELF MODIFIED

GP.LibCall.8	inc IRQ.InLib			
GP.LibCall.RTS	rts
*--------------------------------------
GP.AtkCall		dec IRQ.InKernel

				>STYA .1
				jsr GO.ProDOS
				jsr MLI
				.DA #MLIATALK
.1				.DA *
				jsr GO.A2osX
				
				inc IRQ.InKernel
				rts
*--------------------------------------
GP.RomCallPushFAC
				jsr GP.ROMCALL
			
				lda pStack
				sec
				sbc #5
				sta pStack
				sta FORPNT				Ptr to dst buffer
				lda pStack+1
				sta FORPNT+1
				
				ldx #ROM.GETFAC
*--------------------------------------
GP.RomCall		dec IRQ.InKernel

				phx
				ldx $D000
				stx .8+1
				
				bit	RROMBNK1
				
				plx
				jsr .1
				
.8				ldx #$ff
				bit $C000,x
				bit $C000,x
				
				inc IRQ.InKernel

				clc
				rts
			
.1				jmp (.2,x)
				
* http://www.txbobsc.com/scsc/scdocumentor/E7A0.html

.2				.DA $E7AA				FSUBT
				.DA $E7C1				FADDT
				.DA $E82E				NORMALIZE.FAC.2 (L->F)
				.DA $E941				LOG
				.DA $E987				FMULTT.1
				.DA $E9E7				LOAD.ARG.FROM.INDEX
				.DA $EA6B				FDIVT+2
				.DA $EAFD				LOAD.FAC.FROM.INDEX
				
				.DA $EB27				SETFOR		(GETFAC)
				.DA $EBB2				FCOMP
				.DA $EBF2				QINT		(F->L)
				.DA $EC4A				FIN			StrToF
				.DA $ED36				FOUT.1		PrintF
				.DA $EE8D				SQR
				.DA $EE97				FPWRT
				.DA $EF09				EXP

				.DA $EFEA				COS
				.DA $EFF1				SIN
				.DA $F03A				TAN
				.DA $F09E				ATN
*--------------------------------------
GP.MLICall		stx .1
				sta K.MLI.PARAMS
				jsr GO.ProDOS
				jsr MLI
.1				.BS 1
				.DA K.MLI.PARAMS
				jsr GO.A2osX
				rts
*--------------------------------------
GO.ProDOS		pha
				lda $D000				We re coming from AUXLC, saving bank...
				sta GO.A2osX.BNK+1
				pla
				php
				clc
				.HS	2C					bit abs
				
GO.A2osX		php
				sec
				
				sei
				
				sta GO.EXIT.SaveA+1
				stx GO.EXIT.SaveX+1
				sty GO.EXIT.SaveY+1
				
				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

				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			pha						push P on stack
GO.EXIT.SaveY	ldy #$ff
GO.EXIT.SaveX	ldx #$ff
GO.EXIT.SaveA	lda #$ff
				plp
GO.EXIT.JMP		jmp $FFFF				SELF MODIFIED
*--------------------------------------
* Called from ProDOS IRQ Manager (LCBNK1)
* A,X,Y, $FA->$FF Already Saved
* Main RAM,ZP/LC selected
* must begin with CLD
* must exit with RTS
* - CC if IRQ cleared, CS if NOT
*--------------------------------------
GP.IrqH			cld

				bit IRQ.SkipA2osX		After A2osX IRQ.H ?	
				bmi GP.IrqH.Exit
				
				sta SETALTZP			switch to aux LC
				tsx
				stx A2osX.SaveSM
				ldx	A2osX.SaveSX
				txs

GP.IrqH.JSR		jsr K.IrqH.DEV			SELF MODIFIED
				
				tsx						go back to Main
				stx A2osX.SaveSX
				ldx	A2osX.SaveSM
				txs
				sta CLRALTZP
				
				rts				
				
GP.IrqH.Exit	stz IRQ.SkipA2osX		reset flag
				sec
				rts
*--------------------------------------
CORE.VBLState	.BS 1
CORE.IRQMode	.BS 1
CORE.TickPerSec	.BS 1
CORE.TickPer10t	.BS 1
CORE.TickSec	.BS 1
CORE.Tick10t	.BS 1
CORE.CPUStatCnt	.DA #100
CORE.LastPSID	.DA #0
*--------------------------------------
IRQ.Mode		.BS 1
IRQ.SkipA2osX	.BS 1
IRQ.Tick		.BS 1
IRQ.InKernel	.BS 1
IRQ.InLib		.BS 1
IRQ.IntNum		.BS 1
IRQ.VBL.n0		.BS 1
IRQ.VBL.0n		.BS 1
IRQ.Vectors		.BS K.IRQDEV.MAX*2
*--------------------------------------
*GO.Reset		jsr GO.A2osX
*				jmp CORE.Run
*--------------------------------------
*BrkHandler		bra *
*--------------------------------------
GP.CodeEnd		.BS $BEE0-*
*--------------------------------------
*  $BEE0->$BEEF : Public Variables
*--------------------------------------
				.BS 16
*--------------------------------------
*  $BEF0->$BEFF : Kernel Config Block
*--------------------------------------
				.DA #6					A2osX.HZ=60hz
				.DA #2					A2osX.TTYDEVS=2
				.HS 000000000000
				.DA #0					ChRoot/Preemptive Disabled
				.HS 00000000000000		All Slots marked as "Free"
*--------------------------------------
GP.End			.EQ *
MAN
SAVE USR/SRC/SYS/KERNEL.S.GP
LOAD USR/SRC/SYS/KERNEL.S
ASM
