NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR $2000
				.TF drv/pppssc.drv
*--------------------------------------
DBG				.EQ 1
HWFC			.EQ 0
SWFC			.EQ 1		
INBUF.SIZE		.EQ 2048
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/mli.e.i
				.INB inc/com.i
				.INB inc/com.6551.i
				.INB inc/nic.i
				.INB inc/eth.i
				.INB inc/net.tcpip.i
				.INB inc/libtcpip.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPArgsPtr		.BS 2
ZPPtr1			.BS 2
ZPPtr2			.BS 2
ZPPtr3			.BS 2

ZPBufLen		.BS 2
FCS				.BS 2

DWORD			.BS 4

hETCFILE		.BS 1
b7D				.BS 1
bLCP			.BS 1
bIPCP			.BS 1
Len				.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.SSCInit	.DA MSG.SSCInit
L.MSG.LCPInit	.DA MSG.LCPInit
L.MSG.IPCPInit	.DA MSG.IPCPInit
L.MSG.LocalIP	.DA MSG.LocalIP
L.MSG.RemoteIP	.DA MSG.RemoteIP
				.DO DBG=1
L.MSG.DUMPBUF	.DA MSG.DUMPBUFS
				.DA MSG.DUMPBUFR
L.MSG.HEXDUMP	.DA MSG.HEXDUMP
				.FIN
L.LCP.ConfReq	.DA LCP.ConfReq
L.LCP.EchoRep	.DA LCP.EchoRep
L.IPCP.ConfReq	.DA IPCP.ConfReq
L.IN.Buf		.DA IN.Buf
L.IN.Bufp1		.DA IN.Buf+1
L.OUT.Buf		.DA OUT.Buf
J.LCP			.DA LCP.IN.ConfReq
				.DA LCP.IN.ConfAck
				.DA LCP.IN.ConfNak
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.IN.EchoReq
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
				.DA LCP.Discard
J.IPCP			.DA IPCP.IN.ConfReq
				.DA IPCP.IN.ConfAck
				.DA IPCP.IN.ConfNak
				.DA IPCP.Discard
				.DA IPCP.Discard
				.DA IPCP.Discard
				.DA IPCP.Discard
				.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-1,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
				bcs .9

				jsr PPP.ETCFILE
				bcs .9

				jsr PPP.Init
				bcs .9

				>PUSHW L.MSG.DETECT.OK
				>PUSHW L.FD.DEV.NAME
				>PUSHBI 2
				>SYSCALL PrintF
				bcs .9

				>PUSHWI DRV.END
				>PUSHWI DRV.CS.END-DRV.CS.START
				>PUSHWI DRV.CS.START
				>LDYA L.DRV.CS.START
				>SYSCALL InsDrv
.9				bcs .99

				>STYA FD.DEV+S.FD.DEV.DRVPTR

				>PUSHW L.FD.DEV
				>PUSHW L.FD.DEV.NAME
				>SYSCALL MKDev
				bcs .99

				lda FD.DEV.NAME+3
				and #$0F
				tax
				lda #A2osX.S.NIC
				sta A2osX.S-1,x

*				clc

				rts

.99				pha
				jsr SSC.Close
				pla

*				sec

Dev.Detect.RTS	rts
*--------------------------------------
PPP.Init		>LDYA L.MSG.LCPInit
				>SYSCALL PutS
				
				>LDYA L.LCP.EchoRep		Pre calculate EchoRep FCS
				jsr PPP.FCS16.Set

				>LDYA L.LCP.ConfReq
				jsr PPP.FCS16.Set

				.DO DBG=1
				>LDYA L.LCP.ConfReq
				ldx #0
				jsr DumpBuf.PPP
				.FIN

				>LDYA L.LCP.ConfReq
				jsr SSC.WritePPP
				bcs .9

.1				jsr SSC.ReadPPP
				bcs .9

				tya
				beq .1

				sty ZPBufLen
				stz ZPBufLen+1

				.DO DBG=1
				>LDYA L.IN.Buf
				ldx #2
				jsr DumpBuf.PPP
				.FIN

				jsr PPP.IN.JUMP
				bcs .9

				bit bLCP
				bpl .1
				
				>LDYA L.MSG.IPCPInit
				>SYSCALL PutS
				
				jsr IPCP.OUT.ConfReq
				bcs .9
				
