A2osX/BIN/IRC.S.txt
2020-06-27 20:30:09 +02:00

1016 lines
17 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/irc
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.i
.INB inc/eth.i
.INB inc/libtcpip.i
*--------------------------------------
TIMEOUT.MAX .EQ 200 20 sec.
MSGSIZE .EQ 1024
TEXTMAX .EQ 240
*--------------------------------------
* https://tools.ietf.org/html/rfc2812#section-3.3
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
hSocket .BS 1
hFile .BS 1
hLineBuf .BS 1
ZPLineBufPtr .BS 2
TextPtr .BS 1
TextLen .BS 1
hText .BS 1
ZPTextPtr .BS 2
bEscMode .BS 1
TimeOut .BS 1
bJoin .BS 1
hMsgBuf .BS 1
ZPMsgPtr .BS 2
ZPMsgPfxPtr .BS 2
ZPMsgCmdPtr .BS 2
ZPMsgArgPtr .BS 2
ZPMsgExtPtr .BS 2
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.NOD.Template .DA NOD.Template
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.NICK .DA MSG.NICK
L.MSG.USER .DA MSG.USER
L.MSG.JOIN .DA MSG.JOIN
L.MSG.TOPBAR .DA MSG.TOPBAR
L.MSG.STATUSBAR .DA MSG.STATUSBAR
L.MSG.STATUSBARMSG .DA MSG.STATUSBARMSG
L.IRC.NICK .DA IRC.NICK
L.IRC.USER .DA IRC.USER
L.IRC.JOIN .DA IRC.JOIN
L.IRC.JOINKEY .DA IRC.JOINKEY
L.IRC.PONG .DA IRC.PONG
L.SEQ.INIT .DA SEQ.INIT
L.SEQ.BAR .DA SEQ.BAR
L.SEQ.TXTCLR .DA SEQ.TXTCLR
L.SEQ.PRIVMSG .DA SEQ.PRIVMSG
L.SEQ.INFOMSG .DA SEQ.INFOMSG
L.SEQ.DUMPMSG .DA SEQ.DUMPMSG
L.SEQ.RESET .DA SEQ.RESET
L.IRC.CMDS .DA IRC.CMDS
J.IRC.CMDS .DA CS.RUN.CMD.JOIN
.DA CS.RUN.CMD.PING
.DA CS.RUN.CMD.PRIVMSG
.DA CS.RUN.CMD.MODE
.DA CS.RUN.CMD.353
.DA CS.RUN.CMD.375
.DA CS.RUN.CMD.372
.DA CS.RUN.CMD.376
J.ESC .DA CS.RUN.CHARIN.LEFT
.DA CS.RUN.CHARIN.DOWN
.DA CS.RUN.CHARIN.UP
.DA CS.RUN.CHARIN.RIGHT
.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 ZPPtr1
lda (ZPPtr1) Configured ?
bmi CS.RUN.IPOK
>LDYA L.MSG.IPKO
>SYSCALL PutS
lda #E.SYN
sec
.99 rts
CS.RUN.IPOK ldy #S.PS.ARGC
lda (pPS),y
cmp #3
bcc .9
ldy #S.IPCFG.IP+3
ldx #3
.1 lda (ZPPtr1),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.STREAM
>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
jsr CS.RUN.MkNod
bcs .99
jsr CS.RUN.GETBUF
bcs .99
jsr CS.RUN.SCRSETUP
bcs .99
jsr CS.RUN.NICK
bcs .99
>SLEEP
jsr CS.RUN.USER
bcs .99
>SLEEP
jsr CS.RUN.JOIN
bcs .99
>LDYA pData NULLSTRING
jsr CS.RUN.STATUSPDATE
bcs .99
CS.RUN.LOOP >SLEEP
lda hFile
>SYSCALL feof
bcs .9
tay
* bne .2
beq .77
lda $427
eor #$C0
sta $427
bra .2
.77 >PUSHWI MSGSIZE
>PUSHW ZPMsgPtr
lda hFile
>SYSCALL fgets
bcs .9
jsr CS.RUN.REQ
bcs .9
.2 ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL feof
bcs .9
tay
bne CS.RUN.LOOP EOF = true, no char from STDIN
>SYSCALL GetChar
bcs .9
jsr CS.RUN.CHARIN
bcc CS.RUN.LOOP
.9 php
pha
>PUSHW L.SEQ.RESET
>PUSHBI 0
>SYSCALL PrintF
pla
plp
rts
*--------------------------------------
CS.RUN.MkNod >PUSHEA.G NodBuf
>PUSHW L.NOD.Template
>PUSHB hSocket
>PUSHBI 1
>SYSCALL sprintf
bcs .9
>PUSHEA.G NodBuf
>PUSHW 0
>PUSHB hSocket
>SYSCALL mknod
bcs .9
>PUSHEA.G NodBuf
>PUSHBI O.RDWR+O.TEXT
>PUSHBI S.FI.T.TXT
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
sta hFile
.9 rts
*--------------------------------------
CS.RUN.GETBUF >LDYAI MSGSIZE
>SYSCALL GetMem
bcs .9
stx hMsgBuf
>STYA ZPMsgPtr
>LDYAI 256
>SYSCALL GetMem
bcs .9
stx hText
>STYA ZPTextPtr
>LDYAI 256
>SYSCALL GetMem
bcs .9
stx hLineBuf
>STYA ZPLineBufPtr
.9 rts
*--------------------------------------
CS.RUN.SCRSETUP >PUSHW L.SEQ.INIT
>PUSHBI 0
>SYSCALL PrintF
bcs .9
jsr CS.RUN.TOPUPDATE
bcs .9
jsr CS.RUN.TXTCLR
.9 rts
*--------------------------------------
CS.RUN.TOPUPDATE
>PUSHW ZPLineBufPtr
>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
>PUSHBI 8
>SYSCALL SPrintF
>PUSHW L.SEQ.BAR
>PUSHBI 1
>PUSHW ZPLineBufPtr
>PUSHBI 3
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.STATUSPDATE
pha
phy
>PUSHW ZPLineBufPtr
>PUSHW L.MSG.STATUSBAR
lda #4
>SYSCALL ArgV
>PUSHYA
ply
pla
>PUSHYA
>PUSHBI 4
bra CS.RUN.STATUS
*--------------------------------------
CS.RUN.STATUSMSG
pha
>PUSHW ZPLineBufPtr
>PUSHW L.MSG.STATUSBARMSG
pla
>PUSHYA
>PUSHBI 2
CS.RUN.STATUS >SYSCALL SPrintF
>PUSHW L.SEQ.BAR
>PUSHBI 21
>PUSHW ZPLineBufPtr
>PUSHBI 3
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.TXTCLR lda #0
sta (ZPTextPtr)
stz TextPtr
stz TextLen
stz bEscMode
>PUSHW L.SEQ.TXTCLR
>PUSHBI 0
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.NICK >LDYA L.MSG.NICK
jsr CS.RUN.STATUSMSG
>PUSHB hFile
>PUSHW L.IRC.NICK
lda #3 nickname
>SYSCALL ArgV
>PUSHYA
>PUSHBI 2
>SYSCALL FPrintF
bcs .9
.1 >SLEEP
>PUSHWI MSGSIZE
>PUSHW ZPMsgPtr
lda hFile
>SYSCALL fgets
bcs .9
jsr CS.RUN.SPLITMSG
jsr CS.RUN.DUMPMSG
ldy #$ff
.3 iny
lda IRC.REP.NOIDENT,y
beq .8
cmp (ZPMsgExtPtr),y
beq .3
bra .1
.8 lda #"N"
sta $427
clc
.9 rts
*--------------------------------------
CS.RUN.USER >LDYA L.MSG.USER
jsr CS.RUN.STATUSMSG
>PUSHB hFile
>PUSHW L.IRC.USER
lda #3 nickname
>SYSCALL ArgV
>PUSHYA
lda #3 nickname
>SYSCALL ArgV
>PUSHYA
>PUSHBI 4
>SYSCALL FPrintF
bcs .9
.1 >SLEEP
>PUSHWI MSGSIZE
>PUSHW ZPMsgPtr
lda hFile
>SYSCALL fgets
bcs .9
.2 jsr CS.RUN.SPLITMSG
jsr CS.RUN.DUMPMSG
ldy #$ff
.3 iny
lda IRC.REP.001,y
beq .8
cmp (ZPMsgCmdPtr),y
beq .3
bra .1
.8 lda #"U"
sta $427
clc
.9 rts
*--------------------------------------
CS.RUN.JOIN >LDYA L.MSG.JOIN
jsr CS.RUN.STATUSMSG
>PUSHB hFile
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 .2
.1 >PUSHW L.IRC.JOIN
lda #4 channel
>SYSCALL ArgV
>PUSHYA
>PUSHBI 2
.2 >SYSCALL FPrintF
.9 rts
*--------------------------------------
CS.RUN.REQ jsr CS.RUN.SPLITMSG
bcs .8
* jsr CS.RUN.DUMPMSG
>LDYA L.IRC.CMDS
>STYA ZPPtr1
ldx #0
.1 lda (ZPPtr1)
beq .8
ldy #$ff
.2 iny
lda (ZPPtr1),y
cmp (ZPMsgCmdPtr),y
bne .3
ora #0
bne .2
jmp (J.IRC.CMDS,x)
.3 ora #0
beq .5
.4 iny
lda (ZPPtr1),y
bne .4
.5 inx
inx
tya
sec
adc ZPPtr1
sta ZPPtr1
bcc .1
inc ZPPtr1+1
bra .1
.8 clc
.9 rts
*--------------------------------------
CS.RUN.CMD.JOIN sec
ror bJoin
lda #"J"
sta $427
clc
rts
*--------------------------------------
CS.RUN.CMD.PING >PUSHB hFile
>PUSHW L.IRC.PONG
>PUSHW ZPMsgExtPtr
>PUSHBI 2
>SYSCALL FPrintF
rts
*--------------------------------------
CS.RUN.CMD.PRIVMSG
ldy #0
.1 iny
lda (ZPMsgPfxPtr),y
beq .2
eor #'!'
bne .1
sta (ZPMsgPfxPtr),y
.2 >PUSHW L.SEQ.PRIVMSG
>PUSHW ZPMsgPfxPtr
>PUSHW ZPMsgExtPtr
>PUSHBI 4
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.CMD.MODE
clc
rts
*--------------------------------------
CS.RUN.CMD.353 >LDYA ZPMsgExtPtr
jmp CS.RUN.STATUSPDATE
CS.RUN.CMD.375
CS.RUN.CMD.372
CS.RUN.CMD.376
>PUSHW L.SEQ.INFOMSG
>PUSHW ZPMsgExtPtr
>PUSHBI 2
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.SPLITMSG >LDYA pData
>STYA ZPMsgPfxPtr
>STYA ZPMsgCmdPtr
>STYA ZPMsgArgPtr
>STYA ZPMsgExtPtr
ldy #0
ldx #0
lda (ZPMsgPtr)
cmp #':'
bne .2
lda ZPMsgPtr
clc
adc #1
sta ZPMsgPfxPtr
lda ZPMsgPtr+1
adc #0
sta ZPMsgPfxPtr+1
.1 iny
lda (ZPMsgPtr),y
beq .9
cmp #C.SPACE
bne .1
lda #0
sta (ZPMsgPtr),y
iny Skip blank
tya
tax Save CMD start pos
.2 iny
lda (ZPMsgPtr),y
beq .4
.3 cmp #C.SPACE
bne .2
lda #0
sta (ZPMsgPtr),y
iny Skip blank
.4 php
txa
clc
adc ZPMsgPtr
sta ZPMsgCmdPtr
lda #0
adc ZPMsgPtr+1
sta ZPMsgCmdPtr+1
plp
beq .80
tya
tax Save Arg start pos
lda (ZPMsgPtr),y
cmp #':'
beq .71 not arg....ext
.6 iny
lda (ZPMsgPtr),y
beq .7
cmp #C.SPACE
bne .6
lda #0
sta (ZPMsgPtr),y
iny Skip blank
.7 php
txa
clc
adc ZPMsgPtr
sta ZPMsgArgPtr
lda #0
adc ZPMsgPtr+1
sta ZPMsgArgPtr+1
plp
beq .80
lda (ZPMsgPtr),y
cmp #':'
bne .8
.71 iny Skip blank
.8 tya
clc
adc ZPMsgPtr
sta ZPMsgExtPtr
lda #0
adc ZPMsgPtr+1
sta ZPMsgExtPtr+1
.80 clc
rts
.9 sec
rts
*--------------------------------------
CS.RUN.DUMPMSG >PUSHW L.SEQ.DUMPMSG
>PUSHW ZPMsgPfxPtr
>PUSHW ZPMsgCmdPtr
>PUSHW ZPMsgArgPtr
>PUSHW ZPMsgExtPtr
>PUSHBI 8
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.CHARIN bit bEscMode
bpl .4
cmp #'['
beq .8
stz bEscMode
ldx #EscChars.Cnt-1
.1 cmp EscChars,x
beq .2
dex
bpl .1
clc
rts
.2 txa
asl
tax
jmp (J.ESC,x)
.4 cmp #C.ESC
bne .5
sec
ror bEscMode
.8 clc
rts
.5 cmp #C.SPACE
bcc CS.RUN.CHARIN.CTRL
cmp #C.DEL
bne CS.RUN.CHARIN.INS
lda TextLen
beq .8
lda TextPtr
beq .8
lda #C.BS
>SYSCALL PutChar
jmp CS.RUN.CHARIN.DEL
*--------------------------------------
CS.RUN.CHARIN.INS
ldy TextLen
cpy #TEXTMAX
beq .8
inc TextLen
ldy TextPtr
sta (ZPTextPtr),y
iny
sty TextPtr
pha
lda #0
sta (ZPTextPtr),y
pla
>SYSCALL PutChar
rts
.8 clc
rts
*--------------------------------------
CS.RUN.CHARIN.CTRL
cmp #C.CR
bne .1
bit bJoin
bpl .8
>PUSHW L.SEQ.PRIVMSG
lda #4 channel
>SYSCALL ArgV
>PUSHYA
>PUSHW ZPTextPtr
>PUSHBI 4
>SYSCALL PrintF
bcs .9
jmp CS.RUN.TXTCLR
.1 cmp #$14 Ctrl-T
bne .8
lda #3
sec
rts
.8 clc
.9 rts
*--------------------------------------
CS.RUN.CHARIN.LEFT
lda TextPtr
beq .9
dec TextPtr
lda #C.BS
>SYSCALL PutChar
.9 rts
CS.RUN.CHARIN.DOWN
CS.RUN.CHARIN.UP
clc
rts
CS.RUN.CHARIN.RIGHT
lda TextPtr
cmp TextLen
beq .9
inc
sta TextPtr
lda #C.FS
>SYSCALL PutChar
.9 rts
*--------------------------------------
CS.RUN.CHARIN.DEL
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 hFile
beq .1
>SYSCALL fclose
.1 lda hSocket
beq .2
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.2 lda hText
beq .3
>SYSCALL FreeMem
.3 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.NICK .AZ "Registering User..."
MSG.USER .AZ "Connecting User..."
MSG.JOIN .AZ "Joining Channel..."
MSG.TOPBAR .AZ "A2osX IRC %d.%d Server:%s:%s Nick:%s"
MSG.STATUSBAR .AZ "%s:%s"
MSG.STATUSBARMSG .AZ "STATUS:%s"
*--------------------------------------
EscChars .AS 'DBAC'
EscChars.Cnt .EQ *-EscChars
EscChars.Remap .DA #C.BS,#C.VT,#C.LF,#C.FS
*--------------------------------------
IRC.REP.NOIDENT .AZ "*** No Ident response"
IRC.REP.001 .AZ "001"
IRC.REP.JOIN .AZ "JOIN"
*--------------------------------------
IRC.CMDS .AZ "JOIN"
.AZ "PING"
.AZ "PRIVMSG"
.AZ "MODE"
.AZ "353"
.AZ "375"
.AZ "372"
.AZ "376"
.DA #0
*--------------------------------------
IRC.NICK .AZ "NICK %s\r\n"
IRC.USER .AZ "USER %s 0 * :%s\r\n"
IRC.JOIN .AZ "JOIN %s\r\n"
IRC.JOINKEY .AZ "JOIN %s %s\r\n"
IRC.PONG .AZ "PONG %s\r\n"
IRC.PRIVMSG .AZ "PRIVMSG %s :%s\r\n"
*--------------------------------------
SEQ.INIT .AZ "\ec\e(B\e)0\e[?7l\e[2;20r\e[22;1H\e[?7h"
SEQ.BAR .AZ "\e7\e[%d;1H\e[7m\e[37;40m%79s\e[0m\e8"
SEQ.TXTCLR .AZ "\e[22;1H\e[K\r\n\e[K\r\n\e[K\e[22;1H"
SEQ.PRIVMSG .AZ "\e7\e[20;1H\r\n\e[7m%s:\e[0m%s\e8"
SEQ.DUMPMSG .AZ "\e7\e[20;1H\r\n\e[7m%s \e[0m%s %s %s\e8"
SEQ.INFOMSG .AZ "\e7\e[20;1H%s\r\n\e8"
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
*--------------------------------------
NOD.Template .AZ "/dev/irc%h"
*--------------------------------------
.DUMMY
.OR 0
DS.START
NULLSTRING .BS 1
NodBuf .BS 11
DS.END
.ED
*--------------------------------------
MAN
SAVE usr/src/bin/irc.s
ASM