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 / CPM / UTILS / FILCPY / MOVE.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  7KB  |  331 lines

  1. ;
  2. ;        MOVE.ASM
  3. ;          V2.1
  4. ;       (revised 6/12/80)
  5. ;
  6. ;USED TO TRANSFER FILES FROM ONE DISK TO ANOTHER
  7. ;ON A 1 DISK SYSTEM, BY READING THE FILE INTO MEMORY.
  8. ;ISSUES ERROR MSG IF FILE WON'T FIT. ALSO USEFUL FOR
  9. ;TRANSFERRING ONE FILE TO MULTIPLE DISKS. WORKS WITH
  10. ;ANY DRIVE - A, B, C, OR D.
  11. ;
  12. ;***************************************************
  13. ;* NOTE: CHECK COMMENTS AT LABEL 'EXIT:' REGARDING *
  14. ;*     REBOOT WHEN EXITING THIS PROGRAM.       *
  15. ;***************************************************
  16. ;
  17. ;07/23/78 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  18. ;10/20/78 MODIFY TO WRITE MULTIPLE TIMES
  19. ;    (FOR EXAMPLE TO MOVE STAT.COM TO 5 NEW DISKS)
  20. ;02/24/79 MODIFY TO STORE TO EITHER A: OR B:, AS
  21. ;    MOVE IS MUCH QUICKER THAN PIP FOR PEOPLE
  22. ;    WITH 2 DRIVE SYSTEMS.
  23. ;05/27/79 MODIFY TO CHECK FOR NO FILE NAME AND TO
  24. ;    ZERO OUT DISK NAME SO IT WON'T OVERULE THIS
  25. ;    PROGRAM.  BY KEITH PETERSEN, W8SDZ.
  26. ;08/19/79 REMOVE MACROS TO ALLOW ASSEMBLY WITH
  27. ;    ASM.COM. ADD CONDITIONAL ASSEMBLY FOR CP/M
  28. ;    ON H8 OR TRS-80.  (KBP)
  29. ;08/20/79 FIX TEST TO PROTECT BDOS (WAS WRONG WHEN
  30. ;    ALTCPM OPTION CHOSEN).  (KBP).
  31. ;11/27/79 FIX DMA PROBLEM FOR MULTIPLE WRITES.
  32. ;    ELIMINATE EXTRA PUSH-POPS. (KBP).
  33. ;12/04/79 FIX ERROR IN RESETTING DMA TO NORMAL
  34. ;    (Thanks to Ward Christensen) (KBP)
  35. ;04/20/80 MODIFIED TO WORK WITH EITHER CP/M 1.4 OR CP/M-2.
  36. ;    EARLIER VERSION COPIED FILE ATTRIBUTES WHICH PREVENTED
  37. ;    MOVING R/O FILES AND MADE CP/M-2 FILES INACCESSABLE
  38. ;    UNDER 1.4. (KBP)
  39. ;06/12/80 MODIFIED TO REMOVE ATTRIBUTES ON ALL 11 CHARACTERS
  40. ;    OF FCB NAME. (KBP)
  41. ;
  42. STDCPM    EQU    1    ;TRUE FOR STANDARD CP/M
  43. ALTCPM    EQU    0    ;TRUE FOR H8 OR TRS-80
  44. ;
  45. BASE    SET    0
  46. ;
  47.     IF    ALTCPM    ;H8 OR TRS-80
  48. BASE    SET    4200H
  49.     ENDIF        ;ALTCPM
  50. ;
  51. CR    EQU    0DH    ;CARRIAGE RETURN
  52. LF    EQU    0AH    ;LINE FEED
  53. ;
  54.     ORG    BASE+100H
  55. ;
  56. START    LDA    FCB+1    ;SEE IF FILE NAME THERE
  57.     CPI    ' '    ;NONE?
  58.     RZ        ;IF NONE, RETURN TO CP/M
  59.     LXI    SP,STACK
  60.     XRA    A    ;ZERO DISK NAME SO IT WON'T
  61.     STA    FCB    ;OVERULE COMMANDS IN THIS PGM.
  62.     CALL    ILPRT
  63.     DB    'MOVE.COM V2.1, 6/12/80'
  64.     DB    CR,LF,0
  65. ;
  66. SRCMSG    CALL    ILPRT
  67.     DB    'MOUNT SOURCE DISK, TYPE: A, B, C, OR D ',0
  68.     CALL    GETDISK    ;GET DISK NAME
  69.     JC    SRCMSG    ;INVALID ANSWER, ASK AGAIN
  70. ;
  71. ;GOT DISK, OPEN THE INPUT FILE
  72. ;
  73.     LXI    D,FCB
  74.     MVI    C,OPEN
  75.     CALL    BDOS
  76.     INR    A    ;WAS THE OPEN OK?
  77.     JNZ    OPENOK    ;YES
  78. ;
  79. ;OPEN WAS BAD, EXIT WITH ERROR MESSAGE.
  80. ;
  81.     CALL    ERXIT
  82.     DB    '++NO SUCH FILE++',CR,LF,'$'
  83. ;
  84. OPENOK    LXI    D,BUFF    ;POINT TO BUFFER
  85. READLP    PUSH    D    ;SAVE BUFFER ADDRESS
  86.     MVI    C,STDMA
  87.     CALL    BDOS
  88. ;READ A SECTOR
  89.     LXI    D,FCB
  90.     MVI    C,READ
  91.     CALL    BDOS
  92.     POP    D    ;GET DMA ADDR
  93.     ORA    A    ;OK?
  94.     JNZ    EOF    ;NOT OK, MUST BE EOF
  95.     LHLD    FCT    ;LOAD SECTOR COUNT FOR FILE
  96.     INX    H    ;BUMP IT
  97.     SHLD    FCT    ;SAVE IT BACK
  98.     LXI    H,80H    ;LENGTH OF 1 SECT.
  99.     DAD    D    ;CALC NEXT BUFF ADDR
  100.     XCHG        ;PUT IT BACK IN DE
  101. ;OUT OF MEMORY?
  102.     LDA    BASE+7    ;GET BDOS PAGE POINTER
  103.     SUI    2    ;MAKE SURE
  104.     CMP    D    ;ABOUT TO HIT BDOS?
  105.     JNC    READLP    ;NO, LOOP
  106. ;
  107. ;FILE IS TOO BIG - EXIT PRINTING ERROR MSG.
  108. ;
  109.     CALL    ERXIT
  110.     DB    '++FILE WON''T FIT IN MEMORY++$'
  111. ;
  112. ;GOT RETURN CODE ON READ, SEE IF ERROR OR EOF
  113. ;
  114. EOF    LHLD    FCT    ;GET SECTOR COUNT
  115.     SHLD    SAVEFCT    ;SAVE IT FOR MULTIPLE WRITES
  116. ;A HAS RETURN CODE FROM READ
  117.     DCR    A    ;EOF?
  118.     JZ    DESTMSG    ;YES, ASK FOR DEST. DISK
  119. ;
  120. ;READ ERROR - EXIT WITH MSG
  121. ;
  122.     CALL    ERXIT
  123.     DB    '++READ ERROR++$'
  124. ;
  125. ;FILE READ INTO MEMORY.  ASK FOR DEST. DISK
  126. ;
  127. DESTMSG    LXI    D,BASE+80H ;RESET DMA TO NORMAL
  128.     MVI    C,STDMA
  129.     CALL    BDOS
  130.     CALL    ILPRT
  131.     DB    'C/R TO END, ',CR,LF
  132.     DB    'MOUNT DEST.  DISK, TYPE: A, B, C, OR D ',0
  133.     CALL    GETDISK    ;GET A OR B
  134.     JC    DESTMSG    ;NEITHER, ASK AGAIN
  135.     LHLD    SAVEFCT    ;GET SAVED COUNT
  136.     SHLD    FCT    ;SAVE FOR DECREMENT
  137. ;
  138. ;INIT FOR WRITING THE FILE
  139. ;
  140.     XRA    A
  141.     STA    FCBEXT    ;ZERO EXTENT #
  142.     STA    FCBSNO    ;ZERO SECTOR #
  143. ;
  144. ;REMOVE ALL FILE ATTRIBUTES
  145.     LXI    H,FCB+1    ;POINT TO FILE NAME.TYPE
  146.     MVI    B,11    ;NUMBER OF CHARACTERS
  147. ;
  148. ZFCBLP    MOV    A,M    ;GET CHAR
  149.     ANI    7FH    ;ZERO OUT ATTRIBUTE
  150.     MOV    M,A    ;RESTORE CHAR TO FCB
  151.     INX    H
  152.     DCR    B    ;ONE LESS CHARACTER
  153.     JNZ    ZFCBLP
  154. ;
  155. ;ERASE ANY FILE BY SAME NAME
  156.     LXI    D,FCB
  157.     MVI    C,ERASE
  158.     CALL    BDOS
  159. ;
  160. ;MAKE THE FILE
  161.     LXI    D,FCB
  162.     MVI    C,MAKE
  163.     CALL    BDOS
  164.     INR    A
  165.     JZ    BADMAKE    ;MAYBE DIRECTORY IS FULL?
  166. ;
  167. ;WRITE THE FILE TO DISK
  168. ;
  169.     LXI    H,BUFF    ;POINT TO BUFFER
  170.     SHLD    BUFPTR
  171. WRLP    LHLD    BUFPTR
  172.     LXI    D,BASE+80H
  173.     CALL    MOVE128
  174.     SHLD    BUFPTR    ;SAVE THE NEW BUF ADDR
  175. ;WRITE THE SECTOR
  176.     LXI    D,FCB
  177.     MVI    C,WRITE
  178.     CALL    BDOS
  179.     ORA    A    ;WAS THE WRITE SUCCESSFUL?
  180.     JNZ    WRERR    ;NO, EXIT W/ERROR MSG
  181.     LHLD    FCT    ;GET FILE'S SECTOR COUNT
  182.     DCX    H    ;DECREMENT IT
  183.     SHLD    FCT    ;SAVE IT BACK
  184.     MOV    A,H
  185.     ORA    L    ;ZERO?
  186.     JNZ    WRLP    ;NO, LOOP
  187. ;CLOSE THE FILE
  188.     LXI    D,FCB
  189.     MVI    C,CLOSE
  190.     CALL    BDOS
  191.     CALL    ILPRT    ;PRINT THE FOLLOWING:
  192.     DB    '++DONE++',CR,LF,0
  193.     JMP    DESTMSG
  194. ;
  195. ;GOT A WRITE ERROR - EXIT W/ERROR MSG.
  196. ;
  197. WRERR    CALL    ERXIT
  198.     DB    '++WRITE ERROR$'
  199. ;
  200. ;COULDN'T MAKE THE FILE, EXIT W/ERROR MSG.
  201. ;
  202. BADMAKE    CALL    ERXIT
  203.     DB    '++CAN''T MAKE OUTPUT FILE$'
  204. ;
  205. ;INLINE PRINT ROUTINE - CALL ILPRT FOLLOWED
  206. ;    BY MESSAGE (ENDING IN 0)
  207. ;
  208. ILPRT    MVI    A,CR    ;CR..
  209.     CALL    TYPE
  210.     MVI    A,LF    ;LF FIRST.
  211.     CALL    TYPE
  212.     XTHL        ;SAVE HL, GET MSG ADDR
  213. ;
  214. ILPLP    MOV    A,M    ;GET CHAR OF MSG
  215.     CALL    TYPE    ;TYPE IT
  216.     INX    H    ;POINT TO NEXT CHAR
  217.     MOV    A,M    ;GET IT
  218.     ORA    A    ;IS IT END OF MSG?
  219.     JNZ    ILPLP    ;NO, LOOP
  220.     INX    H    ;SKIP THE 0
  221.     XTHL        ;RESTORE HL, STACK RET ADDR
  222.     RET        ;..AND RETURN
  223. ;
  224. ;TYPE CHAR IN A
  225. ;
  226. TYPE    PUSH    B
  227.     PUSH    D
  228.     PUSH    H
  229.     MOV    E,A    ;FOR TYPE
  230.     MVI    C,WRCON
  231.     CALL    BDOS
  232.     POP    H
  233.     POP    D
  234.     POP    B
  235.     RET
  236. ;
  237. ;EXIT WITH ERROR MESSAGE
  238. ;
  239. ERXIT    MVI    A,CR
  240.     CALL    TYPE
  241.     MVI    A,LF
  242.     CALL    TYPE
  243.     POP    D    ;GET MSG ADDR
  244.     MVI    C,PRINT
  245.     CALL    BDOS
  246. ;
  247. ;EXIT: ASSUMES DISK IN A: MAY NOW BE DIFFERENT
  248. ;SYSTEM SIZE, SO WARM BOOT WOULD NOT WORK.
  249. ;JUMPS TO COLD BOOT EPROM ENTRY POINT.
  250. ;IF SUCH AN ENTRY POINT IS NOT AVAILABLE,
  251. ;CHANGE TO JMP 0000.  THIS WILL WORK IF YOU
  252. ;ARE WARM-BOOTING THE SAME SIZED SYSTEM AS
  253. ;BEFORE.
  254. ;
  255. EXIT    CALL    ILPRT
  256.     DB    CR,LF,'RE-BOOTING '
  257.     DB    'VIA "JMP FC00", '    ;<------
  258.     DB    'PRESS RETURN',0
  259.     MVI    C,RDCON
  260.     CALL    BDOS    ;GET CHAR.
  261.     CPI    CR    ;C/R?
  262.     JNZ    EXIT
  263.     JMP    0FC00H    ;COLD BOOT ROM ADDRESS <------
  264. ;
  265. ;MOVE 128 CHARACTERS
  266. ;
  267. MOVE128    MVI    B,128    ;SET MOVE COUNT
  268. ;
  269. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  270. ;
  271. MOVE    MOV    A,M    ;GET A CHAR
  272.     STAX    D    ;STORE IT
  273.     INX    H    ;TO NEXT "FROM"
  274.     INX    D    ;TO NEXT "TO"
  275.     DCR    B    ;MORE?
  276.     JNZ    MOVE    ;..YES, LOOP
  277.     RET        ;..NO, RETURN
  278. ;
  279. ;ROUTINE TO GET DISK NUMBER (A, B, C, D) THEN
  280. ;RESET THE DISK AND LOG IN THAT DISK.
  281. ;
  282. GETDISK    MVI    C,RDCON
  283.     CALL    BDOS    ;GET CHAR.
  284.     CPI    CR    ;JUST RETURN?
  285.     JZ    EXIT    ;YES, ALL DONE
  286.     PUSH    PSW    ;SAVE CHAR
  287. ;RESET DISK, KILLING R/O STATUS
  288.     MVI    C,RESETDK
  289.     CALL    BDOS
  290.     POP    PSW    ;GET DISK
  291.     ANI    5FH    ;MAKE UPPER CASE
  292.     SUI    'A'    ;CALC DISK
  293.     MOV    E,A    ;SETUP FOR SELECT
  294.     CPI    4    ;A-D?
  295.     CMC        ;CY ON = BAD
  296.     RC        ;ERROR RETURN
  297. ;LOG IN THE APPROPRIATE DISK
  298. SELDISK    MVI    C,SELDK
  299.     CALL    BDOS
  300.     ORA    A    ;SHOW NO ERROR
  301.     RET
  302. ;
  303. FCT    DW    0    ;FILE COUNT
  304. SAVEFCT    DW    0    ;SAVED FILE COUNT
  305. BUFPTR    DS    2    ;BUFFER POINTER FOR WRITE
  306. ;
  307.     DS    64    ;STACK AREA
  308. STACK    EQU    $
  309. BUFF    EQU    $
  310. ;
  311. ;BDOS/CBIOS EQUATES
  312. ;
  313. RDCON    EQU    1
  314. WRCON    EQU    2
  315. PRINT    EQU    9
  316. RESETDK    EQU    13
  317. SELDK    EQU    14
  318. OPEN    EQU    15
  319. CLOSE    EQU    16
  320. ERASE    EQU    19
  321. READ    EQU    20
  322. WRITE    EQU    21
  323. MAKE    EQU    22
  324. STDMA    EQU    26
  325. BDOS    EQU    BASE+5
  326. FCB    EQU    BASE+5CH 
  327. FCBEXT    EQU    FCB+12
  328. FCBSNO    EQU    FCB+32
  329. ;
  330.     END
  331.