A2osX/SBIN/BBSD.S.txt
2024-01-22 22:48:00 +01:00

433 lines
7.5 KiB
Plaintext
Raw Permalink 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 sbin/bbsd
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/kernel.i
.INB inc/mli.i
.INB inc/mli.e.i
.INB inc/eth.i
.INB inc/libtcpip.i
.INB inc/net.telnet.i
*--------------------------------------
TIMEOUT.MAX .EQ 200 20 sec.
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPIPCfgPtr .BS 2
ZPSktPtr .BS 2
ZPMsgFile .BS 2
ZPStartupFile .BS 2
hFile .BS 1
hLineBuf .BS 1
ZPLinePtr .BS 2
ZPPtr1 .BS 2
hMsgFile .BS 1
hStartupFile .BS 1
TimeOut .BS 1
hSrvSocket .BS 1
hClientSocket .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 CS
.DA DS.END-DS.START DS
.DA #32 SS
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.ETCBBSDCONF .DA ETCBBSDCONF
L.KEYWORDS.CONF .DA KEYWORDS.CONF
J.KEYWORDS.CONF .DA CS.RUN.CONF.TCPLISTEN
.DA CS.RUN.CONF.COMLISTEN
.DA CS.RUN.CONF.MSGFILE
.DA CS.RUN.CONF.STARTUPFILE
L.SA.LOCAL .DA SA.LOCAL
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.INCOMING .DA MSG.INCOMING
L.NOD.Template .DA NOD.Template
L.CMD.Template .DA CMD.Template
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
.9 rts
*--------------------------------------
CS.RUN lda #TIMEOUT.MAX
sta TimeOut
>LDYA L.MSG.TCPWAIT
>SYSCALL PutS
.1 >SLEEP
>LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
bcs .99
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bmi CS.RUN.INIT
lda TimeOut
beq .99
ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL FEOF
bcs .9 I/O err
tay
bne .1
>SYSCALL GetChar
bcs .9
cmp #$03
bne .1
* sec
rts
.99 pha
>LDYA L.MSG.TCPIPERR
>SYSCALL PutS
pla
sec
.9 rts
CS.RUN.INIT ldx #3
ldy #S.IPCFG.IP+3
.1 lda (ZPIPCfgPtr),y
sta SA.LOCAL+S.SOCKADDR.ADDR,x
dey
dex
bpl .1
jsr CS.RUN.CONF
bcs .99
>PUSHBI S.SOCKET.T.STREAM
>PUSHBI 0 no protocol
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
bcs .9
sta hSrvSocket
>PUSHA
>PUSHW L.SA.LOCAL
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
bcs .9
lda hSrvSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Listen
bcs .9
>LDYA L.MSG.INITOK
>SYSCALL PutS
.2 >SLEEP
lda hSrvSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Accept
bcs .2
pha
jsr CS.RUN.CLIENT
pla
bcc .2
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
bra .2
.9 pha
>LDYA L.MSG.SKTERR
>SYSCALL PutS
pla
sec
.99 rts
*--------------------------------------
CS.RUN.CLIENT >SLEEP give some time for TCPIP SYN/ACK
sta hClientSocket
tax
lda FDs.pHI-1,x
ldy FDs.pLO-1,x
>STYA ZPSktPtr
>PUSHW L.MSG.INCOMING
>PUSHB hClientSocket
ldx #3
ldy #S.SOCKET.REM.ADDR
.1 >PUSHB (ZPSktPtr),y
iny
dex
bpl .1
>PUSHBI 5
>SYSCALL PrintF
>PUSHEA.G NodBuf
>PUSHW L.NOD.Template
>PUSHB hClientSocket
>PUSHBI 1
>SYSCALL SPrintF
CS.RUN.CLIENT1 >PUSHEA.G NodBuf
>PUSHWZ
>PUSHB hClientSocket
>SYSCALL MKNod
bcs .9
>PUSHEA.G CmdBuf
>PUSHW L.CMD.Template
>PUSHEA.G NodBuf
>PUSHW ZPStartupFile
>PUSHBI 4
>SYSCALL SPrintF
>PUSHEA.G CmdBuf
>PUSHBI 0
>SYSCALL ExecL
* clc
.9 rts
*--------------------------------------
_DEBUG >LDYA.G CmdBuf
>SYSCALL PutS
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 hSrvSocket
beq .3
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.3 lda hLIBTCPIP
beq .8
>SYSCALL UnloadLib
.8 clc
CS.QUIT.RTS rts
*--------------------------------------
CS.RUN.CONF >PUSHW L.ETCBBSDCONF
>PUSHBI O.RDONLY+O.TEXT
>PUSHBI S.FI.T.TXT
>PUSHWZ
>SYSCALL FOpen
bcs CS.QUIT.RTS
sta hFile
>LDYAI 256
>SYSCALL GetMem
bcs .97
>STYA ZPLinePtr
stx hLineBuf
.1 >PUSHB hFile
>PUSHW ZPLinePtr
>PUSHWI 256
>SYSCALL FGetS
bcs .8
lda (ZPLinePtr)
beq .1
lda (ZPLinePtr)
cmp #'#'
beq .1
>LDYA L.KEYWORDS.CONF
>STYA ZPPtr1
ldx #0
.2 ldy #0
.3 lda (ZPPtr1),y
cmp (ZPLinePtr),y
bne .4
iny
cmp #C.SPACE
bne .3
jsr CS.RUN.CONF.JMP
bcc .1
bra .97
.4 inx
inx
ldy #0
.5 iny
lda (ZPPtr1),y
cmp #C.SPACE
bne .5
tya
sec
adc ZPPtr1
sta ZPPtr1
bcc .6
inc ZPPtr1+1
.6 lda (ZPPtr1)
bne .2
.96 lda #E.SYN
sec
.HS 90 BCC
.8 clc
.97 php
pha
lda hLineBuf
beq .98
>SYSCALL FreeMem
.98 lda hFile
beq .99
>SYSCALL FClose
.99 pla
plp
rts
*--------------------------------------
CS.RUN.CONF.JMP tya
clc
adc ZPLinePtr
sta ZPPtr1
tay
lda #0
adc ZPLinePtr+1
sta ZPPtr1+1
jmp (J.KEYWORDS.CONF,x)
CS.RUN.CONF.TCPLISTEN
>SYSCALL AToI
bcs .9
>STYA SA.LOCAL+S.SOCKADDR.PORT
.9 rts
CS.RUN.CONF.COMLISTEN
clc
.9 rts
CS.RUN.CONF.MSGFILE
>PUSHYA
>PUSHWZ Allocate
>SYSCALL RealPath
bcs .9
>STYA ZPMsgFile
stx hMsgFile
.9 rts
CS.RUN.CONF.STARTUPFILE
>PUSHYA
>PUSHWZ Allocate
>SYSCALL RealPath
bcs .9
>STYA ZPStartupFile
stx hStartupFile
.9 rts
*--------------------------------------
CS.END
*--------------------------------------
hLIBTCPIP .BS 1
LIBTCPIP .AZ "libtcpip"
ETCBBSDCONF .AZ "${BOOT}etc/bbsd.conf"
*--------------------------------------
KEYWORDS.CONF .AS "tcplisten "
.AS "comlisten "
.AS "msgfile "
.AS "startupfile "
.DA #0
*--------------------------------------
MSG.TCPWAIT .AZ "BBSD:Waiting for TCP/IP initializing..."
MSG.INITOK .AZ "BBSD:Init Ok, Listening."
MSG.TCPIPERR .AZ "BBSD:TCP/IP Not initialized properly."
MSG.SKTERR .AZ "BBSD:Listen Error."
MSG.INCOMING .CZ "BBSD:Incoming Connection [SKT=%h] From : %d.%d.%d.%d\r\n"
*--------------------------------------
NOD.Template .AZ "/dev/tty%h"
CMD.Template .AZ "${ROOT}sbin/getty -E %s %s"
*--------------------------------------
SA.LOCAL .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.DA TCP.PORT.TELNET
*--------------------------------------
.DUMMY
.OR 0
DS.START
NodBuf .BS 11
CmdBuf .BS 65
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/sbin/bbsd.s
ASM