home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG019.ARK / XFER.ASM < prev   
Assembly Source File  |  1984-04-29  |  9KB  |  260 lines

  1. ;;;       XFER - FILE TRANSFER UTILITY FOR ONE-DRIVE DISK SYSTEMS
  2. ;
  3. ;         LAWRENCE E. HUGHES
  4. ;         8080 SOFTWARE DEVELOPMENT CENTER
  5. ;         1506 MYRICK ROAD
  6. ;         TALLAHASSEE, FLORIDA  32303
  7. ;
  8. ;         PHONE (904) 385-4573
  9. ;
  10. ;            XFER IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER OF
  11. ;         A SINGLE DRIVE DISK SYSTEM TO TRANSFER ARBITRARILY LARGE FILES
  12. ;         FROM ONE DISKETTE TO ANOTHER. THE CURRENT VERSION REQUIRES AT
  13. ;         LEAST A 24K CP/M SYSTEM.
  14. ;
  15. ;            TO USE, TYPE 'XFER FILENAME.TYP'. IF THE FILE FITS IN A 
  16. ;         SINGLE EXTENT ON DISK (UP TO 16K BYTES), IT WILL ALL BE LOADED
  17. ;         INTO MEMORY AT THIS TIME. IF THE FILE IS LARGER THAN 16K, ONE
  18. ;         EXTENT MAY BE TRANSFERRED AT A TIME BY TYPING THE COMMAND
  19. ;         'XFER FILENAME.TYP N' WHERE N IS THE NUMBER OF THE EXTENT TO
  20. ;         BE LOADED. THE DEFAULT FOR N IS 0 (ZERO). AFTER A GIVEN SEGMENT
  21. ;         IS LOADED, XFER WILL SPECIFY HOW MANY PAGES (DECIMAL) SHOULD
  22. ;         BE SAVED BY TYPING 'READY FOR "SAVE NN FILENAME.TYP" ', WHERE
  23. ;         NN IS THE NUMBER OF PAGES (DECIMAL) REQUIRED. THE USER MAY THEN
  24. ;         SWAP DISKETTES, AND TYPE CTRL-C. THIS WILL CAUSE XFER TO INITIATE
  25. ;         A WARM BOOT ON THE NEW DISKETTE. THE USER MAY THEN TYPE THE
  26. ;         APPROPRIATE SAVE COMMAND. IF TRANSFERRING A MULTI-EXTENT FILE,
  27. ;         SAVE EACH EXTENT AS A SEPARATE FILE (EG. LONG.1$$, LONG.2$$,
  28. ;         ETC.), THEN USE PIP TO CONCATENATE THEM INTO ONE LONG FILE
  29. ;         (E.G. 'PIP LONG.ASM=LONG.1$$,LONG.2$$,...,LONG.N$$').
  30. ;
  31. ;         IF AVAILABLE, "SAP" IS A SIMPLER AND FASTER WAY TO MERGE BACK
  32. ;         FRAGMENTED FILES INTO SINGLE FILES. SEE DOCUMENTATION ON SAP
  33. ;         IF YOU HAVE ACCESS TO IT.
  34. ;
  35. ;         NOTE THAT A SIMPLE LOAD WILL NOT SUFFICE TO GENERATE A NEW
  36. ;         COM FILE FOR XFER. THIS IS DUE TO THE FACT THAT PART OF THE
  37. ;         CODE ASSEMBLES FOR EXECUTION AT 4200H, WHICH MAKES FOR AN
  38. ;         EXCESSIVELY LONG COM FILE AND LOAD TIME. HENCE I HAVE WRITTEN
  39. ;         A SHORT BOOT ROUTINE WHICH COPIES 200H BYTES STARTING AT
  40. ;         200H UP TO 4200H. THEREFORE, TO 'LOAD' XFER, DO THE FOLLOWING:
  41. ;
  42. ;         A> ASM XFER
  43. ;         A> DDT XFER.HEX
  44. ;         -M4200,43FF,200
  45. ;         - (CTRL-C)
  46. ;         A> SAVE 8 XFER.COM
  47.  
  48.  BDOS     EQU    0005H          ;BDOS ENTRY POINT AND FUNCTION CODES
  49.  RCFC     EQU    01                  ;READ CONSOLE
  50.  WCFC     EQU    02                  ;WRITE CONSOLE
  51.  OFFC     EQU    15                  ;OPEN FILE
  52.  RRFC     EQU    20                  ;READ RECORD
  53.  SAFC     EQU    26                  ;SET (DMA) ADDRESS
  54.  
  55.  WBOOT    EQU    0000H          ;WARM BOOT ENTRY POINT
  56.  
  57.  FCB      EQU    005CH          ;SYSTEM FILE CONTROL BLOCK AREA AND FIELDS
  58.  FN       EQU    01                  ;FILE NAME
  59.  FT       EQU    09                  ;FILE TYPE
  60.  EX       EQU    12                  ;EXTENT NUMBER
  61.  NR       EQU    32                  ;NEXT RECORD
  62.  
  63.  CR       EQU    0DH            ;CARRIAGE RETURN
  64.  LF       EQU    0AH            ;LINE FEED
  65.  
  66.           ORG    0100H
  67.  MOVE:    LXI    H,200H
  68.           LXI    D,4200H
  69.           LXI    B,200H
  70.  MOVE1:   MOV    A,M
  71.           INX    H
  72.           STAX   D
  73.           INX    D
  74.           DCX    B
  75.           MOV    A,B
  76.           ORA    C
  77.           JNZ    MOVE1
  78.           JMP    4200H
  79.       
  80.           ORG    4200H
  81.  XFER:    LXI    SP,STACK+64
  82.           LXI    H,STR1         ;PRINT 'XFER 1.0'
  83.           CALL   WASC
  84.           XRA    A              ;DEFAULT TO EXTENT ZERO
  85.           STA    FCB+EX
  86.           LDA    FCB+17         ;CHECK FOR SECOND PARAMETER
  87.           CPI    ' '            ;JUMP IF NOT PRESENT
  88.           JZ     XFER0
  89.           SUI    '0'            ;DECODE IT
  90.           JC     XFER9          ;JUMP IF NOT LEGAL DECIMAL DIGIT
  91.           CPI    10
  92.           JNC    XFER9
  93.           STA    FCB+EX
  94.  XFER0:   LXI    H,0100H        ;SET FWA OF BUFFER
  95.           SHLD   ADDR
  96.           XRA    A              ;CLEAR SECTOR COUNT
  97.           STA    SCNT
  98.           LXI    D,FCB          ;OPEN USER'S FILE
  99.           CALL   OPEN
  100.           INR    A              ;JUMP IF OK
  101.           JNZ    XFER1
  102.           LXI    H,STR2         ;ELSE PRINT 'FILE NOT FOUND'
  103.           CALL   WASC
  104.           JMP    XFERX          ;AND EXIT
  105.  XFER1:   XRA    A              ;REWIND FILE
  106.           STA    FCB+NR
  107.  XFER2:   LHLD   ADDR           ;DE = CURRENT BUFFER ADDRESS
  108.           MOV    D,H
  109.           MOV    E,L
  110.           CALL   SETDMA         ;SET DMA ADDRESS
  111.           LXI    D,FCB
  112.           CALL   READ           ;READ NEXT SECTOR INTO BUFFER
  113.           DCR    A              ;JUMP IF EOF
  114.           JZ     XFER3
  115.           LHLD   ADDR           ;INCREMENT LOAD ADDRESS
  116.           LXI    D,80H
  117.           DAD    D
  118.           SHLD   ADDR
  119.           LDA    SCNT           ;INCREMENT SECTOR COUNT
  120.           INR    A
  121.           STA    SCNT
  122.           CPI    128            ;LOOP IF STILL ROOM IN BUFFER
  123.           JC     XFER2
  124.           LXI    H,STR3         ;PRINT BUFFER FULL MSG
  125.           CALL   WASC
  126.  XFER3:   LXI    H,STR4         ;PRINT 'READY FOR "SAVE '
  127.           CALL   WASC
  128.           LDA    SCNT           ;PRINT (SCNT+1)/2   (PAGE COUNT)
  129.           INR    A
  130.           RRC
  131.           ANI    7FH
  132.           CALL   WDB
  133.           MVI    A,' '          ;PRINT A SPACE
  134.           CALL   WACC
  135.           LXI    H,FCB+FN       ;PRINT USER'S FILE NAME
  136.           MVI    B,8
  137.  XFER4:   MOV    A,M
  138.           INX    H
  139.           CPI    ' '
  140.           JZ     XFER8
  141.           CALL   WACC
  142.           DCR    B
  143.           JNZ    XFER4
  144.  XFER8:   MVI    A,'.'          ;PRINT A PERIOD
  145.           CALL   WACC
  146.           LDA    SCNT           ;JUMP IF BUFFER FULL
  147.           CPI    128
  148.           LDA    FCB+EX         ;CHECK FOR EXTENT OTHER THAN 0
  149.           JZ     XFERB
  150.           ORA    A
  151.           JZ     XFERA          ;JUMP IF EXTENT ZERO
  152.  XFERB:   ADI    '0'            ;ELSE PRINT EXTENT NUMBER
  153.           CALL   WACC           ;INSTEAD OF FILE TYPE
  154.           MVI    A,'$'          ;PRINT TWO DOLLAR SIGNS
  155.           CALL   WACC
  156.           MVI    A,'$'
  157.           CALL   WACC
  158.           JMP    XFER6
  159.  XFERA:   LXI    H,FCB+FT       ;PRINT USER'S FILE TYPE
  160.           MVI    B,3
  161.  XFER5:   MOV    A,M
  162.           INX    H
  163.           CPI    ' '
  164.           JZ     XFER6
  165.           CALL   WACC
  166.           DCR    B
  167.           JNZ    XFER5
  168.  XFER6:   MVI    A,'"'          ;PRINT CLOSING QUOTE
  169.           CALL   WACC
  170.           CALL   WEOLC          ;PRINT END-OF-LINE
  171.  XFER7:   LXI    H,STR5         ;PRINT 'SWAP DISKETTES AND TYPE CTRL-C'
  172.           CALL   WASC
  173.           CALL   RACC           ;AWAIT CTRL-C
  174.           ANI    7FH
  175.           CPI    'C'-40H
  176.           JNZ    XFER7
  177.           JMP    XFERX
  178.  XFER9:   LXI    H,STR6         ;PRINT 'ILLEGAL EXTENT NUMBER'
  179.           CALL   WASC
  180.  XFERX:   JMP    WBOOT          ;AND AWAY WE GO!!!
  181.  
  182.  WASC:    MOV    A,M
  183.           ORA    A
  184.           RZ
  185.           CALL   WACC
  186.           INX    H
  187.           JMP    WASC
  188.  
  189.  OPEN:    MVI    C,OFFC
  190.           JMP    BDOS
  191.       
  192.  SETDMA:  MVI    C,SAFC
  193.           JMP    BDOS
  194.  
  195.  READ:    MVI    C,RRFC
  196.           JMP    BDOS
  197.  
  198.  RACC:    MVI    C,RCFC
  199.           JMP    BDOS
  200.  
  201.  WACC:    PUSH   H
  202.           PUSH   D
  203.           PUSH   B
  204.           MVI    C,WCFC
  205.           MOV    E,A
  206.           CALL   BDOS
  207.           POP    B
  208.           POP    D
  209.           POP    H
  210.           RET
  211.  
  212.  WEOLC:   MVI    A,CR
  213.           CALL   WACC
  214.           MVI    A,LF
  215.           JMP    WACC
  216.  
  217.  WDB:     PUSH   PSW
  218.           PUSH   B
  219.           MVI    C,0
  220.  WDB1:    CPI    100
  221.           JC     WDB2
  222.           INR    C
  223.           SUI    100
  224.           JMP    WDB1
  225.  WDB2:    CALL   WDD
  226.           MVI    C,0
  227.  WDB3:    CPI    10
  228.           JC     WDB4
  229.           INR    C
  230.           SUI    10
  231.           JMP    WDB3
  232.  WDB4:    CALL   WDD
  233.           MOV    C,A
  234.           CALL   WDD
  235.           POP    B
  236.           POP    PSW
  237.           RET
  238.  
  239.  WDD:     PUSH   PSW
  240.           MOV    A,C
  241.           ADI    '0'
  242.           CALL   WACC
  243.           POP    PSW
  244.           RET
  245.  
  246. ;         DATA AREA
  247.  
  248.  STR1:    DB     'XFER 1.0',CR,LF,0
  249.  STR2:    DB     'FILE NOT FOUND',CR,LF,0
  250.  STR3:    DB     'BUFFER FULL, FURTHER PASSES REQUIRED',CR,LF,0
  251.  STR4:    DB     'READY FOR "SAVE ',0
  252.  STR5:    DB     'SWAP DISKETTES AND TYPE CTRL-C',CR,LF,0
  253.  STR6:    DB     'ILLEGAL EXTENT NUMBER',CR,LF,0
  254.  
  255.  STACK:   DS     64
  256.  ADDR:    DS     2
  257.  SCNT:    DS     1
  258.  
  259.           END
  260.