Kernel version 0.9 : COM drivers and IRQ related Fixes

This commit is contained in:
Rémy GIBERT 2017-02-02 18:30:07 +01:00
parent 2f13635422
commit 41b21d8091
11 changed files with 166 additions and 147 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -13,7 +13,8 @@ INSDRV CONSOLE.DRV
STARTPROC GETTY CON ${A2OSX}SBIN/LOGIN STARTPROC GETTY CON ${A2OSX}SBIN/LOGIN
# Serial Login # Serial Login
#INSDRV SSC.DRV 9600,N,8,1,X #INSDRV SSC.DRV 9600,N,8,1,X
#STARTPROC GETTY COM2 ${A2OSX}SBIN/LOGIN INSDRV SSC.I.DRV 9600,N,8,1,X
STARTPROC GETTY COM2 ${A2OSX}SBIN/LOGIN
#INSDRV PIC.DRV #INSDRV PIC.DRV
# Network Section # Network Section
INSDRV UTHERNET.DRV 000E3A123456 INSDRV UTHERNET.DRV 000E3A123456

View File

@ -55,6 +55,7 @@ CS.RUN >LDYA L.MSG0
>SYSCALL GetDevByIDA >SYSCALL GetDevByIDA
bcc .10 bcc .10
jmp .8 jmp .8
.10 >STYA ZPPTR1 .10 >STYA ZPPTR1
ldy #S.DEV.JMP+1 ldy #S.DEV.JMP+1
@ -80,7 +81,9 @@ CS.RUN >LDYA L.MSG0
>PUSHW L.DEV.NAME >PUSHW L.DEV.NAME
ldy #S.DEV.F ldy #S.DEV.F
>PUSHB (ZPPTR1),y lda (ZPPTR1),y
and #$FF^S.DEV.F.LEN
>PUSHA
ldy #S.DEV.S ldy #S.DEV.S
>PUSHB (ZPPTR1),y >PUSHB (ZPPTR1),y

View File

