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 / HDUTL / TOHARD.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  8KB  |  385 lines

  1. ;
  2. ;            TOHARD.ASM ver 1.2
  3. ;         by Keith Petersen, W8SDZ
  4. ;                  (revised 9/26/80)
  5. ;
  6. ;This program will transfer files from CP/M on floppy disks
  7. ;to CP/M on hard disk. (It can also be used for transfers
  8. ;from 5-1/4" minifloppy to 8" floppy.)
  9. ;
  10. ;To do this you must bring up the floppy CP/M as a small
  11. ;system (say 24k).  The system location isn't important so
  12. ;long as it does not overwrite the larger system in use by
  13. ;the hard disk. It is assumed that the user's system allows
  14. ;both disk controller boards to be used without conflict.
  15. ;    
  16. ;
  17. ;        USING THIS PROGRAM
  18. ;
  19. ; 1 - Bring up the hard disk CP/M as a large system (eg. 56k).
  20. ; 2 - Log into the drive you will be transferring files to.
  21. ; 3 - Cold boot the floppy CP/M, then run this program on it.
  22. ;
  23. ;COMMANDS:
  24. ;    TOHARD filename.type    ;gets file from default drive
  25. ;    TOHARD B:filename.type    ;gets file from B:
  26. ;    TOHARD *.*        ;gets all files
  27. ;    TOHARD B:*.*        ;gets all files from B:
  28. ;
  29. ;All normal ambiguous file names are allowed. Files written to
  30. ;the hard disk will go to the default drive.
  31. ;
  32. FALSE    EQU    0
  33. TRUE    EQU    NOT FALSE
  34. ;
  35. ;CONDITIONAL ASSEMBLY SWITCHES FOR CPn to
  36. ;the hard disk will go to the default drive.
  37. ;
  38. FALSE    EQU    0
  39. TRUE    EQU    NOT FALSE
  40. ;
  41. ;CONDITIONAL ASSEMBLY SWITCHES FOR CP/M VERSION
  42. ;    (only one should be true)
  43. ;
  44. CPM14    EQU    FALSE    ;CP/M VERSION 1.4
  45. CPM2    EQU    TRUE    ;CP/M VERSION 2.x
  46. ;
  47. ;OTHER CONDIT/M VERSION
  48. ;    (only one should be true)
  49. ;
  50. CPM14    EQU    FALSE    ;CP/M VERSION 1.4
  51. CPM2    EQU    TRUE    ;CP/M VERSION 2.x
  52. ;
  53. ;OTHER CONDITIONAL ASSEMBLY SWITCHES
  54. ;
  55. DJ2D    EQU    FALSE    ;TRUE IF BIG SYSTEM IS DISCUS 2D FLOPPY
  56. REPORT    EQU    FALSE    ;TRUE TO REPORT READS AND WRITES
  57.             ;(nice, but slows down transfers)
  58. ;
  59. ;EQUATES
  60. ;
  61. MSIZE    EQU    56    ;PUT BIG SYSTEM MEMORY SIZE HERE
  62. ;
  63.     IF    CPM14
  64. BIAS    EQU    (MSIZE-16)*1024
  65. CCP    EQU    BIAS+2900H    ;BASE OF CCP
  66.     ENDIF            ;CP/M 1.4
  67. ;
  68.     IF    CPM2 AND (NOT DJ2D)
  69. BIAS    EQU    (MSIZE-20)*1024
  70. CCP    EQU    BIAS+3400H    ;BASE OF CCP
  71.     ENDIF            ;STANDARD CP/M 2.x
  72. ;
  73.     IF    CPM2 AND DJ2D
  74. BIAS    EQU    (MSIZE-20)*1024
  75. CCP    EQU    BIAS+2D00H    ;BASE DISCUS 2D CCP
  76.     ENDIF            ;CP/M 2.x ON DISCUS 2D
  77. ;
  78. DEST$BDOS EQU    CCP+806H   ;RECEIVING BDOS VECTOR
  79. ;
  80. BELL    EQU    7    ;BELL CHARACTER
  81. TAB    EQU    9    ;TAB CHARACTER
  82. CR    EQU    0DH    ;CARRIAGE RETURN
  83. LF    EQU    0AH    ;LINE FEED
  84. ;
  85. ;BDOS/CBIOS EQUATES
  86. ;
  87. WBOOT    EQU    0    ;WARM BOOT ENTRY ADRS
  88. WRCON    EQU    2    ;WRITE CHARACTER TO CONSOLE
  89. BDOS    EQU    0005H    ;THE SENDING BDOS VECTOR
  90. PRINT    EQU    9    ;PRINT STRING (DE) UNTIL '$'
  91. OPEN    EQU    15    ;OPEN FILE
  92. CLOSE    EQU    16    ;CLOSE FILE
  93. SRCHF    EQU    17    ;SEARCH DIR FOR FIRST OCCUR.
  94. SRCHN    EQU    18    ;SEARCH DIR FOR NEXT OCCUR.
  95. DELETE    EQU    19    ;ERASE FILE
  96. READ    EQU    20    ;READ RECORD
  97. WRITE    EQU    21    ;WRITE RECORD
  98. MAKE    EQU    22    ;MAKE FILE
  99. STDMA    EQU    26    ;SET DMA ADRS
  100. FCB    EQU    5CH    ;DEFAULT FILE CONTROL BLOCK
  101. FCBEXT    EQU    FCB+12    ;EXTENT BYTE IN FCB
  102. FCBRNO    EQU    FCB+32    ;RECORD NUMBER IN FCB
  103. ;
  104. NOERR    EQU    0    ;NO ERROR
  105. EOF    EQU    1    ;END OF FILE
  106. NTFND    EQU    255    ;NOT FOUND
  107. NOMAKE    EQU    255    ;CAN'T MAKE FILE
  108. BDCLOS    EQU    255    ;BAD FILE CLOSE
  109. ;
  110. ;    THIS IS THE START OF THE PROGRAM.
  111. ;
  112.     ORG    100H
  113. ;
  114. START    LDA    FCB+1
  115.     CPI    ' '    ;SEE IF FILENAME THERE
  116.     JNZ    SIGNON
  117.     CALL    ILPRT    ;PRINT:
  118.     DB    CR,LF,'++NO FILE NAME SPECIFIED++',0
  119.     RET        ;EXIT TO CP/M
  120. ;
  121. SIGNON:    LXI    SP,STACK  ;SET STACK POINTER
  122.     CALL    ILPRT    ;PRINT:
  123.     DB    CR,LF,'FLOPPY to HARD DISK',CR,LF
  124.     DB    'multiple file transfer program',CR,LF,0
  125.  
  126. MORE:    CALL    MFNAME    ;SEE IF FILE IS IN DIRECTORY
  127.     JNC    MOVNAM    ;ANOTHER FILE FOUND, GET IT
  128.     LDA    MFFLG1    ;NOTHING FOUND, CHECK...
  129.     ORA    A    ;... FIRST TIME FLAG
  130.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  131.     CALL    EXIT
  132.     DB    '++FILE NOT FOUND++$'
  133. ;
  134. DONE:    CALL    EXIT
  135.     DB    CR,LF,'DONE$'
  136. ;
  137. ;MOVE FILENAME FROM FCB TO FNAME AND PRINT IT
  138. ;
  139. MOVNAM:    LXI    H,FCB+1
  140.     LXI    D,FNAME
  141.     MVI    B,8    ;8 CHARS IN FILE NAME
  142.     CALL    MOVER
  143.     LXI    H,FCB+9
  144.     LXI    D,FNAME+9
  145.     MVI    B,3    ;3 CHARS IN FILE TYPE
  146.     CALL    MOVER
  147.     CALL    ILPRT    ;PRINT:
  148.     DB    CR,LF,'--> FILE: '
  149. FNAME:    DB    'XXXXXXXX.XXX'
  150.     DB    CR,LF,0
  151. ;
  152. ;SAVE FIRST FCB FOR USE LATER AS DESTINATION FILE NAME
  153.     MVI    B,11       ;NUMBER OF CHARACTERS TO MOVE
  154.     LXI    H,FCB+1       ;...FROM FIRST FCB
  155.     LXI    D,NEWFCB+1 ;...TO NEWFCB (USE DEFAULT DRIVE)
  156.     CALL    MOVER
  157. ;
  158. ;OPEN THE SOURCE FILE
  159.     LXI    D,FCB
  160.     MVI    C,OPEN
  161.     CALL    BDOS
  162.     CPI    NTFND    ;NOT FOUND?
  163.     JNZ    OPENOK
  164.     CALL    EXIT
  165.     DB    BELL
  166.     DB    '++CAN''T OPEN FILE ON SOURCE DISK++$'
  167. ;
  168. ;OPEN THE DESTINATION FILE
  169. ;
  170. OPENOK:    CALL    ILPRT    ;PRINT:
  171.     DB    'Opening file on destination disk',0
  172.     LXI    D,NEWFCB
  173.     MVI    C,DELETE    ;ERASE ANY OLD FILE
  174.     CALL    DEST$BDOS
  175.     LXI    D,NEWFCB
  176.     MVI    C,MAKE        ;MAKE THE NEW ONE
  177.     CALL    DEST$BDOS
  178.     CPI    NOMAKE
  179.     JNZ    RDLOOP
  180.     CALL    EXIT
  181.     DB    BELL
  182.     DB    '++CANNOT CREATE FILE ON DESTINATION DISK++$'
  183. ;
  184. ;READ A SECTOR FROM SMALL DISK
  185. ;
  186. RDLOOP:    EQU    $
  187. ;
  188.     IF    REPORT
  189.     CALL    ILPRT    ;PRINT:
  190.     DB    TAB,'Reading sector from source disk',0
  191.     ENDIF        ;REPORT
  192. ;
  193.     LXI    D,80H
  194.     MVI    C,STDMA    ;SET DMA TO 80H
  195.     CALL    BDOS
  196.     LXI    D,FCB
  197.     MVI    C,READ    ;READ A RECORD
  198.     CALL    BDOS
  199.     CPI    NOERR
  200.     JZ    WRLOOP    ;NO ERROR, GO WRITE SECTOR
  201.     CPI    EOF
  202.     JZ    TDONE    ;END OF FILE, GO CLOSE IT
  203.     CALL    EXIT
  204.     DB    BELL
  205.     DB    '++READ ERROR ON SOURCE DISK++$'
  206. ;
  207. ;WRITE A SECTOR TO BIG DISK
  208. ;
  209. WRLOOP:    EQU    $
  210. ;
  211.     IF    REPORT
  212.     CALL    ILPRT    ;PRINT:
  213.     DB    TAB,'Writing sector to destination disk',0
  214.     ENDIF        ;REPORT
  215. ;
  216.     LXI    D,80H
  217.     MVI    C,STDMA        ;SET DMA TO 80H
  218.     CALL    DEST$BDOS
  219.     LXI    D,NEWFCB
  220.     MVI    C,WRITE        ;WRITE A RECORD
  221.     CALL    DEST$BDOS
  222.     CPI    NOERR
  223.     JZ    RDLOOP
  224.     CALL    EXIT
  225.     DB    BELL
  226.     DB    '++WRITE ERROR ON DESTINATION DISK++$'
  227. ;
  228. TDONE:    CALL    ILPRT    ;PRINT:
  229.     DB    'Closing file on destination disk now',0
  230.     LXI    D,NEWFCB
  231.     MVI    C,CLOSE        ;CLOSE DESTINATION FILE
  232.     CALL    DEST$BDOS
  233.     CPI    BDCLOS
  234.     JNZ    MORE        ;ANOTHER FILE?
  235.     CALL    EXIT
  236.     DB    BELL
  237.     DB    '++BAD CLOSE ON DESTINATION DISK++$'
  238. ;
  239. ;PRINT MESSAGE THEN EXIT TO CP/M WARM BOOT
  240. ;
  241. EXIT:    POP    D
  242.     MVI    C,PRINT
  243.     CALL    BDOS
  244.     JMP    WBOOT
  245. ;
  246. ;INLINE PRINT ROUTINE
  247. ;
  248. ILPRT    XTHL        ;SAVE HL, GET MSG
  249. ;
  250. ILPLP    MOV    A,M    ;GET CHAR
  251.     CALL    TYPE    ;OUTPUT IT
  252.     INX    H    ;POINT TO NEXT
  253.     MOV    A,M    ;TEST
  254.     ORA    A    ;..FOR END
  255.     JNZ    ILPLP
  256.     MVI    A,CR    ;CARRIAGE RETURN
  257.     CALL    TYPE
  258.     MVI    A,LF    ;LINE FEED
  259.     CALL    TYPE
  260.     XTHL        ;RESTORE HL, RET ADDR
  261.     RET        ;RET PAST MSG
  262. ;
  263. TYPE    PUSH    B
  264.     PUSH    D
  265.     PUSH    H
  266.     MOV    E,A    ;CHAR TO E FOR CP/M
  267.     MVI    C,WRCON    ;WRITE TO CONSOLE
  268.     CALL    BDOS
  269.     POP    H
  270.     POP    D
  271.     POP    B
  272.     RET
  273. ;
  274. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  275. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  276. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  277. ;TIME IT IS CALLED. CARRY IS SET IF NO MORE NAMES
  278. ;CAN BE FOUND. THE ROUTINE IS COMMENTED IN PSEUDO
  279. ;CODE, EACH PSEUDO CODE STATEMENT IS IN <<...>>
  280. ;
  281. MFNAME:    ;<<INIT DMA ADDR, FCB>>
  282.     MVI    C,STDMA
  283.     LXI    D,80H
  284.     CALL    BDOS
  285.     XRA    A
  286.     STA    FCBEXT
  287.     STA    FCBRNO
  288. ;<<IF FIRST TIME>>
  289.     LDA    MFFLG1
  290.     ORA    A
  291.     JZ    MFN01
  292. ;<<SAVE THE REQUESTED NAME>>
  293. ;SAVE ORIG REQ
  294.     LXI    H,FCB
  295.     LXI    D,MFREQ
  296.     MVI    B,12
  297.     CALL    MOVER
  298.     LDA    FCB
  299.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  300. ;<<SRCHF REQ NAME>>
  301.     LXI    H,MFREQ
  302.     LXI    D,FCB
  303.     MVI    B,12
  304.     CALL    MOVER
  305.     MVI    C,SRCHF
  306.     LXI    D,FCB
  307.     CALL    BDOS
  308. ;<<ELSE>>
  309.     JMP    MFN02
  310. ;
  311. MFN01:    ;<<SRCHF CURR NAME>>
  312.     LXI    H,MFCUR
  313.     LXI    D,FCB
  314.     MVI    B,12
  315.     CALL    MOVER
  316.     MVI    C,SRCHF
  317.     LXI    D,FCB
  318.     CALL    BDOS
  319. ;<<SRCHN REQ NAME>>
  320.     LXI    H,MFREQ
  321.     LXI    D,FCB
  322.     MVI    B,12
  323.     CALL    MOVER
  324.     MVI    C,SRCHN
  325.     LXI    D,FCB
  326.     CALL    BDOS
  327. ;<<ENDIF>>
  328. MFN02:    ;<<RETURN CARRY IF NOT FOUND>>
  329.     INR    A
  330.     STC
  331.     RZ
  332. ;<<MOVE NAME FOUND TO CURR>>
  333.     DCR    A
  334.     ANI    3
  335.     ADD    A
  336.     ADD    A
  337.     ADD    A
  338.     ADD    A
  339.     ADD    A
  340.     ADI    81H
  341.     MOV    L,A
  342.     MVI    H,0
  343.     PUSH    H    ;SAVE NAME POINTER
  344.     LXI    D,MFCUR+1
  345.     MVI    B,11
  346.     CALL    MOVER
  347. ;<<MOVE NAME FOUND TO FCB>>
  348.     POP    H
  349.     LXI    D,FCB+1
  350.     MVI    B,11
  351.     CALL    MOVER
  352. ;<<SETUP FCB>>
  353.     XRA    A
  354.     STA    FCBEXT
  355.     STA    FCBRNO
  356.     STA    NEWFCB
  357.     STA    NEWFCB+12
  358.     STA    NEWFCB+32
  359.     STA    MFFLG1    ;TURN OFF 1ST TIME SW
  360. ;<<RETURN>>
  361.     RET
  362. ;------------------------------------------------
  363. ;
  364. ;MOVE SUBROUTINE  MOVE (B) BYTES FROM (HL) TO (DE)
  365. ;
  366. MOVER    MOV    A,M
  367.     ANI    7FH    ;STRIP CP/M 2.x ATTRIBUTES
  368.     STAX    D
  369.     INX    H
  370.     INX    D
  371.     DCR    B
  372.     JNZ    MOVER
  373.     RET
  374. ;
  375. ;MULTI-FILE ACCESS WORK AREA
  376. ;
  377. MFFLG1    DB    1    ;1ST TIME SW
  378. MFREQ    DS    12    ;REQ NAME
  379. MFCUR    DS    12    ;CURR NAME
  380. ;
  381. NEWFCB    DS    33
  382. STACK    EQU    $+100
  383. ;
  384.     END
  385.