home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug038.arc / UNERA12.AQM / UNERA12.ASM
Assembly Source File  |  1979-12-31  |  12KB  |  336 lines

  1. ; DATE 10/13/83  19:10   LAST REVISION
  2.  
  3. ; UNERA12.ASM
  4. ; BY: H.M. VAN TASSELL, 120 HILL HOLLOW RD, WATCHUNG NJ 07060 (201)755-5372
  5. ; VERSION 1.2 IS A MINOR REVISION OF THE UNERA PROGRAM ON SIG/M VOL 76,
  6. ; (THERE WAS AN EARLIER RELEASE CALLED UNERA11 ON VOLUME 46).
  7. ; REVISED TO EXCLUDE 0E5H OR 00 AS FIRST LETTER OF FILENAME, THUS EMPTY
  8. ; DIRECTORY ENTRYS ARE NOT RECOVERED ON *.* WILDCARD, WHICH WOULD CAUSE THE
  9. ; DISK TO ACT AS IF THE DIRECTORY WAS FULL.
  10.  
  11. ;    PROGRAMME TO RECOVER ERASED FILE
  12. BOOT    EQU    0        ;CP/M WARM BOOT JUMP VECTOR
  13. BDOS    EQU    5        ;CP/M BDOS CALL JUMP VECTOR
  14. FCB    EQU    BOOT+5CH    ;DEFAULT FILE CONTROL BLOCK
  15.                                     
  16.     ORG    100H        ;START AT BASE OF TPA
  17.     JMP    STACK        ;GET AROUND THE STACK
  18.  
  19. BIN    DB    48        ;48 IF CP/M 2.x, 42 IF CP/M 1.4
  20.                 ; BE SURE TO SUPPLY A
  21.                 ; SECTRAN ROUTINE IF 1.4
  22.  
  23. HMSG    DB      13,10,'UNERASE VERSION 1.2 (10/12/83) (CP/M VERSION $'
  24. MSG22   DB      '2.x)',13,10,'$'
  25. MSG14   DB    '1.4)',13,10,'$'
  26.  
  27.         ORG     200H    ;GOOD PLACE TO START THE PROGRAM
  28. STACK   LXI     SP, STACK       ;SET STACK POINTER
  29.         CALL    HELLO           ;SIGN ON MESSAGE
  30.         CALL    PCHECK          ;CHECK PARAMETERS
  31.         CALL    TRYFIX          ;DO TH RECOVERY
  32.         CALL    BYE             ;SIGN OFF MESSAGE
  33.         JMP     BOOT            ;RETURN TO CP/M
  34.  
  35. ;  SAY WHO WE ARE
  36. HELLO   LXI     D,HMSG          ;POINT TO HELLO MESSAGE
  37.         CALL    PRINT
  38.         RET
  39.  
  40. ;  CHECK FOR VALID PARAMETERS AND SAY WHICH CP/M VERSION
  41. PCHECK  CALL    FCBCHK          ;MAKE SURE FILE SPECIFIED
  42.         CALL    CPMCHK          ;ESTABLISH CP/M VERSION
  43.         RET
  44.  
  45. ;  LOOKS THROUGH THE DIRECTORY TRYING TO MATCH FCB FILENAME
  46. TRYFIX  CALL    NXTSECT         ;GET A DIRECTORY SECTOR
  47.         RZ                      ;RETURNS ZERO FLAG IF NO MORE
  48.         CALL    CHKENT          ;CHECK IT OUT AND MABYE FIX
  49.         JMP     TRYFIX          ;KEEP IT UP TILL DONE
  50.  
  51. ;  SIGN OFF AND RESET SYSTEM
  52. BYE     MVI     C,13            ;SYSTEM RESET
  53.         CALL    BDOS
  54.         LDA     FIXCNT          ;CHECK FOR ACTIVITY
  55.         ORA     A
  56.         JZ      NOFIND          ;SAY NONE FOUND
  57.         LXI     D,BMSG          ;WARN FOUND
  58.         CALL    PRINT
  59.         RET
  60. NOFIND  LXI     D,NFMSG
  61.         CALL    PRINT
  62.         RET
  63.  
  64. ;  MAKES SURE A LEGAL FILENAME IS SPECIFIED
  65. FCBCHK  LDA     FCB             ;GET DRIVE SPECIFICATION
  66.         ORA     A                ;SEE IF DEAFAULT
  67.         JNZ     FCBCKI          ;NO, GO CHECK FILENAME
  68.         MVI     C,25            ;ASK FOR CURRENT DRIVE
  69.         CALL    BDOS
  70.         INR     A               ;OFFSET FOR NEXT INSTR
  71. FCBCKI  DCR     A               ;CURRENT DRIVE NUMBER
  72.         STA     FCB             ;SAVE IT
  73.         LDA     FCB+1           ;GET 1ST BYTE OF FILENAME
  74.         CPI     ' '             ;MAKE SURE IT IS NON BLANK
  75.         RNC                     ;OK - KEEP GOING
  76. ;  IF NO FILE NAME IS SPECIFIED, ABORT WITH NOTICE
  77.         LXI     D,NOFMSG
  78.         CALL    PRINT
  79.         JMP     BOOT            ;ABORT
  80.  
  81. ;  CHECKS FOR CP/M VERSION AND SETS THINGS
  82. CPMCHK  LXI     D,80H           ;SET DMA TO TBUFF
  83.         MVI     C,26
  84.         CALL    BDOS
  85.         MVI     C,12            ;VERSION NUMBER REQUEST
  86.         CALL    BDOS
  87.         CPI     20H             ;EARLIER THAN 2.x?
  88.         MVI     A,42            ;ASSUME 1.4
  89.         LXI     D,MSG14         ;POINT TO 1.4 MSG
  90.         CNC     CPM22           ;IF 2.x GO SET THINGS
  91.         STA     BIN             ;SET THE MOVE LENGTH
  92.         CALL    PRINT
  93.         CALL    GETBIOS         ;ESTABLISH BIOS JUMP VECTOR
  94.  ;  SELECT CALL DISK AND SETUP DISK PARAM HEADER
  95.         LDA     FCB             ;GET THE DISK
  96.         MOV     C,A
  97.         MVI     B,0
  98.         CALL    SELDSK          ;MAKE SURE DRIVE IS
  99.         MOV     A,H             ;SELECTED
  100.         ORA     L
  101.         JZ      ILDISK
  102.         LDA     BIN
  103.         CPI     48              ;IF CP/M 1.4 SKIP REST
  104.         RC
  105.         MOV     E,M             ;GET THE ADDRESS
  106.         INX     H               ; OF THE XLT0
  107.         MOV     D,M
  108.         XCHG
  109.         SHLD     DPH            ;SAVE THE ADDRESS
  110.         RET
  111.  
  112. ;  IF CP/M 2.x DETERMINE NUMBER OF DIRECTORY ENTRIES ALSO
  113. CPM22   MVI     C,31            ;GET DISK PARMS ADDRESS
  114.         CALL    BDOS            ;DPB ADDR IN HL ON RET
  115.         LXI     D,7             ;OFFSET TO DRM
  116.         DAD     D
  117.         MOV     E,M             ;GET NUMBER OF
  118.         INX     H               ; DIRECTORY ENTRIES
  119.         MOV     D,M
  120.         XCHG
  121.         INX     H               ;ACCOUNT FOR - 1
  122.         CALL    SHFTHL2         ;SHIFT HL RIGHT 2
  123.         MOV     A,L             ;GET NUMBER OF SECTORS
  124.         STA     DIRMAX          ;SAVE NUMB DIR SECS
  125.         LXI     H,5             ;NOW POINT TO SYSTEM
  126.         DAD     D               ; TRACK OFFSET
  127.         MOV     A,M             ;PICK UP NUMBER OF
  128.         STA     TRACK           ;SAVE TRACK OFFSET
  129.         MVI     A,48            ;SET MOVE LENGTH
  130.         LXI     D,MSG22         ;POINT TO 2.x MSG
  131.         RET
  132.  
  133. ;  GET BIOS JUMP VECTORS FOR EASY REFERENCE
  134. GETBIOS LHLD    BOOT+1          ;POINTS TO BIOS JUMP TABLE+3
  135.         LXI     D,WBOOT         ;WHERE WE WILL KEEP A COPY
  136.         LDA     BIN             ;NUMBER OF BYTES TO MOVE
  137.         MOV     B,A             ;MOVE LIKES IT IN REG B
  138.         CALL    MOVE            ;MOVE THE TABLE
  139.         RET
  140.  
  141. ;  READS NEXT SECTOR (GROUP OF 4 DIRECTORY ENTRIES)
  142. ;  RETURNS WITH ZERO FLAG SET OF NO MORE
  143. NXTSECT LDA     DIRMAX          ;SEE IF MORE SECTORS
  144.         ORA     A
  145.         RZ                      ;RETURNS ZERO FLAG IF NO MORE
  146.         LDA     TRACK           ;SET TRACK
  147.         MOV     C,A
  148.         MVI     B,0
  149.         CALL    SETTRK
  150.         LDA     SECTOR          ;SET SECTOR
  151.         MOV     C,A
  152.         CALL    TRANSLT
  153.         MVI     B,0
  154.         CALL    SETSEC
  155.         CALL    READ            ;READ A SECTOR
  156.         ANI     1
  157.         XRI     1               ;REVERSE SENSE OF ERROR FLAG
  158.         RET                     ;RETURNS WITH ZERO FLAG SET
  159.                                 ;  IF BAD READ
  160.  
  161. ;  CHECKS THE CURRENT 4 DIRECTORY ENTRIES AGAINST ARGUMENT
  162. ;  IF MATCH, REWRITES SECTOR WITH REACTIVATED 1ST BYTES
  163. CHKENT  XRA     A               ;ASSUME NO REWRITE
  164.         STA     REWRT
  165.         MVI     B,4             ;NUMBER OF ENTRIES PER SECTOR
  166.         LXI     H,80H           ;BEGINNING OF BUFFER
  167. CKLUP   MOV     A,M
  168.         CPI     0E5H            ;IF E5 ITS NOT ACTIVE DIR.
  169.         JNZ     CKINC
  170.     INX    H
  171.     MOV    A,M        ;CHECK SECOND BYTE
  172.     DCX    H
  173.     CPI    0E5H        ;CPM 1.4 &2.2 USE E5 FILL
  174.     JZ    CKINC        ;FOR FORMATING
  175.         CPI     00H             ;BUT CPM 3.0 USES 00 FILL
  176.         JZ     CKINC        ;DONT RECOVERY FORMATED ENTRYS!
  177.         PUSH    H               ;SAVE BEGINNING ADDR
  178.         CALL    COMPAR          ;COMPARE WITH ARGUMENT
  179.         POP     H
  180.         JNZ     CKINC           ;NO MATCH
  181.         MVI     M,0             ;RESET FLAG FOR ACTIVE
  182.         MVI     A,0FH           ;SAY NEEDS REWRITE
  183.         STA     REWRT
  184.         LDA     FIXCNT
  185.  
  186.         INR     A               ;BUMP COUNT OF CHANGES
  187.         STA     FIXCNT
  188. CKINC   LXI     D,32            ;LENGTH OF ENTRY
  189.         DAD     D
  190.         DCR     B
  191.         JNZ     CKLUP
  192.         LDA     REWRT           ;SEE OF NEED REWRITE
  193.         ORA     A
  194.         JZ      CKDONE          ;NO - DONE
  195. ;  WRITE THE DIRECTORY SECTOR BACK TO THE DISK
  196.         LDA     TRACK           ;SET TRACK
  197.         MOV     C,A
  198.         MVI     B,0
  199.         CALL    SETTRK
  200.         LDA     SECTOR          ;SET SECTOR
  201.         MOV     C,A
  202.         CALL TRANSLT
  203.         MVI     B,0
  204.         CALL    SETSEC
  205.         CALL    WRITE           ;WRITE THE SECTOR BACK
  206.         ORA     A               ;ABORT IF ERROR
  207.         JNZ     ERRWRT
  208. CKDONE  LDA     DIRMAX
  209.         DCR     A               ;REDUCE SECTORS LEFT
  210.         STA     DIRMAX
  211.         LDA     SECTOR          ;POINT TO NEXT SECTOR
  212.         INR     A
  213.         STA     SECTOR
  214.         RET
  215.  
  216. ;  COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT
  217. COMPAR  INX     H
  218.         LXI     D,FCB+1
  219.         XCHG
  220.         MVI     C,11
  221. CMPR1   mvi    a,03fh        ; '?'
  222.     cmp    m
  223.     jz    cmpr2        ; it's a wild char, anything will do
  224.     LDAX    D               ;GET DIR ENT CHAR
  225.         ANI     7FH             ;STRIP ANY FLAGS
  226.         CMP     M
  227.         RNZ                     ;DONE IF NO MATCH
  228. cmpr2:  INX     D
  229.         INX     H               ;BUMP TO NEXT CHAR
  230.         DCR     C
  231.         JNZ     CMPR1           ;LOOP FOR 11 CHAR
  232.         RET                     ;RETURNS ZERO FLAG SET FOR MATCH
  233.  
  234. ;  GENERAL PURPOSE MOVE ROUTINE.
  235. ;    FROM (HL) TO (DE) FOR COUNT OF B
  236. MOVE    MOV     A,M             ;GET A BYTE
  237.         STAX    D               ;PUT A BYTE
  238.         INX     D               ;INCREMENT TO NEXT
  239.         INX     H
  240.         DCR     B               ;COUNT DOWN
  241.         JNZ     MOVE
  242.         RET
  243.  
  244. ;  SHIFT REGS HL RIGHT 2 BITS LOGICAL
  245. SHFTHL2 CALL    SHFTHL
  246. SHFTHL  XRA     A               ;CLEAR CARRY
  247.         MOV     A,H
  248.         RAR                     ;SHIFTED BIT IN CARRY
  249.         MOV     H,A
  250.         MOV     A,L
  251.         RAR
  252.         MOV     L,A
  253.         RET
  254.  
  255. ; GENERAL PRINT ROUTINE ENTER WITH REG DE POINTING TO MSG
  256. ;  RETURNS TO CALLER FROM BDOS
  257. PRINT   MVI     C,9             ;BDOS PRINT STRING COMMAND
  258.         JMP     BDOS            ;GO DO THE PRINT
  259.  
  260. ; SPECIFIED AN ILLEGAL DISK DRIVE - ABORT
  261. ILDISK  LXI     D,ILMSG
  262.         CALL    PRINT
  263.         JMP     BOOT            ;ABORT
  264.  
  265. ;  ERROR OCCURED DURING DISK WRITE - ABORT
  266. ERRWRT  LXI     D,WMSG
  267.         CALL    PRINT
  268.         JMP     BOOT            ;ABORT
  269.  
  270. ; TRANSLATE REG C FROM LOGICAL TO PHYSICAL SECTOR NUMBER
  271. TRANSLT LHLD    DPH             ;GET ADDRESS OF XLT0
  272.         XCHG
  273.         CALL    SECTRAN
  274.         MOV     C,L
  275.         RET
  276.  
  277. ;  THIS IS THE WORKING COPY OF THE BIOS JUMP TABLE
  278. ;  IF CP/M 2.x, NO CHANGES ARE NECESSARY
  279. ;  IF CP/M 1.4, SECTRAN IS NOT COPIED FROM BIOS
  280. ;               BE SURE TO CORRECT THE INCLUDED
  281. ;                               VERSION FOR YOUR OWN DISK SYSTEM
  282. WBOOT   DS      3
  283. CONST   DS      3
  284. CONIN   DS      3
  285. CONOUT  DS      3
  286. LIST    DS      3
  287. PUNCH   DS      3
  288. READER  DS      3
  289. HOME    DS      3
  290. SELDSK  DS      3
  291. SETTRK  DS      3
  292. SETSEC  DS      3
  293. SETDMA  DS      3
  294. READ    DS      3
  295. WRITE   DS      3
  296. LISTST  DS      3
  297. SECTRAN JMP     STRAN
  298. ;  SECTOR TRANSLATION ROUTINE FOR
  299. ;  CP/M VERSIONS EARLIER THAN 2.0
  300. ;  REG DE CONTAINS ADDRESS OF XLT0
  301. ;  REG BC CONTAINS THE LOGICAL SECTOR NUMBER
  302.  
  303. ;  RETURNS PHYSICAL SECTOR NUMBER IN REG HL
  304. STRAN   MVI     B,0
  305.         XCHG
  306.         DAD     B
  307.         MOV     L,M
  308.         RET
  309.  
  310. ;  ADDRESS OF TRANSLATE TABLE
  311. DPH     DW      XLT0
  312.         DS      14
  313.  
  314. ;  THIS IS THE STANDARD TRANSLATE TABLE
  315. XLT0    DB      1,7,13,19,25,5,11,17,23,3,9,15,21
  316.         DB      2,8,14,20,26,6,12,18,24,4,10,16,22
  317.  
  318. ;  WORKING STORAGE FOLLOWS
  319.  
  320. DIRMAX  DB      16              ;NUMBER OF SECTORS IN DIRECTORY =
  321.                                 ;MAXIMUM NUMBER OF DIRECTORY ENTRIES
  322.                                 ; DIVIDED BY 4 (ENTRIES PER SECTOR)
  323.  
  324. TRACK   DB      2               ;TRACK NUMBER OF DIRECTORY
  325. SECTOR  DB      0               ;CURRENT SECTOR NUMBER
  326.  
  327. FIXCNT  DB      0               ;NUMBER OF ENTRIES FIXED
  328. REWRT   DB      0               ;REWRITE FLAG 0=NO, F=YES
  329.  
  330. WMSG    DB      10,13,'ERROR OCCURED DURING DISK WRITE - ABORT$'
  331. ILMSG   DB      10,13,'SPECIFIED AN ILLEGAL DISK DRIVE - ABORT$'
  332. BMSG    DB      10,13,'RECOVERED - PLEASE DOUBLE CHECK BEFORE USING$'
  333. NOFMSG  DB      10,13,'NO FILE NAME SPECIFIED - ABORT$'
  334. NFMSG   DB      10,13,'FILE NOT FOUND$'
  335.         END     100H
  336.