A2osX/DRV/PPPSSC.DRV.S.txt
2021-03-11 22:40:55 +01:00

1169 lines
22 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
.LIST OFF
.OP 65C02
.OR $2000
.TF drv/pppssc.drv
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.e.i
.INB inc/com.i
.INB inc/com.6551.i
.INB inc/nic.i
*--------------------------------------
INBUF.SIZE .EQ $800
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPArgsPtr .BS 2
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPBufLen .BS 2
ZPIOCTL .BS 2
ZPBufPtr .BS 2
ZPCount .BS 2
ZPCount2 .BS 2
FCS .BS 2
Len .BS 1
hETCFILE .BS 1
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp Dev.Detect cld,jmp abs=DRV
.DA #$61 6502,Level 1 (65c02)
.DA #1 DRV Layout Version 1
.DA 0
.DA CS.END-CS.START Code Length
.DA 0
.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
L.ETCFILE .DA ETCFILE
L.MSG.ETCFILE .DA MSG.ETCFILE
L.MSG.UNEXPECTED .DA MSG.UNEXPECTED
L.MSG.SYNTAX .DA MSG.SYNTAX
L.MSG.DUMPBUF .DA MSG.DUMPBUFS
.DA MSG.DUMPBUFR
L.MSG.HEXDUMP .DA MSG.HEXDUMP
L.PPP.LCPReq .DA PPP.LCPReq
L.PPP.IPCPReq .DA PPP.IPCPReq
L.FILE.Buf .DA FILE.Buf
L.FILE.Bufp1 .DA FILE.Buf+1
L.RCV.Buf .DA RCV.Buf
L.RCV.Bufp1 .DA RCV.Buf+1
L.RCV.Bufp2 .DA RCV.Buf+2
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >STYA ZPArgsPtr
>LDYA L.MSG.DETECT
>SYSCALL PutS
stz ZPPtr1
lda #$C1
sta ZPPtr1+1
.1 and #$0f
tay
lda A2osX.S,y
bne .3
ldx #DEVSIG.Length-1
.2 ldy DEVSIG.Offset,x
lda (ZPPtr1),y
cmp DEVSIG.Value,x
bne .3
dex
bpl .2
bra .4
.3 inc FD.DEV.NAME+3
inc ZPPtr1+1 no match, try next slot....
lda ZPPtr1+1
cmp #$C8
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL PutS
lda #MLI.E.NODEV Not Found in any slot, exiting
sec
rts
*--------------------------------------
.4 lda ZPPtr1+1
asl
asl
asl
asl
clc
adc #$8F
sta DEVSLOTn08F
jsr SSC.Init
jsr PPP.ETCFILE
bcs .99
jsr PPP.Init
bcs .99
>PUSHW L.MSG.DETECT.OK
>PUSHW L.FD.DEV.NAME
>PUSHBI 2
>SYSCALL PrintF
>PUSHWI DRV.END
>PUSHWI DRV.CS.END-DRV.CS.START
>PUSHWI DRV.CS.START
>LDYA L.DRV.CS.START
>SYSCALL InsDrv
.99 bcs .9
>STYA FD.DEV+S.FD.DEV.DRVPTR
>PUSHW L.FD.DEV
>PUSHW L.FD.DEV.NAME
>SYSCALL MKDev
bcs .9
lda FD.DEV.NAME+3
and #$0F
tax
lda #A2osX.S.NIC
sta A2osX.S,x
lda #0
sec
rts
.9 ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
Dev.Detect.RTS rts
*--------------------------------------
PPP.ETCFILE >PUSHW L.ETCFILE
>PUSHBI O.RDONLY
>PUSHBI 0
>PUSHWZ
>SYSCALL FOpen
bcs Dev.Detect.RTS
sta hETCFILE
>PUSHW L.MSG.ETCFILE
>PUSHW L.ETCFILE
>PUSHBI 2
>SYSCALL PrintF
.1 >PUSHB hETCFILE
>PUSHW L.FILE.Buf
>PUSHWI 255
>SYSCALL FGetS
bcs .8
lda FILE.Buf
beq .1
cmp #'#'
beq .1
>LDYA L.FILE.Buf
>SYSCALL PutS
lda FILE.Buf
cmp #'>'
bne .2
>LDYA L.FILE.Bufp1
jsr SSC.WriteYA
bcs .9
.10 bra .1
.2 cmp #'?'
bne .7
*--------------------------------------
.3 jsr SSC.Read
bcs .9
tya
beq .3
lda #0
sta RCV.Buf,y
>LDYA L.RCV.Buf
>STYA ZPPtr2
.4 jsr PPP.SkipCRLFPtr2
bcs .3
ldy #$ff
.5 iny
lda FILE.Buf+1,y skip !
beq .10
.6 cmp (ZPPtr2),y
beq .5
lda (ZPPtr2),y
beq .60
cmp #C.CR
beq .60
jsr PPP.ETCFILE.ERR1
bra .9
.60 jsr PPP.NextStrPtr2
lda (ZPPtr2)
bne .4
.7 jsr PPP.ETCFILE.ERR2
bra .9
.8 cmp #MLI.E.EOF
sec
bne .9
lda #0
clc
.9 php
pha
lda hETCFILE
>SYSCALL FClose
pla
plp
rts
*--------------------------------------
PPP.SkipCRLFPtr2
.1 lda (ZPPtr2)
beq .9
cmp #C.CR
bne .8
ldy #1
lda (ZPPtr2),y
beq .9
cmp #C.LF
bne .2
iny
.2 tya
clc
adc ZPPtr2
sta ZPPtr2
bcc .1
inc ZPPtr2+1
bra .1
.8 clc
rts
.9 sec
rts
*--------------------------------------
PPP.NextStrPtr2 ldy #$ff
.1 iny
lda (ZPPtr2),y
beq .2
cmp #C.CR
bne .1
.2 tya
clc
adc ZPPtr2
sta ZPPtr2
bcc .8
inc ZPPtr2+1
.8 rts
*--------------------------------------
PPP.ETCFILE.ERR1
>PUSHW L.MSG.UNEXPECTED
>PUSHW L.RCV.Buf
>PUSHBI 2
>SYSCALL PrintF
lda #MLI.E.IO
sec
rts
*--------------------------------------
PPP.ETCFILE.ERR2
>PUSHW L.MSG.SYNTAX
>PUSHW L.FILE.Buf
>PUSHBI 2
>SYSCALL PrintF
lda #MLI.E.IO
sec
rts
*--------------------------------------
PPP.Init >LDYAI PPP.LCPReq.LEN
>STYA ZPBufLen
>LDYA L.PPP.LCPReq
jsr PPPFCS16
>LDYA L.PPP.LCPReq
ldx #0
jsr DumpBuf
>LDYA L.PPP.LCPReq
ldx #PPP.LCPReq.LEN
jsr SSC.WriteYAX
bcs .9
.1 jsr SSC.Read
bcs .9
tya
beq .1
sty ZPBufLen
stz ZPBufLen+1
>LDYA L.RCV.Buf
ldx #2
jsr DumpBuf
>LDYAI PPP.IPCPReq.LEN
>STYA ZPBufLen
>LDYA L.PPP.IPCPReq
jsr PPPFCS16
>LDYA L.PPP.IPCPReq
ldx #0
jsr DumpBuf
>LDYA L.PPP.IPCPReq
ldx #PPP.IPCPReq.LEN
jsr SSC.WriteYAX
bcs .9
.2 jsr SSC.Read
bcs .9
tya
beq .2
sty ZPBufLen
stz ZPBufLen+1
>LDYA L.RCV.Buf
ldx #2
jsr DumpBuf
sec
* clc
.9 rts
*--------------------------------------
SSC.Init ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
lda #SSC.CTL.1S+SSC.CTL.8D+SSC.CTL.CLKINT+SSC.CTL.B115200
sta SSC.CTL-$8F,x
lda #SSC.CMD.NOP+SSC.CMD.TE+SSC.CMD.RIRQDIS+SSC.CMD.DTR
sta SSC.CMD-$8F,x
lda SSC.DATA-$8F,x discard any garbage byte
lda SSC.STATUS-$8F,x clear any IRQ pending
rts
*--------------------------------------
SSC.WriteYA >STYA ZPPtr1
ldy #$ff
.1 iny
lda (ZPPtr1),y
bne .1
lda #C.CR
sta (ZPPtr1),y
iny
lda #C.LF
sta (ZPPtr1),y
iny
sty Len
bra SSC.Write
SSC.WriteYAX >STYA ZPPtr1
stx Len
SSC.Write php
sei
ldx DEVSLOTn08F
ldy #0
.1 phy
ldy #0
.2 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne .9
bit #SSC.STATUS.TDRE Register Empty ?
bne .3
iny
bne .2
.9 pla
lda #MLI.E.IO
plp
sec
rts
.3 ply
lda (ZPPtr1),y
pha
and #$7F
cmp #C.XON
beq .4
cmp #C.XOFF
bne .6
.4 lda #$7D
sta SSC.DATA-$8F,x
.5 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.TDRE
beq .5
pla
ora #$20
.HS F0 BEQ
.6 pla
sta SSC.DATA-$8F,x
iny
cpy Len
bne .1
plp
clc
rts
*--------------------------------------
SSC.Read php
sei
ldx DEVSLOTn08F
ldy #0
.1 phy
ldy #0
.2 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne .9
bit #SSC.STATUS.RDRF incoming char?
bne .3
iny
bne .2
ply
plp
clc
rts
.3 ply
lda SSC.DATA-$8F,x
sta RCV.Buf,y
iny
bra .1
.9 lda #MLI.E.IO
plp
sec
rts
*--------------------------------------
DumpBuf >STYA ZPPtr1
>PUSHW L.MSG.DUMPBUF,x
>PUSHW ZPBufLen
>PUSHBI 2
>SYSCALL PrintF
bcs .9
lda (ZPPtr1)
cmp #$0D
bne DumpBuf.PPP
lda ZPBufLen
eor #$ff
sta ZPBufLen
lda ZPBufLen+1
eor #$ff
sta ZPBufLen+1
.1 inc ZPBufLen
bne .2
inc ZPBufLen+1
beq .9
.2 lda (ZPPtr1)
inc ZPPtr1
bne .3
inc ZPPtr1+1
.3 cmp #$0D
beq .4
cmp #$0A
beq .4
cmp #C.SPACE
bcs .4
ora #$20
.4 >SYSCALL PutChar
bcc .1
.9 rts
DumpBuf.PPP stz ZPPtr2
stz ZPPtr2+1
.1 >PUSHW L.MSG.HEXDUMP
>PUSHW ZPPtr2
ldy #0
.2 >PUSHB (ZPPtr1),y
iny
cpy #8
bne .2
>PUSHBI 10
>SYSCALL PrintF
bcs .9
lda ZPPtr1
adc #8
sta ZPPtr1
lda ZPPtr1+1
adc #0
sta ZPPtr1+1
lda ZPPtr2
adc #8
sta ZPPtr2
lda ZPPtr2+1
adc #0
sta ZPPtr2+1
lda ZPBufLen
sec
sbc #8
sta ZPBufLen
lda ZPBufLen+1
sbc #0
sta ZPBufLen+1
bcc .9
ora ZPBufLen
bne .1
clc
.9 rts
*--------------------------------------
PPPFCS16 >STYA ZPPtr1
lda #$ff
sta FCS
sta FCS+1
lda ZPBufLen
sec
sbc #4 minus 7E .... FCS FCS 7E
eor #$ff
sta ZPPtr2
lda ZPBufLen+1
sbc #0
eor #$ff
sta ZPPtr2+1
.1 inc ZPPtr2
bne .2
inc ZPPtr2+1
beq .8
.2 inc ZPPtr1 skip First 7E
bne .3
inc ZPPtr1+1
.3 lda (ZPPtr1)
eor FCS
tax
lda FCS.LO,x
eor FCS+1
sta FCS
lda FCS.HI,x
sta FCS+1
bra .1
.8 lda FCS+1
eor #$ff
ldy #1
sta (ZPPtr1),y
lda FCS
eor #$ff
iny
sta (ZPPtr1),y
rts
*--------------------------------------
CS.END
FCS.LO .DA #$0000,#$1189,#$2312,#$329b,#$4624,#$57ad,#$6536,#$74bf
.DA #$8c48,#$9dc1,#$af5a,#$bed3,#$ca6c,#$dbe5,#$e97e,#$f8f7
.DA #$1081,#$0108,#$3393,#$221a,#$56a5,#$472c,#$75b7,#$643e
.DA #$9cc9,#$8d40,#$bfdb,#$ae52,#$daed,#$cb64,#$f9ff,#$e876
.DA #$2102,#$308b,#$0210,#$1399,#$6726,#$76af,#$4434,#$55bd
.DA #$ad4a,#$bcc3,#$8e58,#$9fd1,#$eb6e,#$fae7,#$c87c,#$d9f5
.DA #$3183,#$200a,#$1291,#$0318,#$77a7,#$662e,#$54b5,#$453c
.DA #$bdcb,#$ac42,#$9ed9,#$8f50,#$fbef,#$ea66,#$d8fd,#$c974
.DA #$4204,#$538d,#$6116,#$709f,#$0420,#$15a9,#$2732,#$36bb
.DA #$ce4c,#$dfc5,#$ed5e,#$fcd7,#$8868,#$99e1,#$ab7a,#$baf3
.DA #$5285,#$430c,#$7197,#$601e,#$14a1,#$0528,#$37b3,#$263a
.DA #$decd,#$cf44,#$fddf,#$ec56,#$98e9,#$8960,#$bbfb,#$aa72
.DA #$6306,#$728f,#$4014,#$519d,#$2522,#$34ab,#$0630,#$17b9
.DA #$ef4e,#$fec7,#$cc5c,#$ddd5,#$a96a,#$b8e3,#$8a78,#$9bf1
.DA #$7387,#$620e,#$5095,#$411c,#$35a3,#$242a,#$16b1,#$0738
.DA #$ffcf,#$ee46,#$dcdd,#$cd54,#$b9eb,#$a862,#$9af9,#$8b70
.DA #$8408,#$9581,#$a71a,#$b693,#$c22c,#$d3a5,#$e13e,#$f0b7
.DA #$0840,#$19c9,#$2b52,#$3adb,#$4e64,#$5fed,#$6d76,#$7cff
.DA #$9489,#$8500,#$b79b,#$a612,#$d2ad,#$c324,#$f1bf,#$e036
.DA #$18c1,#$0948,#$3bd3,#$2a5a,#$5ee5,#$4f6c,#$7df7,#$6c7e
.DA #$a50a,#$b483,#$8618,#$9791,#$e32e,#$f2a7,#$c03c,#$d1b5
.DA #$2942,#$38cb,#$0a50,#$1bd9,#$6f66,#$7eef,#$4c74,#$5dfd
.DA #$b58b,#$a402,#$9699,#$8710,#$f3af,#$e226,#$d0bd,#$c134
.DA #$39c3,#$284a,#$1ad1,#$0b58,#$7fe7,#$6e6e,#$5cf5,#$4d7c
.DA #$c60c,#$d785,#$e51e,#$f497,#$8028,#$91a1,#$a33a,#$b2b3
.DA #$4a44,#$5bcd,#$6956,#$78df,#$0c60,#$1de9,#$2f72,#$3efb
.DA #$d68d,#$c704,#$f59f,#$e416,#$90a9,#$8120,#$b3bb,#$a232
.DA #$5ac5,#$4b4c,#$79d7,#$685e,#$1ce1,#$0d68,#$3ff3,#$2e7a
.DA #$e70e,#$f687,#$c41c,#$d595,#$a12a,#$b0a3,#$8238,#$93b1
.DA #$6b46,#$7acf,#$4854,#$59dd,#$2d62,#$3ceb,#$0e70,#$1ff9
.DA #$f78f,#$e606,#$d49d,#$c514,#$b1ab,#$a022,#$92b9,#$8330
.DA #$7bc7,#$6a4e,#$58d5,#$495c,#$3de3,#$2c6a,#$1ef1,#$0f78
*--------------------------------------
FCS.HI .DA /$0000,/$1189,/$2312,/$329b,/$4624,/$57ad,/$6536,/$74bf
.DA /$8c48,/$9dc1,/$af5a,/$bed3,/$ca6c,/$dbe5,/$e97e,/$f8f7
.DA /$1081,/$0108,/$3393,/$221a,/$56a5,/$472c,/$75b7,/$643e
.DA /$9cc9,/$8d40,/$bfdb,/$ae52,/$daed,/$cb64,/$f9ff,/$e876
.DA /$2102,/$308b,/$0210,/$1399,/$6726,/$76af,/$4434,/$55bd
.DA /$ad4a,/$bcc3,/$8e58,/$9fd1,/$eb6e,/$fae7,/$c87c,/$d9f5
.DA /$3183,/$200a,/$1291,/$0318,/$77a7,/$662e,/$54b5,/$453c
.DA /$bdcb,/$ac42,/$9ed9,/$8f50,/$fbef,/$ea66,/$d8fd,/$c974
.DA /$4204,/$538d,/$6116,/$709f,/$0420,/$15a9,/$2732,/$36bb
.DA /$ce4c,/$dfc5,/$ed5e,/$fcd7,/$8868,/$99e1,/$ab7a,/$baf3
.DA /$5285,/$430c,/$7197,/$601e,/$14a1,/$0528,/$37b3,/$263a
.DA /$decd,/$cf44,/$fddf,/$ec56,/$98e9,/$8960,/$bbfb,/$aa72
.DA /$6306,/$728f,/$4014,/$519d,/$2522,/$34ab,/$0630,/$17b9
.DA /$ef4e,/$fec7,/$cc5c,/$ddd5,/$a96a,/$b8e3,/$8a78,/$9bf1
.DA /$7387,/$620e,/$5095,/$411c,/$35a3,/$242a,/$16b1,/$0738
.DA /$ffcf,/$ee46,/$dcdd,/$cd54,/$b9eb,/$a862,/$9af9,/$8b70
.DA /$8408,/$9581,/$a71a,/$b693,/$c22c,/$d3a5,/$e13e,/$f0b7
.DA /$0840,/$19c9,/$2b52,/$3adb,/$4e64,/$5fed,/$6d76,/$7cff
.DA /$9489,/$8500,/$b79b,/$a612,/$d2ad,/$c324,/$f1bf,/$e036
.DA /$18c1,/$0948,/$3bd3,/$2a5a,/$5ee5,/$4f6c,/$7df7,/$6c7e
.DA /$a50a,/$b483,/$8618,/$9791,/$e32e,/$f2a7,/$c03c,/$d1b5
.DA /$2942,/$38cb,/$0a50,/$1bd9,/$6f66,/$7eef,/$4c74,/$5dfd
.DA /$b58b,/$a402,/$9699,/$8710,/$f3af,/$e226,/$d0bd,/$c134
.DA /$39c3,/$284a,/$1ad1,/$0b58,/$7fe7,/$6e6e,/$5cf5,/$4d7c
.DA /$c60c,/$d785,/$e51e,/$f497,/$8028,/$91a1,/$a33a,/$b2b3
.DA /$4a44,/$5bcd,/$6956,/$78df,/$0c60,/$1de9,/$2f72,/$3efb
.DA /$d68d,/$c704,/$f59f,/$e416,/$90a9,/$8120,/$b3bb,/$a232
.DA /$5ac5,/$4b4c,/$79d7,/$685e,/$1ce1,/$0d68,/$3ff3,/$2e7a
.DA /$e70e,/$f687,/$c41c,/$d595,/$a12a,/$b0a3,/$8238,/$93b1
.DA /$6b46,/$7acf,/$4854,/$59dd,/$2d62,/$3ceb,/$0e70,/$1ff9
.DA /$f78f,/$e606,/$d49d,/$c514,/$b1ab,/$a022,/$92b9,/$8330
.DA /$7bc7,/$6a4e,/$58d5,/$495c,/$3de3,/$2c6a,/$1ef1,/$0f78
*--------------------------------------
DEVSIG.Offset .HS 05070B0C
DEVSIG.Value .HS 38180131
DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset
MSG.DETECT .AZ "PPP Driver For Apple SSC."
MSG.DETECT.OK .AZ "PPP Installed As Device : %s\r\n"
MSG.DETECT.KO .AZ "No SSC Found."
ETCFILE .AZ "${ROOT}etc/ppp.conf"
*--------------------------------------
MSG.ETCFILE .AZ "Executing %s File...\r\n"
MSG.UNEXPECTED .AZ "\r\nERR:Unexpected reply From Modem\r\n{%s}\r\n"
MSG.SYNTAX .AZ "\r\nERR:Bad Syntax In ppp.conf\r\n{%s}\r\n"
MSG.DUMPBUFS .AZ "Send:%H\r\n"
MSG.DUMPBUFR .AZ "Recv:%H\r\n"
MSG.HEXDUMP .AZ "%H:%h %h %h %h %h %h %h %h\r\n"
*--------------------------------------
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 "eth1"
*--------------------------------------
PPP.LCPReq .HS 7E
PPP.LCPReq.START
.HS FF03
.HS C021 LCP
PPP.LCPReq.DATA .HS 01 Configure-Request
.HS 01 ID
.DA /PPP.LCPReq.DATA.LEN,#PPP.LCPReq.DATA.LEN
.HS 01.04 MRU
.DA /576,#576
.HS 02.06.000A0000 ACCM
.HS 05.06.002A2B78 MAGIC
* .HS 07.02
* .HS 08.02
PPP.LCPReq.DATA.LEN .EQ *-PPP.LCPReq.DATA
* .HS 0000 PADDING
.BS 2 FCS
.HS 7E
PPP.LCPReq.LEN .EQ *-PPP.LCPReq
*--------------------------------------
PPP.IPCPReq .HS 7E
PPP.IPCPReq.START
.HS FF03
.HS 8021 IPCP
PPP.IPCPReq.DATA .HS 01 Configure-Request
.HS 01 ID
.DA /PPP.IPCPReq.DATA.LEN,#PPP.IPCPReq.DATA.LEN
.HS 03.06.00.00.00.00 IP Address
PPP.IPCPReq.DATA.LEN .EQ *-PPP.IPCPReq.DATA
* .HS 0000 PADDING
.BS 2 FCS
.HS 7E
PPP.IPCPReq.LEN .EQ *-PPP.IPCPReq
*--------------------------------------
FILE.Buf .BS 256
RCV.Buf .BS 256
*--------------------------------------
* Driver Code
*--------------------------------------
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
.DA IRQ
.DA 0 end or relocation
*--------------------------------------
STATUS jsr STATUS.CONTROL.Init
ldy #S.IOCTL.STATCODE
lda (ZPIOCTL),y
beq .1
cmp #S.IOCTL.STATCODE.GETDIB
bne STATUS.DCB
ldy #S.DIB-1
.HS 2C bit abs
.1 ldy #3
.2 lda DIB,y
sta (ZPBufPtr),y
dey
bpl .2
clc
rts
STATUS.DCB cmp #S.IOCTL.STATCODE.GETDCB
bne .3
ldy #S.DCB.COM-1
.2 lda DCB,y
sta (ZPBufPtr),y
dey
bpl .2
clc
rts
.3 cmp #S.IOCTL.STATCODE.EOF
bne STATUS.9
lda DIB+S.DIB.S
and #S.DIB.S.OPENED
beq OPEN.E
lda INBUF.TAIL
eor INBUF.HEAD
bne .8 NO DATA? eof = TRUE
lda INBUF.TAIL+1
eor INBUF.HEAD+1
bne .8
lda #1
clc
rts
.8 lda #0
clc
rts
STATUS.9 lda #MLI.E.BADCTL
sec
rts
*--------------------------------------
CONTROL jsr STATUS.CONTROL.Init
ldy #S.IOCTL.CTRLCODE
lda (ZPIOCTL),y
cmp #S.IOCTL.CTRLCODE.SETDCB
bne STATUS.9
ldy #S.DCB.COM-1
.2 lda (ZPBufPtr),y
sta DCB,y
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 >LDYAI INBUF.SIZE
>SYSCALL2 GetMem
bcs .9
stx hINBUF
>STYA INBUF.PTR
>STYA READ.BUF+1
>STYA IRQ.BUF+1
stz INBUF.TAIL
stz INBUF.TAIL+1
stz INBUF.HEAD
stz INBUF.HEAD+1
stz INBUF.CNT
stz INBUF.CNT+1
php
sei
ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
lda #SSC.CTL.CLKINT+SSC.CTL.B115200+SSC.CTL.8D+SSC.CTL.1S+SSC.CMD.NOP
sta SSC.CTL-$8F,x
lda #SSC.CMD.TE+SSC.CMD.DTR
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
.9 rts
*--------------------------------------
CLOSE php
sei
ldx DEVSLOTn08F
stz SSC.RESET-$8F,x
lda #S.DIB.S.OPENED
trb DIB+S.DIB.S
lda hINBUF
>SYSCALL2 FreeMem
plp
clc
rts
*--------------------------------------
READ php
sei
jsr READ.WRITE.Init
lda INBUF.CNT
ora INBUF.CNT+1
beq READ.9
stz ZPCount2
stz ZPCount2+1
ldy INBUF.TAIL
READ.1 inc ZPCount
bne READ.BUF
inc ZPCount+1
beq READ.8
READ.BUF lda $FFFF,y SELF MODIFIED
sta (ZPBufPtr)
inc ZPBufPtr
bne .1
inc ZPBufPtr+1
.1 inc ZPCount2
bne .2
inc ZPCount2+1
.2 iny
bne .3
inc READ.BUF+2
inc INBUF.TAIL+1
lda INBUF.TAIL+1
cmp /INBUF.SIZE
bne .3
lda INBUF.PTR+1
sta READ.BUF+2
.3 lda INBUF.CNT
ldx INBUF.CNT+1
clc
sbc #0
bcs .4
dex
bmi .8
stx INBUF.CNT+1
.4 sta INBUF.CNT
bra READ.1
.8 sty INBUF.TAIL
READ.8 lda ZPCount2
ldy #S.IOCTL.BYTECNT
sta (ZPIOCTL),y
iny
lda ZPCount2+1
sta (ZPIOCTL),y
plp
clc
rts
READ.9 lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
beq .99
lda #MLI.E.IO
.HS 2C BIT ABS
.99 lda #E.NODATA
plp
sec
rts
*--------------------------------------
WRITE php
sei
jsr READ.WRITE.Init
lda SSC.STATUS-$8F,x
bit #SSC.STATUS.nDCD true when 0
bne .9
ldy #0
.1 inc ZPCount
bne .2
inc ZPCount+1
beq .8
.2 lda SSC.STATUS-$8F,x
and #SSC.STATUS.TDRE Register Empty ?
beq .2
lda (ZPBufPtr),y
sta SSC.DATA-$8F,x
iny
bne .1
inc ZPBufPtr+1
bra .1
.8 plp
clc
rts
.9 lda #MLI.E.IO
plp
sec
rts
*--------------------------------------
READ.WRITE.Init ldx DEVSLOTn08F
STATUS.CONTROL.Init
>STYA ZPIOCTL
ldy #S.IOCTL.BUFPTR
lda (ZPIOCTL),y
sta ZPBufPtr
iny
lda (ZPIOCTL),y
sta ZPBufPtr+1
iny #S.IOCTL.BYTECNT
lda (ZPIOCTL),y
eor #$ff
sta ZPCount
iny
lda (ZPIOCTL),y
eor #$ff
sta ZPCount+1
rts
*--------------------------------------
* IRQ Handler
* on exit, CC if handled
*--------------------------------------
IRQ ldx DEVSLOTn08F
lda SSC.STATUS-$8F,x
* and #SSC.STATUS.IRQ
bpl IRQ.9 IRQ from this device ? no, exit !!!!Applewin bug #308!!!!
bit #SSC.STATUS.RDRF incoming char?
beq IRQ.8
ldy INBUF.HEAD
IRQ.1 lda SSC.DATA-$8F,x read data to clear IRQ
IRQ.BUF sta $FFFF,y SELF MODIFIED
inc INBUF.CNT
bne .1
inc INBUF.CNT+1
.1 iny
bne .2
inc IRQ.BUF+2
inc INBUF.HEAD+1
lda INBUF.HEAD+1
cmp /INBUF.SIZE
bne .2
lda INBUF.PTR+1
sta IRQ.BUF+2
lda #0
.2 bit SSC.STATUS-$8F,x
bmi IRQ.1
inc
bne .2
sty INBUF.HEAD
IRQ.8 clc
rts
IRQ.9 sec
rts
*--------------------------------------
DRV.CS.END
*--------------------------------------
DEVSLOTn08F .BS 1
hINBUF .BS 1
INBUF.PTR .BS 2
INBUF.TAIL .BS 2
INBUF.HEAD .BS 2
INBUF.CNT .BS 2
*--------------------------------------
DIB .DA #S.DIB.S.IRQ
.DA #0,#0,#0 size
>PSTR "SSC/PPP Driver "
.DA #S.DIB.T.NIC
.DA #0
.DA K.VER
*--------------------------------------
DCB .DA #S.DCB.T.NIC
.DA #S.DCB.NIC.FLAGS.ARPOFFLOAD
.DA #S.DCB.NIC.LINK.OK+S.DCB.NIC.LINK.FD
.DA #S.DCB.NIC.SPEED.10
.HS 000000000000 MAC
.BS 12 IP/MASK/GW
*--------------------------------------
DRV.END
MAN
SAVE usr/src/drv/pppssc.drv.s
ASM