Kernel 0.9.1 : KERNEL, bugfix in VBL & IRQ handler

This commit is contained in:
Rémy GIBERT 2018-04-05 21:32:22 +01:00
parent 9d5ad1ee19
commit 4358169b40
7 changed files with 244 additions and 132 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -222,30 +222,111 @@ GO.EXIT.JMP jmp $FFFF Self Modified
* must exit with RTS * must exit with RTS
* - CC if IRQ cleared, CS if NOT * - CC if IRQ cleared, CS if NOT
*-------------------------------------- *--------------------------------------
GP.IrqH cld *GP.IrqH cld
lda RDALTZP * lda RDALTZP
sta .2+1 * sta .2+1
*
* bmi .1 we are already in AuxZP/LC
bmi .1 we are already in AuxZP/LC * sta SETALTZP coming from MainLC, switch to aux
* tsx
* stx A2osX.SaveSM
* ldx A2osX.SaveSX
* txs
sta SETALTZP coming from MainLC, switch to aux *.1 jsr K.IrqH
*.2 lda #$ff get back ZP status when called
* bmi .3 we were coming from AuxZP/LC
* tsx go back to Main
* stx A2osX.SaveSX
* ldx A2osX.SaveSM
* txs
* sta CLRALTZP
*.3 rts
*--------------------------------------
GP.IrqH.TCLOCK ldy IRQ.VBL.n0
lda $c080,y
and #$20
beq GP.IrqH.DEV
lda $c080,y
lda $c088,y
inc CORE.IRQTick
clc
rts
*--------------------------------------
GP.IrqH.VBL jsr IRQ.VBL.MSM SERVEMOUSE
bcs GP.IrqH.DEV Not From Mouse
ldx IRQ.VBL.0n
lda MOUSESTSx,x
and #MOUSESTSx.INTVBL IRQ was caused by VBL ?
beq GP.IrqH.DEV
ldx IRQ.VBL.MRM+2 $Cn
ldy IRQ.VBL.n0
jsr IRQ.VBL.MRM READMOUSE
inc CORE.IRQTick
clc
rts
*--------------------------------------
GP.IrqH.DEV sta SETALTZP switch to aux LC
tsx tsx
stx A2osX.SaveSM stx A2osX.SaveSM
ldx A2osX.SaveSX ldx A2osX.SaveSX
txs txs
.1 jsr K.IrqH >LDYAI Dev.Table
>STYA $fe
.2 lda #$ff get back ZP status when called ldx DevMgr.Count
bmi .3 we were coming from AuxZP/LC
tsx go back to Main .4 ldy #S.DEV.S
lda ($fe),y
and #S.DEV.S.IRQ
beq .6
phx
jsr GP.IrqHJMP
plx
bcc .8 CC, IRQ cleared by device
.6 lda $fe
clc
adc #S.DEV
sta $fe
bcc .7
inc $ff
.7 dex
bne .4
sec
.8 tsx go back to Main
stx A2osX.SaveSX stx A2osX.SaveSX
ldx A2osX.SaveSM ldx A2osX.SaveSM
txs txs
sta CLRALTZP sta CLRALTZP
.3 rts rts
*--------------------------------------
GP.IrqHJMP ldx #DEVMGR.IRQ
jmp ($fe)
*--------------------------------------
IRQ.IntNum .BS 1
IRQ.VBL.n0 .BS 1
IRQ.VBL.0n .BS 1
IRQ.VBL.MSM jmp $0000
IRQ.VBL.MRM jmp $0000
*-------------------------------------- *--------------------------------------
*GO.Reset jsr GO.A2osX *GO.Reset jsr GO.A2osX
* jmp CORE.Run * jmp CORE.Run

View File

