A2osX/SHARED/X.SSC.DRV.S.txt
2025-01-19 17:12:51 +01:00

890 lines
14 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.

NEW
AUTO 3,1
.OP 65C02
.OR $2000
*--------------------------------------
.DO SSCIRQ=1
.TF drv/ssc.i.drv
.ELSE
.TF drv/ssc.drv
.FIN
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPArgPtr .BS 2
ZPSlotPtr .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp Dev.Detect cld,jmp abs=DRV
.DA #$61 6502,Level 1 (65c02)
.DA #2 DRV Layout Version 2
.DA 0
.DA CS.END
.DA ID.END
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
L.MSG.DETECT .DA MSG.DETECT
L.MSG.DETECT.OK .DA MSG.DETECT.OK
L.MSG.DETECT.KO .DA MSG.DETECT.KO
L.DRV.CS.START .DA DRV.CS.START
L.FD.DEV .DA FD.DEV
L.FD.DEV.NAME .DA FD.DEV.NAME
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >STYA ZPArgPtr
>LDYA L.MSG.DETECT
>LIBC PutS
stz ZPSlotPtr
lda #$C1
sta ZPSlotPtr+1
.1 and #$0f
tay
lda A2osX.S-1,y
bne .3
ldx #DEVSIG.Length-1
.2 ldy DEVSIG.Offset,x
lda (ZPSlotPtr),y
cmp DEVSIG.Value,x
bne .3
dex
bpl .2
bra .4
.3 inc FD.DEV.NAME+8
inc ZPSlotPtr+1 no match, try next slot....
lda ZPSlotPtr+1
cmp #$C8
bne .1
>LDYA L.MSG.DETECT.KO
>LIBC PutS
lda #MLI.E.NODEV Not Found in any slot, exiting
sec
.99 rts
.4 lda ZPSlotPtr+1
asl
asl
asl
asl
clc
adc #$8F
sta DEVSLOTn08F
jsr Dev.ParseArgs
bcs .99
*--------------------------------------
Dev.Setup >SS
>PUSHW L.MSG.DETECT.OK
>PUSHW L.FD.DEV.NAME
>PUSHBI 2
>LIBC PrintF
>SR
>SS
>PUSHW L.DRV.CS.START
>PUSHWI DRV.CS.START
>PUSHWI DRV.CS.END
>PUSHWI DRV.ID.END
>LIBC InsDrv
>SR
bcs .9
>STYA FD.DEV+S.FD.DEV.pDRV
>SS
>PUSHW L.FD.DEV
>PUSHW L.FD.DEV.NAME
>LIBC MKDev
>SR
bcs .9
lda ZPSlotPtr+1
and #$0F
tay
lda #A2osX.S.COM
sta A2osX.S-1,y
* clc
.9 rts
*--------------------------------------
Dev.ParseArgs lda (ZPArgPtr)
bne .1
clc
rts
.1 stz DCB+S.DCB.COM.BAUD
stz DCB+S.DCB.COM.BAUD+1
stz DCB+S.DCB.COM.BAUD+2
stz DCB+S.DCB.COM.BAUD+3
.2 jsr DevNextChar
beq .90
cmp #','
beq .3
jsr Dev.IsDigit
bcs .90
jsr Dev.BaudT10pA
bra .2
.3 jsr Dev.CheckBaud
bcs .99
jsr DevNextChar
beq .99
ldx #P2.Cnt-1
.4 cmp P2,x
beq .5
dex
bpl .4
.90 bra .99
.5 lda #%11100000
trb DEVCMD
txa
asl
asl
asl
asl
asl
tsb DEVCMD
jsr DevCheckSep
bcs .99
ldx #P3.Cnt-1
.6 cmp P3,x
beq .7
dex
bpl .6
bra .99
.7 lda #%01100000
trb DEVCTL
txa
asl
asl
asl
asl
asl
tsb DEVCTL
jsr DevCheckSep
bcs .99
ldx #P4.Cnt-1
.8 cmp P4,x
beq .9
dex
bpl .8
bra .99
.9 lda #%10000000
trb DEVCTL
txa
rol
rol
tsb DEVCTL
jsr DevCheckSep
bcs .99
ldx #P5.Cnt-1
.10 cmp P5,x
beq .11
dex
bpl .10
bra .99
.11 stx DEVFLOWCTRL
clc
rts
.99 lda #E.SYN
sec
rts
*--------------------------------------
DevCheckSep jsr DevNextChar
beq .9
cmp #','
bne .9
jsr DevNextChar
beq .9
clc
rts
.9 sec
rts
*--------------------------------------
DevNextChar lda (ZPArgPtr)
beq .9
inc ZPArgPtr
bne .9
inc ZPArgPtr+1
.9 rts
*--------------------------------------
Dev.IsDigit cmp #'0'
bcc .9
cmp #'9'+1
bcs .99
and #$0F
rts
.9 sec
.99 rts
*--------------------------------------
Dev.BaudT10pA pha
>PUSHL DCB+S.DCB.COM.BAUD
>PUSHBI 0
>PUSHBI 0
>PUSHBI 0
>PUSHBI 10
>FPU uMUL
>PUSHBI 0
>PUSHBI 0
>PUSHBI 0
pla
>PUSHA
>FPU uADD
>PULLL DCB+S.DCB.COM.BAUD
rts
*--------------------------------------
Dev.CheckBaud ldx #0
.1 txa
asl
asl
tay
lda DCB+S.DCB.COM.BAUD
cmp P1,y
bne .7
lda DCB+S.DCB.COM.BAUD+1
cmp P1+1,y
bne .7
lda DCB+S.DCB.COM.BAUD+2
cmp P1+2,y
bne .7
lda DCB+S.DCB.COM.BAUD+3
cmp P1+3,y
bne .7
lda #$F
trb DEVCTL
txa
tsb DEVCTL
clc
rts
.7 inx
cpx #P1.Cnt
bcc .1
rts
*--------------------------------------
CS.END .EQ *
*--------------------------------------
DEVSIG.Offset .HS 05070B0C
DEVSIG.Value .HS 38180131
DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset
MSG.DETECT .CS "Apple SSC (Super Serial Card,//c Serial Port) Driver"
.DO SSCIRQ=1
.CS " (IRQ Enabled)"
.FIN
.CZ "."
MSG.DETECT.OK .CZ "SSC Installed As Device : %s\r\n"
MSG.DETECT.KO .CZ "No SSC Found."
*--------------------------------------
P1 .DA >115200 Baud
.DA >50
.DA >75
.DA >110
.DA >135
.DA >150
.DA >300
.DA >600
.DA >1200
.DA >1800
.DA >2400
.DA >3600
.DA >4800
.DA >7200
.DA >9600
.DA >19200
P1.Cnt .EQ 16
*--------------------------------------
P2 .AS "NOEMS" Parity
P2.Cnt .EQ *-P2
*--------------------------------------
P3 .AS "8765" Data
P3.Cnt .EQ *-P3
*--------------------------------------
P4 .AS "12" Stop
P4.Cnt .EQ *-P4
*--------------------------------------
P5 .AS "NHX" flow Control
P5.Cnt .EQ *-P5
*--------------------------------------
FD.DEV .DA #S.FD.T.CDEV
.DA #0 HANDLER
.DA #0 BUSID
.DA #0 DEVID
.DA 0 BUSPTR
.BS 2 DRVPTR
.DA 0 DCBPTR
.DA 0 BUFPTR
FD.DEV.NAME .AZ "/dev/com1"
*--------------------------------------
* Driver Code
*--------------------------------------
.DUMMY
.OR ZPDRV+4
ZPIOCTL .BS 2
ZPReadCnt .BS 2
.ED
*--------------------------------------
DRV.CS.START cld
jmp (.1,x)
.1 .DA STATUS
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA CONTROL
.DA A2osX.BADCALL
.DA OPEN
.DA CLOSE
.DA READ
.DA WRITE
.DO SSCIRQ=1
.DA IRQ
.FIN
.DA 0 end or relocation
*--------------------------------------
STATUS jsr STATUS.CONTROL.Init
ldy #S.IOCTL.S
lda (ZPIOCTL),y
beq .1
cmp #S.IOCTL.S.GETDIB
bne STATUS.DCB
ldy #S.DIB-1
.HS 2C bit abs
.1 ldy #3
bit A2osX.IOOpt
bpl .2
sta IO.SETWRITEAUX
.2 lda DIB,y
sta (ZPpBuf),y
dey
bpl .2
sta IO.CLRWRITEAUX
clc
rts
STATUS.DCB cmp #S.IOCTL.S.GETDCB
bne .3
ldy #S.DCB.COM-1
bit A2osX.IOOpt
bpl .2
sta IO.SETWRITEAUX
.2 lda DCB,y
sta (ZPpBuf),y
dey
bpl .2
sta IO.CLRWRITEAUX
clc
rts
.3 cmp #S.IOCTL.S.EOF
bne STATUS.9
lda DIB+S.DIB.S
and #S.DIB.S.OPENED
beq OPEN.E
.DO SSCIRQ=1
lda INBUF.TAIL
eor INBUF.HEAD
beq .4 NO DATA? eof = TRUE
lda #1
.4 dec
clc
rts
.ELSE
ldx DEVSLOTn08F
lda SSC.STATUS-$8F,x
and #SSC.STATUS.RDRF
beq .4
lda #1
.4 dec
.FIN
.8 clc
rts
STATUS.9 lda #MLI.E.BADCTL
sec
rts
*--------------------------------------
CONTROL jsr STATUS.CONTROL.Init
ldy #S.IOCTL.C
lda (ZPIOCTL),y
cmp #S.IOCTL.C.SETDCB
bne STATUS.9
ldy #S.DCB.COM-1
.2 jsr A2osX.GetpBuf
sta DCB,y
>INCW ZPpBuf
dey
bpl .2
*--------------------------------------
OPEN lda DIB+S.DIB.S
bit #S.DIB.S.OPENED
beq OPEN.1
OPEN.E lda #MLI.E.OPEN
sec
rts
OPEN.1 php
sei
.DO SSCIRQ=1
>LDYAI 256
>KAPI2 Malloc
bcs .99
>STYA READ.INBUF+1
>STYA IRQ.INBUF+1
>LDYAI 256
>KAPI2 Malloc
bcs .90
>STYA WRITE.OUTBUF+1
>STYA IRQ.OUTBUF+1
stz INBUF.HEAD
stz INBUF.TAIL
stz OUTBUF.HEAD
stz OUTBUF.TAIL
.FIN
ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
lda DEVCTL
sta SSC.CTL-$8F,x
lda DEVCMD
sta SSC.CMD-$8F,x
lda SSC.DATA-$8F,x discard any garbage byte
lda SSC.STATUS-$8F,x clear any IRQ pending
lda #S.DIB.S.OPENED
tsb DIB+S.DIB.S
plp
clc
rts
.DO SSCIRQ=1
.90 pha
>LDYA READ.INBUF+1
>KAPI2 Free
pla
.99 plp
sec
rts
.FIN
*--------------------------------------
CLOSE lda DIB+S.DIB.S
bit #S.DIB.S.OPENED
beq OPEN.E
php
sei
ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
.DO SSCIRQ=1
>LDYA READ.INBUF+1
>KAPI2 Free
>LDYA WRITE.OUTBUF+1
>KAPI2 Free
.FIN
lda #S.DIB.S.OPENED
trb DIB+S.DIB.S
plp
clc
rts
*--------------------------------------
READ php
sei
jsr READ.WRITE.Init
stz ZPReadCnt
stz ZPReadCnt+1
READ.10 inc ZPCnt
bne READ.11
inc ZPCnt+1
beq READ.8
READ.11 .DO SSCIRQ=1
ldy INBUF.TAIL
cpy INBUF.HEAD
beq READ.2
READ.INBUF lda $FFFF,y SELF MODIFIED
inc INBUF.TAIL
sta IO.SETWRITEAUX
sta (ZPpBuf)
sta IO.CLRWRITEAUX
>INCW ZPpBuf
inc ZPReadCnt
bne READ.10
inc ZPReadCnt+1
bra READ.10
.FIN
*--------------------------------------
READ.2 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne READ.9
bit #SSC.STATUS.RDRF incoming char?
beq READ.8
lda SSC.DATA-$8F,x
sta IO.SETWRITEAUX
sta (ZPpBuf)
sta IO.CLRWRITEAUX
>INCW ZPpBuf
inc ZPReadCnt
bne READ.2
inc ZPReadCnt+1
bra READ.2
READ.8 lda ZPReadCnt
bne READ.81
ora ZPReadCnt+1
beq READ.99
lda ZPReadCnt
READ.81 ldy #S.IOCTL.BYTECNT
sta (ZPIOCTL),y
iny
lda ZPReadCnt+1
sta (ZPIOCTL),y
plp
clc
rts
READ.9 lda #MLI.E.IO
plp
sec
rts
READ.99 lda #E.NODATA
plp
sec
rts
*--------------------------------------
WRITE php
sei
jsr READ.WRITE.Init
WRITE.2 inc ZPCnt
bne WRITE.3
inc ZPCnt+1
beq WRITE.8
WRITE.3 .DO SSCIRQ=1
lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne WRITE.9
lda OUTBUF.HEAD
cmp OUTBUF.TAIL Buffer Empty?
bne WRITE.6 not empty, queue char
lda SSC.STATUS-$8F,x
and #SSC.STATUS.TDRE Register Empty ?
beq WRITE.5 not empty, queue char
jsr A2osX.GetpBuf yes, write directly to ACIA
sta SSC.DATA-$8F,x
inc ZPpBuf
bne WRITE.2
inc ZPpBuf+1
bra WRITE.2
WRITE.5 lda OUTBUF.HEAD
WRITE.6 tay
inc
cmp OUTBUF.TAIL
beq WRITE.99 Buffer Full!!
sta OUTBUF.HEAD
jsr A2osX.GetpBuf
WRITE.OUTBUF sta $FFFF,y SELF MODIFIED
inc ZPpBuf
bne WRITE.2
inc ZPpBuf+1
bra WRITE.2
.ELSE
WRITE.4 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne WRITE.9
bit #SSC.STATUS.TDRE Outgoing char?
beq WRITE.4
jsr A2osX.GetpBuf
sta SSC.DATA-$8F,x
inc ZPpBuf
bne WRITE.2
inc ZPpBuf+1
bra WRITE.2
.FIN
WRITE.8 plp
clc
rts
WRITE.9 lda #MLI.E.IO
plp
sec
rts
WRITE.99 lda #E.NODATA
plp
sec
rts
*--------------------------------------
READ.WRITE.Init ldx DEVSLOTn08F
STATUS.CONTROL.Init
>STYA ZPIOCTL
ldy #S.IOCTL.BUFPTR
lda (ZPIOCTL),y
sta ZPpBuf
iny
lda (ZPIOCTL),y
sta ZPpBuf+1
iny #S.IOCTL.BYTECNT
lda (ZPIOCTL),y
eor #$ff
sta ZPCnt
iny
lda (ZPIOCTL),y
eor #$ff
sta ZPCnt+1
rts
*--------------------------------------
* IRQ Handler
* on exit, CC if handled
*--------------------------------------
.DO SSCIRQ=1
IRQ ldx DEVSLOTn08F
lda SSC.STATUS-$8F,x
* and #SSC.STATUS.IRQ Useless
bpl IRQ.9 IRQ from this device ? no, exit !!!!Applewin bug #308!!!!
bit #SSC.STATUS.RDRF incoming char?
beq IRQ.2
*------------ IRQ In
pha
lda INBUF.HEAD
tay save actual head for later
inc
cmp INBUF.TAIL
beq IRQ.1 buffer full, discard and exit
sta INBUF.HEAD
lda SSC.DATA-$8F,x read data to clear IRQ
IRQ.INBUF sta $FFFF,y SELF MODIFIED
IRQ.1 pla
*------------ IRQ Out
IRQ.2 bit #SSC.STATUS.TDRE
beq IRQ.8 no transmission possible....
ldy OUTBUF.TAIL something to transmit ?
cpy OUTBUF.HEAD
beq IRQ.8 in that case, HOW TO CLEAR IRQ ????
IRQ.OUTBUF lda $FFFF,y SELF MODIFIED
sta SSC.DATA-$8F,x write data to clear IRQ
inc OUTBUF.TAIL
IRQ.8 clc
rts
IRQ.9 sec
rts
.FIN
*--------------------------------------
DRV.CS.END .EQ *
*--------------------------------------
DEVSLOTn08F .BS 1
.DO SSCIRQ=1
DEVCMD .DA #SSC.CMD.NOP+SSC.CMD.TEIRQ+SSC.CMD.DTR
DEVCTL .DA #SSC.CTL.1S+SSC.CTL.8D+SSC.CTL.CLKINT+SSC.CTL.B9600
.ELSE
DEVCMD .DA #SSC.CMD.NOP+SSC.CMD.TE+SSC.CMD.RIRQDIS+SSC.CMD.DTR
DEVCTL .DA #SSC.CTL.1S+SSC.CTL.8D+SSC.CTL.CLKINT+SSC.CTL.B115200
.FIN
DEVFLOWCTRL .BS 1
.DO SSCIRQ=1
INBUF.TAIL .BS 1
INBUF.HEAD .BS 1
OUTBUF.TAIL .BS 1
OUTBUF.HEAD .BS 1
.FIN
*--------------------------------------
DIB .DO SSCIRQ=1
.DA #S.DIB.S.WRITE+S.DIB.S.READ+S.DIB.S.IRQ
.ELSE
.DA #S.DIB.S.WRITE+S.DIB.S.READ
.FIN
.DA #0,#0,#0
.PS "Serial Card/Port"
.DA #S.DIB.T.CHAR
.DA #0
.DA K.VER
*--------------------------------------
DCB .DA #S.DCB.T.COM
.DA #0 FLAGS
.DO SSCIRQ=1
.DA >9600 BAUD (DWORD)
.ELSE
.DA >115200
.FIN
.DA #8 DATA
.DA #1 STOP
.DA #'N' PARITY
.DA #'N' FLOW
*--------------------------------------
DRV.ID.END .EQ *
*--------------------------------------
ID.END .EQ *
*--------------------------------------
MAN
SAVE usr/src/shared/x.ssc.drv.s
LOAD usr/src/drv/ssc.i.drv.s
ASM