home *** CD-ROM | disk | FTP | other *** search
- 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
-