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 / FROMHARD.AQM / FROMHARD.ASM
Assembly Source File  |  2000-06-30  |  8KB  |  373 lines

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