home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / utilamig / c64trans / c64serve.a65 next >
Text File  |  1989-03-02  |  8KB  |  682 lines

  1. SETNAM    = $FFBD
  2. SETLFS    = $FFBA
  3. OPEN    = $FFC0
  4. CLOSE    = $FFC3
  5. CHKIN    = $FFC6
  6. CHKOUT    = $FFC9
  7. CLRCHN    = $FFCC
  8. CHRIN    = $FFCF
  9. CHROUT    = $FFD2
  10. SCROUT    = $E716
  11. ;
  12. STATUS    = $90
  13. ;
  14. DISK    = 8
  15. ;
  16. MAXLEN    = 1024
  17. ;
  18. P.GETDIR    = 'D
  19. P.ERROR        = 'E
  20. P.GETFILE    = 'G
  21. P.MORE        = 'M
  22. P.OK        = 'O
  23. P.PUTFILE    = 'P
  24. P.QUIT        = 'Q
  25. P.RETRY        = 'R
  26. P.SCRATCH    = 'S
  27. P.FILE        = '1
  28. P.DIR        = '2
  29. P.END        = '9
  30. ;
  31. PKID    = $75
  32. ;
  33.     *=$0801
  34.     .WOR LINK
  35.     .WOR 10
  36.     .BYT $9E,'2061',0
  37. LINK .WOR 0
  38.     JSR SETINPUT
  39.     LDA #0
  40.     STA MODE
  41.     JSR WRITESTR
  42.     .BYT 'C64 FILE TRANSFER SERVER STARTED OK',13,0
  43. MAINLOOP
  44.     JSR GETPACKET
  45.     LDA BUFF
  46.     CMP #P.QUIT
  47.     BNE NOQUIT
  48.     LDA MODE
  49.     BEQ QUITOK
  50.     LDA #5
  51.     JSR CLOSE
  52.     JSR CLOSE15
  53. QUITOK    LDA $DD01 ;FINAL HANDSHAKE
  54.     RTS
  55. ;
  56. NOQUIT    CMP #P.GETDIR
  57.     BNE NO.DIR.REQ
  58.     LDA MODE
  59.     BEQ XD01
  60.     LDA #5
  61.     JSR CLOSE
  62.     JSR CLOSE15
  63.     LDA #0
  64.     STA MODE
  65. XD01
  66. ;DIRECTORY REQUEST
  67.     JSR OPEN15
  68.     LDX #<DNAME
  69.     LDY #>DNAME
  70.     LDA #2
  71.     JSR SETNAM
  72.     LDA #5
  73.     LDY #0
  74.     LDX #DISK
  75.     JSR SETLFS
  76.     JSR OPEN
  77.     JSR DISKERR
  78.     BEQ DIR.OPEN.OK
  79. ERR001    JSR SENDERR
  80.     LDA #5
  81.     JSR CLOSE
  82.     JSR CLOSE15
  83.     LDA #0
  84.     STA MODE
  85.     JMP MAINLOOP
  86. DIR.OPEN.OK
  87.     LDA #P.DIR
  88.     STA MODE
  89.     LDA #0
  90.     STA SEQ
  91.     LDX #5
  92.     JSR CHKIN
  93.     JSR CHRIN ;SKIP LOAD ADDR
  94.     JSR CHRIN
  95.     JSR CLRCHN
  96.     JSR SEND.DIR.LINE
  97.     JMP MAINLOOP
  98. ;
  99. NO.DIR.REQ
  100.     CMP #P.GETFILE
  101.     BNE NO.FILE.REQ
  102. ;GET FILE REQUEST
  103.     LDA MODE
  104.     BEQ XF01
  105.     LDA #5
  106.     JSR CLOSE
  107.     JSR CLOSE15
  108.     LDA #0
  109.     STA MODE
  110. XF01    JSR OPEN15
  111.     LDX #<BUFFX1
  112.     LDY #>BUFFX1
  113.     LDA PKLEN
  114.     SEC
  115.     SBC #1
  116.     JSR SETNAM
  117.     LDX #DISK
  118.     LDA #5
  119.     TAY
  120.     JSR SETLFS
  121.     JSR OPEN
  122.     JSR DISKERR
  123.     BEQ XF02
  124.     JMP ERR001
  125. XF02    LDA #P.FILE
  126.     STA MODE
  127.     LDA #0
  128.     STA SEQ
  129.     STA EOF
  130.     JSR SEND.FILE.BLOCK
  131.     JMP MAINLOOP
  132. ;
  133. NO.FILE.REQ
  134.     CMP #P.PUTFILE
  135.     BNE NO.PUTFILE
  136.     LDA MODE
  137.     BEQ PFX01
  138.     LDA #5
  139.     JSR CLOSE
  140.     JSR CLOSE15
  141. PFX01    LDA #0
  142.     STA MODE
  143.     JSR OPEN15
  144.     LDX PKLEN
  145.     LDA #',
  146.     STA BUFF,X
  147.     STA BUFF+2,X
  148.     LDA #'P
  149.     STA BUFF+1,X
  150.     LDA #'W
  151.     STA BUFF+3,X
  152.     TXA
  153.     LDX #<BUFFX1
  154.     LDY #>BUFFX1
  155.     CLC
  156.     ADC #3
  157.     JSR SETNAM
  158.     LDX #DISK
  159.     LDA #5
  160.     TAY
  161.     JSR SETLFS
  162.     JSR OPEN
  163.     JSR DISKERR
  164.     BNE ERRJ2
  165.     LDA #P.PUTFILE
  166.     STA MODE
  167.     LDA #0
  168.     STA SEQ
  169.     JSR SENDOK
  170.     JMP MAINLOOP
  171. ERRJ2    JMP ERR001
  172. ;
  173. NO.PUTFILE CMP #P.MORE
  174.     BNE NO.MORE.REQ
  175.     LDA MODE
  176.     CMP #P.DIR
  177.     BNE NO.MORE.DIR
  178.     JSR SEND.DIR.LINE
  179.     JMP MAINLOOP
  180. NO.MORE.DIR CMP #P.FILE
  181.     BNE PKERRJ1
  182.     LDA EOF
  183.     BNE END.OF.DATA
  184.     JSR SEND.FILE.BLOCK
  185.     JMP MAINLOOP
  186. PKERRJ1 JMP PKERR
  187. ;
  188. END.OF.DATA JSR DISKERR
  189.     BNE ERRJ2
  190.     LDA #P.END
  191.     STA BUFF
  192.     LDX #1
  193.     STX PKLEN
  194.     DEX
  195.     STX PKLEN+1
  196.     JSR SENDPACKET
  197.     JMP QUITCMD
  198. ;
  199. DATA.PACKET.JUMP JMP DATA.PACKET
  200. ;
  201. NO.MORE.REQ
  202.     CMP #P.FILE
  203.     BEQ DATA.PACKET.JUMP
  204.     CMP #P.SCRATCH
  205.     BEQ SCRATCH
  206.     CMP #P.END
  207.     BNE PKERRJ1
  208.     JSR SENDOK
  209. QUITCMD LDA #5
  210.     JSR CLOSE
  211.     JSR CLOSE15
  212.     LDA #0
  213.     STA MODE
  214.     JMP MAINLOOP
  215. ;
  216. SCRATCH LDA MODE
  217.     BEQ SCRX1
  218.     LDA #5
  219.     JSR CLOSE
  220.     JSR CLOSE15
  221. SCRX1    JSR OPEN15
  222.     LDX #15
  223.     JSR CHKOUT
  224.     LDA #'S
  225.     JSR CHROUT
  226.     LDA #'0
  227.     JSR CHROUT
  228.     LDA #':
  229.     JSR CHROUT
  230.     LDX #1
  231. SXX    LDA BUFF,X
  232.     JSR CHROUT
  233.     INX
  234.     CPX PKLEN
  235.     BCC SXX
  236.     JSR CLRCHN
  237.     JSR DISKERR
  238.     PHA
  239.     JSR CLOSE15
  240.     PLA
  241.     BEQ OK.RES
  242.     JSR SENDERR
  243.     JMP MAINLOOP
  244. OK.RES    LDA #P.OK
  245.     STA BUFF
  246.     LDA #'K
  247.     STA BUFF+1
  248.     LDA #32
  249.     STA BUFF+2
  250.     LDX #0
  251. OKX1    LDA ERRBUF,X
  252.     STA BUFF+3,X
  253.     INX
  254.     CMP #13
  255.     BNE OKX1
  256.     TXA
  257.     CLC
  258.     ADC #2
  259.     STA PKLEN
  260.     LDA #0
  261.     STA PKLEN+1
  262.     JSR SENDPACKET
  263.     JMP MAINLOOP
  264. ;
  265. PKERRJ2 JMP PKERR
  266. ;
  267. DATA.PACKET
  268.     LDA MODE
  269.     CMP #P.PUTFILE
  270.     BNE PKERRJ2
  271.     LDA BUFF+1
  272.     CMP SEQ
  273.     BNE SEQ.ERR
  274.     INC SEQ
  275.     LDA #<BUFFX2
  276.     STA $FB
  277.     LDA #>BUFFX2
  278.     STA $FC
  279.     LDA PKLEN
  280.     CLC
  281.     ADC #<BUFF
  282.     STA $FD
  283.     LDA PKLEN+1
  284.     ADC #>BUFF
  285.     STA $FE
  286.     LDX #5
  287.     JSR CHKOUT
  288.     LDY #0
  289. WRITELOOP
  290.     LDA ($FB),Y
  291.     JSR CHROUT
  292.     INC $FB
  293.     BNE WRX01
  294.     INC $FC
  295. WRX01    LDA $FB
  296.     CMP $FD
  297.     LDA $FC
  298.     SBC $FE
  299.     BCC WRITELOOP
  300.     JSR DISKERR
  301.     BNE ERRJ3
  302.     JSR SENDOK
  303.     JMP MAINLOOP
  304. ERRJ3    JMP ERR001
  305. ;
  306. SEQ.ERR LDA #P.ERROR
  307.     STA BUFF
  308.     LDA #5
  309.     JSR CLOSE
  310.     JSR CLOSE15
  311.     LDA #0
  312.     STA MODE
  313.     LDX #0
  314. SEQER1    LDA SEQERRTXT,X
  315.     STA BUFF+1,X
  316.     INX
  317.     TAY
  318.     BNE SEQER1
  319.     STX PKLEN
  320.     STA PKLEN+1
  321.     JSR SENDPACKET
  322.     JMP MAINLOOP
  323.     JSR CHKOUT
  324. ;
  325. SEQERRTXT .BYT 'SEQUENCE ERROR',0
  326. ;
  327. PKERR    LDA #5
  328.     JSR CLOSE
  329.     JSR CLOSE15
  330.     LDA #0
  331.     STA MODE
  332.     LDA #P.ERROR
  333.     STA BUFF
  334.     LDX #0
  335. PX01    LDA ERRMSG,X
  336.     STA BUFF+1,X
  337.     INX
  338.     TAY
  339.     BNE PX01
  340.     STX PKLEN
  341.     STA PKLEN+1 ;ZERO
  342.     JSR SENDPACKET
  343.     JMP MAINLOOP
  344. ;
  345. ERRMSG .BYT 'UNKNOWN COMMAND',0
  346. ;
  347. SEND.DIR.LINE
  348.     LDX #5
  349.     JSR CHKIN
  350.     LDA #0
  351.     STA STATUS
  352.     JSR CHRIN ;SKIP DUMMY LINK ADDR
  353.     JSR CHRIN
  354.     LDA STATUS
  355.     BEQ DIR.OK
  356.     JSR CLRCHN
  357.     PLA
  358.     PLA
  359.     JMP END.OF.DATA
  360. DIR.OK    LDA #P.DIR
  361.     STA BUFF
  362.     LDA SEQ
  363.     STA BUFF+1
  364.     INC SEQ
  365.     JSR CHRIN
  366.     TAX
  367.     JSR CHRIN
  368.     JSR CONVNUM ;CONVERT 16-BIT NUMBER TO ASCII STRING TO ADDR $0100
  369.     LDX #0
  370. TXN1    LDA $0100,X
  371.     STA BUFF+2,X
  372.     INX
  373.     TAY
  374.     BNE TXN1
  375.     LDA #32
  376.     STA BUFF+1,X
  377. TDX1    JSR CHRIN
  378.     STA BUFF+2,X
  379.     INX
  380.     CPX #80
  381.     BCS TDX2
  382.     TAY
  383.     BNE TDX1
  384. TDX2    DEX
  385.     STX PKLEN
  386.     LDA #0
  387.     STA PKLEN+1
  388.     JSR CLRCHN
  389.     JSR DISKERR
  390.     BNE SP.ERR.J1
  391.     JMP SENDPACKET
  392. SP.ERR.J1
  393.     JMP SPACK.ERR
  394. ;
  395. SEND.FILE.BLOCK
  396.     LDX #5
  397.     JSR CHKIN
  398.     LDA #0
  399.     STA STATUS
  400.     LDA #P.FILE
  401.     STA BUFF
  402.     LDA SEQ
  403.     STA BUFF+1
  404.     INC SEQ
  405.     LDA #<BUFFX2
  406.     STA $FB
  407.     LDA #>BUFFX2
  408.     STA $FC
  409.     LDY #0
  410. SEND.FILE.LOOP
  411.     JSR CHRIN
  412.     STA ($FB),Y
  413.     INC $FB
  414.     BNE XZ01
  415.     INC $FC
  416. XZ01    LDA STATUS
  417.     BNE XEOF1
  418.     LDA $FB
  419.     CMP #<BUFF.END
  420.     LDA $FC
  421.     SBC #>BUFF.END
  422.     BCC SEND.FILE.LOOP
  423. SFBL1    JSR CLRCHN
  424.     LDA $FB
  425.     SEC
  426.     SBC #<BUFF
  427.     STA PKLEN
  428.     LDA $FC
  429.     SBC #>BUFF
  430.     STA PKLEN+1
  431.     JSR DISKERR
  432.     BNE SPACK.ERR
  433.     JMP SENDPACKET
  434. XEOF1    LDA #1
  435.     STA EOF
  436.     JMP SFBL1
  437. SPACK.ERR PLA
  438.     PLA
  439.     JMP ERR001
  440. ;
  441. GETPACKET
  442.     JSR SETINPUT
  443. PHDR    JSR RECEIVE
  444.     CMP #PKID
  445.     BNE PHDR
  446.     JSR RECEIVE
  447.     STA PKLEN+1
  448.     JSR RECEIVE
  449.     STA PKLEN
  450.     LDA #<MAXLEN
  451.     CMP PKLEN
  452.     LDA #>MAXLEN
  453.     SBC PKLEN+1
  454.     BCC TOOLONG
  455.     LDA #<BUFF
  456.     STA $FB
  457.     CLC
  458.     ADC PKLEN
  459.     STA $FD
  460.     LDA #>BUFF
  461.     STA $FC
  462.     ADC PKLEN+1
  463.     STA $FE
  464.     LDY #0
  465.     STY CKSUM
  466.     STY CKSUM+1
  467.     LDA PKLEN
  468.     ORA PKLEN+1
  469.     BEQ RECCK
  470. GETPACKLOOP JSR RECEIVE
  471.     STA ($FB),Y
  472.     CLC
  473.     ADC CKSUM
  474.     STA CKSUM
  475.     LDA #0
  476.     ADC CKSUM+1
  477.     STA CKSUM+1
  478.     INC $FB
  479.     BNE X01
  480.     INC $FC
  481. X01    LDA $FB
  482.     CMP $FD
  483.     LDA $FC
  484.     SBC $FE
  485.     BCC GETPACKLOOP
  486. RECCK    JSR RECEIVE ;CHECKSUM HIGH
  487.     TAY
  488.     JSR RECEIVE ;CHECKSUM LOW
  489.     CMP CKSUM
  490.     BNE CKERR
  491.     CPY CKSUM+1
  492.     BNE CKERR
  493.     CLC
  494.     RTS
  495. CKERR    JSR WRITESTR
  496.     .BYT 'CHECKSUM ERROR',13,0
  497.     SEC
  498.     RTS
  499. TOOLONG JSR WRITESTR
  500.     .BYT 'PACKET TOO LONG',13,0
  501.     SEC
  502.     RTS
  503. ;
  504. SENDPACKET
  505.     JSR SETOUTPUT
  506.     LDA #<BUFF
  507.     STA $FB
  508.     CLC
  509.     ADC PKLEN
  510.     STA $FD
  511.     LDA #>BUFF
  512.     STA $FC
  513.     ADC PKLEN+1
  514.     STA $FE
  515.     LDY #0
  516.     STY CKSUM
  517.     STY CKSUM+1
  518.     LDX #10
  519.     LDA #0
  520. NULLX    JSR SEND
  521.     DEX
  522.     BNE NULLX
  523.     LDA #PKID
  524.     JSR SEND
  525.     LDA PKLEN+1
  526.     JSR SEND
  527.     LDA PKLEN
  528.     JSR SEND
  529.     LDA PKLEN
  530.     ORA PKLEN+1
  531.     BEQ SENDCK
  532. SLOOP    LDA ($FB),Y
  533.     PHA
  534.     JSR SEND
  535.     PLA
  536.     CLC
  537.     ADC CKSUM
  538.     STA CKSUM
  539.     LDA #0
  540.     ADC CKSUM+1
  541.     STA CKSUM+1
  542.     INC $FB
  543.     BNE X02
  544.     INC $FC
  545. X02    LDA $FB
  546.     CMP $FD
  547.     LDA $FC
  548.     SBC $FE
  549.     BCC SLOOP
  550. SENDCK    LDA CKSUM+1
  551.     JSR SEND
  552.     LDA CKSUM
  553.     JSR SEND
  554.     JMP SETINPUT
  555. ;
  556. SETINPUT LDA #$00
  557.     STA $DD03 ;USER PORT TO INPUT
  558.     LDA $DD01
  559.     LDA $DD02
  560.     ORA #4
  561.     STA $DD02
  562.     RTS
  563. ;
  564. RECEIVE LDA #$10
  565. REC1    BIT $DD0D
  566.     BEQ REC1
  567.     LDA $DD01
  568.     RTS
  569. ;
  570. SETOUTPUT LDA #$FF
  571.     STA $DD03 ;USER PORT TO OUTPUT
  572.     LDA $DD02
  573.     ORA #4
  574.     STA $DD02
  575.     LDA $DD00
  576.     ORA #4
  577.     STA $DD00
  578.     RTS
  579. ;
  580. SEND    STA $DD01
  581.     LDA #$10
  582. SEND1 BIT $DD0D
  583.     BEQ SEND1
  584.     RTS
  585. ;
  586. WRITESTR PLA
  587.     STA $22
  588.     PLA
  589.     STA $23
  590. WRS1    INC $22
  591.     BNE WRS2
  592.     INC $23
  593. WRS2    LDY #0
  594.     LDA ($22),Y
  595.     BEQ WRS3
  596.     JSR CHROUT
  597.     JMP WRS1
  598. WRS3    LDA $23
  599.     PHA
  600.     LDA $22
  601.     PHA
  602.     RTS
  603. ;
  604. OPEN15    LDA #0
  605.     JSR SETNAM
  606.     LDA #15
  607.     TAY
  608.     LDX #DISK
  609.     JSR SETLFS
  610.     JMP OPEN
  611. ;
  612. CLOSE15 LDA #15
  613.     JMP CLOSE
  614. ;
  615. DISKERR LDX #15
  616.     JSR CHKIN
  617.     LDX #0
  618. DER1    JSR CHRIN
  619.     STA ERRBUF,X
  620.     INX
  621.     CMP #13
  622.     BNE DER1
  623.     JSR CLRCHN
  624.     LDA ERRBUF
  625.     EOR #'0
  626.     RTS
  627. ;
  628. SENDERR LDA #P.ERROR
  629.     STA BUFF
  630.     LDX #0
  631. SX01    LDA ERRBUF,X
  632.     STA BUFF+1,X
  633.     INX
  634.     CMP #13
  635.     BNE SX01
  636.     STX PKLEN
  637.     LDA #0
  638.     STA PKLEN+1
  639.     JSR SENDPACKET
  640.     JSR WRITESTR
  641.     .BYT 'DISK ERROR: ',0
  642.     LDX #1
  643. SXE01    LDA BUFF,X
  644.     JSR CHROUT
  645.     INX
  646.     CPX PKLEN
  647.     BCC SXE01
  648.     LDA #13
  649.     JMP CHROUT
  650. ;
  651. SENDOK    LDA #P.OK
  652.     STA BUFF
  653.     LDA #'K
  654.     STA BUFF+1
  655.     LDA #2
  656.     STA PKLEN
  657.     LDA #0
  658.     STA PKLEN+1
  659.     JMP SENDPACKET
  660. ;
  661. CONVNUM STA $62
  662.     STX $63
  663.     LDX #$90
  664.     SEC
  665.     JSR $BC49
  666.     JMP $BDDF
  667. ;
  668. DNAME    .BYT '$0'
  669. ;
  670. PKLEN    .WOR 0
  671. CKSUM    .WOR 0
  672. MODE    .BYT 0
  673. SEQ    .BYT 0
  674. EOF    .BYT 0
  675. ;
  676. ERRBUF    *=*+80
  677. ;
  678. BUFF    = $5000
  679. BUFFX1    = BUFF+1
  680. BUFFX2    = BUFF+2
  681. BUFF.END= BUFF+MAXLEN
  682.