A2osX/SYS/KERNEL.S.INIT3.txt

516 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
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
.DA #3
.AS "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
.DA #3
.AS "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 MLICALL.PARAMS+2
>MLICALL MLIALLOCIRQ
bcs .9
lda MLICALL.PARAMS+1
sta ProDOS.INTNUM
stz ZPPtr1 Try finding a Mouse Card...
lda #$C1
sta ZPPtr1+1
.1 ldx #DEVSIG.Value-DEVSIG.Offset-1
.2 ldy DEVSIG.Offset,x
lda (ZPPtr1),y
cmp DEVSIG.Value,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 GOMOUSE.JMP+2 DEVSLOTCn
sta K.IrqMgrVBL.MSM+2
sta K.IrqMgrVBL.MRM+2
and #$0f
sta K.IrqMgrVBL.0n
asl
asl
asl
asl
sta GOMOUSE.n0+1
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
ldx K.IrqMgrVBL.0n
lda $7F8,x
and #$0F
ora #9
ldy #SETMOUSE
jsr GOMOUSE
bcs *
bit RRAMWRAMBNK1 Back To LC Ram
bit RRAMWRAMBNK1
inc K.IrkMgr.VBL set=1 awaiting IrqMgr confirmation
plp
clc
rts
*--------------------------------------
GOMOUSE pha
stz ZPPtr1
ldx GOMOUSE.JMP+2 DEVSLOTCn
stx ZPPtr1+1
lda (ZPPtr1),y
sta GOMOUSE.JMP+1
GOMOUSE.n0 ldy #$ff
pla
GOMOUSE.JMP jmp $ffff Self Modified
*--------------------------------------
DEVSIG.Offset .HS 05070B0CFB
DEVSIG.Value .HS 38180120D6
*--------------------------------------
DevMgrInit stz ZPPtr1
lda #$C1
sta ZPPtr1+1
lda #'1'
sta DEV.HEADER+S.DEV.NAME+4 S1Dy
.1 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 .3 not a smartport...
dex
bpl .2
*SmartPort!!!
jsr DevMgrInit.SP
ldy #A2osX.SLOTS.SP
bra .7
* Disk II, or Block device ?
.3 dex if x=0, only first SIG byte failed
bpl .8
ldy #$ff
lda (ZPPtr1),y
bne .4 $0, Disk II, 16sect
jsr DevMgrInit.DII
ldy #A2osX.SLOTS.DII
bra .7
.4 inc
beq .7 $ff, Disk II, 13sect, ignore
dec
* Block device
jsr DevMgrInit.BLK
ldy #A2osX.SLOTS.BLK
.7 lda ZPPtr1+1
and #$0f
tax
tya
sta A2osX.SLOTS,x
.8 inc DEV.HEADER+5
inc ZPPtr1+1
lda ZPPtr1+1
cmp #$C8
bne .1
clc
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
.1 jsr $ffff Self Modified
.DA #0 Status
.DA SP.CTRL.STATUS
bcs .9
lda SP.STATUS1
beq .9 no device
.2 lda #'1'
sta DEV.HEADER+S.DEV.NAME+2 SxD1
.3 jsr $ffff Self Modified
.DA #0 Status
.DA DEV.HEADER+S.DEV.S
bcs .7
lda SP.STATUS2+S.DEVSTAT.S
sta DEV.HEADER+S.DEV.S
.7 inc DEV.HEADER+7
dec SP.STATUS1
bne .3
.9 rts
*--------------------------------------
DevMgrInit.DII >LDYAI A2osX.DIIDrv
>STYA DEV.HEADER+S.DEV.ROM.JMP
rts
*--------------------------------------
DevMgrInit.BLK
rts
*--------------------------------------
DevMgrInit.AddDev
lda DevMgr.Count
cmp #K.DEV.MAX
beq .9
inc DevMgr.Count
jsr K.GetDevByIDA
>STYA ZPPtr1
ldy #S.DEV-1
.1 lda DEV.HEADER,y
sta (ZPPtr1),y
dey
bne .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 07010305
SmartPort.SIG .HS 00200003
*--------------------------------------
SP.CTRL.STATUS .DA #3
.DA #0
.DA SP.STATUS1
.DA #0 return S only
SP.DEV.STATUS .DA #3
.BS 1
.DA SP.STATUS2
.DA #3 return DIB
SP.STATUS1 .BS 4
SP.STATUS2 .BS S.DEVSTAT
*--------------------------------------
SP.DRV cld
ldy #7
lda (pDev),y
and #$f
sta PRTCALL.PARAMS+1 dev
SP.DRV.lo ldy #$ff
SP.DRV.hi lda #$ff
jmp A2osX.PRTCALL
*--------------------------------------
DII.DRV cld
lda #$ff DSSS0000
cpx #DEVMGR.CONTROL
bcs .9
.9 lda #MLI.ERR.BADCALL
rts
*--------------------------------------
BLK.DRV
*--------------------------------------
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 MLICALL.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 SYS/KERNEL.S.INIT3
LOAD SYS/KERNEL.S
ASM