NEW PREFIX AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF SBIN/HTTPD *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/ETH.I .INB INC/LIBTCPIP.I .INB INC/NET.HTTP.I *-------------------------------------- TIMEOUT.MAX .EQ 30 30 sec. CONN.MAX .EQ 16 *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPSktPtr .EQ ZPBIN+2 ZPLinePtr .EQ ZPBIN+4 *-------------------------------------- * 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 .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #6 ZP .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.Local .DA SA.Local L.MSG.TCPWAIT .DA MSG.TCPWAIT L.MSG.INITOK .DA MSG.INITOK L.MSG.TCPIPERR .DA MSG.TCPIPERR L.MSG.SKTERR .DA MSG.SKTERR L.MSG.ABORT .DA MSG.ABORT L.MSG.INCOMING .DA MSG.INCOMING L.HTTP.200OK .DA HTTP.200OK .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib sta hLIBTCPIP clc rts *-------------------------------------- CS.RUN jsr Init.Timeout >LDYA L.MSG.TCPWAIT >SYSCALL printf .1 >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? bcs .99 >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.INIT >SLEEP jsr Wait.Timeout bcc .1 >SYSCALL GetChar bcs .1 cmp #$03 bne .1 >LDYA L.MSG.ABORT >SYSCALL printf lda #0 clc rts .99 >LDYA L.MSG.TCPIPERR >SYSCALL printf lda #E.SYN sec CS.RUN.RTS rts CS.RUN.INIT ldx #3 ldy #S.IPCFG.IP+3 .1 lda (ZPIPCfgPtr),y sta SA.LOCAL+S.SOCKADDR.ADDR,x dey dex bpl .1 >PUSHBI 0 no protocol lda #S.SOCKET.T.STREAM >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs CS.RUN.ERR >STA.G hSrvSocket pha >PUSHW L.SA.LOCAL pla >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs CS.RUN.ERR >LDA.G hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Listen bcs CS.RUN.ERR >LDYAI 256 >SYSCALL getmem bcs CS.RUN.RTS >STYA ZPLinePtr txa >STA.G hLineBuf >LDYA L.MSG.INITOK >SYSCALL printf CS.RUN.LOOP >SLEEP jsr CS.RUN.SERVER bcs CS.RUN.ERR ldy #SktIndex lda (pData),y tay lda (pData),y hSockets beq .3 jsr CS.RUN.CLIENT .3 ldy #SktIndex lda (pData),y inc cmp #CONN.MAX bne .4 lda #0 .4 sta (pData),y bra CS.RUN.LOOP .9 >LDYA L.MSG.SKTERR >SYSCALL printf lda #E.SYN sec CS.RUN.ERR rts *-------------------------------------- CS.RUN.SERVER >LDA.G hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.accept bcs .8 pha ldy #hSockets ldx #CONN.MAX .1 lda (pData),y beq .2 iny dex bne .1 pla >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown bra .8 .2 pla sta (pData),y >STA.G hClntSocket >SYSCALL GetMemPtr >STYA ZPSktPtr ldx #3 ldy #S.SOCKET.REM.ADDR+3 .3 >PUSHB (ZPSktPtr),y dey dex bpl .3 >PUSHB.G hClntSocket >PUSHBI 5 >LDYA L.MSG.INCOMING >SYSCALL printf .8 clc .9 rts *-------------------------------------- CS.RUN.CLIENT >STA.G hClntSocket pha >PUSHWI 256 >PUSHW ZPLinePtr pla >LIBCALL hLIBTCPIP,LIBTCPIP.read bcs .1 >PUSHW ZPLinePtr >SYSCALL printf >PUSHB hClntSocket >PUSHW L.HTTP.200OK >LDA.G hClntSocket >LIBCALL hLIBTCPIP,LIBTCPIP.write .1 clc rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT ldx #CONN.MAX ldy #hSockets .1 lda (pData),y beq .2 phx phy >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown ply plx .2 iny dex bne .1 ldy #hSrvSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown >LDA.G hLineBuf beq .3 >SYSCALL FreeMem .3 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- Init.Timeout ldy #TimeOut lda #TIMEOUT.MAX sta (pData),y rts *-------------------------------------- Wait.TimeOut sec ldy #TimeOut lda (pData),y beq .9 clc .9 rts *-------------------------------------- CS.END *-------------------------------------- LIBTCPIP .AZ "libtcpip.o" MSG.TCPWAIT .AZ "HTTPD:Waiting for TCP/IP initializing...\r\n" MSG.INITOK .AZ "HTTPD:Init Ok, Listening.\r\n" MSG.TCPIPERR .AZ "HTTPD:TCP/IP Not initialized properly\r\n" MSG.SKTERR .AZ "HTTPD:Listen Error\r\n" MSG.ABORT .AZ "HTTPD:User Aborted\r\n" MSG.INCOMING .AZ "HTTPD:Incoming Connection [SKT=%h] From : %d.%d.%d.%d\r\n" hLIBTCPIP .BS 1 *-------------------------------------- HTTP.200OK .AS "HTTP/1.1 200 OK\r\n" HTTP.200OK.len .EQ *-HTTP.200OK *-------------------------------------- SA.LOCAL .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .DA TCP.PORT.HTTP *-------------------------------------- .DUMMY .OR 0 DS.START hSockets .BS CONN.MAX pData hLineBuf .BS 1 SktIndex .BS 1 hSrvSocket .BS 1 hClntSocket .BS 1 TimeOut .BS 1 DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/SBIN/HTTPD.S ASM