home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er
/
64ER_CD.iso
/
utilamig
/
c64trans
/
c64serve.a65
next >
Wrap
Text File
|
1989-03-02
|
8KB
|
682 lines
SETNAM = $FFBD
SETLFS = $FFBA
OPEN = $FFC0
CLOSE = $FFC3
CHKIN = $FFC6
CHKOUT = $FFC9
CLRCHN = $FFCC
CHRIN = $FFCF
CHROUT = $FFD2
SCROUT = $E716
;
STATUS = $90
;
DISK = 8
;
MAXLEN = 1024
;
P.GETDIR = 'D
P.ERROR = 'E
P.GETFILE = 'G
P.MORE = 'M
P.OK = 'O
P.PUTFILE = 'P
P.QUIT = 'Q
P.RETRY = 'R
P.SCRATCH = 'S
P.FILE = '1
P.DIR = '2
P.END = '9
;
PKID = $75
;
*=$0801
.WOR LINK
.WOR 10
.BYT $9E,'2061',0
LINK .WOR 0
JSR SETINPUT
LDA #0
STA MODE
JSR WRITESTR
.BYT 'C64 FILE TRANSFER SERVER STARTED OK',13,0
MAINLOOP
JSR GETPACKET
LDA BUFF
CMP #P.QUIT
BNE NOQUIT
LDA MODE
BEQ QUITOK
LDA #5
JSR CLOSE
JSR CLOSE15
QUITOK LDA $DD01 ;FINAL HANDSHAKE
RTS
;
NOQUIT CMP #P.GETDIR
BNE NO.DIR.REQ
LDA MODE
BEQ XD01
LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
XD01
;DIRECTORY REQUEST
JSR OPEN15
LDX #<DNAME
LDY #>DNAME
LDA #2
JSR SETNAM
LDA #5
LDY #0
LDX #DISK
JSR SETLFS
JSR OPEN
JSR DISKERR
BEQ DIR.OPEN.OK
ERR001 JSR SENDERR
LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
JMP MAINLOOP
DIR.OPEN.OK
LDA #P.DIR
STA MODE
LDA #0
STA SEQ
LDX #5
JSR CHKIN
JSR CHRIN ;SKIP LOAD ADDR
JSR CHRIN
JSR CLRCHN
JSR SEND.DIR.LINE
JMP MAINLOOP
;
NO.DIR.REQ
CMP #P.GETFILE
BNE NO.FILE.REQ
;GET FILE REQUEST
LDA MODE
BEQ XF01
LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
XF01 JSR OPEN15
LDX #<BUFFX1
LDY #>BUFFX1
LDA PKLEN
SEC
SBC #1
JSR SETNAM
LDX #DISK
LDA #5
TAY
JSR SETLFS
JSR OPEN
JSR DISKERR
BEQ XF02
JMP ERR001
XF02 LDA #P.FILE
STA MODE
LDA #0
STA SEQ
STA EOF
JSR SEND.FILE.BLOCK
JMP MAINLOOP
;
NO.FILE.REQ
CMP #P.PUTFILE
BNE NO.PUTFILE
LDA MODE
BEQ PFX01
LDA #5
JSR CLOSE
JSR CLOSE15
PFX01 LDA #0
STA MODE
JSR OPEN15
LDX PKLEN
LDA #',
STA BUFF,X
STA BUFF+2,X
LDA #'P
STA BUFF+1,X
LDA #'W
STA BUFF+3,X
TXA
LDX #<BUFFX1
LDY #>BUFFX1
CLC
ADC #3
JSR SETNAM
LDX #DISK
LDA #5
TAY
JSR SETLFS
JSR OPEN
JSR DISKERR
BNE ERRJ2
LDA #P.PUTFILE
STA MODE
LDA #0
STA SEQ
JSR SENDOK
JMP MAINLOOP
ERRJ2 JMP ERR001
;
NO.PUTFILE CMP #P.MORE
BNE NO.MORE.REQ
LDA MODE
CMP #P.DIR
BNE NO.MORE.DIR
JSR SEND.DIR.LINE
JMP MAINLOOP
NO.MORE.DIR CMP #P.FILE
BNE PKERRJ1
LDA EOF
BNE END.OF.DATA
JSR SEND.FILE.BLOCK
JMP MAINLOOP
PKERRJ1 JMP PKERR
;
END.OF.DATA JSR DISKERR
BNE ERRJ2
LDA #P.END
STA BUFF
LDX #1
STX PKLEN
DEX
STX PKLEN+1
JSR SENDPACKET
JMP QUITCMD
;
DATA.PACKET.JUMP JMP DATA.PACKET
;
NO.MORE.REQ
CMP #P.FILE
BEQ DATA.PACKET.JUMP
CMP #P.SCRATCH
BEQ SCRATCH
CMP #P.END
BNE PKERRJ1
JSR SENDOK
QUITCMD LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
JMP MAINLOOP
;
SCRATCH LDA MODE
BEQ SCRX1
LDA #5
JSR CLOSE
JSR CLOSE15
SCRX1 JSR OPEN15
LDX #15
JSR CHKOUT
LDA #'S
JSR CHROUT
LDA #'0
JSR CHROUT
LDA #':
JSR CHROUT
LDX #1
SXX LDA BUFF,X
JSR CHROUT
INX
CPX PKLEN
BCC SXX
JSR CLRCHN
JSR DISKERR
PHA
JSR CLOSE15
PLA
BEQ OK.RES
JSR SENDERR
JMP MAINLOOP
OK.RES LDA #P.OK
STA BUFF
LDA #'K
STA BUFF+1
LDA #32
STA BUFF+2
LDX #0
OKX1 LDA ERRBUF,X
STA BUFF+3,X
INX
CMP #13
BNE OKX1
TXA
CLC
ADC #2
STA PKLEN
LDA #0
STA PKLEN+1
JSR SENDPACKET
JMP MAINLOOP
;
PKERRJ2 JMP PKERR
;
DATA.PACKET
LDA MODE
CMP #P.PUTFILE
BNE PKERRJ2
LDA BUFF+1
CMP SEQ
BNE SEQ.ERR
INC SEQ
LDA #<BUFFX2
STA $FB
LDA #>BUFFX2
STA $FC
LDA PKLEN
CLC
ADC #<BUFF
STA $FD
LDA PKLEN+1
ADC #>BUFF
STA $FE
LDX #5
JSR CHKOUT
LDY #0
WRITELOOP
LDA ($FB),Y
JSR CHROUT
INC $FB
BNE WRX01
INC $FC
WRX01 LDA $FB
CMP $FD
LDA $FC
SBC $FE
BCC WRITELOOP
JSR DISKERR
BNE ERRJ3
JSR SENDOK
JMP MAINLOOP
ERRJ3 JMP ERR001
;
SEQ.ERR LDA #P.ERROR
STA BUFF
LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
LDX #0
SEQER1 LDA SEQERRTXT,X
STA BUFF+1,X
INX
TAY
BNE SEQER1
STX PKLEN
STA PKLEN+1
JSR SENDPACKET
JMP MAINLOOP
JSR CHKOUT
;
SEQERRTXT .BYT 'SEQUENCE ERROR',0
;
PKERR LDA #5
JSR CLOSE
JSR CLOSE15
LDA #0
STA MODE
LDA #P.ERROR
STA BUFF
LDX #0
PX01 LDA ERRMSG,X
STA BUFF+1,X
INX
TAY
BNE PX01
STX PKLEN
STA PKLEN+1 ;ZERO
JSR SENDPACKET
JMP MAINLOOP
;
ERRMSG .BYT 'UNKNOWN COMMAND',0
;
SEND.DIR.LINE
LDX #5
JSR CHKIN
LDA #0
STA STATUS
JSR CHRIN ;SKIP DUMMY LINK ADDR
JSR CHRIN
LDA STATUS
BEQ DIR.OK
JSR CLRCHN
PLA
PLA
JMP END.OF.DATA
DIR.OK LDA #P.DIR
STA BUFF
LDA SEQ
STA BUFF+1
INC SEQ
JSR CHRIN
TAX
JSR CHRIN
JSR CONVNUM ;CONVERT 16-BIT NUMBER TO ASCII STRING TO ADDR $0100
LDX #0
TXN1 LDA $0100,X
STA BUFF+2,X
INX
TAY
BNE TXN1
LDA #32
STA BUFF+1,X
TDX1 JSR CHRIN
STA BUFF+2,X
INX
CPX #80
BCS TDX2
TAY
BNE TDX1
TDX2 DEX
STX PKLEN
LDA #0
STA PKLEN+1
JSR CLRCHN
JSR DISKERR
BNE SP.ERR.J1
JMP SENDPACKET
SP.ERR.J1
JMP SPACK.ERR
;
SEND.FILE.BLOCK
LDX #5
JSR CHKIN
LDA #0
STA STATUS
LDA #P.FILE
STA BUFF
LDA SEQ
STA BUFF+1
INC SEQ
LDA #<BUFFX2
STA $FB
LDA #>BUFFX2
STA $FC
LDY #0
SEND.FILE.LOOP
JSR CHRIN
STA ($FB),Y
INC $FB
BNE XZ01
INC $FC
XZ01 LDA STATUS
BNE XEOF1
LDA $FB
CMP #<BUFF.END
LDA $FC
SBC #>BUFF.END
BCC SEND.FILE.LOOP
SFBL1 JSR CLRCHN
LDA $FB
SEC
SBC #<BUFF
STA PKLEN
LDA $FC
SBC #>BUFF
STA PKLEN+1
JSR DISKERR
BNE SPACK.ERR
JMP SENDPACKET
XEOF1 LDA #1
STA EOF
JMP SFBL1
SPACK.ERR PLA
PLA
JMP ERR001
;
GETPACKET
JSR SETINPUT
PHDR JSR RECEIVE
CMP #PKID
BNE PHDR
JSR RECEIVE
STA PKLEN+1
JSR RECEIVE
STA PKLEN
LDA #<MAXLEN
CMP PKLEN
LDA #>MAXLEN
SBC PKLEN+1
BCC TOOLONG
LDA #<BUFF
STA $FB
CLC
ADC PKLEN
STA $FD
LDA #>BUFF
STA $FC
ADC PKLEN+1
STA $FE
LDY #0
STY CKSUM
STY CKSUM+1
LDA PKLEN
ORA PKLEN+1
BEQ RECCK
GETPACKLOOP JSR RECEIVE
STA ($FB),Y
CLC
ADC CKSUM
STA CKSUM
LDA #0
ADC CKSUM+1
STA CKSUM+1
INC $FB
BNE X01
INC $FC
X01 LDA $FB
CMP $FD
LDA $FC
SBC $FE
BCC GETPACKLOOP
RECCK JSR RECEIVE ;CHECKSUM HIGH
TAY
JSR RECEIVE ;CHECKSUM LOW
CMP CKSUM
BNE CKERR
CPY CKSUM+1
BNE CKERR
CLC
RTS
CKERR JSR WRITESTR
.BYT 'CHECKSUM ERROR',13,0
SEC
RTS
TOOLONG JSR WRITESTR
.BYT 'PACKET TOO LONG',13,0
SEC
RTS
;
SENDPACKET
JSR SETOUTPUT
LDA #<BUFF
STA $FB
CLC
ADC PKLEN
STA $FD
LDA #>BUFF
STA $FC
ADC PKLEN+1
STA $FE
LDY #0
STY CKSUM
STY CKSUM+1
LDX #10
LDA #0
NULLX JSR SEND
DEX
BNE NULLX
LDA #PKID
JSR SEND
LDA PKLEN+1
JSR SEND
LDA PKLEN
JSR SEND
LDA PKLEN
ORA PKLEN+1
BEQ SENDCK
SLOOP LDA ($FB),Y
PHA
JSR SEND
PLA
CLC
ADC CKSUM
STA CKSUM
LDA #0
ADC CKSUM+1
STA CKSUM+1
INC $FB
BNE X02
INC $FC
X02 LDA $FB
CMP $FD
LDA $FC
SBC $FE
BCC SLOOP
SENDCK LDA CKSUM+1
JSR SEND
LDA CKSUM
JSR SEND
JMP SETINPUT
;
SETINPUT LDA #$00
STA $DD03 ;USER PORT TO INPUT
LDA $DD01
LDA $DD02
ORA #4
STA $DD02
RTS
;
RECEIVE LDA #$10
REC1 BIT $DD0D
BEQ REC1
LDA $DD01
RTS
;
SETOUTPUT LDA #$FF
STA $DD03 ;USER PORT TO OUTPUT
LDA $DD02
ORA #4
STA $DD02
LDA $DD00
ORA #4
STA $DD00
RTS
;
SEND STA $DD01
LDA #$10
SEND1 BIT $DD0D
BEQ SEND1
RTS
;
WRITESTR PLA
STA $22
PLA
STA $23
WRS1 INC $22
BNE WRS2
INC $23
WRS2 LDY #0
LDA ($22),Y
BEQ WRS3
JSR CHROUT
JMP WRS1
WRS3 LDA $23
PHA
LDA $22
PHA
RTS
;
OPEN15 LDA #0
JSR SETNAM
LDA #15
TAY
LDX #DISK
JSR SETLFS
JMP OPEN
;
CLOSE15 LDA #15
JMP CLOSE
;
DISKERR LDX #15
JSR CHKIN
LDX #0
DER1 JSR CHRIN
STA ERRBUF,X
INX
CMP #13
BNE DER1
JSR CLRCHN
LDA ERRBUF
EOR #'0
RTS
;
SENDERR LDA #P.ERROR
STA BUFF
LDX #0
SX01 LDA ERRBUF,X
STA BUFF+1,X
INX
CMP #13
BNE SX01
STX PKLEN
LDA #0
STA PKLEN+1
JSR SENDPACKET
JSR WRITESTR
.BYT 'DISK ERROR: ',0
LDX #1
SXE01 LDA BUFF,X
JSR CHROUT
INX
CPX PKLEN
BCC SXE01
LDA #13
JMP CHROUT
;
SENDOK LDA #P.OK
STA BUFF
LDA #'K
STA BUFF+1
LDA #2
STA PKLEN
LDA #0
STA PKLEN+1
JMP SENDPACKET
;
CONVNUM STA $62
STX $63
LDX #$90
SEC
JSR $BC49
JMP $BDDF
;
DNAME .BYT '$0'
;
PKLEN .WOR 0
CKSUM .WOR 0
MODE .BYT 0
SEQ .BYT 0
EOF .BYT 0
;
ERRBUF *=*+80
;
BUFF = $5000
BUFFX1 = BUFF+1
BUFFX2 = BUFF+2
BUFF.END= BUFF+MAXLEN