home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol074 / bckup.asm < prev    next >
Encoding:
Assembly Source File  |  1985-02-10  |  5.5 KB  |  344 lines

  1. ;    BACKUP - DISK BACKUP UTILITY FOR CP/M
  2. ;
  3.     ORG    0100H
  4.     JMP    BACKUP
  5. ;
  6. SINGLE    EQU    1
  7. ;
  8. ;    ONE OF THE FOLLOWING LINES SHOULD BE COMMENTED OUT
  9. ;
  10. DRIVES    DB    1        ;SINGLE DRIVE VERSION
  11. ;DRIVES    DB    2        ;MULTI DRIVE VERSION
  12. ;
  13.     DB    '(C) 1980 - N D H HAMMOND'
  14. PRGNAME    DB    'BACKUP VSN 1.1 OF 20JUL80',0DH,0AH,'$'
  15. ;
  16. ;    VSN 1.0 12JAN80
  17. ;    VSN 1.1 MODIFIED FOR DUAL DRIVE OPTION
  18. ;
  19. ;
  20.     ;CONSTANTS
  21. TRUE    EQU    0FFH
  22. LF    EQU    0AH
  23. CR    EQU    0DH
  24. EOM    EQU    '$'
  25. ;
  26.     ;SYSTEM VALUES
  27. BOOT    EQU    0000H        ;REBOOT ADDRESS
  28. FSIZE    EQU    TRUE        ;8IN DISK
  29. MINI    EQU    NOT(FSIZE)    ;5IN DISK
  30.     IF    FSIZE
  31. NSCTRS    EQU    1AH        ;SECTRS PER TRK 
  32. NTRKS    EQU    4DH        ;TRACKS PER DISK
  33.     ENDIF
  34.     IF    MINI
  35. NSCTRS    EQU    12H
  36. NTRKS    EQU    23H
  37.     ENDIF
  38. ;
  39. ;    MAIN PROGRAM
  40. ;
  41. BACKUP    LXI    SP,STACK
  42.     LXI    D,PRGNAME
  43.     CALL    WRITESTRING
  44. COPYLP    LDA    DRIVES
  45.     CPI    SINGLE
  46.     JZ    SDRV
  47.     LXI    D,DRVMSG
  48.     CALL    WRITESTRING
  49.     CALL    WAIT
  50. SDRV    CALL    INITVAR
  51.     CALL    HOME
  52. REPEAT    CALL    SOURCEDISK
  53.     CALL    LOADBUF
  54.     CALL    DESTDISK
  55.     CALL    DUMPBUF
  56.     LDA    FINISH
  57.     CPI    TRUE
  58.     JNZ    REPEAT
  59.     LXI    D,TERMSG
  60.     CALL    WRITESTRING
  61. ENDCOPY    CALL    CHKMORE
  62.     LDA    MULTI
  63.     CPI    TRUE
  64.     JZ    COPYLP
  65.     CALL    HOME
  66.     JMP    BOOT
  67. ;
  68. ;    SUBROUTINBS
  69. ;
  70. INITVAR        ;INITIALIZE VARIABLES
  71.     XRA    A
  72.     STA    FINISH    ;FINISH:=Fâ”´LSE
  73.     STA    TRK    ;TRK:=0
  74.     INR    A
  75.     STA    SEC    ;SEC:=1
  76.     LHLD    BOOT+1
  77.     MVI    L,0
  78.     SHLD    EXTENT    ;EXTENT:=^CBIOS
  79.     RET
  80. ;
  81. ;
  82. LOADBUF        ;LOAD BUFFER FROM SOURCE DISK
  83.     LDA    TRK        ;SAVE TRK AND SEC
  84.     STA    TRKSAVE
  85.     LDA    SEC
  86.     STA    SECSAVE
  87.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  88.     SHLD    BUFFPT
  89. LOADLP    PUSH    H
  90.     POP    B
  91.     CALL    SETDMA        ;SETUP FOR READ
  92.     LDA    TRK
  93.     MOV    C,A
  94.     CALL    SETTRK
  95.     LDA    SEC
  96.     MOV    C,A
  97.     CALL    SETSEC
  98.     CALL    READ
  99.     JNZ    READERR
  100.     CALL    INCTS        ;UPDATE TRK & SEC
  101.     RZ            ;LAST TRACK READ
  102.     LHLD    BUFFPT        ;UPDATE BUFFPT
  103.     LXI    B,80H
  104.     DAD    B
  105.     SHLD    BUFFPT
  106.     LXI    B,EXTENT
  107.     CALL    COMPARE        ;CHECK FOR FULL BUFFER
  108.     JNZ    LOADLP
  109.     RET
  110. ;
  111. ;
  112. DUMPBUF        ;DUMP BUFFER TO DEST DISK
  113.     LDA    TRKSAVE        ;RESTORE TRK & SEC
  114.     STA    TRK
  115.     LDA    SECSAVE
  116.     STA    SEC
  117.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  118.     SHLD    BUFFPT
  119. DUMPLP    PUSH    H
  120.     POP    B
  121.     CALL    SETDMA        ;SETUP FOR WRITE
  122.     LDA    TRK
  123.     MOV    C,A
  124.     CALL    SETTRK
  125.     LDA    SEC
  126.     MOV    C,A
  127.     CALL    SETSEC
  128.     CALL    WRITE
  129.     JNZ    WRITERR
  130.     CALL    INCTS        ;UPDATE TRK & SeC
  131.     JNZ    DMPMORE
  132.     MVI    A,TRUE        ;LAST TRACK WRITTEN
  133.     STA    FINISH
  134.     RET
  135. DMPMORE    LHLD    BUFFPT        ;UPDATE BUFFPT
  136.     LXI    B,80H
  137.     DAD    B
  138.     SHLD    BUFFPT
  139.     LXI    B,EXTENT
  140.     CALL    COMPARE        ;CHECK FOR FULL BUFFER
  141.     JNZ    DUMPLP
  142.     RET
  143. ;
  144. ;
  145. CHKMORE        ;CHECK FOR ANOTHER DISK
  146.     MVI    A,TRUE
  147.     STA    MULTI
  148.     CALL    CONIN
  149.     CPI    'Y'
  150.     RZ
  151.     CPI    'Y'+20H
  152.     RZ
  153.     ;IF NOT, REBOOT CP/M
  154.     XRA    A
  155.     STA    MULTI
  156.     LXI    D,RBMSG
  157.     CALL    WRITESTRING
  158.     CALL    WAIT
  159.     RET
  160. ;
  161. ;
  162. COMPARE        ;COMPARE BC^ AND HL - SET FLAGS
  163.     INX    B
  164.     LDAX    B
  165.     DCX    B
  166.     CMP    H
  167.     RNZ
  168.     LDAX    B
  169.     CMP    L
  170.     RET
  171. ;
  172. ;
  173. SOURCEDISK    ;SELECT OR PROMPT FOR SOURCE DISK
  174.     LDA    DRIVES
  175.     CPI    SINGLE
  176.     JZ    SDPROMPT
  177.     MVI    C,1
  178.     CALL    SELDRV
  179.     RET
  180. SDPROMPT    ;ADVISE OPERATOR, WAIT FOR RESPONSE,
  181.     LXI    D,SDMSG
  182.     CALL    WRITESTRING
  183.     CALL    WAIT
  184.     RET
  185. ;
  186. ;
  187. DESTDISK    ;SELECT OR PROMPT FOR DEST DISK
  188.     LDA    DRIVES
  189.     CPI    SINGLE
  190.     JZ    DDPROMPT
  191.     MVI    C,0
  192.     CALL    SELDRV
  193.     RET
  194. DDPROMPT    ;ADVISE OPERATOR, WAIT FOR RESPONSE,
  195.     LXI    D,DDMSG
  196.     CALL    WRITESTRING
  197.     CALL    WAIT
  198.     RET
  199. ;
  200. ;
  201. WAIT        ;WAIT FOR OPERATOR TO TYPE RETURN
  202.     CALL    CONIN
  203.     CPI    03H
  204.     JZ    BOOT
  205.     CPI    CR
  206.     JNZ    WAIT
  207.     RET
  208. ;
  209. ;
  210. WRITESTRING    ;WRITE STRING AT DE^ ON CONSOLE
  211.     LDAX    D
  212.     INX    D
  213.     CPI    EOM
  214.     RZ
  215.     PUSH    D
  216.     MOV    C,A
  217.     CALL    CONOUT
  218.     POP    D
  219.     JMP    WRITESTRING
  220. ;
  221. ;
  222. INCTS    ;INCREMENT TRACK AND SECTOR ADDRESS
  223.     ;RETURN WITH Z RESET IF ADDRESS VALID
  224.     LDA    SEC
  225.     INR    A
  226.     CPI    NSCTRS+1
  227.     JZ    NEWTRK
  228.     STA    SEC
  229.     RET
  230. NEWTRK    MVI    A,1
  231.     STA    SEC
  232.     LDA    TRK
  233.     INR    A
  234.     CPI    NTRKS
  235.     RZ            ;PAST LAST TRACK
  236.     STA    TRK
  237.     RET
  238. ;
  239. ;
  240. READERR    ;DISK ERROR ON READ
  241.     LXI    SP,STACK
  242.     LXI    D,REMSG
  243.     CALL    WRITESTRING
  244.     JMP    ENDCOPY
  245. ;
  246. ;
  247. WRITERR    ;DISK ERROR ON WRITE
  248.     LXI    SP,STACK
  249.     LXI    D,WEMSG
  250.     CALL    WRITESTRING
  251.     JMP    ENDCOPY
  252. ;
  253. ;    I/O ROUTINES
  254. ;
  255. ;    WARNING - THESE ARE LOW LEVEL ROUTINES
  256. ;    WHICH DIRECTLY ACCESS THE CP/M CBIOS.  THEY
  257. ;    MAY REQUIRE MODIFICATION WITH NON STANDARD
  258. ;    SYSTEMS.
  259. ;
  260. ;
  261. CONIN    ;READ CHAR FROM CONSOLE (A-REG)
  262.     LHLD    BOOT+1
  263.     MVI    L,09H
  264.     PCHL
  265. ;
  266. ;
  267. CONOUT    ;WRITE CHAR TO CONSOLE (C-REG)
  268.     LHLD    BOOT+1
  269.     MVI    L,0CH
  270.     PCHL
  271. ;
  272. ;
  273. HOME    ;HOME DISK TO TRACK 00
  274.     LHLD    BOOT+1
  275.     MVI    L,18H
  276.     PCHL
  277. ;
  278. ;
  279. SELDRV    ;SET DRIVE (C-REG)
  280.     LHLD    BOOT+1
  281.     MVI    L,1BH
  282.     PCHL
  283. ;
  284. ;
  285. SETTRK    ;SET TRACK (C-REG)
  286.     LHLD    BOOT+1
  287.     MVI    L,1EH
  288.     PCHL
  289. ;
  290. ;
  291. SETSEC    ;SET SECTOR (C-REG)
  292.     LHLD    BOOT+1
  293.     MVI    L,21H
  294.     PCHL
  295. ;
  296. ;
  297. SETDMA    ;SET TRANSFER ADDRESS (BC-REG)
  298.     LHLD    BOOT+1
  299.     MVI    L,24H
  300.     PCHL
  301. ;
  302. ;
  303. READ    ;READ SECTOR TO DMA ADDRESS
  304.     LHLD    BOOT+1
  305.     MVI    L,27H
  306.     PCHL
  307. ;
  308. ;
  309. WRITE    ;WRITE A SECTOR FROM DMA ADDRESS
  310.     LHLD    BOOT+1
  311.     MVI    L,2AH
  312.     PCHL
  313. ;
  314. ;
  315. ;    DATA AREA
  316. ;
  317. EXTENT    DS    2    ;EXTENT OF COPY BUFFER
  318. MULTI    DS    1    ;MULTIPLE COPY MODE FLAG
  319. BUFFPT    DS    2    ;BUFFER POINTER
  320. FINISH    DS    1    ;LAST BUFFER FLAG
  321. TRK    DS    1    ;CURRENT TRACK
  322. SEC    DS    1    ;CURRENT SECTOR
  323. TRKSAVE    DS    1    ;TRACK TO START DUMP
  324. SECSAVE    DS    1    ;SECTOR TO START DUMP
  325. DRVMSG    DB    'INSERT SOURCE DISK IN DRIVE B'
  326.     DB    ' AND BACKUP DISK IN DRIVE A',CR,LF
  327.     DB    '<CR> TO CONTINUE',CR,LF,EOM
  328. SDMSG    DB    CR,LF
  329.     DB    'INSERT SOURCE DISK, <CR> TO CONTINUE'
  330.     DB    CR,LF,EOM
  331. DDMSG    DB    'INSERT DEST DISK, <CR> TO CONTINUE'
  332.     DB    CR,LF,EOM
  333. TERMSG    DB    'COPY COMPLETE',CR,LF
  334.     DB    'ANY MORE DISKS TO BACKUP?',CR,LF,EOM
  335. RBMSG    DB    CR,LF,'<CR> TO REBOOT CP/M',CR,LF,EOM
  336. REMSG    DB    'READ ERROR ON DRIVE A',CR,LF,EOM
  337. WEMSG    DB    'WRITE ERROR ON DRIVE B',CR,LF,EOM
  338.     DS    20H    ;MINIMUM STACK SPACE
  339.     ;SET START OF BUFFER TO MULTIPLE OF SECTOR SIZE
  340.     ORG    (($ + 7FH) / 80H) * 80H
  341. STACK    EQU    $    ;GROWS DOWN
  342. BUFFER    EQU    $    ;FILLS REST OF MEMORY TO CBIOS
  343.     END
  344.