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 : Quit" *-------------------------------------- MSG.IPKO .CZ "TCP/IP Not Loaded/Configured.\r\n" MSG.USAGE .CZ "Usage : GOPHER [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