home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv074.ark / RESTORE.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  4.5 KB  |  269 lines

  1. ;    RESTORE - RECOVER ERASED FILES
  2. ;
  3.     ORG    0100H
  4.     JMP    RESTORE
  5.     DB    '(C) 1980 - N D H HAMMOND'
  6. PRGNAME    DB    'RESTORE V1.1 OF 21APR80'
  7.     DB    0DH,0AH,'$'
  8. ;
  9. ;    DEFINITIONS
  10. ;
  11. BOOT    EQU    0000H        ;CP/M BOOT VECTOR
  12. CBIOS    EQU    BOOT+1        ;^CBIOS
  13. ENTRY    EQU    0005H        ;CP/M FDOS ENTRY
  14. FCB    EQU    005CH        ;DEFAULT FCB
  15. NAME2    EQU    006DH        ;POSN OF 2ND 'FILENAME'
  16. FNAME    EQU    FCB+1        ;NAME FIELD
  17. DIRTRK    EQU    2        ;DIRECTORY TRACK NO
  18. NDIRSEC    EQU    16        ;NO OF DIR SECTORS
  19. NDIRENT    EQU    64        ;MAX NO OF DIR ENTRIES
  20. ENTLGTH    EQU    32        ;ENTRY LGTH IN BYTES
  21. NLGTH    EQU    8        ;NAME FIELD LGTH
  22. TLGTH    EQU    3        ;TYPE FIELD LGTH
  23. FNLGTH    EQU    NLGTH+TLGTH    ;LENGTH OF FILENAME
  24. DELCHR    EQU    0E5H        ;DELETED DATA CHAR
  25. VALCHAR    EQU    00H        ;VALID DATA CHAR
  26. ;
  27. ;    MAIN PROGRAM
  28. ;
  29. RESTORE    LXI    H,0        ;SAVE SYSTEM SP
  30.     DAD    SP
  31.     SHLD    OLDSP
  32.     LXI    SP,STACK
  33.     LXI    D,PRGNAME    ;PRINT SIGNON MSG
  34.     CALL    WRITESTRING
  35.     CALL    CHKEXT
  36.     CALL    GETDISK
  37.     CALL    READDIR
  38.     CALL    REST
  39.     JC    EXIT
  40.     CALL    WRITEDIR
  41.     CALL    INITBDOS
  42.     LXI    D,TERMMSG
  43.     CALL    WRITESTRING
  44. EXIT    LHLD    OLDSP        ;RESTORE SYSTEM SP
  45.     SPHL
  46.     RET            ;RETURN TO CP/M
  47. ;
  48. ;    SUBROUTINES
  49. ;
  50. CHKEXT        ;CHECK FOR FILE EXTENSION
  51.     XRA    A
  52.     STA    EXTNO
  53.     LDA    NAME2+1
  54.     CPI    ' '
  55.     JNZ    INVEXT
  56.     LDA    NAME2
  57.     CPI    ' '
  58.     RZ        ;EMPTY, EXT:=0
  59.     CPI    '0'
  60.     JC    INVEXT
  61.     CPI    '9'+1
  62.     JC    NUM
  63.     CPI    'A'
  64.     JC    INVEXT
  65.     CPI    'F'+1
  66.     JNC    INVEXT
  67.     SUI    'A'-10    ;CONVERT 'A'..'F'
  68.     STA    EXTNO
  69.     RET
  70. NUM    SUI    '0'    ;CONVERT '0'..'9'
  71.     STA    EXTNO
  72.     RET
  73. INVEXT    LXI    D,IEMSG
  74.     CALL    WRITESTRING
  75.     JMP    EXIT
  76. ;
  77. ;
  78. GETDISK        ;PROMPT OPERATOR FOR DISK
  79.     LXI    D,DSKMSG
  80.     CALL    WRITESTRING
  81. GET1    CALL    READCHAR
  82.     CPI    0DH        ;<CR> ?
  83.     RZ
  84.     CPI    03H        ;<^C> ?
  85.     JZ    BOOT
  86.     JMP    GET1
  87. ;
  88. ;
  89. READDIR    ;READ DISK DIRECTORY INTO BUFFER
  90.     MVI    C,DIRTRK    ;SET TRACK NO
  91.     CALL    SETTRK
  92.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  93.     SHLD    BUFFPT
  94.     XRA    A        ;INITIALIZE SECTOR
  95.     STA    SECTOR
  96. READLP    CALL    NEXTSEC        ;SET SECTOR NO
  97.     LHLD    BUFFPT    ;SET DMA ADDRESS
  98.     MOV    B,H
  99.     MOV    C,L
  100.     CALL    SETDMA
  101.     CALL    READ        ;READ SECTOR
  102.     LHLD    BUFFPT    ;UPDATE DMA ADDRESS
  103.     LXI    D,80H
  104.     DAD    D
  105.     SHLD    BUFFPT
  106.     LDA    SECTOR    ;UPDATE SECTOR
  107.     INR    A
  108.     STA    SECTOR
  109.     CPI    NDIRSEC
  110.     JNZ    READLP
  111.     RET
  112. ;
  113. ;
  114. WRITEDIR    ;WRITE DISK DIRECTORY FROM BUFFER
  115.     MVI    C,DIRTRK    ;SET TRACK NO
  116.     CALL    SETTRK
  117.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  118.     SHLD    BUFFPT
  119.     XRA    A        ;INITIALIZE SECTOR
  120.     STA    SECTOR
  121. WRITELP    CALL    NEXTSEC        ;SET SECTOR NO
  122.     LHLD    BUFFPT    ;SET DMA ADDRESS
  123.     MOV    B,H
  124.     MOV    C,L
  125.     CALL    SETDMA
  126.     CALL    WRITE        ;WRITE SECTOR
  127.     LHLD    BUFFPT    ;UPDATE DMA ADDRESS
  128.     LXI    D,80H
  129.     DAD    D
  130.     SHLD    BUFFPT
  131.     LDA    SECTOR    ;UPDATE SECTOR
  132.     INR    A
  133.     STA    SECTOR
  134.     CPI    NDIRSEC
  135.     JNZ    WRITELP
  136.     RET
  137. ;
  138. ;
  139. NEXTSEC    ;SET SECTOR NO TO NEXT DIRECTORY SECTOR
  140.     ;MAPS SEQUENTIAL NO IN REG-A TO PHYSICAL
  141.     ;SECTOR ON DISK.
  142.     LXI    H,SEGTABLE
  143.     MVI    B,0
  144.     MOV    C,A
  145.     DAD    B
  146.     MOV    C,M
  147.     CALL    SETSEC
  148.     RET
  149. ;
  150. SEGTABLE
  151.     DB    01H,07H,0DH,13H
  152.     DB    19H,05H,0BH,11H
  153.     DB    17H,03H,09H,0FH
  154.     DB    15H,02H,08H,0EH
  155. ;
  156. ;
  157. REST    ;FIND AND RESTORE FILE
  158.     ;RETURNS CY:=FILE NOT FOUND
  159.     MVI    D,NDIRENT
  160.     LXI    H,BUFFER
  161. RESTLP    MOV    A,M        ;CHECK FOR ERASED FILE
  162.     CPI    DELCHR
  163.     PUSH    H
  164.     PUSH    D
  165.     CZ    COMPARE
  166.     POP    D
  167.     POP    H
  168.     JZ    FOUND
  169.     LXI    B,ENTLGTH    ;STEP TO NEXT ENTRY
  170.     DAD    B
  171.     DCR    D
  172.     JNZ    RESTLP
  173.     LXI    D,NFMSG
  174.     CALL    WRITESTRING
  175.     STC            ;SET CARRY
  176.     RET
  177. FOUND    MVI    M,VALCHAR
  178.     ORA    A        ;CLEAR CARRY
  179.     RET
  180. ;
  181. ;
  182. COMPARE    ;COMPARE FILE NAMES AT M+1^ AND FNAME
  183.     ;RETURN Z:=MATCH
  184.     INX    H
  185.     LXI    D,FNAME
  186.     MVI    B,FNLGTH
  187. COMPLP    LDAX    D
  188.     CMP    M
  189.     JNZ    ENDCOMP
  190.     INX    D
  191.     INX    H
  192.     DCR    B
  193.     JNZ    COMPLP
  194.     LDA    EXTNO        ;GET EXTENT NO
  195.     CMP    M        ;CHECK AGAINST ENTRY
  196. ENDCOMP    RET
  197. ;
  198. ;    I/O ROUTINES
  199. ;
  200. WRITESTRING    ;WRITE STRING TO CONSOLE
  201.     MVI    C,9
  202.     JMP    ENTRY
  203. ;
  204. ;
  205. READCHAR    ;READ CHAR FROM KEYBOARD
  206.     MVI    C,1
  207.     JMP    ENTRY
  208. ;
  209. ;
  210. INITBDOS    ;INITIALIZE BDOS, LOG IN DRIVE A
  211.     MVI    C,13
  212.     JMP    ENTRY
  213. ;
  214. ;
  215. ;    WARNING - THESE LOW LEVEL DISK I/O ROUTINES
  216. ;    ACCESS THE CP/M CBIOS DIRECTLY.  THEY MAY
  217. ;    NEED MODIFICATION WITH NON STANDARD SYSTEMS.
  218. ;
  219. ;
  220. SETTRK    ;SET TRACK (C-REG)
  221.     LHLD    CBIOS
  222.     MVI    L,1EH
  223.     PCHL
  224. ;
  225. ;
  226. SETSEC    ;SET SECTOR (C-REG)
  227.     LHLD    CBIOS
  228.     MVI    L,21H
  229.     PCHL
  230. ;
  231. ;
  232. SETDMA    ;SET TRANSFER ADDRESS (BC-REG)
  233.     LHLD    CBIOS
  234.     MVI    L,24H
  235.     PCHL
  236. ;
  237. ;
  238. READ    ;READ A SECTOR
  239.     LHLD    CBIOS
  240.     MVI    L,27H
  241.     PCHL
  242. ;
  243. ;
  244. WRITE    ;WRITE A SECTOR
  245.     LHLD    CBIOS
  246.     MVI    L,2AH
  247.     PCHL
  248. ;
  249. ;
  250. ;    DATA AREA
  251. ;
  252. DSKMSG    DB    'INSERT DISK, <CR> TO CONTINUE'
  253.     DB    0AH,0DH,'$'
  254. IEMSG    DB    'INVALID EXTENT - USE 1 HEX DIGIT'
  255.     DB    0AH,0DH,'$'
  256. TERMMSG    DB    'FUNCTION COMPLETE'
  257.     DB    0DH,0AH,'$'
  258. NFMSG    DB    'FILE NOT FOUND'
  259.     DB    0DH,0AH,'$'
  260. OLDSP    DS    2    ;SYSTEM STACK POINTER
  261. SECTOR    DS    1    ;CURRENT SECTOR SEQUENCE NO
  262. EXTNO    DS    1    ;REQUIRED EXTENT NO
  263. BUFFPT    DS    2    ;BUFFER POINTER
  264.     DS    20H    ;STACK SPACE
  265. STACK    EQU    $    ;GROWS DOWN
  266. BUFFER    EQU    $    ;GROWS UP
  267. ;
  268.     END
  269.