A2osX/BIN/IRC.S.txt

624 lines
11 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
2020-06-19 15:20:59 +00:00
USRSIZE .EQ 128
2020-06-18 15:13:56 +00:00
*--------------------------------------
* 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
2020-06-19 15:20:59 +00:00
ZPUsrBufPtr .BS 2
hUsrBuf .BS 1
2020-06-18 15:13:56 +00:00
ZPMsgBufPtr .BS 2
hMsgBuf .BS 1
2020-06-19 15:20:59 +00:00
TextPtr .BS 1
TextLen .BS 1
bEscMode .BS 1
2020-06-18 15:13:56 +00:00
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
2020-06-19 15:20:59 +00:00
.DA CS.DOEVENT
2020-06-18 15:13:56 +00:00
.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
2020-06-19 15:20:59 +00:00
L.MSG.STATUSBAR .DA MSG.STATUSBAR
2020-06-18 15:13:56 +00:00
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
2020-06-19 15:20:59 +00:00
L.SEQ.PRINTMSG .DA SEQ.PRINTMSG
L.SEQ.TXTCLR .DA SEQ.TXTCLR
2020-06-19 06:33:47 +00:00
L.SEQ.RESET .DA SEQ.RESET
2020-06-19 15:20:59 +00:00
J.ESC .DA CS.RUN.CHARIN.LEFT
.DA CS.RUN.CHARIN.DOWN
.DA CS.RUN.CHARIN.UP
.DA CS.RUN.CHARIN.RIGHT
2020-06-18 15:13:56 +00:00
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
.9 rts
*--------------------------------------
2020-06-19 15:20:59 +00:00
CS.RUN jsr CS.RUN.GETBUF
bcs .99
jsr CS.RUN.SCRSETUP
bcs .99
jsr CS.RUN.PRINTMSG
lda #0
sec
.99 rts
>LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
2020-06-18 15:13:56 +00:00
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bmi CS.RUN.IPOK
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
>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
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
>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
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
>PUSHBI 8
>SYSCALL PrintF
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
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
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
>PUSHW L.SA.REMOTE
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
bcc .4
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
cmp #ERR.SKT.NOCONN
bne .9
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda TimeOut
bne .3
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda #ERR.SKT.NOCONN
bra .9
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
.4 >PUSHW L.MSG.SKTOK
>PUSHBI 0
>SYSCALL PrintF
2020-06-19 06:33:47 +00:00
jsr CS.RUN.USER
bcs .99
2020-06-19 15:20:59 +00:00
2020-06-19 06:33:47 +00:00
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
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
jsr CS.RUN.CHARIN
bcs .9
jmp CS.RUN.LOOP
2020-06-19 15:20:59 +00:00
.9
2020-06-18 15:13:56 +00:00
CS.RUN.ERR php
pha
>PUSHW L.SEQ.RESET
>PUSHBI 0
>SYSCALL PrintF
pla
plp
rts
*--------------------------------------
2020-06-19 15:20:59 +00:00
CS.RUN.GETBUF >LDYAI BUFSIZE
>SYSCALL GetMem
bcs .9
stx hRep
>STYA ZPRepPtr
>LDYAI USRSIZE
>SYSCALL GetMem
bcs .9
stx hUsrBuf
>STYA ZPUsrBufPtr
lda #0
sta (ZPUsrBufPtr)
>LDYAI MSGSIZE
>SYSCALL GetMem
bcs .9
stx hMsgBuf
>STYA ZPMsgBufPtr
.9 rts
*--------------------------------------
2020-06-18 15:13:56 +00:00
CS.RUN.SCRSETUP >PUSHW L.SEQ.INIT
>PUSHBI 0
>SYSCALL PrintF
2020-06-19 15:20:59 +00:00
bcs .9
jsr CS.RUN.TOPUPDATE
bcs .9
>DEBUG
jsr CS.RUN.STATUSPDATE
bcs .9
>DEBUG
jsr CS.RUN.TXTCLR
>DEBUG
.9 rts
*--------------------------------------
CS.RUN.TOPUPDATE
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-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda #1
>SYSCALL ArgV
>PUSHYA
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda #2
>SYSCALL ArgV
>PUSHYA
2020-06-19 15:20:59 +00:00
lda #3
>SYSCALL ArgV
>PUSHYA
>PUSHBI 8
>SYSCALL SPrintF
>PUSHW L.SEQ.BAR
>PUSHW ZPMsgBufPtr
>PUSHBI 2
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.PRINTMSG >PUSHW L.SEQ.PRINTMSG
2020-06-18 15:13:56 +00:00
lda #3
>SYSCALL ArgV
>PUSHYA
2020-06-19 15:20:59 +00:00
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHBI 4
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.STATUSPDATE
>PUSHW ZPMsgBufPtr
>PUSHW L.MSG.STATUSBAR
2020-06-18 15:13:56 +00:00
lda #4
>SYSCALL ArgV
>PUSHYA
2020-06-19 15:20:59 +00:00
>PUSHW ZPUsrBufPtr
>PUSHBI 4
2020-06-18 15:13:56 +00:00
>SYSCALL SPrintF
2020-06-19 15:20:59 +00:00
>PUSHW L.SEQ.BAR
2020-06-19 06:33:47 +00:00
>PUSHW ZPMsgBufPtr
>PUSHBI 2
2020-06-18 15:13:56 +00:00
>SYSCALL PrintF
2020-06-19 15:20:59 +00:00
rts
*--------------------------------------
CS.RUN.TXTCLR lda #0
sta (pData)
stz TextPtr
stz TextLen
stz bEscMode
>PUSHW L.SEQ.TXTCLR
>PUSHBI 0
>SYSCALL PrintF
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 15:20:59 +00:00
2020-06-19 06:33:47 +00:00
jsr CS.RUN.SEND
bcs .9
2020-06-19 15:20:59 +00:00
2020-06-19 06:33:47 +00:00
.1 >SLEEP
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
bcc .2
tay
beq .1 No Frame
bra .9
.2 sta hReq
>SYSCALL GetMemPtr
2020-06-19 15:20:59 +00:00
>STYA ZPReqPtr
2020-06-19 06:33:47 +00:00
clc
2020-06-19 15:20:59 +00:00
.9 rts
2020-06-18 15:13:56 +00:00
*--------------------------------------
2020-06-19 06:33:47 +00:00
CS.RUN.JOIN >PUSHW ZPRepPtr
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda #5 key
>SYSCALL ArgV
bcs .1
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
>PUSHW L.IRC.JOINKEY
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
lda #4 channel
>SYSCALL ArgV
>PUSHYA
lda #5 key
>SYSCALL ArgV
>PUSHYA
>PUSHBI 4
bra .8
.1 >PUSHW L.IRC.JOIN
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
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
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
jmp CS.RUN.SEND
2020-06-19 15:20:59 +00:00
.9 rts
2020-06-18 15:13:56 +00:00
*--------------------------------------
CS.RUN.REQ sta hReq
>SYSCALL GetMemPtr
>STYA ZPReqPtr
2020-06-19 15:20:59 +00:00
2020-06-18 15:13:56 +00:00
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
*--------------------------------------
2020-06-19 15:20:59 +00:00
CS.RUN.CHARIN bit bEscMode
bpl .4
cmp #'['
beq .9
stz bEscMode
ldx #EscChars.Cnt-1
.1 cmp EscChars,x
beq .2
dex
bpl .1
.9 rts
.2 txa
asl
tax
jmp (J.ESC,x)
.4 cmp #C.ESC
bne .5
sec
ror bEscMode
clc
rts
.5 cmp #C.SPACE
bcc CS.RUN.CHARIN.CTRL
cmp #C.DEL
bne CS.RUN.CHARIN.INS
lda TextLen
beq .9
lda TextPtr
beq .9
lda #C.BS
>SYSCALL PutChar
jmp CS.RUN.CHARIN.DEL
*--------------------------------------
CS.RUN.CHARIN.INS
CS.RUN.CHARIN.CTRL
clc
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
2020-06-18 15:13:56 +00:00
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."
2020-06-19 15:20:59 +00:00
MSG.TOPBAR .AZ "A2osX IRC %d.%d %s:%s %s"
MSG.STATUSBAR .AZ "\e[19;1H%s:%s"
*--------------------------------------
EscChars .AS 'DBAC'
EscChars.Cnt .EQ *-EscChars
EscChars.Remap .DA #C.BS,#C.VT,#C.LF,#C.FS
2020-06-18 15:13:56 +00:00
*--------------------------------------
IRC.MSG .AZ "PING"
2020-06-19 15:20:59 +00:00
IRC.NOIDENT .AZ "No Ident response"
2020-06-18 15:13:56 +00:00
*--------------------------------------
2020-06-19 15:20:59 +00:00
IRC.USER .AZ "USER %s 0 * :%s"
2020-06-18 15:13:56 +00:00
IRC.JOIN .AZ "JOIN %s"
IRC.JOINKEY .AZ "JOIN %s %s"
2020-06-19 15:20:59 +00:00
IRC.PRIVMSG .AZ "PRIVMSG %s :%s"
2020-06-18 15:13:56 +00:00
*--------------------------------------
SEQ.INIT .AZ "\ec\e(B\e)0\e[?7l\e[2;19r"
2020-06-19 15:20:59 +00:00
SEQ.BAR .AZ "\e7\e[7m\e[37;40m%80s\e[0m\e8"
SEQ.PRINTMSG .AZ "\e7\r\n\e[18;1H\e[7m%s:\e[0m%s\e8"
SEQ.TXTCLR .AZ "\e[20;1H\e[K\r\n\e[K\r\n\e[K\e[20;1H"
2020-06-19 06:33:47 +00:00
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
2020-06-19 15:20:59 +00:00
TextBuf .BS 240
2020-06-18 15:13:56 +00:00
DS.END
.ED
*--------------------------------------
MAN
SAVE usr/src/bin/irc.s
ASM