A2osX/SBIN/CIFSD.S.txt
2021-01-17 22:48:54 +01:00

331 lines
6.2 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 Enable MASM3 auto line num
.LIST OFF
.OP 65C02 Target CPU, must match CPU level in header
.OR $2000 usualy $2000, but any value > $100 allowed
.TF sbin/cifsd
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.e.i
.INB inc/eth.i
.INB inc/libtcpip.i
.INB inc/net.smb.i
.INB inc/libcifs.i
*--------------------------------------
TIMEOUT.MAX .EQ 250 25 sec.
*--------------------------------------
* Zero Page Segment, up to 32 bytes
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPIPCfgPtr .BS 2
hSocket .BS 1
TimeOut .BS 1
hSMBContext .BS 1
hMount .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
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #64 Stack Size
.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.LIBCIFS .DA LIBCIFS
L.MSG.USAGE .DA MSG.USAGE
L.MSG.TCPIPERR .DA MSG.TCPIPERR
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.CONNECTED .DA MSG.CONNECTED
.DA 0
*--------------------------------------
* Called once at process creation
* Put code for loading LIB here
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
>LDYA L.LIBCIFS
>SYSCALL LoadLib
bcs .9
sta hLIBCIFS
* clc
.9
CS.INIT.RTS rts
*--------------------------------------
* Called until exit with CS
* if RUN exits with CC, RUN entered again
*--------------------------------------
CS.RUN lda hSocket
beq .1
lda #0
clc
rts
.1 jsr CS.RUN.CheckTCPIP
bcs CS.INIT.RTS
jsr CS.RUN.CheckArgs
bcs CS.INIT.RTS
jsr CS.RUN.Connect
bcs CS.INIT.RTS
>PUSHB hSocket
>PUSHBI 0
>LIBCALL hLIBCIFS,LIBCIFS.Negotiate
bcs CS.INIT.RTS
sta hSMBContext
>PUSHB hSocket
>PUSHB hSMBContext
>PUSHWI 0
>PUSHWI 0
>PUSHBI 0
>LIBCALL hLIBCIFS,LIBCIFS.SessionSetup
bcs .9
>PUSHB hSocket
>PUSHB hSMBContext
lda #2
>SYSCALL ArgV
>PUSHYA
>PUSHBI 0
>LIBCALL hLIBCIFS,LIBCIFS.TreeConnect
bcs .9
>PUSHB hSocket
>PUSHB hSMBContext
lda #3
>SYSCALL ArgV
>PUSHYA
>LIBCALL hLIBCIFS,LIBCIFS.Mount
sta hMount
lda #0
clc
.9 rts
*--------------------------------------
CS.RUN.CheckTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
bcs .9
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bmi .1
>LDYA L.MSG.TCPIPERR
>SYSCALL PutS
lda #E.SYN
sec
.9 rts
.1 lda #AF.INET
>STA.G SA.LOCAL
>STA.G SA.REMOTE
ldy #S.IPCFG.IP+3
.3 lda (ZPIPCfgPtr),y
pha
dey
cpy #S.IPCFG.IP-1
bne .3
ldy #SA.LOCAL+S.SOCKADDR.ADDR
.4 pla
sta (pData),y
iny
cpy #SA.LOCAL+S.SOCKADDR.ADDR+4
bne .4
lda #TCP.PORT.CIFS
>STA.G SA.REMOTE+S.SOCKADDR.PORT
iny
lda /TCP.PORT.CIFS
sta (pData),y
clc
rts
*--------------------------------------
CS.RUN.CheckArgs
ldy #S.PS.ARGC
lda (pPS),y
cmp #3
bcs .1
>LDYA L.MSG.USAGE
>SYSCALL PutS
lda #E.SYN
sec
rts
.1 lda #TIMEOUT.MAX
sta TimeOut
.2 >PUSHEA.G SA.REMOTE+S.SOCKADDR.ADDR
lda #1
>SYSCALL ArgV
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName
bcc .3
>SLEEP
lda TimeOut
bne .2
>PUSHW L.MSG.UNKNOWN
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHBI 2
>SYSCALL PrintF
sec
rts
.3 lda #2
>SYSCALL ArgV
clc
CS.RUN.CheckArgs.RTS
rts
*--------------------------------------
CS.RUN.Connect >PUSHBI 0 no protocol
lda #S.SOCKET.T.SEQPKT
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
bcs CS.RUN.CheckArgs.RTS
sta hSocket
>PUSHEA.G SA.LOCAL
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
bcs .9
>SLEEP
>PUSHEA.G SA.REMOTE
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
bcs .9
lda #TIMEOUT.MAX
sta TimeOut
.1 >SLEEP
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
bcc .7
cmp #E.NODATA
beq .8
ldx TimeOut
bne .1
sec
rts
.7 >SYSCALL Freemem
.8 >PUSHW L.MSG.CONNECTED
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHBI 2
>SYSCALL PrintF
.9 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 hMount
beq .1
>SYSCALL UMount
.1 lda hSocket
beq .2
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.2 lda hLIBCIFS
beq .3
>SYSCALL UnloadLib
.3 lda hLIBTCPIP
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.END
*--------------------------------------
* Initialized DATA
*--------------------------------------
LIBTCPIP .AZ "libtcpip"
hLIBTCPIP .BS 1
LIBCIFS .AZ "libcifs"
hLIBCIFS .BS 1
MSG.USAGE .AZ "Usage : CIFSD <ip|host> sharename mountpoint"
MSG.TCPIPERR .AZ "CIFSD:TCP/IP Not initialized properly."
MSG.UNKNOWN .AZ "CIFSD:%s: Unknown host\r\n"
MSG.CONNECTED .AZ "CIFSD:Connected to: %s\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
SA.LOCAL .BS 1 S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
SA.REMOTE .BS 1 S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
DS.END
.ED
*--------------------------------------
MAN
SAVE usr/src/sbin/cifsd.s
ASM