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 / CPMUG078.ARK / SDCOPY.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  10KB  |  360 lines

  1. ;SDCOPY.ASM
  2. ;V1.0
  3. ;*************************************************************
  4. ;       THIS PROGRAM IS USED TO COPY A FILE FROM
  5. ;       ONE DISKETTE TO ANOTHER ON A CP/M SYSTEM
  6. ;       WHICH HAS ONLY ONE DISK DRIVE.
  7. ;
  8. ;    IF FILE IS LARGER THAN AVAILABLE MEMORY IT IS
  9. ;    COPIED IN MULTIPLE PASSES - EACH PASS READS
  10. ;    AS MUCH AS WILL FIT IN MEMORY, WRITES IT OUT AFTER
  11. ;    ASKING FOR DESTINATION DISK, THEN ASKS FOR SOURCE AGAIN.
  12. ;*************************************************************
  13. ;
  14. ;
  15. ;       WARD'S BDOS/CBIOS EQUATES (VERSION 6)    
  16. ;
  17. RDCON    EQU    1
  18. WRCON    EQU    2
  19. PRINT    EQU    9
  20. RESETDK    EQU    13
  21. SELDK    EQU    14
  22. OPEN    EQU    15
  23. CLOSE    EQU    16
  24. SRCHF    EQU    17
  25. SRCHN    EQU    18
  26. ERASE    EQU    19
  27. READ    EQU    20
  28. WRITE    EQU    21
  29. MAKE    EQU    22
  30. RENAME  EQU     23
  31. STDMA    EQU    26
  32. BDOS    EQU    5
  33. FCB    EQU    5CH 
  34. ;
  35. ;******************************************
  36. ;
  37.     ORG    100H
  38. ;
  39. ;******************************************
  40. ;       SAVE THE LOCAL STACK
  41. ;******************************************
  42.     LXI    H,0
  43.     DAD    SP
  44.     SHLD    STACK
  45.     LXI    SP,STACK
  46. ;******************************************
  47. ;       CREATE DUPLICATE FCB FOR OUTPUT FILE
  48. ;******************************************
  49.     LXI    D,FCB    
  50.     LXI    H,FCB2
  51.     MVI    B,33
  52.     CALL    MOVER
  53. ;
  54.     CALL    ILPRT
  55.     DB    'SINGLE-DRIVE COPY 3/10/81',0DH,0AH,0
  56.     CALL    OPNSRC
  57. ;
  58. OPENOK: LXI    D,BUFF    ;POINT TO BUFFER
  59. READLP: PUSH    D    ;SAVE BUFFER ADDRESS
  60. ;    SET THE DMA ADDR
  61.     MVI    C,STDMA
  62.     CALL    BDOS
  63. ;
  64. ;******************************************
  65. ;    READ A SECTOR
  66. ;******************************************
  67.     LXI    D,FCB
  68.     MVI    C,READ
  69.     CALL    BDOS
  70. ;
  71.     ORA    A    ;OK?
  72.     JNZ    EOF    ;NOT OK, MUST BE EOF
  73.     LHLD    FCT    ;LOAD SECTOR COUNT FOR FILE
  74.     INX    H    ;BUMP BY 1
  75.     SHLD    FCT    ;SAVE IT BACK
  76.     POP    D    ;GET DMA ADDR
  77.     LXI    H,80H
  78.     DAD    D    ;CALC NEXT BUFF ADDR
  79.     XCHG        ;PUT IT BACK IN DE
  80. ;******************************************
  81. ;       OUT OF MEMORY?
  82. ;******************************************
  83.     LDA    7    ;GET BDOS PAGE POINTER
  84.     SUI    0AH    ;SUBTRACT OFFSET TO BELOW CCP
  85.     CMP    D    ;ABOUT TO HIT CCP?
  86.     JZ    FULL    ;YES - WRITE WHAT WE HAVE
  87.     JNC    READLP    ;NO, LOOP
  88. ;******************************************
  89. ;FILE IS TOO BIG - WRITE FIRST PART
  90. ;******************************************
  91. FULL:    JMP    DESTMSG
  92. ;******************************************
  93. ;GOT RETURN CODE ON READ, SEE IF ERROR OR EOF
  94. ;******************************************
  95. EOF:    POP    D    ;POP BUFF ADDR OFF STACK
  96.     DCR    A    ;EOF?
  97.     JNZ    RERROR    ;NO, READ ERROR
  98.     XRA    A    ;SET DONE FLAG
  99.     STA    DONEF   ;SAVE FLAG FOR CHECKING LATER
  100.     JMP    DESTMSG ;GO TO OUTPUT ROUTINE
  101. ;******************************************
  102. ;FILE READ INTO MEMORY.  ASK FOR DEST. DISK
  103. ;******************************************
  104. DESTMSG:CALL    ILPRT
  105.     DB    'MOUNT DESTINATION DISK, TYPE D: ',0
  106. ;
  107. ;    GET CHARACTER FROM CONSOLE
  108.     MVI    C,RDCON
  109.     CALL    BDOS
  110. ;
  111.     ANI    5FH    ;MAKE IT UPPER CASE
  112.     CPI    'D'    ;IS IT A D?
  113.     JZ    RESET    ;YES, RESET R/O STATUS
  114.     CPI    03H    ;IS IT CTL-C
  115.     JZ    DONE    ;YES - REBOOT
  116.     JMP    DESTMSG    ;NO - GO ASK AGAIN
  117. ;******************************************
  118. ;       RESET DISK TO DISABLE R/O STATUS
  119. ;******************************************
  120. RESET:    MVI    C,RESETDK
  121.     CALL    BDOS
  122. ;
  123.     CALL    LOGIN
  124. ;
  125. OUTOPN:    LDA    OPNOUT    ;HAS OUTPUT FILE BEEN CREATED?
  126.     ORA    A
  127.     JNZ    CREATE    ;NO-CREATE IT
  128. ;******************************************
  129. ;       OPEN THE OUTPUT FILE
  130. ;******************************************
  131.     LXI    D,FCB2    ;YES-JUST OPEN IT
  132.     MVI    C,OPEN
  133.     CALL    BDOS
  134. ;
  135.     INR    A    ;WAS OPEN OK?
  136.     JNZ    WRTFIL    ;YES-GO WRITE IT
  137.     CALL    ILPRT   ;LOOKS LIKE THE WRONG DISKETTE
  138.         DB      0DH,0AH,'** WRONG DISKETTE **',0DH,0AH,0
  139.         JMP     DESTMSG ;GO ASK FOR OUTPUT DISK AGAIN
  140. CREATE:    XRA    A    ;SET FLAG
  141.     STA    OPNOUT
  142.     STA    FCB2+12    ;ZERO EXTENT #
  143.     STA    FCB2+32    ;ZERO SECTOR #
  144. ;******************************************
  145. ;       ERASE EXISTING FILE WITH SAME NAME (IF ANY)
  146. ;******************************************
  147.     LXI    D,FCB2
  148.     MVI    C,ERASE
  149.     CALL    BDOS
  150. ;
  151. ;******************************************
  152. ;       CREATE THE OUTPUT FILE
  153. ;******************************************
  154.     LXI    D,FCB2
  155.     MVI    C,MAKE
  156.     CALL    BDOS
  157. ;
  158.     INR    A
  159.     JZ    BADMAKE    ;MAYBE DIRECTORY IS FULL?
  160. ;******************************************
  161. ;       WRITE THE FILE TO DISK
  162. ;******************************************
  163. WRTFIL:    LHLD    FCT    ;ANYTHING TO WRITE?
  164.     MOV    A,H
  165.     ORA    L
  166.     JZ    CLOSEF    ;NO - CLOSE OUTPUT FILE
  167.     LXI    D,BUFF    ;POINT TO BUFFER
  168. WRLP:    PUSH    D    ;SAVE THE DMA ADDR
  169.     MVI    C,STDMA ;SET DMA ADDRESS
  170.     CALL    BDOS
  171. ;******************************************
  172. ;    WRITE THE SECTOR
  173. ;******************************************
  174.     LXI    D,FCB2
  175.     MVI    C,WRITE
  176.     CALL    BDOS
  177. ;
  178.     ORA    A    ;WAS THE WRITE SUCCESSFUL?
  179.     JNZ    WRERR    ;NO, EXIT W/ERROR MSG
  180.     POP    D    ;GET DMA ADDR
  181.     LXI    H,80H    ;GET BUFFER LENGTH
  182.     DAD    D    ;CALC NEXT DISK WRITE ADDR
  183.     XCHG        ;SAVE IN DE
  184.     LHLD    FCT    ;GET FILE'S SECTOR COUNT
  185.     DCX    H    ;DECREMENT IT
  186.     SHLD    FCT    ;SAVE IT BACK
  187.     MOV    A,H     ;IS IT ZERO?
  188.     ORA    L
  189.     JNZ    WRLP    ;IF MORE, LOOP
  190. ;******************************************
  191. ;    CLOSE THE FILE
  192. ;******************************************
  193. CLOSEF:    LXI    D,FCB2
  194.     MVI    C,CLOSE
  195.     CALL    BDOS
  196. ;
  197.     LDA    DONEF    ;DONE ?
  198.     ORA    A
  199.     JZ    DONE    ;YES - CLOSE FILE
  200.     LXI    H,0    ;NO - CONTINUE
  201.     SHLD    FCT
  202.     CALL    OPNSRC
  203.     CALL    LOGIN
  204.     JMP    OPENOK
  205. ;******************************************
  206. DONE    EQU    $       ;FILE HAS BEEN COPIED
  207. ;******************************************
  208. ;    RESET DMA ADDR T0 80H
  209. ;******************************************
  210.     LXI    D,80H
  211.     MVI    C,STDMA
  212.     CALL    BDOS
  213. ;
  214.     CALL    MSGEXIT    ;EXIT PRINTING FOLLOWING:
  215.     DB    '++DONE++',0DH,0AH,'$'
  216. ;******************************************
  217. ;       READ ERROR - EXIT WITH MSG
  218. ;******************************************
  219. RERROR:    CALL    MSGEXIT
  220.     DB    '++READ ERROR++$'
  221. ;******************************************
  222. ;       GOT A WRITE ERROR - EXIT W/ERROR MSG.
  223. ;******************************************
  224. WRERR:    CALL    MSGEXIT
  225.     DB    '++WRITE ERROR++$'
  226. ;******************************************
  227. ;       COULDN'T MAKE THE FILE, EXIT W/ERROR MSG.
  228. ;******************************************
  229. BADMAKE:CALL    MSGEXIT
  230.     DB    '++CAN''T MAKE OUTPUT FILE$'
  231. ;******************************************
  232. ;       INLINE PRINT ROUTINE - CALL ILPRT FOLLOWED
  233. ;    BY MESSAGE (ENDING IN 0)
  234. ;******************************************
  235. ILPRT:    MVI    A,0DH    ;CR..
  236.     CALL    TYPE
  237.     MVI    A,0AH    ;LF FIRST.
  238.     CALL    TYPE
  239.     XTHL        ;SAVE HL, GET MSG ADDR
  240. ILPLP:    MOV    A,M    ;GET CHAR OF MSG
  241.     PUSH    H    ;SAVE H
  242.     CALL    TYPE    ;TYPE CHAR
  243.     POP    H    ;GET H AGAIN
  244.     INX    H    ;POINT TO NEXT CHAR
  245.     MOV    A,M    ;GET IT
  246.     ORA    A    ;IS IT END OF MSG?
  247.     JNZ    ILPLP    ;NO, LOOP
  248.     INX    H    ;SKIP THE 0
  249.     XTHL        ;RESTORE HL, STACK RET ADDR
  250.     RET        ;..AND RETURN
  251. ;******************************************
  252. ;       TYPE CHAR IN A
  253. ;******************************************
  254. TYPE:
  255. ;       WRITE TO CONSOLE
  256.     MOV    E,A
  257.     MVI    C,WRCON
  258.     CALL    BDOS
  259. ;
  260.     RET
  261. ;******************************************
  262. ;       CHAR MOVE ROUTINE, (DE) -> (HL) LEN IN B
  263. ;******************************************
  264. MOVER:    LDAX    D    ;GET SOURCE CHAR
  265.     MOV    M,A    ;STORE IN DEST. LOCATION
  266.     INX    D    ;POINT TO NEXT SOURCE
  267.     INX    H    ;POINT TO NEXT DEST.
  268.     DCR    B    ;DECREMENT COUNT
  269.     JNZ    MOVER    ;LOOP UNTIL ZERO
  270.     RET        ;..THEN RETURN
  271. ;******************************************
  272. ;       EXIT WITH ERROR MESSAGE
  273. ;******************************************
  274. MSGEXIT:MVI    A,0DH
  275.     CALL    TYPE
  276.     MVI    A,0AH
  277.     CALL    TYPE
  278.     POP    D    ;GET MSG ADDRESS
  279. ;       PRINT A MESSAGE
  280.     MVI    C,PRINT
  281.     CALL    BDOS
  282. ;******************************************
  283. ;       EXIT, RESTORING STACK AND RETURN
  284. ;******************************************
  285. EXIT:    CALL    ILPRT
  286.     DB    0DH,0AH,'RE-BOOTING '
  287.     DB    'VIA "JMP 0000", '
  288.     DB    'PRESS RETURN',0
  289. ;       READ A CHARACTER
  290.     MVI    C,RDCON
  291.     CALL    BDOS
  292. ;
  293.     CPI    0DH
  294.     JNZ    EXIT
  295.         LHLD    STACK    ;GET ORIGINAL STACK POINTER
  296.         SPHL             ;AND RELOAD
  297.     JMP    0000H    ;REBOOT CP/M
  298. ;******************************************
  299. ;       REQUEST SOURCE DISKETTE + OPEN FILE
  300. ;******************************************
  301. OPNSRC:    CALL    ILPRT
  302.     DB    'MOUNT SOURCE DISK, TYPE S: ',0
  303. ;    GET THE CHARACTER
  304.     MVI    C,RDCON
  305.     CALL    BDOS
  306. ;
  307.     ANI    5FH    ;MAKE UPPER CASE
  308.     CPI    'S'
  309.     JZ    OPENIN    ;YES - OPEN INPUT FILE
  310.     CPI    03H    ;IS IT CTL-C?
  311.     JZ    DONE    ;YES - REBOOT
  312.     JMP    OPNSRC    ;NO - GO ASK AGAIN
  313. ;******************************************
  314. ;'S' WAS TYPED, OPEN THE INPUT FILE
  315. ;******************************************
  316. OPENIN    EQU    $
  317. ;       OPEN THE FILE
  318.     LXI    D,FCB
  319.     MVI    C,OPEN
  320.     CALL    BDOS
  321. ;
  322.     INR    A    ;WAS THE OPEN OK?
  323.         RNZ      ;YES - RETURN
  324. ;******************************************
  325. ;       OPEN WAS BAD ON SOURCE DISKETTE
  326. ;******************************************
  327.     CALL    ILPRT   ;LOOKS LIKE THE WRONG DISKETTE
  328.     DB    0DH,0AH,'** WRONG DISKETTE **',0DH,0AH,0
  329.         JMP     OPNSRC  ;GO ASK FOR INPUT DISK AGAIN
  330. ;******************************************
  331. ;    LOG IN THE MOUNTED DISK
  332. ;******************************************
  333. LOGIN    EQU    $
  334.     LXI    D,0
  335.     MVI    C,SELDK
  336.     CALL    BDOS
  337. ;
  338.     RET
  339. ;
  340. ;****************************************
  341. ;       DATA AREA STARTS HERE
  342. ;****************************************
  343. ;
  344. DONEF:    DB    0FFH    ;COPY DONE FLAG
  345. OPNOUT:    DB    0FFH    ;OUTPUT OPEN FLAG
  346. FCT:    DW    0    ;FILE COUNT
  347. ;FOLLOWING FROM WARD'S "EQU5.LIB"---->
  348.     DS    40H    ;STACK AREA
  349. STACK:    DS    2
  350. ;******************************************
  351. ;       SECOND FCB (FOR OUTPUT FILE)
  352. ;******************************************
  353. FCB2:    DS    33
  354. ;******************************************
  355. ;       BUFFER AREA STARTS RIGHT AFTER PROGRAM CODE
  356. ;       AND DATA, AND EXTENDS TO JUST BELOW CCP
  357. ;******************************************
  358. BUFF    EQU    $
  359.         END
  360.