.2				jsr SSC.ReadPPP
				bcs .9

				tya
				beq .2

				sty ZPBufLen
				stz ZPBufLen+1
				
				.DO DBG=1
				>LDYA L.IN.Buf
				ldx #2
				jsr DumpBuf.PPP
				.FIN

				jsr PPP.IN.JUMP
				bcs .9

				bit bIPCP
				bpl .2
				
*				clc
				rts

.9				jsr SSC.Close
				
				lda #MLI.E.IO
*				sec
				rts
*--------------------------------------
PPP.IN.JUMP		lda IN.Buf+3
				cmp #$21
				bne LCP.Discard

				lda IN.Buf+2
				cmp #$C0
				bne .1

				lda IN.Buf+4
				beq LCP.Discard

				cmp #16
				bcs LCP.Discard

				asl
				tax
				jmp (J.LCP-2,x)

.1				cmp #$80
				bne LCP.Discard

				lda IN.Buf+4
				beq LCP.Discard

				cmp #8
				bcs LCP.Discard

				asl
				tax
				jmp (J.IPCP-2,x)
*--------------------------------------
LCP.Discard
IPCP.Discard
				clc
				rts
*--------------------------------------
LCP.IN.ConfReq	ldy #0

.1				lda IN.Buf,y			FF03C021
				sta OUT.Buf,y
				iny
				cpy #4
				bne .1

				lda #2					Configure-Ack
				sta OUT.Buf,y

				iny						ID

				lda IN.Buf,y
				sta OUT.Buf,y

				iny						Len MSB

				lda IN.Buf,y
				sta OUT.Buf,y
				sta	ZPBufLen+1

				iny						Len LSB

				lda IN.Buf,y
				sta OUT.Buf,y
				sta	ZPBufLen

				sec
				sbc #4					minus LEN LEN ... FCS FCS
				tax

				iny						First option ID

.2				lda IN.Buf,y
				cmp #6					ACCM ?
				bne .7

				phy
				phx

				ldx #4

.3				lda IN.Buf+2,y
				sta DWORD-1,x
				iny
				dex
				bne .3

*				ldx	#0

				ldy #0
				
.4				lda #1

.5				and DWORD,y
				bne .6

				stz ACCM.OUT,x

.6				inx
				asl
				bne .5
				
				iny
				cpy #4
				bne .4


				plx
				ply

.7				jsr LCP.Ack.Copy
				bne .2

				lda ZPBufLen
				clc
				adc #6
				sta ZPBufLen
				bcc .8

				inc ZPBufLen+1

.8				>LDYA L.OUT.Buf
				jsr PPP.FCS16.Set

				.DO DBG=1
				>LDYA L.OUT.Buf
				ldx #0
				jsr DumpBuf.PPP
				.FIN

				>LDYA L.OUT.Buf
				jmp SSC.WritePPP
*--------------------------------------
LCP.Ack.Copy	txa
				sec
				sbc IN.Buf+1,y

				pha

				ldx IN.Buf+1,y

.1				lda	IN.Buf,y
				sta OUT.Buf,y
				iny
				dex
				bne .1

				plx
				rts
*--------------------------------------
LCP.Ack.Next	txa
				sec
				sbc IN.Buf+1,y
				tax

				tya
				clc
				adc IN.Buf+1,y
				tay

				rts
*--------------------------------------
LCP.IN.ConfAck	sec
				ror bLCP

				clc
				rts
*--------------------------------------
LCP.IN.ConfNak

				clc
				rts
*--------------------------------------
LCP.IN.EchoReq	.DO DBG=1
				>LDYA L.LCP.EchoRep
				ldx #0
				jsr DumpBuf.PPP
				.FIN

				>LDYA L.LCP.EchoRep
				jmp SSC.WritePPP
*--------------------------------------
IPCP.IN.ConfReq	ldy #0

.1				lda IN.Buf,y			FF038021
				sta OUT.Buf,y
				iny
				cpy #4
				bne .1

				lda #2					Configure-Ack
				sta OUT.Buf,y

				iny						ID

				lda IN.Buf,y
				sta OUT.Buf,y

				iny						Len MSB

				lda IN.Buf,y
				sta OUT.Buf,y
				sta	ZPBufLen+1

				iny						Len LSB

				lda IN.Buf,y
				sta OUT.Buf,y
				sta	ZPBufLen

				sec
				sbc #4					minus LEN LEN ... FCS FCS
				tax

				iny						First option ID