@ -566,45 +566,32 @@ DevMgr.SYS cld
*-------------------------------------- *--------------------------------------
IrqMgrInit >LDYAI MSG.IRQ IrqMgrInit >LDYAI MSG.IRQ
>SYSCALL PrintF.YA >SYSCALL PrintF.YA
php * php
sei * sei
>LDYA $FFFE * >LDYA $FFFE
>STYA IRQ.OldFFFE * >STYA IRQ.OldFFFE
>LDYAI K.IrqHAuxLC * >LDYAI K.IrqHAuxLC
>STYA $FFFE * >STYA $FFFE
>LDYAI GP.IrqH * >LDYAI GP.IrqH
>STYA K.MLI.PARAMS+2 * >STYA K.MLI.PARAMS+2
>MLICALL MLIALLOCIRQ * >MLICALL MLIALLOCIRQ
bcs .9 * bcs .9
lda K.MLI.PARAMS+1 * lda K.MLI.PARAMS+1
sta IRQ.INTNUM * sta IRQ.INTNUM
plp * plp
jsr IrqMgrInit.Mouse jsr IrqMgrInit.TClock
bcs .1 bcs .1
lda #"V"
sta SYS.BASL0+38
>LDYAI K.IrqH.VBL
>STYA K.IrqH+1
>LDYAI MSG.IRQ.VBL
>SYSCALL PrintF.YA
clc
rts
.1 jsr IrqMgrInit.TClock
bcs .8
lda #"C" lda #"C"
sta SYS.BASL0+38 sta SYS.BASL0+38
>LDYAI K.IrqH.TClock >LDYAI GP.IrqH.TClock
>STYA K.IrqH+1 jsr IrqMgrInit.MLI
bcs .9
>LDYAI MSG.IRQ.CLOCK >LDYAI MSG.IRQ.CLOCK
>SYSCALL PrintF.YA >SYSCALL PrintF.YA
@ -612,6 +599,22 @@ IrqMgrInit >LDYAI MSG.IRQ
clc clc
rts rts
.1 jsr IrqMgrInit.Mouse
bcs .8
lda #"V"
sta SYS.BASL0+38
>LDYAI GP.IrqH.VBL
jsr IrqMgrInit.MLI
bcs .9
>LDYAI MSG.IRQ.VBL
>SYSCALL PrintF.YA
clc
rts
.8 jsr IrqMgrInit.HZ2Tick .8 jsr IrqMgrInit.HZ2Tick
lda #"P" lda #"P"
@ -623,95 +626,18 @@ IrqMgrInit >LDYAI MSG.IRQ
clc clc
rts rts
.9 plp .9 sec
sec
rts rts
*-------------------------------------- *--------------------------------------
IrqMgrInit.HZ2Tick IrqMgrInit.MLI >STYA K.MLI.PARAMS+2
ldx #50
lda A2osX.HZ
sta CORE.TickPer10t
sta CORE.Tick10t
cmp #5
beq .1
ldx #60
.1 stx CORE.TickPerSec
stx CORE.TickSec
rts
*--------------------------------------
IrqMgrInit.Mouse
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
sec
rts
.4 lda ZPPtr1+1
sta IRQ.VBL.MSM+2
sta IRQ.VBL.MRM+2
and #$0f
sta IRQ.VBL.0n
asl
asl
asl
asl
sta IRQ.VBL.n0
ldy #$13 SERVEMOUSE
lda (ZPPtr1),y
sta IRQ.VBL.MSM+1
ldy #$14 READMOUSE
lda (ZPPtr1),y
sta IRQ.VBL.MRM+1
ldy #$12 SETMOUSE
lda (ZPPtr1),y
sta .7+1
lda #9 #MOUSEMODx.INTVBL+MOUSEMODx.ACTIVE
ldx ZPPtr1+1 DEVSLOTCn
stx .7+2
ldy IRQ.VBL.n0
php php
sei sei
>MLICALL MLIALLOCIRQ
bit RROMBNK2 Renable ROM to allow MOUSE II firmware works properly
.7 jsr $ffff self Modified, CALL SETMOUSE
bcs .9 bcs .9
bit RRAMWRAMBNK1 Back To LC Ram lda K.MLI.PARAMS+1
bit RRAMWRAMBNK1 sta IRQ.INTNUM
jsr IrqMgrInit.HZ2Tick
dec CORE.IRQMode
plp plp
clc clc
rts rts
@ -719,9 +645,6 @@ IrqMgrInit.Mouse
.9 plp .9 plp
sec sec
rts rts
Mouse.OFS .HS 05070B0CFB
Mouse.SIG .HS 38180120D6
*-------------------------------------- *--------------------------------------
IrqMgrInit.TClock IrqMgrInit.TClock
stz ZPPtr1 Try finding a Mouse Card... stz ZPPtr1 Try finding a Mouse Card...
@ -781,6 +704,106 @@ IrqMgrInit.TClock
TClock.SIG .HS 0878282c58ff700538b00118b8087848 TClock.SIG .HS 0878282c58ff700538b00118b8087848
.HS 8a489848adffcf201ac86868ba8df807 .HS 8a489848adffcf201ac86868ba8df807
*-------------------------------------- *--------------------------------------
IrqMgrInit.Mouse
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
sec
rts
.4 lda ZPPtr1+1
sta .11+2
sta IRQ.VBL.MSM+2
sta IRQ.VBL.MRM+2
and #$0f
sta IRQ.VBL.0n
asl
asl
asl
asl
sta IRQ.VBL.n0
php
sei
bit RROMBNK2 Renable ROM to allow MOUSE II firmware works properly
ldy #INITMOUSE
jsr .10
ldy #SETMOUSE
lda #MOUSEMODx.INTVBL+MOUSEMODx.ACTIVE
jsr .10
bit RRAMWRAMBNK1 Back To LC Ram
bit RRAMWRAMBNK1
ldy #SERVEMOUSE
lda (ZPPtr1),y
sta IRQ.VBL.MSM+1
ldy #READMOUSE
lda (ZPPtr1),y
sta IRQ.VBL.MRM+1
jsr IrqMgrInit.HZ2Tick
dec CORE.IRQMode
plp
clc
rts
.9 plp
sec
rts
.10 pha
lda (ZPPtr1),y
sta .11+1
pla
ldx .11+2 Cn
ldy IRQ.VBL.n0
.11 jmp $ffff SELF MODIFIED
Mouse.OFS .HS 05070B0CFB
Mouse.SIG .HS 38180120D6
*--------------------------------------
IrqMgrInit.HZ2Tick
ldx #50
lda A2osX.HZ
sta CORE.TickPer10t
sta CORE.Tick10t
cmp #5
beq .1
ldx #60
.1 stx CORE.TickPerSec
stx CORE.TickSec
rts
*--------------------------------------
DevMgrInit >LDYAI MSG.DEV DevMgrInit >LDYAI MSG.DEV
>SYSCALL PrintF.YA >SYSCALL PrintF.YA

