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 *-------------------------------------- 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 .1 inx .1 iny #S.PS.PC sta (pPs),y txa iny #S.PS.PC+1 sta (pPs),y tsx inx skip P inx skip PC HI,LO inx txa beq .8 tay Save !Byte count for later .2 pla >PUSHA inx bne .2 tya .8 >PUSHA push CPU Stack BC to restore on top of Soft Stack 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 bit K.SYSCALL.BANK,x bmi .1 jsr .8 in $E000, no BNK change inc IRQ.InKernel rts .1 sta .7+1 save A (Func Arg) lda K.SYSCALL.BANK,x Get Target BNK cmp $D000 #RRAMWRAMBNK1 or #RRAMWRAMBNK2 bne .2 jsr .7 same as actual BNK...go restore A and JMP inc IRQ.InKernel rts .2 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 inc IRQ.InKernel rts Unmodified Carry .6 ldx #$FF Self Modified .7 lda #$FF Self Modified .8 jmp (K.SYSCALL.JMP,x) *-------------------------------------- GP.LibCall dec IRQ.InKernel 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 * SELF MODIFIED inc IRQ.InKernel 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.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 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 *-------------------------------------- IRQ.SkipA2osX .BS 1 IRQ.Tick .BS 1 IRQ.InKernel .BS 1 IRQ.IntNum .BS 1 IRQ.VBL.n0 .BS 1 IRQ.VBL.0n .BS 1 *-------------------------------------- *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 #4 A2osX.TTYDEVS=4 .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