; Program to recover Erased file ; ; From Interface Age December 1981 pg 98+ ; ; I didn't type in ALL the comments, so be sure to read the article ; and the printed program listing in the magazine ; ; ; Proper credit given to original author: ; ; Gene Cotton ; ; All I did was to type this in from the magazine ; Hopefully without added any typing errors ; ; HBR Version 1.0 as of 11/17/81 ; ; Henry B. Rothberg ; 4 Laticrete Park North ; Bethany, Ct 06525 ; ; VERSION 1.1 AS OF 11/19/81 ; ; ADDED CONDITIONAL EQUATES FOR CP/M 1.4 AND 2.2 ; AS WELL AS EQUATES FOR STANDARD CP/M AND MICROPOLIS ; CP/M (DIFFETHRENT SECTOR SKEW TABLES) ; ; BRUCE E. BLAKESLEE ; 906 CRESTWOOD ROAD - WEST ; WESTFIELD, N.J. 07090 ; ; FALSE EQU 0 ;BASIC DEFINITIONS TRUE EQU NOT FALSE ; CPM1 EQU FALSE CPM2 EQU TRUE ; STNDRD EQU FALSE MICROP EQU TRUE ; ; BOOT EQU 0 ;CP/M warm boot BDOS EQU 5 FCB EQU BOOT+5CH ; ORG 100H JMP STACK ; IF CPM1 BLN DB 42 ;CP/M 1.4 ENDIF ; IF CPM2 BLN DB 48 ;CP/M 2.2 ENDIF ; HMSG DB 13,10,'Unerase Version 1.1 (11/19/81) (CP/M Version $' MSG22 DB '2.2)',13,10,'$' MSG14 DB '1.4)',13,10,'$' ; ORG 200H ;Good place to start program ; STACK LXI SP,STACK ;Set stack pointer CALL HELLO CALL PCHECK CALL TRYFIX CALL BYE JMP BOOT ; ; Say who we are ; HELLO LXI D,HMSG CALL PRINT RET ; ; Check for valid parimeters and say which cp/m version ; PCHECK CALL FCBCHK CALL CPMCHK RET ; ; Look thru directory ; TRYFIX CALL NXTSECT RZ CALL CHKENT JMP TRYFIX ; ; Sign off & reset system ; BYE MVI C,13 CALL BDOS LDA FIXCNT ORA A JZ NOFIND LXI D,BMSG CALL PRINT RET ; NOFIND LXI D,NFMSG CALL PRINT RET ; ; Make sure a legal filename is spec'd ; FCBCHK LDA FCB ORA A JNZ FCBCK1 MVI C,25 CALL BDOS INR A ; FCBCK1 DCR A STA FCB LDA FCB+1 CPI ' ' RNC ; ; IF NO FILE NAME IS SPEC'D, ABORT WITH NOTICE ; LXI D,NOFMSG CALL PRINT JMP BOOT ; ; CHECK FOR CP/M VERSION AND SET THINGS ; CPMCHK LXI D,80H MVI C,26 CALL BDOS MVI C,12 CALL BDOS CPI 20H MVI A,42 LXI D,MSG14 CNC CPM22 STA BLN CALL PRINT CALL GETBIOS ; ; SELECT DISK AND SETUP DISK PARAM HEADER ; LDA FCB MOV C,A MVI B,0 CALL SELDSK MOV A,H ORA L JZ ILDISK LDA BLN CPI 48 RC MOV E,M INX H MOV D,M XCHG SHLD DPH RET ; ; IF CP/M 2.2 DETERMINE # OF DIRECTORY ENTRIES ALSO ; CPM22 MVI C,31 CALL BDOS LXI D,7 DAD D MOV E,M INX H MOV D,M XCHG INX H CALL SHFTHL2 MOV A,L STA DIRMAX LXI H,5 DAD D MOV A,M STA TRACK MVI A,48 LXI D,MSG22 RET ; ; GET BIOS JUMPS VECTORS FOR EASY REFERENCE ; GETBIOS LHLD BOOT+1 LXI D,WBOOT LDA BLN MOV B,A CALL MOVE RET ; ; READ NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES) ; RETURNS WITH ZERO FLAG SET IF NO MORE ; NXTSECT LDA DIRMAX ORA A RZ LDA TRACK MOV C,A MVI B,0 CALL SETTRK LDA SECTOR MOV C,A CALL TRANSLT MVI B,0 CALL SETSEC CALL READ ANI 1 XRI 1 RET ; ; CHECKS THE CURRENT 4 DIR ENTRIES ; ; CHKENT XRA A STA REWRT MVI B,4 LXI H,80H CKLUP MOV A,M CPI 0E5H JNZ CKINC PUSH H CALL COMPAR POP H JNZ CKINC MVI M,0 MVI A,0FH STA REWRT LDA FIXCNT INR A STA FIXCNT CKINC LXI D,32 DAD D DCR B JNZ CKLUP LDA REWRT ORA A JZ CKDONE ; ; WRITE THE DIRECTORY SECTOR BACK TO THE DISK ; LDA TRACK MOV C,A MVI B,0 CALL SETTRK LDA SECTOR MOV C,A CALL TRANSLT MVI B,0 CALL SETSEC CALL WRITE ORA A JNZ ERRWRT CKDONE LDA DIRMAX DCR A STA DIRMAX LDA SECTOR INR A STA SECTOR RET ; ; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT ; COMPAR INX H LXI D,FCB+1 XCHG MVI C,11 CMPR1 LDAX D ANI 7FH CMP M RNZ INX D INX H DCR C JNZ CMPR1 RET ; ; GENERAL PURPOSE MOVE ROUTINE ; MOVE MOV A,M STAX D INX D INX H DCR B JNZ MOVE RET ; ; SHIFT REGS HL RIGHT 2 BITS ; SHFTHL2 CALL SHFTHL SHFTHL XRA A MOV A,H RAR MOV H,A MOV A,L RAR MOV L,A RET ; ; GENERAL PURPOSE PRINT ROUTINE ; PRINT MVI C,9 JMP BDOS ; ; SPEC'D ILLEGAL DISK, SO ABORT ; ILDISK LXI D,ILMSG CALL PRINT JMP BOOT ; ; ERROR DURING DISK WRITE ; ERRWRT LXI D,WMSG CALL PRINT JMP BOOT ; ; TRANSLATE REG C FROM LOGICAL TO PHYSICAL SECTOR # ; TRANSLT LHLD DPH XCHG CALL SECTRAN MOV C,L RET ; ; THIS IS WORKING COPY OF BIOS TABLE ; ; ; WBOOT DS 3 CONST DS 3 CONIN DS 3 CONOUT DS 3 LIST DS 3 PUNCH DS 3 READER DS 3 HOME DS 3 SELDSK DS 3 SETTRK DS 3 SETSEC DS 3 SETDMA DS 3 READ DS 3 WRITE DS 3 LISTST DS 3 SECTRAN JMP STRAN ; ; ; ; ; RETURNS PHYSICAL SECTOR # ; STRAN MVI B,0 XCHG DAD B MOV L,M RET ; ; ADDRESS OF TRANSLATE TABLE ; DPH DW XLT0 DS 14 ; ; THIS IS STANDARD TRANSLATE TABLE ; IF STNDRD XLT0 DB 1,7,13,19,25,5,11,17,23,3,9,15,21 DB 2,8,14,20,26,6,12,18,24,4,10,16,22 ENDIF ; ; SECTOR TRANSLATE TABLE FOR MICROPOLIS ; MOD II ; IF MICROP XLT0 DB 1,2,11,12,21,22,31,32 DB 9,10,19,20,29,30,7,8 DB 17,18,27,28,5,6,15,16 DB 25,26,3,4,13,14,23,24 ENDIF ; ; WORKING STORAGE FOLLOWS ; DIRMAX DB 16 ; TRACK DB 2 ; SECTOR DB 0 ; FIXCNT DB 0 ; REWRT DB 0 ; WMSG DB 10,13,'Error occured during disk Write - ABORT$' ; ILMSG DB 10,13,'Specified an illegal disk drive - ABORT$' ; BMSG DB 10,13,'Recovered - Please DOUBLE CHECK before using$' ; NOFMSG DB 10,13,'No File Name specified - ABORT$' ; NFMSG DB 10,13,'File NOT found$' ; END 100H