NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/SBIN/HTTPD *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBTCPIP.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 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.Socket .DA Socket 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.YA sta hLIBTCPIP lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc rts *-------------------------------------- CS.RUN jsr Init.Timeout >LDYA L.MSG.TCPWAIT >SYSCALL PrintF.YA .1 >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG 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.YA lda #0 clc rts .99 >LDYA L.MSG.TCPIPERR >SYSCALL PrintF.YA lda #K.E.SYN sec CS.RUN.RTS rts CS.RUN.INIT ldx #3 ldy #S.IPCFG.IP+3 .1 lda (ZPIPCfgPtr),y sta Socket.Src.Addr,x dey dex bpl .1 >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcs CS.RUN.RTS txa ldy #hSrvSocket sta (pData),y >LDYAI 256 >SYSCALL GetMem.YA bcs CS.RUN.RTS >STYA ZPLinePtr txa >STA.G hLineBuf >LDYA L.MSG.INITOK >SYSCALL PrintF.YA 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.YA lda #K.E.SYN sec rts CS.RUN.ERR sec rts *-------------------------------------- CS.RUN.SERVER ldy #hSrvSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.AcceptA bcs .8 pha ldy #hSockets ldx #CONN.MAX .1 lda (pData),y beq .2 iny dex bne .1 pla >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CloseA bra .8 .2 pla sta (pData),y sta .4+1 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetA >STYA ZPSktPtr ldx #3 ldy #S.SOCKET.DST.ADDR+3 .3 >PUSHB (ZPSktPtr),y dey dex bpl .3 .4 lda #$ff >PUSHA >LDYA L.MSG.INCOMING >SYSCALL PrintF.YA .8 clc .9 rts *-------------------------------------- CS.RUN.CLIENT sta hClntSocket >PUSHA hSocket >PUSHW ZPLinePtr >PUSHWI 256 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetS bcs .1 >PUSHW ZPLinePtr >SYSCALL PrintF.YA >PUSHB hClntSocket >PUSHW L.HTTP.200OK >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.PutS .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.SKT.CLOSEA ply plx .2 iny dex bne .1 ldy #hSrvSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA >LDA.G hLineBuf beq .3 >SYSCALL FreeMem.A .3 lda hLIBTCPIP >SYSCALL UnloadLib.A 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 hClntSocket .BS 1 *-------------------------------------- HTTP.200OK .AZ "HTTP/1.1 200 OK\r\n" *-------------------------------------- Socket .DA #S.SOCKET.SOCK.STREAM .DA #S.SOCKET.SO.ACCEPTCONN .DA #S.SOCKET.TCP.STATUS.LISTEN .BS 1 Socket.Src.Addr .BS 4 Socket.Src.Port .DA 80 Socket.Dst.Addr .BS 4 Socket.Dst.Port .BS 2 *-------------------------------------- .DUMMY .OR 0 DS.START hSockets .BS CONN.MAX pData hLineBuf .BS 1 SktIndex .BS 1 hSrvSocket .BS 1 TimeOut .BS 1 DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/HTTPD.S ASM