A2osX/BIN/HTTPGET.S.txt
2020-09-01 08:23:13 +02:00

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

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/httpget
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.i
.INB inc/mli.e.i
.INB inc/eth.i
.INB inc/libtcpip.i
.INB inc/net.http.i
*--------------------------------------
TIMEOUT.MAX .EQ 200 20 sec.
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPIPCfgPtr .BS 2
ZPHostPtr .BS 2
ZPPtr .BS 2
ZPReqBufPtr .BS 2
ZPReqBufLen .BS 2
ZPEncodedBufPtr .BS 2
ZPEncodedBufLen .BS 2
ZPRespBufPtr .BS 2
ArgIndex .BS 1
hSocket .BS 1
hReqBuf .BS 1
hEncodedBuf .BS 1
hSendBuf .BS 1
ZPSendBufPtr .BS 2
hFile .BS 1
ZPFileName .BS 2
hRespBuf .BS 1
bResponse .BS 1
TimeOut .BS 1
bURI .BS 1
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 Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
.DA #64 SS
.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.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.CONNECT .DA MSG.CONNECT
L.MSG.SKTKO .DA MSG.SKTKO
L.MSG.CONNECTED .DA MSG.CONNECTED
L.MSG.SKTERR .DA MSG.SKTERR
L.MSG.IOERR .DA MSG.IOERR
L.HTTP.GET .DA HTTP.GET
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
.9 rts
*--------------------------------------
CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG 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 ArgIndex
lda 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
lda TimeOut
bne .2
>PUSHW L.MSG.UNKNOWN
>PUSHW ZPHostPtr
>PUSHBI 2
>SYSCALL PrintF
bra CS.RUN.ESYN
.9 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
CS.RUN.ESYN lda #E.SYN
sec
CS.RUN.RTS rts
CS.RUN.HOSTOK inc ArgIndex
lda 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 ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .8
>STYA ZPPtr
lda (ZPPtr)
cmp #'-'
bne CS.RUN.ESYN
.1 ldy #1
lda (ZPPtr),y
cmp #'a'
bcc .11
cmp #'z'+1
bcs .11
eor #$20
.11 cmp #'U'
bne .2
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
.9 bcs CS.RUN.ESYN
>STYA ZPReqBufPtr
>SYSCALL StrLen
>STYA ZPReqBufLen
.8 bra CS.RUN.PORTOK
.2 cmp #'F'
bne .3
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .9
>PUSHYA
>PUSHBI O.RDONLY
>PUSHBI S.FI.T.TXT
>PUSHWZ Aux type
>SYSCALL LoadTxtFile
bcs .9
>STYA ZPReqBufLen
stx hReqBuf
>SYSCALL GetMemPtr
>STYA ZPReqBufPtr
sec
ror bURI
bra CS.RUN.PORTOK
.3 cmp #'O'
bcs .9
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .9
>STYA ZPFileName
CS.RUN.PORTOK >PUSHW L.MSG.CONNECT
ldx #0
.1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x
inx
cpx #4
bne .1
>PUSHW SA.REMOTE+S.SOCKADDR.PORT
>PUSHW ZPHostPtr
>PUSHBI 8
>SYSCALL PrintF
CS.RUN.OPENSKT >PUSHBI 0 no protocol
lda #S.SOCKET.T.SEQPKT
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
bcs .9
sta hSocket
>PUSHW L.SA.LOCAL
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
bcc .1
.9 pha
>LDYA L.MSG.SKTKO
>SYSCALL PutS
pla
sec
.99 rts
.1 jsr Init.TimeOut
.2 >SLEEP
>PUSHW L.SA.REMOTE
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
bcc .3
cmp #ERR.SKT.NOCONN
bne .9
lda TimeOut
bne .2
lda #ERR.SKT.NOCONN
bra .9
.3 >LDYA L.MSG.CONNECTED
>SYSCALL PutS
>SLEEP
CS.RUN.GET jsr CS.RUN.ENCODE
bcs .99
jsr CS.RUN.REQUEST
bcs .99
>LDYA ZPFileName
beq .1
>PUSHYA
>PUSHBI O.CREATE+O.WRONLY+O.TRUNC
>PUSHBI 0 TYPE
>PUSHWI 0 AUXTYPE
>SYSCALL FOpen
bcs .9
sta hFile
.1 jsr CS.RUN.RESPONSE
bcs .99
.9 lda #0
sec
.99 rts
*--------------------------------------
CS.RUN.SKTERR pha
>PUSHW L.MSG.SKTERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.IOERR pha
>PUSHW L.MSG.IOERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.ENCODE >LDYA ZPReqBufPtr
>STYA ZPPtr
.10 lda (ZPPtr)
beq .4
inc ZPEncodedBufLen
bne .1
inc ZPEncodedBufLen+1
.1 inc ZPPtr
bne .11
inc ZPPtr+1
.11 jsr CS.RUN.TOENCODE
bcc .10
.3 lda ZPEncodedBufLen
clc
adc #2
sta ZPEncodedBufLen
bcc .10
inc ZPEncodedBufLen+1
bra .10
.4 >LDYA ZPEncodedBufLen
>SYSCALL GetMem
bcs .9
>STYA ZPEncodedBufPtr
>STYA ZPPtr
stx hEncodedBuf
.5 lda (ZPReqBufPtr)
beq .8
inc ZPReqBufPtr
bne .6
inc ZPReqBufPtr+1
.6 jsr CS.RUN.TOENCODE
bcc .7
jsr CS.RUN.ADDBYTETOBUF
bra .5
.7 jsr CS.RUN.ADDTOBUF
bra .5
.8 clc
.9 rts
*--------------------------------------
CS.RUN.TOENCODE ldx #URI.ToEncode.Cnt-1
.1 cmp URI.ToEncode,x
beq .9 CS
dex
bpl .1
clc
.9 rts
*--------------------------------------
CS.RUN.ADDBYTETOBUF
pha
lda #'%'
jsr CS.RUN.ADDTOBUF
pla
pha
lsr
lsr
lsr
lsr
ora #$30
cmp #$3A
bcc .1
adc #6
.1 jsr CS.RUN.ADDTOBUF
pla
and #$0F
ora #$30
cmp #$3A
bcc CS.RUN.ADDTOBUF
adc #6
*--------------------------------------
CS.RUN.ADDTOBUF sta (ZPPtr)
inc ZPPtr
bne .8
inc ZPPtr+1
.8 rts
*--------------------------------------
CS.RUN.REQUEST jsr Init.TimeOut
>LDYAI 1024
>SYSCALL GetMem
bcs .9
>STYA ZPSendBufPtr
stx hSendBuf
>PUSHYA
>PUSHW L.HTTP.GET
>PUSHW ZPEncodedBufPtr
>PUSHW ZPHostPtr
>PUSHBI 4
>SYSCALL SPrintF
bcs .90
>PUSHYA Byte count
>PUSHW ZPSendBufPtr
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Send
.90 php
pha
lda hSendBuf
>SYSCALL FreeMem
pla
plp
.9 rts
*--------------------------------------
CS.RUN.RESPONSE jsr Init.TimeOut
.1 >SLEEP
lda #'?'
>SYSCALL putchar
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
bcc .2
cmp #E.NODATA
bne .8
lda TimeOut
bne .1
bra .80
.2 lda #'!'
>SYSCALL putchar
>SYSCALL GetMemPtr
>STYA ZPRespBufPtr
>PUSHW ZPRespBufPtr
lda hFile
bne .3
ldy #S.PS.hStdOut
lda (pPS),y
.3 >SYSCALL FWrite
bcs .9
sec
ror bResponse
bra CS.RUN.RESPONSE
.8 cmp #MLI.E.IO SKT Close ?
bne .9
.80 lda bResponse
bpl .99
.81 clc
rts
.99 lda #MLI.E.IO
.9 sec
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 hSocket
beq .1
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.1 lda hReqBuf
beq .2
>SYSCALL FreeMem
.2 lda hEncodedBuf
beq .3
>SYSCALL FreeMem
.3 lda hRespBuf
beq .4
>SYSCALL FreeMem
.4 lda hFile
beq .5
>SYSCALL FClose
.5 lda hLIBTCPIP
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
Init.TimeOut lda #TIMEOUT.MAX
sta TimeOut
rts
*--------------------------------------
CS.END
LIBTCPIP .AZ "libtcpip"
hLIBTCPIP .BS 1
MSG.IPKO .AZ "TCP/IP Not Loaded/Configured."
MSG.USAGE .AS "Usage : HTTPGET <ip|host> [port]\r\n"
.AS " -U Url\r\n"
.AS " -F UrlFile\r\n"
.AZ " -O OutputFile\r\n"
MSG.UNKNOWN .AZ "%s: Unknown host\r\n"
MSG.CONNECT .AZ "Connecting to %d.%d.%d.%d:%D (%s)..."
MSG.SKTKO .AZ "Failed to Open Socket."
MSG.CONNECTED .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
*--------------------------------------
URI.ToEncode .DA #C.LF,#C.CR,#C.SPACE,#'"'
.AS "%-.\^_`{|}~"
URI.ToEncode.Cnt .EQ *-URI.ToEncode
*--------------------------------------
HTTP.GET .AS "GET /%s HTTP/1.1"
.DA #C.CR,#C.LF
.AS "User-Agent: A2osX.HTTPGET"
.DA #C.CR,#C.LF
.AS "Host: %s"
.DA #C.CR,#C.LF
.AS "Connection: close"
.DA #C.CR,#C.LF
.DA #C.CR,#C.LF
.DA #0
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/httpget.s
ASM