NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/irc *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/eth.i .INB inc/libtcpip.i *-------------------------------------- TIMEOUT.MAX .EQ 200 20 sec. BUFSIZE .EQ 1024 MSGSIZE .EQ 240 *-------------------------------------- * https://tools.ietf.org/html/rfc2812#section-3.3 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPIPCfgPtr .BS 2 ZPReqPtr .BS 2 ZPReqLen .BS 2 hReq .BS 1 hSocket .BS 1 ZPMsgBufPtr .BS 2 hMsgBuf .BS 1 MsgPtr .BS 1 ZPRepPtr .BS 2 hRep .BS 1 TimeOut .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 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.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.USER .DA MSG.USER L.MSG.TOPBAR .DA MSG.TOPBAR L.IRC.USER .DA IRC.USER L.IRC.JOIN .DA IRC.JOIN L.IRC.JOINKEY .DA IRC.JOINKEY L.SEQ.INIT .DA SEQ.INIT L.SEQ.BAR .DA SEQ.BAR L.SEQ.RESET .DA SEQ.RESET .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.PS.ARGC lda (pPS),y cmp #3 bcc .9 ldy #S.IPCFG.IP+3 ldx #3 .1 lda (ZPIPCfgPtr),y sta SA.LOCAL+S.SOCKADDR.ADDR,x dey dex bpl .1 lda #TIMEOUT.MAX sta TimeOut .2 >SLEEP >PUSHW L.SA.REMOTE.AD lda #1 >SYSCALL ArgV >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc CS.RUN.HOSTOK lda TimeOut bne .2 >PUSHW L.MSG.UNKNOWN lda #1 >SYSCALL ArgV >PUSHYA >PUSHBI 2 >SYSCALL PrintF bra .99 .9 >LDYA L.MSG.USAGE >SYSCALL PutS .99 lda #E.SYN sec rts CS.RUN.HOSTOK lda #2 >SYSCALL ArgV >SYSCALL atoi >STYA SA.REMOTE+S.SOCKADDR.PORT >PUSHW L.MSG.HOSTOK ldx #0 .1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x inx cpx #4 bne .1 >PUSHW SA.REMOTE+S.SOCKADDR.PORT lda #1 >SYSCALL ArgV >PUSHYA >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 .2 .9 pha >LDYA L.MSG.SKTKO >SYSCALL PutS pla sec .99 rts .2 lda #TIMEOUT.MAX sta TimeOut .3 >SLEEP >PUSHW L.SA.REMOTE lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .4 cmp #ERR.SKT.NOCONN bne .9 lda TimeOut bne .3 lda #ERR.SKT.NOCONN bra .9 .4 >PUSHW L.MSG.SKTOK >PUSHBI 0 >SYSCALL PrintF >LDYAI BUFSIZE >SYSCALL GetMem bcs .99 stx hRep >STYA ZPRepPtr >LDYAI MSGSIZE >SYSCALL GetMem bcs .99 stx hMsgBuf >STYA ZPMsgBufPtr jsr CS.RUN.SCRSETUP bcs .99 jsr CS.RUN.USER bcs .99 jsr CS.RUN.JOIN bcs .99 CS.RUN.LOOP >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .1 tay beq .2 No Frame bra .9 .1 jsr CS.RUN.REQ bcs .9 .2 ldy #S.PS.hStdIn lda (pPS),y >SYSCALL feof bcs CS.RUN.ERR tay bne CS.RUN.LOOP EOF = true, no char from STDIN >SYSCALL GetChar bcs .9 jsr CS.RUN.CHARIN bcs .9 jmp CS.RUN.LOOP .9 CS.RUN.ERR php pha >PUSHW L.SEQ.RESET >PUSHBI 0 >SYSCALL PrintF pla plp rts *-------------------------------------- CS.RUN.SCRSETUP >PUSHW L.SEQ.INIT >PUSHBI 0 >SYSCALL PrintF >PUSHW ZPMsgBufPtr >PUSHW L.MSG.TOPBAR >PUSHB #K.VER >PUSHB /K.VER lda #1 >SYSCALL ArgV >PUSHYA lda #2 >SYSCALL ArgV >PUSHYA lda #3 >SYSCALL ArgV >PUSHYA lda #4 >SYSCALL ArgV >PUSHYA >PUSHBI 10 >SYSCALL SPrintF >PUSHW L.SEQ.BAR >PUSHW ZPMsgBufPtr >PUSHBI 2 >SYSCALL PrintF >DEBUG rts *-------------------------------------- CS.RUN.USER >PUSHW ZPRepPtr >PUSHW L.IRC.USER lda #3 nickname >SYSCALL ArgV >PUSHYA lda #3 nickname >SYSCALL ArgV >PUSHYA >PUSHBI 4 >SYSCALL SPrintF bcs .9 jsr CS.RUN.SEND bcs .9 .1 >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .2 tay beq .1 No Frame bra .9 .2 sta hReq >SYSCALL GetMemPtr >STYA ZPReqPtr clc .9 rts *-------------------------------------- CS.RUN.JOIN >PUSHW ZPRepPtr lda #5 key >SYSCALL ArgV bcs .1 >PUSHW L.IRC.JOINKEY lda #4 channel >SYSCALL ArgV >PUSHYA lda #5 key >SYSCALL ArgV >PUSHYA >PUSHBI 4 bra .8 .1 >PUSHW L.IRC.JOIN lda #4 channel >SYSCALL ArgV >PUSHYA >PUSHBI 2 .8 >SYSCALL SPrintF bcs .9 jmp CS.RUN.SEND .9 rts *-------------------------------------- CS.RUN.REQ sta hReq >SYSCALL GetMemPtr >STYA ZPReqPtr clc rts *-------------------------------------- CS.RUN.SEND >PUSHYA >PUSHW ZPRepPtr lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Send rts *-------------------------------------- CS.RUN.CHARIN clc 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 hReq beq .2 >SYSCALL FreeMem .2 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- CS.END LIBTCPIP .AZ "libtcpip" hLIBTCPIP .BS 1 MSG.IPKO .AZ "TCP/IP Not Loaded/Configured." MSG.USAGE .AZ "Usage : IRC <#channel> [key]" 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\r\n(Exit key is Ctrl-T)\r\n" MSG.SKTERR .AZ "Socket Error : $%h\r\n" MSG.USER .AZ "User interrupt." MSG.TOPBAR .AZ "A2osX IRC %d.%d: %s:%s %s@%s" *-------------------------------------- IRC.MSG .AZ "PING" *-------------------------------------- IRC.USER .AZ "USER %s 0 * :%s" IRC.JOIN .AZ "JOIN %s" IRC.JOINKEY .AZ "JOIN %s %s" IRC.PRIVMSG .AZ "PRIVMSG %s %s" *-------------------------------------- SEQ.INIT .AZ "\ec\e(B\e)0\e[?7l\e[2;19r" SEQ.BAR .AZ "\e[7m\e[37;40m%80s\e[0m" SEQ.RESET .AZ "\ec" *-------------------------------------- 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 .BS 2 *-------------------------------------- .DUMMY .OR 0 DS.START DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/irc.s ASM