.2				lda IN.Buf,y
				cmp #3					IP ADDR ?
				bne .7

				phy
				phx

				>PUSHW L.MSG.RemoteIP

				ldx #0

.3				lda IN.Buf+2,y
				sta DCB.GW,x
				>PUSHA
				iny
				inx
				cpx #4
				bne .3
				
				>PUSHBI 4
				>SYSCALL PrintF

				plx
				ply

.7				jsr LCP.Ack.Copy
				bne .2

				lda ZPBufLen
				clc
				adc #6
				sta ZPBufLen
				bcc .8

				inc ZPBufLen+1

.8				>LDYA L.OUT.Buf
				jsr PPP.FCS16.Set

				.DO DBG=1
				>LDYA L.OUT.Buf
				ldx #0
				jsr DumpBuf.PPP
				.FIN
				
				>LDYA L.OUT.Buf
				jmp SSC.WritePPP
*--------------------------------------
IPCP.IN.ConfAck	sec
				ror bIPCP

*				clc
				rts
*--------------------------------------
IPCP.IN.ConfNak	ldy #10
				ldx #0

				>PUSHW L.MSG.LocalIP

.1				lda IN.Buf,y
				sta IPCP.ConfReq,y
				sta DCB.IP,x
				>PUSHA
				inx
				iny
				cpy #14
				bne .1

				>PUSHBI 4
				>SYSCALL PrintF
*--------------------------------------
IPCP.OUT.ConfReq
				>LDYA L.IPCP.ConfReq
				jsr PPP.FCS16.Set

				.DO DBG=1
				>LDYA L.IPCP.ConfReq
				ldx #0
				jsr DumpBuf.PPP
				.FIN

				>LDYA L.IPCP.ConfReq
				jmp SSC.WritePPP
*--------------------------------------
SSC.Init		>LDYA L.MSG.SSCInit
				>SYSCALL PutS
				
				jsr SSC.Close

				ldy #0

.10				lda SSC.STATUS-$8F,x
				bit #SSC.STATUS.nDCD+SSC.STATUS.nDSR	true when 0
				bne .20
				
				iny
				bne .10
				
*				bra .9

.20				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

				ldy #0

.1				lda SSC.STATUS-$8F,x
				bit #SSC.STATUS.nDCD+SSC.STATUS.nDSR	true when 0
				beq .2
				
				iny
				bne .1

.9				lda #MLI.E.IO
				sec
				rts

.2				lda SSC.DATA-$8F,x			discard any garbage byte

				.DO SWFC=1
				lda #C.XOFF
				sta SSC.DATA-$8F,x
				.FIN

				.DO HWFC=1
				lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.DTR
				sta SSC.CMD-$8F,x
				.FIN

				clc
				rts
*--------------------------------------
SSC.Close		ldx DEVSLOTn08F
				stz SSC.RESET-$8F,x

				lda #SSC.CMD.RIRQDIS
				sta SSC.CMD-$8F,x		Applewin Bug ???

				rts
*--------------------------------------
SSC.ReadPPP		php
				sei

				ldx DEVSLOTn08F

				.DO SWFC=1
				lda #C.XON
				sta SSC.DATA-$8F,x
				.FIN

				.DO HWFC=1
				lda #SSC.CMD.NOP+SSC.CMD.TE+SSC.CMD.RIRQDIS+SSC.CMD.DTR
				sta SSC.CMD-$8F,x
				.FIN

				stz b7D

.10				ldy #0

.1				lda SSC.STATUS-$8F,x
				bit #SSC.STATUS.nDCD	true when 0
				bne .9

				bit #SSC.STATUS.RDRF	incoming char?
				bne .3

				iny
				bne .1

.8	
				.DO SWFC=1
				lda #C.XOFF
				sta SSC.DATA-$8F,x
				.FIN

				.DO HWFC=1
				lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.DTR
				sta SSC.CMD-$8F,x
				.FIN

				plp
				clc
				rts

.3				lda SSC.DATA-$8F,x

				bit b7D
				bmi .4

				cmp #$7D
				bne .40

				ror b7D
				bra .1

.4				stz b7D
				eor #%00100000
				
.40				cmp #$FF
				bne .10

				sta IN.Buf
				ldy #1

				stz b7D

.5				lda #SSC.STATUS.RDRF

