home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / utilitys / unera3.arc / U3.ASM next >
Assembly Source File  |  1991-08-11  |  9KB  |  370 lines

  1. ; U3 - UTILITY FOR RECOVERING ERASED FILES FOR CP/M PLUS
  2. ; This program is based on UNERASE.COM in the public domain.
  3. ; It has been modified to work with CP/M 3.0 and later.
  4. ; It currently works with sector sizes of 128, 256 and 512 bytes.
  5. ; It is placed in the public domain by Advanced Logic Systems for public
  6. ; use.    Advanced Logic Systems makes no warrantee on the operation or use
  7. ; of this program or its applicabilty for any given application.
  8.  
  9. ;    HISTORY
  10.  
  11. ;12/29/83    FIRST PASS AT DISASSEMBLY OF UNERASE.COM AND MODIFICATIONS
  12. ;        TO MAKE IT COMPATIBLE WITH CP/M PLUS
  13. ;        I ALSO DIS A SELECT DISK IN DSKPRM SO THAT IF YOU TRY TO 
  14. ;        RECOVER A FILE FROM A DISK THAT IS A DIFFERENT FORMAT FROM
  15. ;        THE ONE THAT YOU ARE CURRENTLY LOGGED ON TO, ITS GETS THE 
  16. ;        RIGHT DPH.  AT THE SAME TIME I CHANGED THE SIZE OF THE AREA
  17. ;        WHERE THE NUMBER OF RESERVED SYSTEM TRACKS IS KEPT.  THIS 
  18. ;        ALLOWS THE NUMBER OF RESERVED TRACKS TO BE GREATER THAN 256.
  19. ;        - GALE WOLFENBARGER
  20.  
  21. ;    ADDRESSES
  22.  
  23. BDOS:    EQU    05H        ;BDOS VECTOR ADDRESS
  24. WRMBOOT:EQU    00H        ;WARM BOOT VECTOR ADDRESS
  25. DEFFCB: EQU    5CH        ;ADDRESS OF THE DEFAULT FCB
  26. DEFFCB2:EQU    6DH        ;ADDRESS OF THE SECOND DEFAULT FCB
  27.  
  28. ;    BDOS FUNCTIONS
  29.  
  30. DIRCALL:EQU    32H        ;CPM 3.0 DIRECT BIOS CALL
  31. DRESET: EQU    0DH        ;RESET DISK SYSTEM
  32. GETCUR: EQU    19H        ;GET CURRENTLY LOGGED IN DISK
  33. CONIN:    EQU    01H        ;GET A CHARACTER FROM THE CONSOLE
  34. CONOUT: EQU    02H        ;PRINT A CHARACTER TO THE CONSOLE
  35. SETDMA: EQU    1AH        ;SET DMA FUNCTION
  36. GETVER: EQU    0CH        ;GET CPM VERSION #
  37. GETPARM:EQU    1FH        ;GET ADDRESS OF DISK PARAMETERS
  38. PRINT:    EQU    09H        ;PRINT STRING TO CONSOLE
  39.  
  40. ;    ASCII CHARACTERS
  41.  
  42. CR:    EQU    0DH        ;CARRIAGE RETURN
  43. LF:    EQU    0AH        ;LINE FEED
  44.  
  45. ;    I USED MACROS FROM Z80.LIB TO IMPLEMENT SOME Z80 COMMANDS
  46. ;    BECAUSE MAC.COM AND Z80.LIB COME WITH CP/M PLUS.
  47. ;    IF YOU ARE USING ASM.COM OR NOT USING A Z80 PROCESSOR
  48. ;    YOU WILL HAVE TO USE EQUATES OR INSERT INLINE CODE FOR THE
  49. ;    Z80 MACROS - gw
  50.  
  51.     MACLIB    Z80
  52.  
  53.     ORG    100H
  54.  
  55.     JMP    START    
  56.     DB    'U3 ver 1.0'
  57.     DB    'UNERASE FOR CPM 3.0'
  58.     DB    '12/29/83 - gw'
  59.     
  60.     ORG    200H
  61. START:         
  62.     LXI    SP,START    
  63.     CALL    SETUP
  64.     CALL    RDDIR
  65.     CALL    FINISH    
  66.     JMP    WRMBOOT 
  67. SETUP:
  68.     CALL    CKNAME        ;CHECK FOR VALID FILE NAME 
  69.     CALL    SETBIOS     ;COPY BIOS JUMP VECTOR
  70.     RET
  71. RDDIR:         
  72.     CALL    GETDIR        ;READ A DIRECTORY SECTOR
  73.     RZ            ;END OR READ ERROR
  74.     CALL    CKENT        ;CHECK ENTRIES FOR FILE TO RECOVER
  75.     JMP    RDDIR    
  76. FINISH:
  77.     MVI    C,DRESET    ;RESET DISK SYSTEM
  78.     CALL    BDOS    
  79.     LDA    NOREC        ;GET NUMBER RECOVERED
  80.     ORA    A
  81.     JZ    NOTFND        ;NO RECOVERIES
  82.     LXI    D,RECMSG
  83.     CALL    PRTMSG        ;PRINT NUMBER OF FILES RECOVERED
  84.     RET
  85. NOTFND:
  86.     LXI    D,FILERR
  87.     CALL    PRTMSG    
  88.     RET
  89. CKNAME:  
  90.     LDA    DEFFCB        ;GET DRIVE FOR FILE
  91.     ORA    A        ;USE DEFAULT?
  92.     JNZ    NODEF        ;NO CONVERT TO FCB FORMAT
  93.     MVI    C,GETCUR    ;GET CURRENT DISK
  94.     CALL    BDOS    
  95.     INR    A        ;SET UP FOR DECREMENT
  96. NODEF:         
  97.     DCR    A        ;CONVERT TO FCB FORMAT
  98.     STA    DEFFCB        ;SAVE IT
  99.     LDA    DEFFCB+1    ;CHECK FOR NO FILE
  100.     CPI    ' '    
  101.     RNC            ;RETURN IF OK
  102.     LXI    D,NAMERR    ;PRINT FILE ERROR
  103.     CALL    PRTMSG    
  104.     JMP    WRMBOOT     ;GIVE UP
  105. SETBIOS:            ;SET UP LOCAL BIOS JUMP VECTOR
  106.     LXI    B,LOCDMA    ;GET DEFAULT DMA ADDRESS
  107.     SBCD    BCREG
  108.     MVI    A,12        ;SET DMA TO DEFAULT
  109.     STA    FUNC
  110.     CALL    CALLBIOS
  111.     MVI    C,GETVER    ;GET CPM VERSION #
  112.     CALL    BDOS    
  113.     CPI    30H        ;IS IT 3.0 OR GREATER
  114.     JC    ONLY30        ;THIS VERSION FOR CPM 3.0 AND LATER
  115.     CALL    DSKPRM        ;GET DISK PARAMETERS FROM BDOS 
  116.     LDA    DEFFCB        ;SELECT DRIVE
  117.     MOV    C,A
  118.     MVI    B,0
  119.     MOV    E,B
  120.     SBCD    BCREG        ;BIOS SELDSK FUNCTION
  121.     SDED    DEREG
  122.     MVI    A,9        ;SELDSK
  123.     STA    FUNC
  124.     CALL    CALLBIOS
  125.     MOV    A,H
  126.     ORA    L        ;CHECK FOR DRIVE ERROR
  127.     JZ    NODRV        ;GO REPORT IT
  128.     MOV    E,M        ;GET DPH ADDRESS
  129.     INX    H
  130.     MOV    D,M
  131.     XCHG
  132.     SHLD    DPHADD        ;SAVE ADDRESS TO DPH
  133.     RET
  134. DSKPRM:      
  135.     LDA    DEFFCB
  136.     MOV    E,A
  137.     MVI    C,14        ;SELECT DISK
  138.     CALL    BDOS
  139.     MVI    C,GETPARM    ;GET ADDRESS OF DISK PARMS
  140.     CALL    BDOS    
  141.     LXI    D,7        ;OFFSET TO DRM (# OF DIRECTORY ENTRIES)
  142.     DAD    D        ;ADD OFFSET
  143.     MOV    E,M        ;GET DRM
  144.     INX    H
  145.     MOV    D,M
  146.     PUSH    D
  147.     PUSH    H
  148.     LXI    D,7        ;POINT TO PSH
  149.     DAD    D
  150.     MOV    A,M        ;GET IT
  151.     STA    PSH        ;SAVE IT
  152.     POP    H
  153.     POP    D
  154.     XCHG
  155.     INX    H        ;ADD 1 FOR TOTAL DIRECTORY ENTRIES
  156.     LDA    PSH
  157.     CPI    2        ;512 BYTE SECTORS
  158.     CZ    DIV16
  159.     LDA    PSH
  160.     CPI    1        ;256 BYTE SECTORS
  161.     CZ    DIV8
  162.     LDA    PSH
  163.     ORA    A        ;128 BYTE SECTORS
  164.     CZ    DIV4        
  165.     MOV    A,L        ;SAVE # OF DIRECTORY ENTRIES MAX 1024
  166.     STA    DIRENT    
  167.     LXI    H,5        ;ADD OFFSET TO NUMBER OF RESERVED TRACKS
  168.     DAD    D
  169.     MOV    E,M        ;GET NUMBER OF RESERVED TRACKS
  170.     INX    H
  171.     MOV    D,M
  172.     SDED    RESTKS        ;SAVE RESERVED TRACKS FOR LATER
  173.     RET
  174. ONLY30:
  175.     LXI    D,ERR30     ;PRINT MESSAGE FOR CPM PLUS ONLY
  176.     CALL    PRTMSG
  177.     JMP    WRMBOOT
  178. GETDIR:      
  179.     LDA    DIRENT        ;GET # OF DIRECTORY ENTRIES
  180.     ORA    A
  181.     RZ            ;RETURN IF NONE
  182.     LBCD    RESTKS        ;GET NUMBER OF RESERVED TRACKS
  183.     SBCD    BCREG        ;SET TRACK TO DIRECTORY
  184.     MVI    A,10        ;SETTRK
  185.     STA    FUNC
  186.     CALL    CALLBIOS
  187.     LDA    SECTOR        ;GET CURRENT SECTOR
  188.     MOV    C,A
  189.     CALL    TRNSEC        ;TRANSLATE SECTOR IF NECESSARY
  190.     MVI    B,0
  191.     SBCD    BCREG        ;POINT TO CURRENT SECTOR
  192.     MVI    A,11        ;SETSEC
  193.     STA    FUNC
  194.     CALL    CALLBIOS
  195.     MVI    A,13        ;READ SECTOR OF DIRECTORY
  196.     STA    FUNC
  197.     CALL    CALLBIOS
  198.     ANI    1
  199.     XRI    1
  200.     RET
  201. CKENT:         
  202.     XRA    A        ;ZERO RECOVER FLAG
  203.     STA    RECFLG
  204.     LDA    DVD        ;GET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  205.     MOV    B,A
  206.     LXI    H,LOCDMA
  207. CKNXT:
  208.     MOV    A,M        ;GET BYTE
  209.     CPI    0E5H        ;CHECK FOR DELETED
  210.     JNZ    GETNXT        ;NOPE SKIP
  211.     PUSH    H
  212.     CALL    CKDEL        ;YES CHECK FOR RECOVERY
  213.     POP    H
  214. RECENT:      
  215.     JNZ    GETNXT
  216.     MVI    M,0        ;RECOVER THE ENTRY
  217.     MVI    A,0FH        ;SET RECOVERED FLAG
  218.     STA    RECFLG
  219.     LDA    NOREC        ;INCREMENT NUMBER OF RECORDS RECOVERED
  220.     INR    A
  221.     STA    NOREC    
  222. GETNXT:      
  223.     LXI    D,32        ;ADVANCE TO NEXT ENTRY
  224.     DAD    D
  225.     DCR    B        ;DECREMENT COUNTER
  226.     JNZ    CKNXT
  227.     LDA    RECFLG        ;CHECK FOR RECOVERED ENTRY
  228.     ORA    A
  229.     JZ    LOOP        ;NOPE CONTINUE LOOP
  230.     LBCD    RESTKS        ;GET # RESERVED TRACKS
  231.     SBCD    BCREG        ;POINT TO DIRECTORY
  232.     MVI    A,10        ;SETTRK
  233.     STA    FUNC
  234.     CALL    CALLBIOS
  235.     LDA    SECTOR        ;GET CURRENT SECTOR
  236.     MOV    C,A
  237.     CALL    TRNSEC        ;TRANSLATE SECTOR
  238.     MVI    B,0
  239.     SBCD    BCREG        ;POINT TO CURRENT SECTOR
  240.     MVI    A,11        ;SETSEC
  241.     STA    FUNC
  242.     CALL    CALLBIOS
  243.     LXI    B,1        ;NONE DEFERRED WRITE
  244.     SBCD    BCREG
  245.     MVI    A,14        ;WRITE
  246.     STA    FUNC
  247.     CALL    CALLBIOS    ;UPDATE DIRECTORY
  248.     ORA    A        ;CHECK FOR WRITE ERROR
  249.     JNZ    WRTERROR    ;REPORT ERROR
  250. LOOP:
  251.     LDA    DIRENT        ;DECREMENT DIRECTORY ENTRIES
  252.     DCR    A
  253.     STA    DIRENT
  254.     LDA    SECTOR        ;INCREMENT SECTOR
  255.     INR    A
  256.     STA    SECTOR    
  257.     RET
  258. CKDEL:
  259.     INX    H        ;CHECK DELETED ENTRY FOR RECOVERY
  260.     LXI    D,DEFFCB+1    ;POINT AT FILE TO BE RECOVERED
  261.     XCHG
  262.     MVI    C,11        ;LOOK AT 11 CHARACTERS
  263. CMPDEL:
  264.     LDAX    D        ;GET CHARACTER IN NAME
  265.     ANI    7FH        ;TURN OFF HIGH BIT
  266.     CMP    M        ;ARE THEY EQUAL?
  267.     RNZ            ;NOPE GO GET ANOTHER ENTRY
  268.     INX    D        ;YES, CONTINUE
  269.     INX    H
  270.     DCR    C
  271.     JNZ    CMPDEL
  272.     RET
  273. DIV16:                ;DIVIDE HL BY 16
  274.     MVI    A,16        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  275.     STA    DVD
  276.     CALL    DIV2        ;/2
  277.     CALL    DIV2        ;/4
  278.     CALL    DIV2        ;/8
  279.     CALL    DIV2        ;/16
  280.     RET
  281. DIV8:                ;DIVIDE HL BY 8
  282.     MVI    A,8        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  283.     STA    DVD
  284.     CALL    DIV2        ;/2
  285.     CALL    DIV2        ;/4
  286.     CALL    DIV2        ;/8
  287.     RET
  288. DIV4:                ;DIVIDE HL BY 4
  289.     MVI    A,4        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  290.     STA    DVD
  291.     CALL    DIV2        ;CALL DIVIDE BY 2 THEN FALL INTO IT FOR 4
  292. DIV2:                ;DIVIDE BY 2 ROUTINE
  293.     XRA    A        ;CLEAR CARRY
  294.     MOV    A,H        ;GET HIGH ORDER BYTE
  295.     RAR            ;SHIFT RIGHT FOR A DIVIDE BY 2
  296.     MOV    H,A
  297.     MOV    A,L        ;GET LOW ORDER BYTE
  298.     RAR            ;SHIFT RIGHT FOR A DIVIDE BY 2
  299.     MOV    L,A
  300.     RET
  301. PRTMSG:      
  302.     MVI    C,PRINT     ;PRINT STRING TO CONSOLE
  303.     JMP    BDOS    
  304. NODRV:                ;PRINT DRIVE ERROR MESSAGE
  305.     LXI    D,DRVERR
  306.     CALL    PRTMSG    
  307.     JMP    WRMBOOT 
  308. WRTERROR:            ;PRINT WRITE ERROR MESSAGE
  309.     LXI    D,WRTERR
  310.     CALL    PRTMSG    
  311.     JMP    WRMBOOT 
  312. TRNSEC:      
  313.     LHLD    DPHADD        ;GET TRANSLATE TABLE ADDRESS
  314.     XCHG
  315.     SBCD    BCREG
  316.     SDED    DEREG
  317.     MVI    A,16        ;SECTRAN
  318.     STA    FUNC
  319.     CALL    CALLBIOS
  320.     MOV    C,L
  321.     RET
  322. CALLBIOS:            ;CPM 3.0 DIRECT BIOS CALL
  323.     MVI    C,DIRCALL
  324.     LXI    D,FUN50
  325.     CALL    BDOS
  326.     RET
  327. FUN50:
  328. FUNC:    DS    1
  329. AREG:    DS    1
  330. BCREG:    DS    2
  331. DEREG:    DS    2
  332. HLREG:    DS    2
  333.  
  334. DPHADD:
  335.     DS    2
  336. DIRENT: DS    1
  337. RESTKS: DS    2
  338. SECTOR: DB    0
  339. NOREC:    DB    0
  340. RECFLG: DB    0
  341. PSH:    DS    1
  342. DVD:    DB    0
  343. WRTERR:      
  344.     DB    CR,LF,'Error occured during disk Write - ABORT$'
  345. DRVERR:      
  346.     DB    CR,LF,'Specified an illegal disk drive - ABORT$'
  347. RECMSG:      
  348.     DB    'File recovered.$'
  349. NAMERR:      
  350.     DB    CR,LF
  351.     DB    'No File Name specified - ABORT$'
  352. FILERR:      
  353.     DB    CR,LF,'File NOT found$'
  354. ERR30:
  355.     DB    CR,LF
  356.     DB    'THIS VERSION OF UNERASE ONLY WORKS',CR,LF
  357.     DB    'FOR CPM 3.0 OR LATER',CR,LF
  358.     DB    'U2.COM FOR EARLIER RELEASES OF CP/M',CR,LF
  359.     DB    'IS AVAILABLE FROM Advanced Logic Systems',CR,LF
  360.     DB    'AT NO CHARGE.  SOURCE FOR THIS PROGRAM AND U2',CR,LF
  361.     DB    'ARE ALSO AVAILABLE. FOR MORE INFORMATION CALL',CR,LF
  362.     DB    '800-538-8177 OR 408-730-0306 (IN CALIFORNIA).',CR,LF,'$'
  363. LOCDMA:
  364.     DS    512        ;LOCAL DMA BUFFER
  365.  
  366.     END
  367. ATION CALL',CR,LF
  368.     DB    '800-538-8177 OR 408-730-0306 (IN CALIFORNIA).',CR,LF,'$'
  369. LOCDMA:
  370.     DS    512        ;LOCAL DMA BUFFE