home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv076.ark / UNERA.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  11KB  |  319 lines

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