.50				bit SSC.STATUS-$8F,x	incoming char?
				beq .50

				lda SSC.DATA-$8F,x
				bit b7D
				bmi .6

				cmp #$7D
				bne .7

				ror b7D
				bra .5

.6				stz b7D
				eor #%00100000

				sta IN.Buf,y
				iny
				bra .5

.7				cmp #$7E
				beq .8

				sta IN.Buf,y
				iny
				bne .5

.9				lda	#MLI.E.IO
				plp
				sec
.99				rts
*--------------------------------------
SSC.WritePPP	>STYA ZPPtr1

				ldy #7
				lda (ZPPtr1),y			Len LO
				clc
				adc #6
				sta ZPPtr3

				php
				sei

				ldx DEVSLOTn08F

				lda SSC.STATUS-$8F,x
				bit #SSC.STATUS.nDCD	true when 0
				bne .9

				.DO HWFC=1
				lda #SSC.CMD.NOP+SSC.CMD.TE+SSC.CMD.RIRQDIS+SSC.CMD.DTR
				sta SSC.CMD-$8F,x
				.FIN
				
				lda #SSC.STATUS.TDRE

.1				bit SSC.STATUS-$8F,x 	Register Empty ?
				beq .1

				lda #$7E
				sta SSC.DATA-$8F,x

.2				lda (ZPPtr1)

				cmp #$7D
				beq .5

				cmp #$7E
				beq .5

				cmp #32
				bcs .6
				
				tay
				lda ACCM.OUT,y
				beq .53
				
.5				lda #SSC.STATUS.TDRE
				
.51				bit SSC.STATUS-$8F,x 	Register Empty ?
				beq .51

				lda #$7D
				sta SSC.DATA-$8F,x
				
				lda #SSC.STATUS.TDRE
				
.52				bit SSC.STATUS-$8F,x 	Register Empty ?
				beq .52				

				lda (ZPPtr1)
				eor #%00100000
				bra .6
				
.53				lda (ZPPtr1)

.6				sta SSC.DATA-$8F,x
				
				inc ZPPtr1
				bne .60
				
				inc ZPPtr1+1
				
.60				dec ZPPtr3
				bne .2

				lda #SSC.STATUS.TDRE

.7				bit SSC.STATUS-$8F,x 	Register Empty ?
				beq .7

				lda #$7E
				sta SSC.DATA-$8F,x

				lda #SSC.STATUS.TDRE
				
.8				bit SSC.STATUS-$8F,x 	Register Empty ?
				beq .8
				
				.DO HWFC=1
				lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.DTR
				sta SSC.CMD-$8F,x
				.FIN

				plp
				clc
				rts

.9				lda	#MLI.E.IO

				plp
				sec
				rts
*--------------------------------------
				.DO DBG=1
DumpBuf.PPP		>STYA ZPPtr1

				stz ZPPtr2
				stz ZPPtr2+1

				ldy #7
				lda (ZPPtr1),y			Len LO
				clc
				adc #6
				sta ZPPtr3

				dey
				lda (ZPPtr1),y			Len HI
				adc #0
				sta ZPPtr3+1

				>PUSHW L.MSG.DUMPBUF,x
				>PUSHW ZPPtr3
				>PUSHBI 2
				>SYSCALL PrintF
				bcs .9

.1				>PUSHW L.MSG.HEXDUMP
				>PUSHW ZPPtr2

				ldy #0

.2				>PUSHB (ZPPtr1),y
				iny
				cpy #16
				bne .2

				>PUSHBI 18
				>SYSCALL PrintF
				bcs .9

				lda ZPPtr1
				adc #16
				sta ZPPtr1
				lda ZPPtr1+1
				adc #0
				sta ZPPtr1+1

				lda ZPPtr2
				adc #16
				sta ZPPtr2
				bcs .8
				lda ZPPtr2+1
				adc #0
				sta ZPPtr2+1

				lda ZPPtr3
				sec
				sbc #16
				sta ZPPtr3
				lda ZPPtr3+1
				sbc #0
				sta ZPPtr3+1
				bcc .9

				ora ZPPtr3
				bne .1

.8				clc

.9				rts
				.FIN
*--------------------------------------
PPP.FCS16.Check	sec
				.HS 90					BCC
