A2osX/BIN/GOPHER.S.txt

679 lines
12 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 bin/gopher
*--------------------------------------
* mirrors.apple2.org.za
* gopherpedia.com
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/eth.i
.INB inc/net.tcpip.i
.INB inc/libtcpip.i
.INB inc/libtui.i
*--------------------------------------
TIMEOUT.MAX .EQ 200 20 sec.
BUFSIZE .EQ 4096
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPIPCfgPtr .BS 2
ZPBufPtr .BS 2
ZPLinePtr .BS 2
ZPFramePtr .BS 2
ZPnFrameLen .BS 2
hBuf .BS 1
hLine .BS 1
hSocket .BS 1
hFrame .BS 1
TimeOut .BS 1
hCTX .BS 1
hSCR .BS 1
hTBOX .BS 1
TargetHost .BS 2
TargetPort .BS 2
TargetSelector .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #S.PS.F.EVENT S.PS.F
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data Segment Size
.DA #64 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.LIBTUI .DA LIBTUI
L.SA.LOCAL .DA SA.LOCAL
L.MSG.ScrTitle .DA MSG.ScrTitle
L.MSG.IPKO .DA MSG.IPKO
L.MSG.USAGE .DA MSG.USAGE
L.MSG.IOERR .DA MSG.IOERR
L.MSG.CRLF .DA MSG.CRLF
L.MSG.CONNECTING .DA MSG.CONNECTING
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.ERROR .DA MSG.ERROR
L.MSG.CONNECTED .DA MSG.CONNECTED
J.ITEMTYPES .DA CS.Net.File
.DA CS.Net.Dir
.DA CS.Net.Search
.DA CS.Net.Info
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
>LDYA L.LIBTUI
>SYSCALL LoadLib
bcs .9
sta hLIBTUI
.9
CS.INIT.RTS rts
*--------------------------------------
CS.RUN jsr CS.Net.Init
bcs CS.INIT.RTS
jsr CS.Scr.Init
bcs CS.INIT.RTS
>LDYAI BUFSIZE
>SYSCALL GetMem
bcs CS.INIT.RTS
stx hBuf
>LDYAI 256
>SYSCALL GetMem
bcs CS.INIT.RTS
>STYA ZPLinePtr
stx hLine
jsr CS.Net.Connect
bcs CS.INIT.RTS
>LDYA L.MSG.CRLF
jsr CS.Net.Get
bcs CS.INIT.RTS
*--------------------------------------
jsr CS.Scr.SetBuf
*--------------------------------------
CS.RUN.LOOP lda hSCR
>LIBCALL hLIBTUI,LIBTUI.Exec
bcs .99 Error
tay
beq CS.RUN.LOOP No Event
cmp #3
beq .99
bra CS.RUN.LOOP
.99 rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
bpl .9 is it a TIMER event?
lda TimeOut
beq .9
dec TimeOut
.9 sec do not discard TIMER event
rts
*--------------------------------------
CS.QUIT lda hCTX
beq .10
>LIBCALL hLIBTUI,LIBTUI.Close
.10 lda hLIBTUI
beq .1
>SYSCALL UnloadLib
.1 lda hSocket
beq .2
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.2 lda hBuf
beq .3
>SYSCALL FreeMem
.3 lda hLine
beq .4
>SYSCALL FreeMem
.4 lda hLIBTCPIP
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.Net.Init >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bpl .97
ldy #S.IPCFG.IP+3
ldx #3
.1 lda (ZPIPCfgPtr),y
sta SA.LOCAL+S.SOCKADDR.ADDR,x
dey
dex
bpl .1
lda #1
>SYSCALL ArgV
bcs .96
>STYA TargetHost
lda #2
>SYSCALL ArgV
bcs .7
>SYSCALL AToI
bra .8
.7 >LDYAI 70
.8 >STYA TargetPort
lda #AF.INET
>STA.G SA.REMOTE+S.SOCKADDR.AF
clc
rts
.96 >LDYA L.MSG.USAGE
bra .98
.97 >LDYA L.MSG.IPKO
.98 >SYSCALL PutS
lda #E.SYN
sec
.99 rts
*--------------------------------------
CS.Net.Connect >PUSHEA.G SCR.StatusBuf
>PUSHW L.MSG.CONNECTING
>PUSHW TargetHost
>PUSHW TargetPort
>PUSHBI 4
>SYSCALL SPrintF
jsr CS.Scr.SetStatus
lda #TIMEOUT.MAX
sta TimeOut
.1 >SLEEP
>PUSHEA.G SA.REMOTE+S.SOCKADDR.ADDR
>PUSHW TargetHost
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName
bcc CS.Net.Connect1
lda TimeOut
bne .1
>PUSHEA.G SCR.StatusBuf
>PUSHW L.MSG.UNKNOWN
>PUSHW TargetHost
>PUSHBI 2
>SYSCALL SPrintF
jsr CS.Scr.SetStatus
sec
rts
CS.Net.Connect1 >PUSHBI S.SOCKET.T.SEQPKT
>PUSHBI 0
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
bcs .9
sta hSocket
>PUSHA
>PUSHW L.SA.LOCAL
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
bcs .9
>LDYA TargetPort
>STYA.G SA.REMOTE+S.SOCKADDR.PORT
lda #TIMEOUT.MAX
sta TimeOut
.1 >SLEEP
>PUSHB hSocket
>PUSHEA.G SA.REMOTE
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
bcc .8
cmp #ERR.SKT.NOCONN
sec
bne .9
lda TimeOut
bne .1
lda #ERR.SKT.NOCONN
sec
.9 rts
.8 >PUSHEA.G SCR.StatusBuf
>PUSHW L.MSG.CONNECTED
ldy #SA.REMOTE+S.SOCKADDR.ADDR
.80 >PUSHB (pData),y
iny
cpy #SA.REMOTE+S.SOCKADDR.PORT
bcc .80
iny
>PUSHB (pData),y
dey
>PUSHB (pData),y
>PUSHBI 6
>SYSCALL SPrintF
jsr CS.Scr.SetStatus
clc
rts
*--------------------------------------
CS.Net.Get >STYA TargetSelector
lda hBuf
>SYSCALL GetMemPtr
>STYA ZPBufPtr
lda #0
sta (ZPBufPtr)
sta (ZPLinePtr)
>PUSHB hSocket
>PUSHW TargetSelector
ldy #$ff
.1 iny
lda (TargetSelector),y
bne .1
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.Send
bcs .9
.2 >SLEEP
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
bcc .3
cmp #E.NODATA
beq .2
* lda hSocket
* >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
clc
rts
.3 jsr CS.Net.GetFrame
jsr CS.Net.GetLines
lda hFrame
>SYSCALL FreeMem
bra .2
.9 rts
*--------------------------------------
CS.Net.GetFrame sta hFrame
>SYSCALL GetMemPtr
>STYA ZPFramePtr
ldy #S.IP.TOTAL.LENGTH+1
lda (ZPFramePtr),y
sec
sbc #S.TCP-S.ETH.EII
eor #$ff
sta ZPnFrameLen
dey
lda (ZPFramePtr),y
sbc /S.TCP-S.ETH.EII
eor #$ff
sta ZPnFrameLen+1
lda ZPFramePtr
clc
adc #S.TCP
sta ZPFramePtr
bcc .8
inc ZPFramePtr+1
.8 rts
*--------------------------------------
CS.Net.GetLines ldy #$ff
.1 iny
lda (ZPLinePtr),y
bne .1
.2 jsr CS.Net.GetChar
bcs .8
cmp #C.LF
beq .3
sta (ZPLinePtr),y
iny
bra .2
.3 lda #0
sta (ZPLinePtr),y
jsr CS.Net.Line2Buf
lda #0
sta (ZPLinePtr)
tay
bra .2
.8 clc
rts
*--------------------------------------
CS.Net.Line2Buf lda (ZPLinePtr)
ldx #ITEMTYPES.L-1
.1 cmp ITEMTYPES,x
beq .2
dex
bpl .1
bra .6
.2 txa
asl
tax
jmp (J.ITEMTYPES,x)
.6 ldy #$ff
.7 iny
lda (ZPLinePtr),y
sta (ZPBufPtr),y
bne .7
tya
clc
adc ZPBufPtr
sta ZPBufPtr
bcc .8
inc ZPBufPtr+1
.8 rts
*--------------------------------------
* hyperlinks: [[text to show|targetUrl]]
*--------------------------------------
CS.Net.File
CS.Net.Dir
CS.Net.Search
lda #'['
jsr CS.Net.Char2Buf
jsr CS.Net.Char2Buf
ldy #0
jsr CS.Net.Token2Buf
lda #'|'
jsr CS.Net.Char2Buf
phy save Selector pos
jsr CS.Net.SkipToken
jsr CS.Net.Token2Buf address
lda #':'
jsr CS.Net.Char2Buf
jsr CS.Net.Token2Buf port
ply
jsr CS.Net.Token2Buf selector
lda #']'
jsr CS.Net.Char2Buf
jsr CS.Net.Char2Buf
.8 lda #C.CR
jsr CS.Net.Char2Buf
lda #0
sta (ZPBufPtr)
rts
*--------------------------------------
CS.Net.Info ldy #0
jsr CS.Net.Token2Buf
lda #C.CR
jsr CS.Net.Char2Buf
lda #0
sta (ZPBufPtr)
rts
*--------------------------------------
CS.Net.Token2Buf
iny
lda (ZPLinePtr),y
cmp #C.TAB
beq .8
cmp #C.CR
beq .8
jsr CS.Net.Char2Buf
bra CS.Net.Token2Buf
.8 rts
*--------------------------------------
CS.Net.SkipToken
iny
lda (ZPLinePtr),y
cmp #C.TAB
beq .8
cmp #C.CR
beq .8
bra CS.Net.SkipToken
.8 rts
*--------------------------------------
CS.Net.Char2Buf sta (ZPBufPtr)
inc ZPBufPtr
bne .8
inc ZPBufPtr+1
.8 rts
*--------------------------------------
CS.Net.GetChar inc ZPnFrameLen
bne .1
inc ZPnFrameLen+1
beq .9
.1 lda (ZPFramePtr)
inc ZPFramePtr
bne .8
inc ZPFramePtr+1
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.Scr.Init >LIBCALL hLIBTUI,LIBTUI.Init
bcs .9
sta hCTX
>PUSHA hCTX
>PUSHBI S.OBJ.F.bTitle+S.OBJ.F.bStatus
>LIBCALL hLIBTUI,LIBTUI.NewScrn
bcs .9
sta hSCR
jsr CS.Scr.SetTitle
jsr CS.Scr.SetStatus
>PUSHB hSCR
>PUSHBI 0 X1
>PUSHBI 0 Y1
>PUSHBI 80 W
>PUSHBI 22 H
>PUSHBI 0 F
lda hBuf
>SYSCALL GetMemPtr
>PUSHYA
>PUSHWI BUFSIZE
>LIBCALL hLIBTUI,LIBTUI.NewTBox
bcs .9
sta hTBOX
>LIBCALL hLIBTUI,LIBTUI.Activate
.9 rts
*--------------------------------------
CS.Scr.SetTitle >PUSHEA.G SCR.TitleBuf
>PUSHW L.MSG.ScrTitle
>PUSHW TargetHost
>PUSHW TargetPort
>PUSHW TargetSelector
>PUSHBI 6
>SYSCALL SPrintF
>PUSHB hSCR
>PUSHBI S.OBJ.pTITLE
>PUSHEA.G SCR.TitleBuf
>LIBCALL hLIBTUI,LIBTUI.SetProp
rts
*--------------------------------------
CS.Scr.SetBuf >PUSHB hTBOX
>PUSHBI S.OBJ.pBuf
lda hBuf
>SYSCALL GetMemPtr
>PUSHYA
>LIBCALL hLIBTUI,LIBTUI.SetProp
rts
*--------------------------------------
CS.Scr.SetStatus
>PUSHB hSCR
>PUSHBI S.OBJ.pSTATUS
>PUSHEA.G SCR.StatusBuf
>LIBCALL hLIBTUI,LIBTUI.SetProp
rts
*--------------------------------------
CS.END
LIBTCPIP .AZ "libtcpip"
hLIBTCPIP .BS 1
LIBTUI .AZ "libtui"
hLIBTUI .BS 1
*--------------------------------------
MSG.ScrTitle .CZ "A2osX-GOPHER %s:%D/%s <Ctrl-Q> : Quit"
*--------------------------------------
MSG.IPKO .CZ "TCP/IP Not Loaded/Configured.\r\n"
MSG.USAGE .CZ "Usage : GOPHER <ip|host> [port]\r\n"
MSG.IOERR .CS "I/O Error."
MSG.CRLF .CS "\r\n"
MSG.NULL .HS 00
*--------------------------------------
MSG.CONNECTING .CZ "Connecting to %s:%D..."
MSG.UNKNOWN .CZ "%s: Unknown host"
MSG.ERROR .CZ "Error : $%h"
MSG.CONNECTED .CZ "Connected to %d.%d.%d.%d:%D."
*--------------------------------------
ITEMTYPES .AS "017i"
ITEMTYPES.L .EQ *-ITEMTYPES
*--------------------------------------
SA.LOCAL .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
*--------------------------------------
.DUMMY
.OR 0
DS.START
SA.REMOTE .BS S.SOCKADDR
SCR.TitleBuf .BS 80
SCR.StatusBuf .BS 80
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/gopher.s
ASM