@ -10,6 +10,7 @@ AUTO 6
*-------------------------------------- *--------------------------------------
.INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/MACROS.I
.INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/A2OSX.I
.INB /A2OSX.DEV/INC/PRODOS.I
*-------------------------------------- *--------------------------------------
ZPTmpPtr1 .EQ ZPDRV ZPTmpPtr1 .EQ ZPDRV
*-------------------------------------- *--------------------------------------
@ -61,14 +62,12 @@ Dev.Detect sta hArgs
>LDYA L.MSG.DETECT.KO >LDYA L.MSG.DETECT.KO
>SYSCALL CPrintFYA >SYSCALL CPrintFYA
lda #DEVMGR.ERRNOHW Not Found in any slot, exiting lda #MLI.ERR.NODEV Not Found in any slot, exiting
sec sec
rts rts
.4 lda ZPTmpPtr1+1 .4 lda ZPTmpPtr1+1
sta DEVSLOTCn
and #$0F and #$0F
sta DEVSLOT0n
ora #$30 ora #$30
sta DEV.HEADER.NAME+4 sta DEV.HEADER.NAME+4
asl asl
@ -94,25 +93,38 @@ hArgs .BS 1
*-------------------------------------- *--------------------------------------
* Device Header (16 Bytes) * Device Header (16 Bytes)
*-------------------------------------- *--------------------------------------
DEV.HEADER cld DEV.HEADER .DA DRV.CS.START
jmp (DRV.CS.START,x) .DA #S.DEV.S.WRITE+S.DEV.S.READ
.HS 00 DevID
.DA #S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR
DEV.HEADER.NAME >PSTR "COM1" NAME DEV.HEADER.NAME >PSTR "COM1" NAME
.HS 00
.HS 00.00.00.00
*-------------------------------------- *--------------------------------------
* Driver Code * Driver Code
*-------------------------------------- *--------------------------------------
DRV.CS.START .DA OPEN DRV.CS.START cld
.DA GETEVENT jmp (.1,x)
.DA COUT .1 .DA STATUS
.DA BADCALL
.DA BADCALL
.DA BADCALL
.DA CONTROL
.DA BADCALL
.DA OPEN
.DA CLOSE .DA CLOSE
.DA GETINFO .DA READ
.DA IRQ .DA WRITE
L.DEVINFO .DA DEVINFO L.STAT .DA STAT
.DA 0 end or relocation .DA 0 end or relocation
*-------------------------------------- *--------------------------------------
BADCALL lda #MLI.ERR.BADCALL
sec
rts
*--------------------------------------
STATUS >LDYA L.STAT
clc
rts
*--------------------------------------
CONTROL clc
rts
*--------------------------------------
OPEN ldx DEVSLOTn0 OPEN ldx DEVSLOTn0
php php
@ -132,7 +144,15 @@ OPEN ldx DEVSLOTn0
clc clc
rts rts
*-------------------------------------- *--------------------------------------
GETEVENT ldx DEVSLOTn0 CLOSE php
sei
ldx DEVSLOTn0
stz SSC.RESET,x
plp
clc
rts
*--------------------------------------
READ ldx DEVSLOTn0
lda SSC.STATUS,x lda SSC.STATUS,x
bmi * bmi *
@ -140,16 +160,6 @@ GETEVENT ldx DEVSLOTn0
beq .9 beq .9
lda SSC.DATA,x lda SSC.DATA,x
ldy #S.EVT.DATA
sta (pEvent),y
iny
lda #0
sta (pEvent),y
lda #S.EVT.F.KEY
sta (pEvent)
clc clc
rts rts
@ -157,16 +167,17 @@ GETEVENT ldx DEVSLOTn0
sec sec
rts rts
*-------------------------------------- *--------------------------------------
COUT pha WRITE pha
ldx DEVSLOTn0 ldx DEVSLOTn0
.1 lda SSC.STATUS,x .1 lda SSC.STATUS,x
bmi *
and #SSC.STATUS.DCD+SSC.STATUS.DSR * and #SSC.STATUS.DCD+SSC.STATUS.DSR
beq .9 * beq .9
and #SSC.STATUS.TDRE Outgoing char? and #SSC.STATUS.TDRE Outgoing char?
bne .1 beq .1
pla pla
sta SSC.DATA,x sta SSC.DATA,x
@ -178,24 +189,15 @@ COUT pha
sec sec
rts rts
*-------------------------------------- *--------------------------------------
CLOSE php
sei
ldx DEVSLOTn0
stz SSC.RESET,x
plp
clc
rts
*--------------------------------------
GETINFO >LDYA L.DEVINFO
IRQ clc
rts
*--------------------------------------
DRV.CS.END DRV.CS.END
DEVSLOT0n .BS 1
DEVSLOTCn .BS 1
DEVSLOTn0 .BS 1 DEVSLOTn0 .BS 1
DEVINFO .DA #S.DEVINFO.TYPE.CHAR *--------------------------------------
STAT .DA #S.DEVSTAT.S.WRITE+S.DEVSTAT.S.READ
.DA #0,#0,#0
>PSTR "Serial Card/Port"
.DA #S.DEVSTAT.TYPE.CHAR
.DA #0 .DA #0
.DA $0900
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE DRV/SSC.DRV.S SAVE DRV/SSC.DRV.S

View File

