home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol044 / unera11.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.4 KB  |  401 lines

  1. ;    Program to recover Erased file
  2. ;
  3. ;    From Interface Age December 1981 pg 98+
  4. ;
  5. ;    I didn't type in ALL the comments, so be sure to read the article
  6. ;    and the printed program listing in the magazine
  7. ;
  8. ;
  9. ;    Proper credit given to original author:
  10. ;
  11. ;        Gene Cotton
  12. ;
  13. ;    All I did was to type this in from the magazine
  14. ;    Hopefully without added any typing errors
  15. ;
  16. ;    HBR Version 1.0 as of 11/17/81
  17. ;
  18. ;    Henry B. Rothberg
  19. ;    4 Laticrete Park North
  20. ;    Bethany, Ct 06525
  21. ;
  22. ;    VERSION 1.1 AS OF 11/19/81
  23. ;
  24. ;    ADDED CONDITIONAL EQUATES FOR CP/M 1.4 AND 2.2
  25. ;     AS WELL AS EQUATES FOR STANDARD CP/M AND MICROPOLIS
  26. ;     CP/M (DIFFETHRENT SECTOR SKEW TABLES)
  27. ;
  28. ;    BRUCE E. BLAKESLEE
  29. ;    906 CRESTWOOD ROAD - WEST
  30. ;    WESTFIELD, N.J. 07090
  31. ;
  32. ;
  33. FALSE    EQU    0    ;BASIC DEFINITIONS
  34. TRUE    EQU    NOT FALSE
  35. ;
  36. CPM1      EQU    FALSE
  37. CPM2      EQU    TRUE
  38. ;
  39. STNDRD    EQU    FALSE
  40. MICROP    EQU    TRUE
  41. ;
  42. ;
  43. BOOT    EQU    0    ;CP/M warm boot
  44. BDOS    EQU    5
  45. FCB    EQU    BOOT+5CH
  46. ;
  47.     ORG    100H
  48.     JMP    STACK
  49. ;
  50.     IF    CPM1
  51. BLN    DB    42    ;CP/M 1.4
  52.     ENDIF
  53. ;
  54.     IF    CPM2
  55. BLN    DB    48    ;CP/M 2.2
  56.     ENDIF
  57. ;                
  58. HMSG    DB    13,10,'Unerase Version 1.1 (11/19/81) (CP/M Version $'
  59. MSG22    DB    '2.2)',13,10,'$'
  60. MSG14    DB    '1.4)',13,10,'$'
  61. ;
  62.     ORG    200H    ;Good place to start program
  63. ;
  64. STACK    LXI    SP,STACK    ;Set stack pointer
  65.     CALL     HELLO
  66.     CALL    PCHECK
  67.     CALL    TRYFIX
  68.     CALL    BYE
  69.     JMP    BOOT
  70. ;
  71. ;    Say who we are
  72. ;
  73. HELLO    LXI    D,HMSG
  74.     CALL    PRINT
  75.     RET
  76. ;
  77. ;    Check for valid parimeters and say which cp/m version
  78. ;
  79. PCHECK    CALL    FCBCHK
  80.     CALL    CPMCHK
  81.     RET
  82. ;
  83. ;    Look thru directory
  84. ;
  85. TRYFIX    CALL    NXTSECT
  86.     RZ
  87.     CALL    CHKENT
  88.     JMP    TRYFIX
  89. ;
  90. ;    Sign off & reset system
  91. ;
  92. BYE    MVI    C,13
  93.     CALL    BDOS
  94.     LDA    FIXCNT
  95.     ORA    A
  96.     JZ    NOFIND
  97.     LXI    D,BMSG
  98.     CALL    PRINT
  99.     RET
  100. ;
  101. NOFIND    LXI    D,NFMSG
  102.     CALL    PRINT
  103.     RET
  104. ;
  105. ;    Make sure a legal filename is spec'd
  106. ;
  107. FCBCHK    LDA    FCB
  108.     ORA     A
  109.     JNZ    FCBCK1
  110.     MVI    C,25
  111.     CALL    BDOS
  112.     INR    A
  113. ;
  114. FCBCK1    DCR    A
  115.     STA    FCB
  116.     LDA    FCB+1
  117.     CPI    ' '
  118.     RNC
  119. ;    
  120. ;    IF NO FILE NAME IS SPEC'D, ABORT WITH NOTICE
  121. ;
  122.     LXI    D,NOFMSG
  123.     CALL     PRINT
  124.     JMP    BOOT
  125. ;
  126. ;    CHECK FOR CP/M VERSION AND SET THINGS
  127. ;
  128. CPMCHK    LXI    D,80H
  129.     MVI    C,26
  130.     CALL    BDOS
  131.     MVI    C,12
  132.     CALL     BDOS
  133.     CPI    20H
  134.     MVI    A,42
  135.     LXI    D,MSG14
  136.     CNC    CPM22
  137.     STA    BLN
  138.     CALL    PRINT
  139.     CALL    GETBIOS
  140. ;
  141. ;    SELECT DISK AND SETUP DISK PARAM HEADER
  142. ;
  143.     LDA    FCB
  144.     MOV    C,A
  145.     MVI    B,0
  146.     CALL    SELDSK
  147.     MOV    A,H
  148.     ORA    L
  149.     JZ    ILDISK
  150.     LDA    BLN
  151.     CPI    48
  152.     RC
  153.     MOV    E,M
  154.     INX    H
  155.     MOV    D,M
  156.     XCHG
  157.     SHLD    DPH
  158.     RET
  159. ;
  160. ;    IF CP/M 2.2 DETERMINE # OF DIRECTORY ENTRIES ALSO
  161. ;
  162. CPM22    MVI    C,31
  163.     CALL    BDOS
  164.     LXI    D,7
  165.     DAD    D
  166.     MOV    E,M
  167.     INX    H
  168.     MOV    D,M
  169.     XCHG
  170.     INX    H
  171.     CALL    SHFTHL2
  172.     MOV    A,L
  173.     STA    DIRMAX
  174.     LXI    H,5
  175.     DAD    D
  176.     MOV    A,M
  177.     STA    TRACK
  178.     MVI    A,48
  179.     LXI    D,MSG22
  180.     RET
  181. ;
  182. ;    GET BIOS JUMPS VECTORS FOR EASY REFERENCE
  183. ;
  184. GETBIOS    LHLD    BOOT+1
  185.     LXI    D,WBOOT
  186.     LDA    BLN
  187.     MOV    B,A
  188.     CALL    MOVE
  189.     RET
  190. ;
  191. ;    READ NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES)
  192. ;    RETURNS WITH ZERO FLAG SET IF NO MORE
  193. ;
  194. NXTSECT    LDA    DIRMAX
  195.     ORA    A
  196.     RZ
  197.     LDA    TRACK
  198.     MOV    C,A
  199.     MVI    B,0
  200.     CALL    SETTRK
  201.     LDA    SECTOR
  202.     MOV    C,A
  203.     CALL    TRANSLT
  204.     MVI    B,0
  205.     CALL    SETSEC
  206.     CALL    READ
  207.     ANI    1
  208.     XRI    1
  209.     RET
  210. ;
  211. ;    CHECKS THE CURRENT 4 DIR ENTRIES
  212. ;
  213. ;
  214. CHKENT    XRA    A
  215.     STA    REWRT
  216.     MVI    B,4
  217.     LXI     H,80H
  218. CKLUP    MOV    A,M
  219.     CPI    0E5H
  220.     JNZ    CKINC
  221.     PUSH     H
  222.     CALL    COMPAR
  223.     POP    H
  224.     JNZ    CKINC
  225.     MVI    M,0
  226.     MVI    A,0FH
  227.     STA    REWRT
  228.     LDA    FIXCNT
  229.     INR    A
  230.     STA    FIXCNT
  231. CKINC    LXI    D,32
  232.     DAD    D
  233.     DCR    B
  234.     JNZ    CKLUP
  235.     LDA    REWRT
  236.     ORA    A
  237.     JZ    CKDONE
  238. ;
  239. ;    WRITE THE DIRECTORY SECTOR BACK TO THE DISK
  240. ;
  241.     LDA    TRACK
  242.     MOV    C,A
  243.     MVI    B,0
  244.     CALL    SETTRK
  245.     LDA    SECTOR
  246.     MOV    C,A
  247.     CALL    TRANSLT
  248.     MVI    B,0
  249.     CALL     SETSEC
  250.     CALL    WRITE
  251.     ORA    A
  252.     JNZ    ERRWRT
  253. CKDONE    LDA    DIRMAX
  254.     DCR    A
  255.     STA    DIRMAX
  256.     LDA    SECTOR
  257.     INR    A
  258.     STA    SECTOR
  259.     RET
  260. ;
  261. ;     COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT
  262. ;
  263. COMPAR    INX    H
  264.     LXI    D,FCB+1
  265.     XCHG
  266.     MVI    C,11
  267. CMPR1    LDAX    D
  268.     ANI    7FH
  269.     CMP    M
  270.     RNZ
  271.     INX    D
  272.     INX    H
  273.     DCR    C
  274.     JNZ    CMPR1
  275.     RET
  276. ;
  277. ;    GENERAL PURPOSE MOVE ROUTINE
  278. ;
  279. MOVE    MOV    A,M
  280.     STAX    D
  281.     INX    D
  282.     INX    H
  283.     DCR    B
  284.     JNZ    MOVE
  285.     RET
  286. ;
  287. ;    SHIFT REGS HL RIGHT 2 BITS
  288. ;
  289. SHFTHL2    CALL    SHFTHL
  290. SHFTHL    XRA    A
  291.     MOV    A,H
  292.     RAR
  293.     MOV    H,A
  294.     MOV    A,L
  295.     RAR
  296.     MOV    L,A
  297.     RET
  298. ;
  299. ;    GENERAL PURPOSE PRINT ROUTINE
  300. ;
  301. PRINT    MVI    C,9
  302.     JMP    BDOS
  303. ;
  304. ;    SPEC'D ILLEGAL DISK, SO ABORT
  305. ;
  306. ILDISK    LXI    D,ILMSG
  307.     CALL    PRINT
  308.     JMP    BOOT
  309. ;
  310. ;    ERROR DURING DISK WRITE
  311. ;
  312. ERRWRT    LXI     D,WMSG
  313.     CALL    PRINT
  314.     JMP    BOOT
  315. ;
  316. ;    TRANSLATE REG C FROM LOGICAL TO PHYSICAL SECTOR #
  317. ;
  318. TRANSLT    LHLD    DPH
  319.     XCHG
  320.     CALL    SECTRAN
  321.     MOV    C,L
  322.     RET
  323. ;
  324. ;    THIS IS WORKING COPY OF BIOS TABLE
  325. ;
  326. ;
  327. ;
  328. WBOOT    DS    3
  329. CONST    DS    3
  330. CONIN    DS    3
  331. CONOUT    DS    3
  332. LIST    DS    3
  333. PUNCH    DS    3
  334. READER    DS    3
  335. HOME    DS    3
  336. SELDSK    DS    3
  337. SETTRK    DS    3
  338. SETSEC    DS    3
  339. SETDMA    DS      3
  340. READ    DS    3
  341. WRITE    DS    3
  342. LISTST    DS    3
  343. SECTRAN    JMP    STRAN
  344. ;
  345. ;
  346. ;
  347. ;
  348. ;    RETURNS PHYSICAL SECTOR #
  349. ;
  350. STRAN    MVI    B,0
  351.     XCHG
  352.     DAD    B
  353.     MOV    L,M
  354.     RET
  355. ;
  356. ;    ADDRESS OF TRANSLATE TABLE
  357. ;
  358. DPH    DW    XLT0
  359.     DS    14
  360. ;
  361. ;    THIS IS STANDARD TRANSLATE TABLE
  362. ;
  363.     IF    STNDRD
  364. XLT0    DB    1,7,13,19,25,5,11,17,23,3,9,15,21
  365.     DB    2,8,14,20,26,6,12,18,24,4,10,16,22
  366.     ENDIF
  367. ;
  368. ;          SECTOR TRANSLATE TABLE FOR MICROPOLIS
  369. ;        MOD II
  370. ;
  371.     IF    MICROP
  372. XLT0    DB    1,2,11,12,21,22,31,32
  373.     DB    9,10,19,20,29,30,7,8
  374.     DB    17,18,27,28,5,6,15,16
  375.     DB    25,26,3,4,13,14,23,24
  376.     ENDIF
  377. ;
  378. ;    WORKING STORAGE FOLLOWS
  379. ;
  380. DIRMAX    DB    16
  381. ;
  382. TRACK    DB    2
  383. ;
  384. SECTOR    DB    0
  385. ;
  386. FIXCNT    DB    0
  387. ;
  388. REWRT    DB    0
  389. ;
  390. WMSG    DB    10,13,'Error occured during disk Write - ABORT$'
  391. ;
  392. ILMSG    DB    10,13,'Specified an illegal disk drive - ABORT$'
  393. ;
  394. BMSG    DB    10,13,'Recovered - Please DOUBLE CHECK before using$'
  395. ;
  396. NOFMSG    DB    10,13,'No File Name specified - ABORT$'
  397. ;
  398. NFMSG    DB    10,13,'File NOT found$'
  399. ;
  400.     END    100H
  401.