A2osX/SBIN/TCPIP.S.txt
2015-11-22 23:30:06 +01:00

524 lines
10 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.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/SBIN/TCPIP
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
ZPFrameBase2 .EQ ZPBIN+6
ZPFrameLen2 .EQ ZPBIN+8
ZPFramePtr2 .EQ ZPBIN+10
ZPIPCfgPtr .EQ ZPBIN+12
ZPIPDevPtr .EQ ZPBIN+14
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.MSG.HELP .DA MSG.HELP
L.CFGFILENAME .DA CFGFILENAME
L.IPCFG .DA IPCFG
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL SYS.LoadLibYA
bcs .99
sta hLIBTCPIP
ldy #S.PS.hARGS
lda (pPs),y
bne .10
>LDYA L.MSG.HELP
>SYSCALL SYS.PSTROutYA
lda #0
sec
rts
.10 ldx #0
.1 stz IPCFG,x
inx
cpx #S.IPCFG
bne .1
jsr CS.INIT.DEV
bcs .99
* jsr CS.INIT.CFGFILE continue even if error opening CFG file
ldx #S.IPCFG.HOSTNAME
lda IPCFG,x
bne .3
ldy #0
.2 lda DefaultHostName,y
sta IPCFG,x
beq .3
inx
iny
bne .2
.3 >PUSHW L.IPCFG
>PUSHBI K.PROTOID.IP
>SYSCALL SYS.AddNetCfg
bcs .99
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
.99 rts
*--------------------------------------
CS.INIT.DEV ldy #S.PS.hARGS
lda (pPs),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting DEV
>SYSCALL SYS.PStrGetTkn
bcs .99
sta hDEVNAME save DevName for discard
>SYSCALL SYS.GetDevByNameA
bcs .98
>STYA pDev
txa
sta hDev
ldx #S.IPCFG.HDEV
sta IPCFG,x
ldx #DEVMGR.OPEN
jsr pDevJmp
bcs .98
ldx #DEVMGR.GETINFO
jsr pDevJmp
bcs .98
>STYA ZPIPDevPtr
ldy #1
ldx #S.IPCFG.MAC
.1 lda (ZPIPDevPtr),y
sta IPCFG,x
iny
inx
cpx #S.IPCFG.MAC+6
bne .1
jsr .98
clc
rts
.98 pha
lda hDEVNAME
>SYSCALL SYS.FreeMemA
pla
.99 sec
rts
*--------------------------------------
CS.INIT.CFGFILE >LDYA L.CFGFILENAME
>SYSCALL SYS.ExpandPStrYA
bcs .99
sta hCfgFileName
>SYSCALL SYS.LoadFileA
bcs .98
stx hCfgFile
>STYA hCfgFileLen
txa
>SYSCALL SYS.GetMemPtrA
>STYA ZPIPCfgPtr
.89 lda hCfgFile
>SYSCALL SYS.FreeMemA
lda hCfgFileName
>SYSCALL SYS.FreeMemA
clc
rts
.98 pha
lda hCfgFileName
>SYSCALL SYS.FreeMemA
pla
.99 sec
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
and #S.EVT.F.NET
beq .9
ldy #S.EVT.hDEV
lda (pEvent),y
cmp hDev
beq CS.DOEVENT.NET
.9 sec
rts
CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
ldy #S.EVT.DATAW1 Get Frame Len
lda (pEvent),y
sta ZPFrameLen1
iny
lda (pEvent),y
sta ZPFrameLen1+1
ldy #S.ETH.ETHERTYPE
lda (ZPFrameBase1),y
tax
iny
lda (ZPFrameBase1),y
cmp #S.ETH.ETHERTYPE.ARP
bne .1
cpx /S.ETH.ETHERTYPE.ARP
bne .1
jsr ARPListener
bcc .89
rts
.1 cmp #S.ETH.ETHERTYPE.IP
bne .99
cpx /S.ETH.ETHERTYPE.IP
bne .99
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.ICMP
bne .2
jsr ICMPListener
bcc .89
rts
.2 cmp #S.IP.PROTOCOL.UDP
bne .21
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .3
iny
lda #UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .3
jsr DNSListener
bcc .89
rts
.21 >PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.UDP.LISTENER
bcc .89
rts
.3 cmp #S.IP.PROTOCOL.TCP
bne .99
>PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.TCP.LISTENER
bcc .89
rts
.89 clc
rts
.99 sec
rts
*--------------------------------------
CS.QUIT lda hDev
>SYSCALL SYS.GetDevByIDA
>STYA pDev
ldx #DEVMGR.CLOSE
jsr pDevJmp
lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
ARPListener jsr GetIPCFG
ldy #S.ARP.TPA
ldx #S.IPCFG.IP
.1 lda (ZPFrameBase1),y
cmp IPCFG,x
bne .9
iny
inx
cpx #S.IPCFG.IP+4
bne .1
ldy #S.ARP.OPERATION+1 HI byte
lda (ZPFrameBase1),y
cmp #S.ARP.OPERATION.REQ
beq ARPListener.REQ
cmp #S.ARP.OPERATION.REP
beq ARPListener.REP
.9 clc Discard any other ARP frames
rts
ARPListener.REP >LDAXI S.ARP.SHA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LDAXI S.ARP.SPA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD
clc
ARPListener.RTS rts
ARPListener.REQ >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ARP.FRAME
bcs ARPListener.RTS
phx
>STYA ZPFrameBase2
ldy #S.ARP.OPERATION+1
lda #S.ARP.OPERATION.REP
sta (ZPFrameBase2),y
>LDAXI S.ARP.SHA
jsr SetFramePtr1AX
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
>LDAXI S.ARP.THA
jsr SetFramePtr2AX
ldy #10 IP(4) + MAC(6)
jsr CopyFramePtr12
>PUSHW ZPFramePtr1 still point to SHA
>LDAXI S.ARP.SPA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD
ldx #5
ldy #S.ARP.SHA+5
.4 lda IPCFG+S.IPCFG.MAC,x
sta (ZPFrameBase2),y
dey
dex
bpl .4
ldx #3
ldy #S.ARP.SPA+3
.5 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase2),y
dey
dex
bpl .5
>PUSHW ZPFrameBase2
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ARP.FRAME
pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
ICMPListener ldy #S.ICMP.TYPE
lda (ZPFrameBase1),y
cmp #S.ICMP.TYPE.ECHOREQ
bne .9
jsr GetIPCFG
ldy #S.IP.DST
ldx #S.IPCFG.IP
.10 lda (ZPFrameBase1),y
cmp IPCFG,x
bne .9
iny
inx
cpx #S.IPCFG.IP+4
bne .10
>LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME
bcs .9
phx
>STYA ZPFrameBase2
ldy #S.ICMP.TYPE
lda #S.ICMP.TYPE.ECHOREP
sta (ZPFrameBase2),y
jsr MakeIPReply
ldy #S.ICMP.IDENTIFIER
.1 lda (ZPFrameBase1),y
sta (ZPFrameBase2),y
iny
cpy #ZPFrameLen1
bne .1
>PUSHW ZPFrameLen1
>PUSHW ZPFrameBase2
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME
pla
>SYSCALL SYS.FreeMemA
clc
rts
.9 sec
rts
*--------------------------------------
DNSListener ldy #S.DNS.F+1
lda (ZPFrameBase1),y
and /S.DNS.F.QR
beq .9
ldy #S.DNS.ANCOUNT+1
lda (ZPFrameBase1),y
beq .9
ldy #S.DNS.QDCOUNT+1
lda (ZPFrameBase1),y
tax
beq .3 no QUERY to skip
ldy #S.DNS Read query
.1 lda (ZPFrameBase1),y
beq .2
iny
bne .1
.2 tya
clc
adc #4 Skip QTYPE & QCLASS
tay
dex skip another QUERY ?
bne .1
.3 iny skip high byte of offset
iny skip lo byte of offset
clc
rts
.9 sec
rts
*--------------------------------------
GetIPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
>STYA ZPIPCfgPtr
ldy #S.IPCFG
.1 dey
lda (ZPIPCfgPtr),y
sta IPCFG,y
tya
bne .1
rts
*--------------------------------------
MakeIPReply >LDAXI S.IP.SRC
jsr SetFramePtr1AX
>LDAXI S.IP.DST
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.IP.DST
jsr SetFramePtr1AX
>LDAXI S.IP.SRC
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.ETH.SRCMAC
jsr SetFramePtr1AX
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
rts
*--------------------------------------
* A,X = Frame PTR
*--------------------------------------
SetFramePtr1AX clc
adc ZPFrameBase1
sta ZPFramePtr1
txa
adc ZPFrameBase1+1
sta ZPFramePtr1+1
rts
*--------------------------------------
* A,X = Frame PTR
*--------------------------------------
SetFramePtr2AX clc
adc ZPFrameBase2
sta ZPFramePtr2
txa
adc ZPFrameBase2+1
sta ZPFramePtr2+1
rts
*--------------------------------------
* Y = bytes to copy from ZPFramePtr1 to ZPFramePtr2
*--------------------------------------
CopyFramePtr12 dey
lda (ZPFramePtr1),y
sta (ZPFramePtr2),y
tya
bne CopyFramePtr12
rts
*--------------------------------------
CS.END
*--------------------------------------
LIBTCPIP >PSTRING "libtcpip.o"
MSG.HELP >PSTRING "Usage: TCPIP ETHx\n"
CFGFILENAME >PSTRING "${A2OSX}ETC/TCPIP.CONF"
DefaultHostName >CSTRING "a2osx-host"
hLIBTCPIP .BS 1
hDEVNAME .BS 1
hDev .BS 1
hCfgFileName .BS 1
hCfgFile .BS 1
hCfgFileLen .BS 2
IPCFG .BS S.IPCFG Get in cache for faster access with ,X
*--------------------------------------
MAN
SAVE SBIN/TCPIP.S
ASM