@ -10,6 +10,7 @@ AUTO 6
*-------------------------------------- *--------------------------------------
.INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/MACROS.I
.INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/A2OSX.I
.INB /A2OSX.DEV/INC/PRODOS.I
*-------------------------------------- *--------------------------------------
BUF.SIZE .EQ $20 BUF.SIZE .EQ $20
BUF.MASK .EQ $1F BUF.MASK .EQ $1F
@ -18,10 +19,6 @@ ZPTmpPtr1 .EQ ZPDRV
*-------------------------------------- *--------------------------------------
.INB DRV/X.SER.6551.S .INB DRV/X.SER.6551.S
*-------------------------------------- *--------------------------------------
* see this :
* http://mirrors.apple2.org.za/apple.cabi.net/Applications/Telcom/SSC.DRIVER/SSC.DRIVER.TXT
* About False read issue in SSC
*--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
CS.START cld CS.START cld
@ -68,7 +65,7 @@ Dev.Detect sta hArgs
>LDYA L.MSG.DETECT.KO >LDYA L.MSG.DETECT.KO
>SYSCALL CPrintFYA >SYSCALL CPrintFYA
lda #DEVMGR.ERRNOHW Not Found in any slot, exiting lda #MLI.ERR.NODEV Not Found in any slot, exiting
sec sec
rts rts
@ -104,25 +101,39 @@ hArgs .BS 1
*-------------------------------------- *--------------------------------------
* Device Header (16 Bytes) * Device Header (16 Bytes)
*-------------------------------------- *--------------------------------------
DEV.HEADER cld DEV.HEADER .DA DRV.CS.START
jmp (DRV.CS.START,x) .DA #S.DEV.S.WRITE+S.DEV.S.READ+S.DEV.S.IRQ
.HS 00 DevID
.DA #S.DEV.F.IRQ+S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR
DEV.HEADER.NAME >PSTR "COM1" NAME DEV.HEADER.NAME >PSTR "COM1" NAME
.HS 00
.HS 00.00.00.00
*-------------------------------------- *--------------------------------------
* Driver Code * Driver Code
*-------------------------------------- *--------------------------------------
DRV.CS.START .DA OPEN DRV.CS.START cld
.DA GETEVENT jmp (.1,x)
.DA COUT .1 .DA STATUS
.DA BADCALL
.DA BADCALL
.DA BADCALL
.DA CONTROL
.DA BADCALL
.DA OPEN
.DA CLOSE .DA CLOSE
.DA GETINFO .DA READ
.DA WRITE
.DA IRQ .DA IRQ
L.DEVINFO .DA DEVINFO L.STAT .DA STAT
.DA 0 end or relocation .DA 0 end or relocation
*-------------------------------------- *--------------------------------------
BADCALL lda #MLI.ERR.BADCALL
sec
rts
*--------------------------------------
STATUS >LDYA L.STAT
clc
rts
*--------------------------------------
CONTROL clc
rts
*--------------------------------------
OPEN php OPEN php
sei sei
ldx DEVSLOTn0 ldx DEVSLOTn0
@ -137,7 +148,7 @@ OPEN php
lda #SSC.CTL.CLKINT+SSC.CTL.B9600 lda #SSC.CTL.CLKINT+SSC.CTL.B9600
sta SSC.CTL,x sta SSC.CTL,x
lda #SSC.CMD.TE+SSC.CMD.DTR lda #SSC.CMD.TEIRQ+SSC.CMD.TE+SSC.CMD.DTR
sta SSC.CMD,x sta SSC.CMD,x
lda SSC.DATA,x discard any garbage byte lda SSC.DATA,x discard any garbage byte
@ -147,31 +158,30 @@ OPEN php
clc clc
rts rts
*-------------------------------------- *--------------------------------------
GETEVENT php CLOSE php
sei
ldx DEVSLOTn0
stz SSC.RESET,x
plp
clc
rts
*--------------------------------------
READ php
sei sei
lda INBUF.CNT lda INBUF.CNT
beq .9 beq .9
ldx INBUF.PTR ldx INBUF.PTR
lda INBUF,x ldy INBUF,x
ldy #S.EVT.DATA
sta (pEvent),y
iny
lda #0
sta (pEvent),y
lda #S.EVT.F.KEY
sta (pEvent)
txa txa
inc inc
and #BUF.MASK and #BUF.MASK
sta INBUF.PTR sta INBUF.PTR
dec INBUF.CNT dec INBUF.CNT
tya
plp plp
clc clc
rts rts
@ -181,31 +191,34 @@ GETEVENT php
sec sec
rts rts
*-------------------------------------- *--------------------------------------
COUT php WRITE php
sei sei
tay save char in Y tay save char in Y
* ldx DEVSLOTn0
* lda SSC.STATUS,x
* bit #SSC.STATUS.DCD+SSC.STATUS.DSR true when 0
* bne .9
ldx OUTBUF.CNT Buffer Empty?
bne .11 not empty, queue char
ldx DEVSLOTn0 ldx DEVSLOTn0
lda SSC.STATUS,x lda SSC.STATUS,x
bit #SSC.STATUS.DCD+SSC.STATUS.DSR true when 0 and #SSC.STATUS.TDRE Register Empty ?
bne .9
ldx OUTBUF.CNT Buffer Empty?
bne .10 not empty, queue char
and #SSC.STATUS.TDRE Register Empty ?
beq .10 not empty, queue char beq .10 not empty, queue char
tya yes, write directly to ACIA tya yes, write directly to ACIA
ldx DEV.DATA.BFFF sta SSC.DATA,x
sta $BFFF,x
plp plp
clc clc
rts rts
.10 cpx #BUF.SIZE .10 ldx OUTBUF.CNT
.11 cpx #BUF.SIZE
beq .9 Buffer Full!! beq .9 Buffer Full!!
lda OUTBUF.PTR lda OUTBUF.PTR
@ -220,8 +233,8 @@ COUT php
inc OUTBUF.CNT inc OUTBUF.CNT
* ldx DEVSLOTn0 * ldx DEVSLOTn0
lda #SSC.CMD.TEIRQ+SSC.CMD.DTR * lda #SSC.CMD.TEIRQ+SSC.CMD.DTR
sta SSC.CMD,x * sta SSC.CMD,x
plp plp
clc clc
rts rts
@ -230,35 +243,25 @@ COUT php
sec sec
rts rts
*-------------------------------------- *--------------------------------------
CLOSE php
sei
ldx DEVSLOTn0
stz SSC.RESET,x
plp
clc
rts
*--------------------------------------
GETINFO >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* IRQ Handler * IRQ Handler
* on exit, CC if handled * on exit, CC if handled
*-------------------------------------- *--------------------------------------
IRQ ldx DEVSLOTn0 IRQ stz .8+1
lda SSC.STATUS,x IRQ from this device ?
* bpl .9 no, exit !!!!Applewin bug #308!!!! .1 ldx DEVSLOTn0
lda SSC.STATUS,x
* bpl .9 IRQ from this device ? no, exit !!!!Applewin bug #308!!!!
bit #SSC.STATUS.RDRF incoming char? bit #SSC.STATUS.RDRF incoming char?
beq .1 beq .3
*------------ IRQ In *------------ IRQ In
ldy SSC.DATA,x read data to clear IRQ ldy SSC.DATA,x read data to clear IRQ
lda INBUF.CNT lda INBUF.CNT
cmp #BUF.SIZE cmp #BUF.SIZE
beq .8 buffer full, discard beq .8 buffer full, discard and exit
clc clc
adc INBUF.PTR adc INBUF.PTR
@ -268,40 +271,40 @@ IRQ ldx DEVSLOTn0
sta INBUF,x sta INBUF,x
inc INBUF.CNT inc INBUF.CNT
bra IRQ start over if
lda #$ff
sta .8+1
bra .1
*------------ IRQ Out *------------ IRQ Out
.1 bit #SSC.STATUS.TDRE .2 ldx DEVSLOTn0
beq .2 no transmit, no recieve, CTS changed! lda SSC.STATUS,x
.3 bit #SSC.STATUS.TDRE
beq .8 no transmition possible....
lda OUTBUF.CNT something to transmit ? lda OUTBUF.CNT something to transmit ?
beq .11 no, disable IRQ and exit beq .8
ldx OUTBUF.PTR ldy OUTBUF.PTR
lda OUTBUF,x lda OUTBUF,y
ldy DEV.DATA.BFFF
sta $BFFF,y sta SSC.DATA,x
dec OUTBUF.CNT dec OUTBUF.CNT
txa get back OUTBUF.PTR tya get back OUTBUF.PTR
inc inc
and #BUF.MASK and #BUF.MASK
sta OUTBUF.PTR sta OUTBUF.PTR
clc
rts
.11 lda #SSC.CMD.TE+SSC.CMD.DTR bra .2
sta SSC.CMD,x
.8 lda #$ff did we finally handle and IRQ condtion ?
beq .9
clc clc
rts rts
*------------ IRQ CTS High
.2
.8 clc
rts
.9 sec .9 sec
rts rts
@ -317,8 +320,14 @@ OUTBUF.PTR .BS 1
OUTBUF.CNT .BS 1 OUTBUF.CNT .BS 1
INBUF .BS BUF.SIZE INBUF .BS BUF.SIZE
OUTBUF .BS BUF.SIZE OUTBUF .BS BUF.SIZE
DEVINFO .DA #S.DEVINFO.TYPE.CHAR *--------------------------------------
STAT .DA #S.DEVSTAT.S.WRITE+S.DEVSTAT.S.READ+S.DEV.S.IRQ
.DA #0,#0,#0
>PSTR "Serial Card/Port"
.DA #S.DEVSTAT.TYPE.CHAR
.DA #0 .DA #0
.DA $0900
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE DRV/SSC.DRV.I.S SAVE DRV/SSC.DRV.I.S