PPP.FCS16.Set	clc
				php

				>STYA ZPPtr1

				lda #$ff
				sta FCS
				sta FCS+1

				ldy #7
				lda (ZPPtr1),y			Len LO
				clc
				adc #4					add FF 00 XX XX but dont include FCS FCS
				eor #$ff
				sta ZPPtr2

				dey
				lda (ZPPtr1),y			Len HI
				adc #0
				eor #$ff
				sta ZPPtr2+1

				ldy #0

.1				inc ZPPtr2
				bne .2

				inc ZPPtr2+1
				beq .7

.2				lda (ZPPtr1),y
				iny
				bne .3

				inc ZPPtr1+1

.3				eor FCS
				tax

				lda FCS.LO,x
				eor FCS+1
				sta FCS

				lda FCS.HI,x
				sta FCS+1

				bra .1

.7				plp
				bcc .8					CC = set

				lda FCS
				eor #$ff
				eor (ZPPtr1),y
				bne .9

				iny

				lda FCS+1
				eor #$ff
				eor (ZPPtr1),y
				bne .9

				clc
				rts

.8				lda FCS
				eor #$ff
				sta (ZPPtr1),y

				iny

				lda FCS+1
				eor #$ff
				sta (ZPPtr1),y

.9				rts
*--------------------------------------
				.INB usr/src/drv/pppssc.drv.s.e
*--------------------------------------
CS.END
*--------------------------------------
DEVSIG.Offset	.HS 05070B0C
DEVSIG.Value	.HS 38180131
DEVSIG.Length	.EQ DEVSIG.Value-DEVSIG.Offset
MSG.DETECT		.CZ "PPP Driver For Apple SSC."
MSG.DETECT.OK	.CZ "PPP Installed As Device : %s\r\n"
MSG.DETECT.KO	.CZ "No SSC Found."
ETCFILE			.AZ "${ROOT}etc/ppp.conf"
*--------------------------------------
MSG.ETCFILE		.CZ "Executing %s File...\r\n"
MSG.UNEXPECTED	.CZ "\r\nERR:Unexpected reply From Modem\r\n{%s}\r\n"
MSG.SYNTAX		.CZ "\r\nERR:Bad Syntax In ppp.conf\r\n{%s}\r\n"
MSG.SSCInit		.CZ "Connecting..."
MSG.LCPInit		.CZ "LCP Negotiation..."
MSG.IPCPInit	.CZ "IPCP Negotiation..."
MSG.LocalIP		.CZ "Local IP is %d.%d.%d.%d\r\n"
MSG.RemoteIP	.CZ "Remote IP is %d.%d.%d.%d\r\n"
				.DO DBG=1
MSG.DUMPBUFS	.CZ ">>Send:%H\r\n"
MSG.DUMPBUFR	.CZ "Recv<<:%H\r\n"
MSG.HEXDUMP		.CZ "%H:%h %h %h %h %h %h %h %h:%h %h %h %h %h %h %h %h\r\n"
				.FIN
*--------------------------------------
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"
*--------------------------------------
LCP.ConfReq		.HS FF03
				.HS C021				LCP
LCP.ConfReq.DATA
				.HS 01					Configure-Request
				.HS FF					ID
				.DA /LCP.ConfReq.LEN,#LCP.ConfReq.LEN
*				.HS 01.04				MRU
*				.DA /1400,#1400
				.DO SWFC=1
				.HS 02.06.000A0000		ACCM
				.ELSE
				.HS 02.06.00000000		ACCM
				.FIN
				.HS 05.06.EA4C2B41		MAGIC
*				.HS 07.02
*				.HS 08.02
LCP.ConfReq.LEN	.EQ *-LCP.ConfReq.DATA
			.BS 2						FCS
*--------------------------------------
IPCP.ConfReq	.HS FF03
				.HS 8021				IPCP
IPCP.ConfReq.DATA
				.HS 01					Configure-Request
				.HS FF					ID
				.DA /IPCP.ConfReq.LEN,#IPCP.ConfReq.LEN
*				.HS 02.06.00.2D.0F.00	VJ
				.HS 03.06.00.00.00.00	IP Address
IPCP.ConfReq.LEN	.EQ *-IPCP.ConfReq.DATA
			.BS 2						FCS
*--------------------------------------
IN.Buf			.BS 256
OUT.Buf			.BS 256
*--------------------------------------
				.INB usr/src/drv/pppssc.drv.s.d
*--------------------------------------
MAN
SAVE usr/src/drv/pppssc.drv.s
ASM
