PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- Kernel.Init3 sta SETALTZP bit RRAMWRAMBNK1 bit RRAMWRAMBNK1 jsr MemMgrInit jsr PS0Init bcs * >LDYAI MSG.Init3 >SYSCALL CPrintFYA >LDYAI MSG.DEV >SYSCALL CPrintFYA jsr DevMgrInit bcs * >LDYAI MSG.IRQ >SYSCALL CPrintFYA jsr IrqMgrInit bcs * >LDYAI MSG.EVT >SYSCALL CPrintFYA jsr EvtMgrInit bcs * >LDYAI MSG.FLT >SYSCALL CPrintFYA jsr FltMgrInit bcs * >LDYAI MSG.TSK >SYSCALL CPrintFYA jsr TskMgrInit bcs * ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA >LDYAI MSG.Prefix >SYSCALL CPrintFYA >PUSHWI STARTUP.CMDLINE >LDYAI MSG.Startup >SYSCALL CPrintFYA >LDYAI STARTUP.CMDLINE >SYSCALL ExpandPStrYA phx Save Expanded CMDLINE for discard >SYSCALL CreateProcessYA bcs .9 pla >SYSCALL FreeMemA ...discard... >LDYAI MSG.Init3.OK >SYSCALL CPrintFYA >LDYAI TskMgr.Table >STYA pPs >DEBUGOA bit RRAMWRAMBNK2 bit RRAMWRAMBNK2 jmp K.KernelRun .9 >PUSHA >LDYAI MSG.StartupErr >SYSCALL CPrintFYA bra * No need to discard Expanded CMDLINE *-------------------------------------- MemMgrInit >LDYAI MemMgr.MHiMem >STYA MemMgr.HiMem >STYA MemMgr.Free >LDYAI MemMgr.MLoMem >STYA MemMgr.LoMem stz MemMgr.LastSlot Reserve Slot #0 sta SETWRITEAUX >LDYAI MemMgr.XHiMem >STYA MemMgr.HiMem >STYA MemMgr.Free >LDYAI MemMgr.XLoMem >STYA MemMgr.LoMem stz MemMgr.LastSlot Reserve Slot #0 sta CLRWRITEAUX rts *-------------------------------------- PS0Init ldx #S.DEV*2 NUL,SYS .1 lda DevMgr.NUL-1,x sta DevMgr.Table-1,x dex bne .1 lda #2 sta DevMgr.Count >LDYAI TskMgr.Table Select Process 0 (Kernel) >STYA pPs ldy #S.PS-1 lda #0 .2 sta (pPs),y Blank PS0 dey bpl .2 >LDYAI DEV.SYS >SYSCALL MkNodYA bcs .9 ldy #S.PS.hStdIn sta (pPs),y ldy #S.PS.hStdOut sta (pPs),y ldy #S.PS.hStdErr sta (pPs),y clc .9 rts *-------------------------------------- DevMgr.NUL cld jmp (DevMgr.NUL.Code,x) .DA #S.DEV.S.WRITE+S.DEV.S.READ+S.DEV.S.OPENED .BS 6 >PSTR "NUL" NAME .HS 00 NAME must Be 4 bytes long *-------------------------------------- DevMgr.SYS cld jmp (DevMgr.SYS.Code,x) .DA #S.DEV.S.WRITE+S.DEV.S.READ .BS 6 >PSTR "SYS" NAME .HS 00 NAME must Be 4 bytes long *-------------------------------------- * Setup AuxLC $FFFE->Kernel IRQ Handler * if irq not handled, jmp (S.IrqMgrOldFFFE) *-------------------------------------- SETMOUSE .EQ $12 Sets mouse mode SERVEMOUSE .EQ $13 Services mouse interrupt READMOUSE .EQ $14 Reads mouse position *-------------------------------------- IrqMgrInit php sei >LDYA $FFFE >STYA K.IrqMgrOldFFFE >LDYAI K.IrqHandlerAuxLC >STYA $FFFE >LDYAI IrqHandler >STYA K.MLI.PARAMS+2 >MLICALL MLIALLOCIRQ bcs .9 lda K.MLI.PARAMS+1 sta ProDOS.INTNUM stz ZPPtr1 Try finding a Mouse Card... lda #$C1 sta ZPPtr1+1 .1 ldx #Mouse.SIG-Mouse.OFS-1 .2 ldy Mouse.OFS,x lda (ZPPtr1),y cmp Mouse.SIG,x bne .3 dex bpl .2 bra .4 .3 inc ZPPtr1+1 no match, try next slot.... lda ZPPtr1+1 cmp #$C8 bne .1 plp clc rts .9 plp sec rts .4 lda ZPPtr1+1 sta K.IrqMgrVBL.MSM+2 sta K.IrqMgrVBL.MRM+2 and #$0f sta K.IrqMgrVBL.0n asl asl asl asl sta K.IrqMgrVBL.n0 ldy #SERVEMOUSE lda (ZPPtr1),y sta K.IrqMgrVBL.MSM+1 ldy #READMOUSE lda (ZPPtr1),y sta K.IrqMgrVBL.MRM+1 bit RROMBNK2 Renable ROM to allow MOUSE II firmware works properly ldy #SETMOUSE lda (ZPPtr1),y sta .7+1 lda #9 #MOUSEMODx.INTVBL+MOUSEMODx.ACTIVE ldx ZPPtr1+1 DEVSLOTCn stx .7+2 ldy K.IrqMgrVBL.n0 .7 jsr $ffff self Modified, CALL SETMOUSE bcs * bit RRAMWRAMBNK1 Back To LC Ram bit RRAMWRAMBNK1 inc K.IrkMgr.VBL set=1 awaiting IrqMgr confirmation plp clc rts *-------------------------------------- Mouse.OFS .HS 05070B0CFB Mouse.SIG .HS 38180120D6 *-------------------------------------- DevMgrInit stz ZPPtr1 lda #$C1 sta ZPPtr1+1 lda #1 sta DEV.HEADER+S.DEV.BUSID .1 lda #1 sta DEV.HEADER+S.DEV.DEVID ldx #SmartPort.SIG-SmartPort.OFS-1 .2 ldy SmartPort.OFS,x Check if there is a smartport firmware lda (ZPPtr1),y cmp SmartPort.SIG,x bne .8 not a Disk Controller... dex bpl .2 ldy #$ff lda (ZPPtr1),y bne .3 $0, Disk II, 16sect jsr DevMgrInit.DII ldy #A2osX.SLOTS.DII bra .7 .3 inc beq .7 $ff, Disk II 13 Sect, ignore ldy #7 lda (ZPPtr1),y bne .4 $Cn07=00 : SmartPort jsr DevMgrInit.SP ldy #A2osX.SLOTS.SP bra .7 .4 jsr DevMgrInit.BLK ldy #A2osX.SLOTS.BLK .7 lda ZPPtr1+1 and #$0f tax tya sta A2osX.SLOTS,x .8 inc DEV.HEADER+S.DEV.BUSID inc ZPPtr1+1 lda ZPPtr1+1 cmp #$C8 bne .1 clc rts *-------------------------------------- DevMgrInit.DII >LDYAI A2osX.DIIDrv >STYA DEV.HEADER+S.DEV.DRV.JMP jsr DevMgrInit.AddDev inc DEV.HEADER+S.DEV.DEVID jsr DevMgrInit.AddDev rts *-------------------------------------- DevMgrInit.BLK ldy #$ff lda (ZPPtr1),y sta DEV.HEADER+S.DEV.ROM.JMP lda ZPPtr1+1 sta DEV.HEADER+S.DEV.ROM.JMP+1 >LDYAI A2osX.BlkDrv >STYA DEV.HEADER+S.DEV.DRV.JMP jsr DevMgrInit.AddDev inc DEV.HEADER+S.DEV.DEVID jsr DevMgrInit.AddDev rts *-------------------------------------- DevMgrInit.SP ldy #$ff lda (ZPPtr1),y clc adc #3 Compute smartport entry point sta .1+1 sta .3+1 sta DEV.HEADER+S.DEV.ROM.JMP lda ZPPtr1+1 sta .1+2 sta .3+2 sta DEV.HEADER+S.DEV.ROM.JMP+1 >LDYAI A2osX.PrtDrv >STYA DEV.HEADER+S.DEV.DRV.JMP .1 jsr $ffff Self Modified .DA #0 Status .DA SP.CTRL.STATUS bcs .9 lda SP.CTRL.STATUS.DATA beq .9 no device .2 lda #1 sta SP.DEV.STATUS.DEVID .3 jsr $ffff Self Modified .DA #0 Status .DA SP.DEV.STATUS bcs .7 lda SP.DEV.STATUS.DATA+S.DEVSTAT.S sta DEV.HEADER+S.DEV.S jsr DevMgrInit.AddDev .7 inc SP.DEV.STATUS.DEVID inc DEV.HEADER+S.DEV.DEVID dec SP.CTRL.STATUS.DATA bne .3 .9 rts *-------------------------------------- DevMgrInit.AddDev lda DevMgr.Count cmp #K.DEV.MAX beq .9 inc DevMgr.Count >SYSCALL GetDevByIDA >STYA ZPPtr2 lda DEV.HEADER+S.DEV.BUSID ora #$30 sta DEV.HEADER+S.DEV.NAME+2 SnDy lda DEV.HEADER+S.DEV.DEVID ora #$30 sta DEV.HEADER+S.DEV.NAME+4 SxDn ldy #S.DEV-1 .1 lda DEV.HEADER,y sta (ZPPtr2),y dey bpl .1 clc rts .9 lda #DEVMGR.ERROOH sec rts *-------------------------------------- DEV.HEADER clc jmp ($ffff,x) .DA #S.DEV.S.BLOCK S .BS 1 F .BS 1 BUS.ID .BS 1 DEV.ID .BS 2 ROM.JMP .BS 1 >PSTR "S1D1" 5 bytes *-------------------------------------- SmartPort.OFS .HS 010305 SmartPort.SIG .HS 200003 *-------------------------------------- SP.CTRL.STATUS .DA #3 .DA #0 .DA SP.CTRL.STATUS.DATA .DA #0 SP.CTRL.STATUS.DATA .BS 8 DevCnt SP.DEV.STATUS .DA #3 SP.DEV.STATUS.DEVID .BS 1 .DA SP.DEV.STATUS.DATA .DA #3 return DIB SP.DEV.STATUS.DATA .BS S.DEVSTAT *-------------------------------------- EvtMgrInit lda #$A5 sta A2osX.TIMER16 lda #$9B sta A2osX.TIMER16+1 lda /EvtMgr.Table sta pEvent+1 clc rts *-------------------------------------- FltMgrInit stz FltMgr.Table clc rts *-------------------------------------- TskMgrInit >LDYAI TskMgr.Table+S.PS Clear whole process table except PS0 >STYA .2+1 ldx #K.PS.MAX-1 .1 lda #0 ldy #S.PS-1 .2 sta $ffff,y Self Modified dey bpl .2 lda .2+1 clc adc #S.PS sta .2+1 bcc .3 inc .2+2 .3 dex bne .1 >PUSHWI K.ENV.SIZE get a buffer for ENV >PUSHBI S.MEM.F.INIT0 make sure blank >SYSCALL GetMem create it... bcs .9 txa ldy #S.PS.hENV sta (pPs),y >LDYAI UsrBuf256 >STYA K.MLI.PARAMS+1 >MLICALL MLIGETPREFIX bcs .9 >LDYAI UsrBuf256 >SYSCALL NewPStrYA bcs .9 txa ldy #S.PS.hPREFIX sta (pPs),y >PUSHWI UsrBuf256 push ENV value >PUSHWI I.ENV.A2osX push ENV name >SYSCALL SetEnv bcs .9 >LDYAI I.ENV.PATH >SYSCALL PutEnvYA bcs .9 >LDYAI I.ENV.LIB >SYSCALL PutEnvYA bcs .9 >LDYAI I.ENV.DRV >SYSCALL PutEnvYA .9 rts *-------------------------------------- DEV.SYS >PSTR "SYS" I.ENV.A2osX >PSTR "A2OSX" I.ENV.PATH >PSTR "PATH=${A2OSX}SBIN/;${A2OSX}BIN/" I.ENV.LIB >PSTR "LIB=${A2OSX}LIB/" I.ENV.DRV >PSTR "DRV=${A2OSX}DRV/" STARTUP.CMDLINE >PSTR "${A2OSX}SBIN/SHELL ${A2OSX}A2osX.STARTUP" *-------------------------------------- MSG.Init3 >CSTR "A2osX[Stage3]:Init\r\n" MSG.DEV >CSTR "-Device Manager...\r\n" MSG.IRQ >CSTR "-Interrupt Manager...\r\n" MSG.EVT >CSTR "-Event Manager...\r\n" MSG.FLT >CSTR "-Path Filter...\r\n" MSG.TSK >CSTR "-Task Manager...\r\n" MSG.Prefix >CSTR "Prefix:%S\r\n" MSG.Startup >CSTR "Executing Kernel Startup Script...\r\nCmd:%S\r\n" MSG.StartupErr >CSTR "Failed : [$%h]\r\n" MSG.Init3.OK >CSTR "A2osX[Stage3]:Complete.\r\n" *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.INIT3 LOAD /A2OSX.SRC/SYS/KERNEL.S ASM