View File

@ -412,8 +412,8 @@ S.DEV.S.WENABL .EQ %00000100
S.DEV.S.IRQ .EQ %00000010 S.DEV.S.IRQ .EQ %00000010
S.DEV.S.OPENED .EQ %00000001 S.DEV.S.OPENED .EQ %00000001
S.DEV.F .EQ 3 S.DEV.F .EQ 3
S.DEV.F.IRQ .EQ %10000000 Device is irq driven *S.DEV.F.IRQ .EQ %10000000 Device is irq driven
S.DEV.F.EVENT .EQ %01000000 Device is event driven *S.DEV.F.EVENT .EQ %01000000 Device is event driven
S.DEV.F.LEN .EQ %00000111 Len S.DEV.F.LEN .EQ %00000111 Len
S.DEV.NAME .EQ 4 4 MAX S.DEV.NAME .EQ 4 4 MAX
* *
@ -429,6 +429,7 @@ DEVMGR.OPEN .EQ 12
DEVMGR.CLOSE .EQ 14 DEVMGR.CLOSE .EQ 14
DEVMGR.READ .EQ 16 DEVMGR.READ .EQ 16
DEVMGR.WRITE .EQ 18 DEVMGR.WRITE .EQ 18
DEVMGR.IRQ .EQ 20
*-------------------------------------- *--------------------------------------
S.DEVSTAT.S .EQ 0 S.DEVSTAT.S .EQ 0
S.DEVSTAT.S.BLOCK .EQ %10000000 S.DEVSTAT.S.BLOCK .EQ %10000000