View File

@ -34,9 +34,17 @@ K.IrqHAuxLC sta .6+1
pha pha
sta CLRREADAUX Make sure we can access Dev.Table sta CLRREADAUX Make sure we can access Dev.Table
lda RDWRITEAUX
pha
sta CLRWRITEAUX Driver may R/W in screen holes
jsr K.IrqH jsr K.IrqH
pla Must keep Carry pla Must keep Carry
bpl .10
sta SETWRITEAUX
.10 pla
bpl .1 bpl .1
sta SETREADAUX sta SETREADAUX
@ -62,8 +70,7 @@ K.IrqHAuxLC sta .6+1
bcs .8 bcs .8
rti rti
.7 pla pull P .7 lda .6+1
bra *
.8 jmp (IRQ.OldFFFE) .8 jmp (IRQ.OldFFFE)
*-------------------------------------- *--------------------------------------

View File

@ -12,6 +12,7 @@ AUTO 4,1
.INB INC/IO.I .INB INC/IO.I
.INB INC/PRODOS.I .INB INC/PRODOS.I
.INB INC/MLI.ERR.I .INB INC/MLI.ERR.I
.INB INC/XY.MOUSE.I
.INB INC/GUI.I .INB INC/GUI.I
.INB /A2OSX.SRC/SYS/KERNEL.S.INIT .INB /A2OSX.SRC/SYS/KERNEL.S.INIT
@ -49,7 +50,7 @@ A2osX.D2 .PH $D000
.EP .EP
A2osX.E0 .PH $E000 A2osX.E0 .PH $E000
.INB /A2OSX.SRC/SYS/KERNEL.S.JMP .INB /A2OSX.SRC/SYS/KERNEL.S.JMP
.INB /A2OSX.SRC/SYS/KERNEL.S.IRQ * .INB /A2OSX.SRC/SYS/KERNEL.S.IRQ
.INB /A2OSX.SRC/SYS/KERNEL.S.MEM .INB /A2OSX.SRC/SYS/KERNEL.S.MEM
DevMgr.FreeMem .EQ * DevMgr.FreeMem .EQ *
.EP .EP