A2osX/BIN/IRC.S.txt

453 lines
8.3 KiB
Plaintext
Raw Normal View History

2020-06-18 15:13:56 +00:00
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
2020-06-19 06:33:47 +00:00
L.IRC.JOINKEY .DA IRC.JOINKEY
2020-06-18 15:13:56 +00:00
L.SEQ.INIT .DA SEQ.INIT
2020-06-19 06:33:47 +00:00
L.SEQ.BAR .DA SEQ.BAR
L.SEQ.RESET .DA SEQ.RESET
2020-06-18 15:13:56 +00:00
.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
2020-06-19 06:33:47 +00:00
stx hMsgBuf
>STYA ZPMsgBufPtr
jsr CS.RUN.SCRSETUP
bcs .99
jsr CS.RUN.USER
bcs .99
jsr CS.RUN.JOIN
bcs .99
2020-06-18 15:13:56 +00:00
CS.RUN.LOOP >SLEEP
lda hSocket
2020-06-19 06:33:47 +00:00
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
2020-06-18 15:13:56 +00:00
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
2020-06-19 06:33:47 +00:00
bcs CS.RUN.ERR
2020-06-18 15:13:56 +00:00
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
2020-06-19 06:33:47 +00:00
>PUSHW ZPMsgBufPtr
2020-06-18 15:13:56 +00:00
>PUSHW L.MSG.TOPBAR
2020-06-19 06:33:47 +00:00
>PUSHB #K.VER
>PUSHB /K.VER
2020-06-18 15:13:56 +00:00
lda #1
>SYSCALL ArgV
>PUSHYA
lda #2
>SYSCALL ArgV
>PUSHYA
lda #3
>SYSCALL ArgV
>PUSHYA
lda #4
>SYSCALL ArgV
>PUSHYA
2020-06-19 06:33:47 +00:00
>PUSHBI 10
2020-06-18 15:13:56 +00:00
>SYSCALL SPrintF
2020-06-19 06:33:47 +00:00
>PUSHW L.SEQ.BAR
>PUSHW ZPMsgBufPtr
>PUSHBI 2
2020-06-18 15:13:56 +00:00
>SYSCALL PrintF
2020-06-19 06:33:47 +00:00
>DEBUG
2020-06-18 15:13:56 +00:00
rts
*--------------------------------------
2020-06-19 06:33:47 +00:00
CS.RUN.USER >PUSHW ZPRepPtr
2020-06-18 15:13:56 +00:00
>PUSHW L.IRC.USER
lda #3 nickname
>SYSCALL ArgV
>PUSHYA
lda #3 nickname
>SYSCALL ArgV
>PUSHYA
>PUSHBI 4
>SYSCALL SPrintF
bcs .9
2020-06-19 06:33:47 +00:00
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
2020-06-18 15:13:56 +00:00
.9 rts
*--------------------------------------
2020-06-19 06:33:47 +00:00
CS.RUN.JOIN >PUSHW ZPRepPtr
2020-06-18 15:13:56 +00:00
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
2020-06-19 06:33:47 +00:00
>PUSHBI 2
2020-06-18 15:13:56 +00:00
.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
2020-06-19 06:33:47 +00:00
>PUSHW ZPRepPtr
2020-06-18 15:13:56 +00:00
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 <ip|host> <port> <nickname> <#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"
2020-06-19 06:33:47 +00:00
SEQ.BAR .AZ "\e[7m\e[37;40m%80s\e[0m"
SEQ.RESET .AZ "\ec"
2020-06-18 15:13:56 +00:00
*--------------------------------------
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
2020-06-19 06:33:47 +00:00
.BS 2
2020-06-18 15:13:56 +00:00
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END
.ED
*--------------------------------------
MAN
SAVE usr/src/bin/irc.s
ASM