View File

@ -115,9 +115,9 @@ note : '$VAR' does NOT expand Variable
| Name | Status | Comment | K.Ver | | Name | Status | Comment | K.Ver |
| ---- | ------ | ------- | ----- | | ---- | ------ | ------- | ----- |
| Console.DRV | Working | ANSI support in Progress. | 0.9 | | Console.DRV | Working | ANSI support in Progress. | 0.9 |
| SSC.DRV | Working | Apple "Super Serial Card" Driver | 0.9 |
| SSC.I.DRV | Working | Apple "Super Serial Card" Driver (IRQ enabled) | 0.9 |
| PIC.DRV | In Progress | Apple "Parallel Interface Card" Driver, renamed from PPIC.DRV | 0.8 | | PIC.DRV | In Progress | Apple "Parallel Interface Card" Driver, renamed from PPIC.DRV | 0.8 |
| SSC.DRV | In Progress | Apple "Super Serial Card" Driver | 0.8 |
| SSC.I.DRV | In Progress | Apple "Super Serial Card" Driver (IRQ enabled) | 0.8 |
| Mouse.DRV | Working | Apple Mouse Card,//c Mouse Port | 0.9 | | Mouse.DRV | Working | Apple Mouse Card,//c Mouse Port | 0.9 |
| DHGR.DRV | In Progress | except bitblt... | 0.8 | | DHGR.DRV | In Progress | except bitblt... | 0.8 |
| Uthernet.DRV | Working | | 0.9 | | Uthernet.DRV | Working | | 0.9 |

View File

@ -135,7 +135,7 @@ DevMgr.NUL .DA DevMgr.NUL.Code
.HS 00 NAME must Be 4 bytes long .HS 00 NAME must Be 4 bytes long
*-------------------------------------- *--------------------------------------
DevMgr.SYS .DA DevMgr.SYS.Code DevMgr.SYS .DA DevMgr.SYS.Code
.DA #S.DEV.S.WRITE+S.DEV.S.READ+3 .DA #S.DEV.S.WRITE+S.DEV.S.READ
.DA #3 .DA #3
.AS "SYS" NAME .AS "SYS" NAME
.HS 00 NAME must Be 4 bytes long .HS 00 NAME must Be 4 bytes long

View File

@ -1,6 +1,6 @@
PR#3 PR#3
PREFIX /A2OSX.SRC PREFIX /A2OSX.SRC
NEW LOMEM $A00
INC 1 INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
@ -61,25 +61,23 @@ K.IrqHandler >LDYAI DevMgr.Table
ldx DevMgr.Count ldx DevMgr.Count
.1 lda ($fe) End Of Table ? .1 ldy #S.DEV.S
sec
beq .8
ldy #S.DEV.F
lda ($fe),y lda ($fe),y
and #S.DEV.F.IRQ and #S.DEV.S.IRQ
beq .2 beq .2
phx phx
jsr K.IrqHandlerJMP jsr K.IrqHandlerJMP
plx plx
bcc .8 CC, IRQ cleared by device bcc .8 CC, IRQ cleared by device
.2 lda $fe CS, .2 lda $fe
adc #S.DEV-1 clc
adc #S.DEV
sta $fe sta $fe
bcc .3 bcc .3
inc $ff inc $ff
.3 dex .3 dex
bne .1 bne .1
@ -87,8 +85,13 @@ K.IrqHandler >LDYAI DevMgr.Table
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
K.IrqHandlerJMP ldx #DEVMGR.READ K.IrqHandlerJMP lda ($fe)
jmp ($fe) sta .1+1
ldy #1
lda ($fe),y
sta .1+2
ldx #DEVMGR.IRQ
.1 jmp $ffff
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE SYS/KERNEL.S.IRQ SAVE SYS/KERNEL.S.IRQ