PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- ZPPtr1 .EQ ZPKERNEL ZPPtr2 .EQ ZPKERNEL+2 ZPPtr3 .EQ ZPKERNEL+4 ZPPtr4 .EQ ZPKERNEL+6 *-------------------------------------- Kernel.Init sei ldx #$FF txs sta SETALTZP stx A2osX.SaveSM stx A2osX.SaveSX sta CLRALTZP Make sure MAIN ZP is enabled for X.PRINT.F *-------------------------------------- Kernel.Init2 >LDAXI MSG.Init2 jsr PrintFAX >LDYAI A2osX.GP >STYA ZPPtr1 >LDYAI A2osX.SYSCALL >STYA ZPPtr2 >LDYAI A2osX.D1-A2osX.GP^$FFFF >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP >LDAXI MSG.D2 jsr PrintFAX sta SETALTZP lda RRAMWRAMBNK2 lda RRAMWRAMBNK2 >LDYAI A2osX.D2 >STYA ZPPtr1 >LDYAI $D000 >STYA ZPPtr2 >LDYAI A2osX.E0-A2osX.D2^$FFFF >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP >LDAXI MSG.D1 jsr PrintFAX sta SETALTZP lda RRAMWRAMBNK1 lda RRAMWRAMBNK1 >LDYAI A2osX.D1 >STYA ZPPtr1 >LDYAI $D000 >STYA ZPPtr2 >LDYAI A2osX.D2-A2osX.D1^$FFFF >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP >LDAXI MSG.E0 jsr PrintFAX sta SETALTZP lda RRAMWRAMBNK1 lda RRAMWRAMBNK1 >LDYAI A2osX.E0 >STYA ZPPtr1 >LDYAI $E000 >STYA ZPPtr2 >LDYAI A2osX.E0.E-A2osX.E0^$FFFF >STYA ZPPtr3 jsr Kernel.Move >LDYAI D.STACK.TOP >STYA pStack init Soft Stack sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F cli jsr KConfigLoad lda A2osX.HZ pha push HZ >LDAXI MSG.HZ jsr PrintFAX jsr CPU.Init >LDAXI MSG.Init2.OK jsr PrintFAX *-------------------------------------- >DEBUGOA *-------------------------------------- Kernel.Init3 sta SETALTZP bit RRAMWRAMBNK1 bit RRAMWRAMBNK1 jsr MemMgrInit jsr PS0Init bcs * >LDYAI MSG.Init3 >SYSCALL PrintFYA >LDYAI MSG.DEV >SYSCALL PrintFYA jsr DevMgrInit bcs * >LDYAI MSG.IRQ >SYSCALL PrintFYA jsr IrqMgrInit bcs * >LDYAI MSG.EVT >SYSCALL PrintFYA jsr EvtMgrInit bcs * >LDYAI MSG.FLT >SYSCALL PrintFYA jsr FltMgrInit bcs * >LDYAI MSG.TSK >SYSCALL PrintFYA jsr TskMgrInit bcs * ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >PUSHYA >LDYAI MSG.Prefix >SYSCALL PrintFYA >PUSHWI STARTUP.CMDLINE >LDYAI MSG.Startup >SYSCALL PrintFYA >LDYAI STARTUP.CMDLINE >SYSCALL ExpandPStrYA phx Save Expanded CMDLINE for discard >SYSCALL CreateProcessYA bcs .9 pla >SYSCALL FreeMemA ...discard... >LDYAI MSG.Init3.OK >SYSCALL PrintFYA >LDYAI TskMgr.Table >STYA pPs >DEBUGOA bit RRAMWRAMBNK2 bit RRAMWRAMBNK2 jmp K.KernelRun .9 >PUSHA >LDYAI MSG.StartupErr >SYSCALL PrintFYA bra * No need to discard Expanded CMDLINE *-------------------------------------- Kernel.Move ldy #0 .1 inc ZPPtr3 bne .2 inc ZPPtr3+1 beq .9 .2 lda (ZPPtr1),y sta (ZPPtr2),y iny bne .1 inc ZPPtr1+1 inc ZPPtr2+1 bne .1 .9 rts *-------------------------------------- CPU.Init >LDAXI MSG.CPU jsr PrintFAX jsr Detect6502 A = CPU type sta A2osX.CPUTYPE ldx MSG.CPUTYPEH,y lda MSG.CPUTYPEL,y jsr PrintFAX lda MACHID and #MACHID.TYPE cmp #MACHID.TYPE.IIc beq CPU.Init.Z80 >LDAXI MSG.CPU.SPEED jsr PrintFAX stz A2osX.RANDOM16 stz A2osX.RANDOM16+1 php sei .1 bit VBL bpl .2 .2 bit VBL bmi .2 ldx #0 Count LO lda #0 Count HI .3 ldy #3 (2) .4 nop (2) dey (2) bne .4 (2*) inc A2osX.RANDOM16 (6) bne .5 (2*) inc A2osX.RANDOM16+1 (6) bit VBL (4) bpl .3 (2*) bmi .6 .5 nop (2) nop (2) nop (2) bit VBL (4) bpl .3 (2*) .6 plp stz A2osX.CPUSPEED .7 sec lda A2osX.RANDOM16 sbc #100 tax lda A2osX.RANDOM16+1 sbc /100 bcc .8 stx A2osX.RANDOM16 sta A2osX.RANDOM16+1 inc A2osX.CPUSPEED bra .7 .8 lda A2osX.RANDOM16 sta A2osX.CPUSPEED+1 pha push CPU speed LO lda A2osX.CPUSPEED pha push CPU speed HI >LDAXI MSG.CPU.SPEEDOK jsr PrintFAX CPU.Init.Z80 >LDAXI MSG.Z80 jsr PrintFAX jsr DetectZ80 bcs .9 sta A2osX.Z80SLOT pha Push Z80Slot tax lda #A2osX.SLOTS.Z80 sta A2osX.SLOTS,x >LDAXI MSG.Z80.OK jsr PrintFAX rts .9 >LDAXI MSG.Z80.KO jsr PrintFAX rts *-------------------------------------- * Out: * A = $60, 6502 * A = $61, 65C02 * A = $62, 65R02 * A = $63, 65816 *-------------------------------------- Detect6502 ldy #0 Test 6502 BCD bug sed lda #$99 clc adc #$01 cld bmi .9 BUG!, we have 6502 ldy #3 test 65C816 TYX Instruction ldx #0 .OP 65816 tyx TYX: if 65C816, x becomes non-zero .OP 65C02 bne .9 worked! 65C816 dey y=2 -> R65C02 ldx $EA save zp $EA stz $EA store 0 in $EA * .OP 65R02 .HS F7EA For compatibility with A2osX.ASM * smb 7,$EA if not Rockwell, assemble as nop nop * .OP 65C02 asl $EA cs if Rockwell stx $EA restore zp $EA bcs .9 dey y=1 -> 65C02 .9 tya ora #$60 rts *-------------------------------------- * Out: * A = Z80 Slot *-------------------------------------- DetectZ80 ldx #Z80Code.Size .1 lda Z80Code.Start-1,x sta $1000-1,x 00000H for Z80 dex bne .1 stz ZPPtr1 lda #$C1 sta ZPPtr1+1 .2 sta (ZPPtr1) lda $100D bmi .8 inc ZPPtr1+1 lda ZPPtr1+1 cmp #$C8 beq .9 CS clc adc #$20 sta $100A bra .2 .8 lda ZPPtr1+1 and #$0F clc .9 rts *-------------------------------------- KConfigLoad >LDAXI MSG.KCREAD jsr PrintFAX jsr MLI .DA #MLIOPEN .DA MLIOPEN00 bcs .9 lda MLIOPEN00+5 sta MLIREAD00+1 sta MLICLOSE00+1 jsr MLI .DA #MLIREAD .DA MLIREAD00 php pha jsr MLI .DA #MLICLOSE .DA MLICLOSE00 pla plp bcs .9 >LDAXI MSG.KCREAD.OK jsr PrintFAX rts .9 >LDAXI MSG.KCREAD.KO jsr PrintFAX rts *-------------------------------------- Z80Code.Start .HS 31FFFF START: LD SP,0FFFFH Init Stack .HS 3EFF LD A,0FFH Set Flag .HS 320D00 LD (FLAG),A .HS 3200E1 LD (0E100H),A Back to 6502 .HS 18F3 JR START Loop .HS 00 FLAG: .DB 0 Z80Code.Size .EQ *-Z80Code.Start *-------------------------------------- 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 >LDYAI K.ENV.SIZE get a buffer for ENV >SYSCALL GetMem0YA make sure blank!! 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 *-------------------------------------- MSG.Init2 >CSTR "A2osX[Stage2]:Init\nInstalling KERNEL...\n - $BE00 Global Page...\n" MSG.D1 >CSTR " - $D000 Bank1...\n" MSG.D2 >CSTR " - $D000 Bank2...\n" MSG.E0 >CSTR " - $E000...\n" MSG.HZ >CSTR "Kernel SYS Timer Set For %d0 hz Machine.\n" MSG.Init2.OK >CSTR "A2osX[Stage2]:Complete.\n" *-------------------------------------- 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" *-------------------------------------- MSG.CPU >CSTR "Checking CPU..." MSG.CPU.SPEED >CSTR "Detecting CPU Speed..." MSG.CPUTYPEL .DA #MSG.6502 .DA #MSG.65C02 .DA #MSG.65R02 .DA #MSG.65816 MSG.CPUTYPEH .DA /MSG.6502 .DA /MSG.65C02 .DA /MSG.65R02 .DA /MSG.65816 MSG.6502 >CSTR "6502.\n" MSG.65C02 >CSTR "65C02.\n" MSG.65R02 >CSTR "65R02.\n" MSG.65816 >CSTR "65816.\n" MSG.CPU.SPEEDOK >CSTR "%d.%02d Mhz.\n" MSG.Z80 >CSTR "Detecting Z80 CPU..." MSG.Z80.OK >CSTR "Detected In Slot %d.\n" MSG.Z80.KO >CSTR "Not Detected.\n" MSG.KCREAD >CSTR "Reading Kernel Config File..." MSG.KCREAD.OK >CSTR "OK\n" MSG.KCREAD.KO >CSTR "\nError While Reading Kernel Config File, Using Default.\n" *-------------------------------------- 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" *-------------------------------------- MLIOPEN00 .DA #3 .DA A2OSXCONF .DA $1000 .BS 1 A2OSXCONF >PSTR "A2osX.KCONFIG" *-------------------------------------- MLIREAD00 .DA #4 .BS 1 .DA A2osX.HZ .DA 16 .BS 2 *-------------------------------------- MLICLOSE00 .DA #1 .BS 1 *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.INIT LOAD /A2OSX.SRC/SYS/KERNEL.S ASM