NEW PREFIX AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF BIN/HTTPGET *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/ETH.I .INB INC/LIBTCPIP.I .INB INC/NET.HTTP.I *-------------------------------------- RESP.BUFSIZE .EQ 1024 TIMEOUT.MAX .EQ 100 10 sec. *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPHostPtr .EQ ZPBIN+2 ZPPtr .EQ ZPBIN+4 ZPBufPtr .EQ ZPBIN+6 ZPBufLen .EQ ZPBIN+8 *-------------------------------------- * 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 Length To Relocate .DA DS.END-DS.START Data Segment to Allocate .DA #16 SS .DA #10 ZP .DA 0 *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.LOCAL .DA SA.LOCAL L.SA.REMOTE .DA SA.REMOTE L.SA.REMOTE.AD .DA SA.REMOTE+S.SOCKADDR.ADDR L.MSG.IPKO .DA MSG.IPKO L.MSG.USAGE .DA MSG.USAGE L.MSG.UNKNOWN .DA MSG.UNKNOWN L.MSG.HOSTOK .DA MSG.HOSTOK L.MSG.SKTKO .DA MSG.SKTKO L.MSG.SKTOK .DA MSG.SKTOK L.MSG.SKTERR .DA MSG.SKTERR L.MSG.IOERR .DA MSG.IOERR L.HTTP.GET1 .DA HTTP.GET1 L.HTTP.GET2 .DA HTTP.GET2 L.HTTP.GET3 .DA HTTP.GET3 .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib bcs .9 sta hLIBTCPIP .9 rts *-------------------------------------- CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.IPOK >LDYA L.MSG.IPKO >SYSCALL puts lda #E.SYN sec rts CS.RUN.IPOK ldy #S.IPCFG.IP+3 ldx #3 .1 lda (ZPIPCfgPtr),y sta SA.LOCAL+S.SOCKADDR.ADDR,x dey dex bpl .1 >INC.G ArgIndex >SYSCALL ArgV bcs .9 >STYA ZPHostPtr jsr Init.Timeout .2 >PUSHW L.SA.REMOTE.AD >PUSHW ZPHostPtr >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc CS.RUN.HOSTOK >SLEEP jsr Wait.Timeout bcc .2 >PUSHW ZPHostPtr >PUSHBI 2 >LDYA L.MSG.UNKNOWN >SYSCALL printf bra CS.RUN.ESYN .9 >PUSHBI 0 >LDYA L.MSG.USAGE >SYSCALL printf CS.RUN.ESYN lda #E.SYN sec CS.RUN.RTS rts CS.RUN.HOSTOK >INC.G ArgIndex >SYSCALL ArgV bcc .10 jmp CS.RUN.PORTOK .10 >STYA ZPPtr lda (ZPPtr) cmp #'-' beq .1 >LDYA ZPPtr >SYSCALL atoi bcs CS.RUN.RTS >STYA SA.REMOTE+S.SOCKADDR.PORT >INC.G ArgIndex >SYSCALL ArgV bcs .8 >STYA ZPPtr lda (ZPPtr) cmp #'-' bne CS.RUN.ESYN .1 ldy #1 lda (ZPPtr),y cmp #'U' bne .2 >INC.G ArgIndex >SYSCALL ArgV .9 bcs CS.RUN.ESYN >STYA ZPBufPtr >SYSCALL strlen >STYA ZPBufLen .8 bra CS.RUN.PORTOK .2 cmp #'F' bne CS.RUN.ESYN >INC.G ArgIndex >SYSCALL ArgV bcs CS.RUN.RTS >SYSCALL LoadTxtFile bcs .9 >STYA ZPBufLen txa >STA.G hReqBuf >SYSCALL GetMemPtr >STYA ZPBufPtr CS.RUN.PORTOK >PUSHW ZPHostPtr >PUSHW SA.REMOTE+S.SOCKADDR.PORT ldx #3 .1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x dex bpl .1 >PUSHBI 8 >LDYA L.MSG.HOSTOK >SYSCALL printf CS.RUN.OPENSKT >PUSHBI 0 no protocol lda #S.SOCKET.T.STREAM >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 >STA.G hSocket pha >PUSHW L.SA.LOCAL pla >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcc .2 .9 >LDYA L.MSG.SKTKO >SYSCALL puts lda #E.SYN sec rts .2 >PUSHW L.SA.REMOTE >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcs .9 >LDYA L.MSG.SKTOK >SYSCALL puts >LDYAI RESP.BUFSIZE >SYSCALL getmem bcs .9 >STYA ZPBufPtr txa >STA.G hRespBuf CS.RUN.GET jsr Init.Timeout jsr CS.RUN.REQUEST bcs .99 .1 >SLEEP >PUSHWI RESP.BUFSIZE >PUSHW ZPBufPtr >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Read bcc .2 tay bne CS.RUN.SKTERR >SLEEP no response jsr Wait.Timeout bcc .1 jmp CS.RUN.IOERR .2 >PUSHYA len >PUSHW ZPBufPtr ldy #S.PS.hStdOut lda (pPs),y >SYSCALL fwrite bcs .99 bra .1 .9 lda #0 sec .99 rts *-------------------------------------- CS.RUN.SKTERR pha >PUSHA >PUSHBI 1 >LDYA L.MSG.SKTERR >SYSCALL printf pla sec rts *-------------------------------------- CS.RUN.IOERR pha >PUSHA >PUSHBI 1 >LDYA L.MSG.IOERR >SYSCALL printf pla sec rts *-------------------------------------- CS.RUN.REQUEST >PUSHWI HTTP.GET1.LEN >PUSHW L.HTTP.GET1 jsr .8 bcs .99 >PUSHW ZPBufLen >PUSHW ZPBufPtr jsr .8 bcs .9 >PUSHWI HTTP.GET2.LEN >PUSHW L.HTTP.GET2 jsr .8 .99 bcs .9 >LDYA ZPHostPtr >SYSCALL strlen >PUSHYA >PUSHW ZPHostPtr jsr .8 bcs .9 >PUSHWI HTTP.GET3.LEN >PUSHW L.HTTP.GET3 .8 >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Write .9 rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? >LDA.G TimeOut beq .9 dec sta (pData),y .9 sec do not discard TIMER event rts *-------------------------------------- CS.QUIT >LDA.G hSocket beq .1 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown .1 >LDA.G hReqBuf beq .2 >SYSCALL freemem .2 >LDA.G hRespBuf beq .3 >SYSCALL freemem .3 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- Init.Timeout lda #TIMEOUT.MAX >STA.G TimeOut rts *-------------------------------------- Wait.TimeOut sec >LDA.G TimeOut beq .9 clc .9 rts *-------------------------------------- CS.END LIBTCPIP .AZ "libtcpip" hLIBTCPIP .BS 1 MSG.IPKO .AZ "TCP/IP Not Loaded/Configured." MSG.USAGE .AS "Usage : HTTPGET [port]\r\n" .AS " -U Url\r\n" .AZ " -F UrlFile\r\n" MSG.UNKNOWN .AZ "%s: Unknown host\r\n" MSG.HOSTOK .AZ "Connecting to %d.%d.%d.%d:%D (%s)..." MSG.SKTKO .AZ "Failed to Open Socket." MSG.SKTOK .AZ "Connected." MSG.SKTERR .AZ "Socket Error : $%h\r\n" MSG.IOERR .AZ "I/O Error : $%h\r\n" *-------------------------------------- SA.LOCAL .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .BS 2 S.SOCKADDR.PORT *-------------------------------------- SA.REMOTE .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .DA TCP.PORT.HTTP *-------------------------------------- HTTP.GET1 .AZ "GET /" HTTP.GET1.LEN .EQ *-HTTP.GET1 HTTP.GET2 .AS " HTTP/1.1\r\n" .AS "User-Agent: A2osX.HTTPGET\r\n" .AZ "Host: " HTTP.GET2.LEN .EQ *-HTTP.GET2 HTTP.GET3 .AZ "\r\n" HTTP.GET3.LEN .EQ *-HTTP.GET3 *-------------------------------------- .DUMMY .OR 0 DS.START ArgIndex .BS 1 hReqBuf .BS 1 hRespBuf .BS 1 hSocket .BS 1 TimeOut .BS 1 DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/BIN/HTTPGET.S ASM