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 / DIRUTL / REC22A.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  4KB  |  297 lines

  1. ;Recovery program to reinstate deleted disk files
  2. ;Copyright (C) David R Back 1982
  3. ;requires CP/M2.2
  4. ;SYNTAX: rec22 [ambiguous]filename.ext
  5. ;
  6. ;REC22A.ASM created 11/15/84 by Keith Petersen, W8SDZ.  No
  7. ;changes made other than reformatting file to make reading
  8. ;code easier.  The original had only a single space between
  9. ;columns and was all lower case.
  10. ;
  11. BDOS    EQU    5
  12. CR    EQU    0DH
  13. LF    EQU    0AH
  14. ;
  15.     ORG    100H
  16. ;
  17. BEGIN:    JMP    START
  18.     DB    'COPYRIGHT (C) DAVID R BACK 1982'
  19. ;
  20. START:    LXI    H,0
  21.     DAD    SP
  22.     SHLD    USERSP
  23.     LXI    SP,USERSP
  24.     LDA    5DH        ;test for blank filename
  25.     CPI    ' '
  26.     LXI    D,BLKFIL
  27.     JZ    BLKER
  28.     MVI    C,9
  29.     LXI    D,SIGNON
  30.     CALL    BDOS        ;signon message
  31.     MVI    C,12
  32.     CALL    BDOS        ;get version
  33.     MOV    A,L
  34.     CPI    20H
  35.     LXI    D,BDSEL
  36.     JC    BLKER
  37.     MVI    C,25        ;get current disk
  38.     CALL    BDOS
  39.     STA    DISK        ;save default
  40.     MOV    C,A
  41.     LXI    D,5CH
  42.     LDAX    D        ;required drive
  43.     ORA    A
  44.     MOV    E,C
  45.     JZ    SETALL
  46.     DCR    A
  47.     MOV    E,A
  48. ;
  49. SETALL:    PUSH    D
  50.     MVI    C,14        ;select disk
  51.     CALL    BDOS        ;make sure drive has been selected
  52.     POP    B
  53.     LXI    D,1        ;already selected
  54.     CALL    SELDSK        ;get .dphd
  55.     LXI    D,8
  56.     DAD    D
  57.     MOV    E,M
  58.     INX    H
  59.     MOV    D,M        ;DE=.DIRBUF
  60.     MOV    L,E
  61.     MOV    H,D
  62.     SHLD    DBUF        ;save .DIRBUF
  63.     MVI    C,26        ;setdma
  64.     CALL    BDOS
  65.     MVI    C,32
  66.     MVI    E,0FFH        ;get user
  67.     CALL    BDOS
  68.     STA    US        ;save current user
  69.     MVI    C,32        ;set user
  70.     MVI    E,5        ;user 5
  71.     CALL    BDOS
  72.     LXI    D,5CH
  73.     MVI    A,'?'
  74.     STAX    D
  75.     MVI    C,17        ;sfirst
  76. ;
  77. LOOP:    CALL    BDOS
  78.     CPI    0FFH
  79.     JZ    EXIT
  80.     ADD    A
  81.     ADD    A
  82.     ADD    A
  83.     ADD    A
  84.     ADD    A
  85.     MOV    C,A
  86.     MVI    B,0
  87.     LHLD    DBUF        ;dirbuf
  88.     DAD    B
  89.     PUSH    H
  90.     MVI    C,11        ;ignore ext
  91.     LXI    D,5CH
  92.     CALL    COMP        ;compare with fcb
  93.     POP    H
  94.     RAR
  95.     JC    NXT
  96.     MOV    A,M
  97.     CPI    0E5H        ;recover only deleted files
  98.     JNZ    NXT
  99.     PUSH    H
  100.     PUSH    H
  101.     MOV    A,M
  102.     MVI    B,11
  103.     INX    H
  104. ;
  105. NAMOUT:    MOV    A,M
  106.     CALL    CNVRT        ;convert to printing chars
  107.     CALL    OPCHR        ;o/p char to co
  108.     DCR    B
  109.     INX    H
  110.     JNZ    NAMOUT
  111.     CALL    CRLF
  112.     MVI    B,32
  113.     POP    H
  114. ;
  115. FCBOUT:    MOV    A,B
  116.     ANI    3
  117.     CZ    WRSPC        ;o/p space to co
  118.     MOV    A,M
  119.     CALL    BINASC        ;binary to hex ascii
  120.     INX    H
  121.     DCR    B
  122.     JNZ    FCBOUT
  123.     CALL    CRLF
  124.     LXI    D,RECO
  125.     CALL    PSTR        ;printstring
  126.     CALL    CI
  127.     POP    H
  128.     CPI    3        ;^C exit
  129.     JZ    EXIT
  130.     CPI    'Y'
  131.     JZ    REC
  132.     CPI    'y'
  133.     JNZ    NXT
  134. ;
  135. REC:    MVI    M,0        ;recover file to user 0
  136.     MVI    C,12
  137.     CALL    RESET        ;reset attributes of recovered file
  138.     MVI    C,1        ;directory write
  139.     CALL    WRITE        ;write dir sector to disk
  140.     ORA    A
  141.     JNZ    WRERR
  142. ;
  143. NXT:    LXI    D,5CH
  144.     MVI    A,0E0H
  145.     STAX    D
  146.     MVI    C,18        ;snext
  147.     JMP    LOOP
  148. ;
  149. BLKER:    MVI    C,9
  150.     CALL    BDOS
  151.     JMP    EXIT1
  152. ;
  153. WRERR:    LXI    D,ERMSG
  154. ;
  155. WRERR1:    MVI    C,9
  156.     CALL    BDOS
  157. ;
  158. EXIT:    MVI    C,13        ;reset system
  159.     CALL    BDOS
  160.     LDA    DISK
  161.     MOV    E,A
  162.     MVI    C,14
  163.     CALL    BDOS        ;reset original drive
  164.     MVI    C,32        ;reselect original user
  165.     LDA    US
  166.     MOV    E,A
  167.     CALL    BDOS
  168. ;
  169. EXIT1:    LHLD    USERSP
  170.     SPHL
  171.     RET            ;to ccp
  172. ;
  173. COMP:    INX    D
  174.     INX    H        ;dont compare drives
  175. ;
  176. COMPR1:    LDAX    D
  177.     ANI    7FH
  178.     CPI    '?'
  179.     JZ    COMPR2
  180.     MOV    B,A
  181.     MOV    A,M
  182.     ANI    7FH
  183.     CMP    B
  184.     JNZ    COMPF
  185. ;
  186. COMPR2:    INX    H
  187.     INX    D
  188.     DCR    C
  189.     JNZ    COMPR1
  190.     XRA    A
  191.     RET
  192. ;
  193. COMPF:    XRA    A
  194.     CMA
  195.     RET
  196. ;
  197. RESET:    MOV    A,M
  198.     ANI    7FH
  199.     MOV    M,A
  200.     INX    H
  201.     DCR    C
  202.     JNZ    RESET
  203.     RET
  204. ;
  205. PSTR:    LDAX    D
  206.     CPI    '$'
  207.     RZ
  208.     CALL    OPCHR
  209.     INX    D
  210.     JMP    PSTR
  211. ;
  212. OPCHR:    PUSH    B
  213.     PUSH    D
  214.     PUSH    H
  215.     MOV    C,A
  216.     CALL    CO
  217.     POP    H
  218.     POP    D
  219.     POP    B
  220.     RET
  221. ;
  222. CRLF:    MVI    A,CR
  223.     CALL    OPCHR
  224.     MVI    A,LF
  225.     CALL    OPCHR
  226.     RET
  227. ;
  228. WRSPC:    MVI    A,' '
  229.     CALL    OPCHR
  230.     RET
  231. ;
  232. HASC:    CPI    10
  233.     JC    HASC1
  234.     ADI    '7'
  235.     CALL    OPCHR
  236.     RET
  237. ;
  238. HASC1:    ADI    '0'
  239.     CALL    OPCHR
  240.     RET
  241. ;
  242. BINASC:    PUSH    PSW
  243.     RAR
  244.     RAR
  245.     RAR
  246.     RAR
  247.     ANI    0FH
  248.     CALL    HASC
  249.     POP    PSW
  250.     ANI    0FH
  251.     CALL    HASC
  252.     RET
  253. ;
  254. CNVRT:    CPI    ' '
  255.     JC    CNVRT1
  256.     CPI    61H
  257.     JNC    CNVRT1
  258.     RET
  259. ;
  260. CNVRT1:    MVI    A,'-'
  261.     RET
  262. ;
  263. CI:    LHLD    1
  264.     LXI    D,6        ;bios ci
  265.     DAD    D
  266.     PCHL
  267. ;
  268. CO:    LHLD    1
  269.     LXI    D,9        ;bios co
  270.     DAD    D
  271.     PCHL
  272. ;
  273. ;req C=drive 0,1...  lsb E=1
  274. SELDSK:    LHLD    1
  275.     LXI    D,24        ;bios seldsk
  276.     DAD    D
  277.     PCHL
  278. ;
  279. WRITE:    LHLD    1
  280.     LXI    D,39
  281.     DAD    D        ;bios write
  282.     PCHL
  283. ;
  284. BLKFIL:    DB    CR,LF,'NO FILE SPECIFIED',CR,LF,'$'
  285. BDSEL:    DB    CR,LF,'CP/M 2.0 or later is required.',CR,LF,'$'
  286. RECO:    DB    'RECOVER ?',CR,LF,'$'
  287. ERMSG:    DB    CR,LF,'DIRECTORY WRITE ERROR',CR,LF,'$'
  288. SIGNON:    DB    CR,LF,'Disk File Recover D.R.Back V2.2',CR,LF,'$'
  289. ;
  290.     DS    32        ;stack
  291. USERSP:    DS    2
  292. DISK:    DS    1        ;original default drive
  293. US:    DS    1        ;original user
  294. DBUF:    DS    2        ;dirbuf
  295. ;
  296. END    BEGIN
  297.