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 / CPMUG029.ARK / MOVENMAC.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  369 lines

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