home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / HARDDISK / LIST123.ZIP / LISTBAD.ASM next >
Encoding:
Assembly Source File  |  1987-01-12  |  9.5 KB  |  245 lines

  1. PAGE ,132
  2. TITLE List Bad Cluster Program, Version 1.23, 12-Jan-1987
  3.  
  4. ;
  5. ; Written By Steven Georgiades
  6. ;
  7. ; List Bad Cluster Program
  8. ;   Will respond with a list of all the clusters on the disk that are
  9. ;   marked as bad.
  10. ;
  11. ;       If you are using this program and find it of value, your
  12. ;       contribution in any amount ($5.00 suggested) will be greatly
  13. ;       appreciated.  Makes checks payable to Steven M. Georgiades.
  14. ;               Thank you.
  15. ;
  16. ;       If you have any questions or comments about this or any other
  17. ;       SMG program, call or write:
  18. ;
  19. ;               Steven M. Georgiades
  20. ;               SMG Software
  21. ;               701-H South Hayward Street
  22. ;               Anaheim, CA 92804
  23. ;               (714) 826-9549
  24. ;
  25.  
  26. CODE      SEGMENT BYTE PUBLIC 'CODE'
  27.  
  28.           ASSUME  CS:CODE,DS:CODE,ES:CODE,SS:CODE
  29.  
  30.           ORG     5CH
  31.  
  32. FCB       LABEL   BYTE
  33.  
  34.           ORG     100H
  35.  
  36. LISTBAD:  JMP     BEGIN
  37.  
  38. AND_STR   DB      " , $"
  39. CLSTSTR   DB      "XXXXX$"
  40. ERR_DRV   DB      "Error reading drive x:",7
  41. CRLF      DB      13,10,"$"
  42. HDR_MSG   DB      "Drive x: has $"
  43. BAD_MSG   DB      "the following clusters marked as bad:",13,10,10,"$"
  44. NBAD_MSG  DB      "no clusters marked as bad$"
  45. SIGNON    DB      "List Bad Cluster Program, Version 1.23",13,10
  46.           DB      "SMG Software",13,10
  47.           DB      "(C) Copyright 1986,1987 Steven Georgiades",13,10,10,"$"
  48. TO_STR    DB      " to$"
  49. TOT_MSG   DB      13,10,10,"Total Clusters Marked as Bad = $"
  50.  
  51. BAD_CLST  DW      0FF7H
  52. BAD_CNT   DW      0
  53. DRIVE     DB      ?
  54. FAT_BITS  DB      12
  55. FIRST     DW      0
  56. LAST      DW      0
  57. LASTCLST  DW      ?
  58.  
  59. BEGIN:    MOV     AX,OFFSET SIGNON              ; Output Sign-On Message
  60.           CALL    MSG_OUT
  61.           MOV     AL,FCB[0]                     ; Read Specified Drive Number
  62.           DEC     AL
  63.           JNS     USE_DEF
  64.           MOV     AH,19H
  65.           INT     21H
  66. USE_DEF:  MOV     DRIVE,AL                      ;   and Save
  67.           ADD     AL,'A'                        ; Set Drive Letter
  68.           MOV     HDR_MSG[6],AL
  69.           MOV     ERR_DRV[20],AL
  70.           MOV     AX,OFFSET HDR_MSG             ; Output Header Message
  71.           CALL    MSG_OUT
  72.           MOV     AL,DRIVE                      ; Read Boot Record
  73.           MOV     CX,1
  74.           MOV     DX,0
  75.           MOV     BX,OFFSET FATBUF
  76.           INT     25H
  77.           POPF
  78.           MOV     BX,FATBUF[22]                 ; Read Sectors per FAT
  79.           PUSH    BX
  80.           MOV     AH,36H                        ; Get Disk Info
  81.           MOV     DL,DRIVE
  82.           INC     DL
  83.           INT     21H
  84.           POP     CX
  85.           CMP     AX,-1
  86.           JNE     DRV_OK
  87.           MOV     AX,OFFSET ERR_DRV             ; Output Drive Error Message
  88.           CALL    MSG_OUT
  89.           MOV     AX,4C01H                      ; Exit to DOS
  90.           INT     21H
  91. DRV_OK:   MOV     LASTCLST,DX                   ; Save Total Clusters
  92.           INC     LASTCLST
  93.           CMP     DX,4079                       ; If Necessary, Adjust FAT Size
  94.           JLE     FAT_OK
  95.           MOV     FAT_BITS,16
  96.           MOV     BAD_CLST,0FFF7H
  97. FAT_OK:   MOV     AL,DRIVE                      ; Read FAT
  98.           MOV     BX,OFFSET FATBUF
  99.           MOV     DX,1
  100.           INT     25H
  101.           POPF
  102.           MOV     DX,2                          ; Check Clusters from #2
  103. GET_NEXT: MOV     BX,DX                         ; Get Next Cluster Number
  104.           CALL    NEXTCLST
  105.           CMP     BX,BAD_CLST                   ; If Bad,
  106.           JNE     NOT_BAD
  107.           MOV     AX,OFFSET AND_STR
  108.           CMP     BAD_CNT,0                     ;   If First Bad Cluster,
  109.           JNE     NOTFIRST                      ;     Setup Bad Cluster Message
  110.           MOV     AX,OFFSET BAD_MSG             ;   Else Setup AND_STR
  111. NOTFIRST: CMP     FIRST,0                       ;   If First in Range,
  112.           JNE     NO_STR
  113.           CALL    MSG_OUT                       ;     Output Message
  114. NO_STR:   INC     BAD_CNT                       ;   Increment Bad Cluster Count
  115.           MOV     LAST,DX                       ;   Range Last = Current
  116.           CMP     FIRST,0                       ;   If First,
  117.           JNE     CHK_NEXT
  118.           MOV     FIRST,DX                      ;     Range First = Current
  119.           MOV     AX,DX                         ;     Output Cluster Number
  120.           CALL    OUT_CLST
  121.           JMP     SHORT CHK_NEXT
  122. NOT_BAD:  MOV     AX,LAST                       ; Else If Range,
  123.           OR      AX,AX
  124.           JZ      NO_RANGE
  125.           CMP     AX,FIRST                      ;     If First != Last
  126.           JE      NO_RANGE
  127.           MOV     AX,OFFSET TO_STR              ;       Output TO_STR
  128.           CALL    MSG_OUT
  129.           MOV     AX,LAST                       ;       Output Last Cluster #
  130.           CALL    OUT_CLST
  131. NO_RANGE: MOV     FIRST,0                       ;   Clear Range
  132.           MOV     LAST,0
  133. CHK_NEXT: INC     DX                            ; Try Next Cluster Number
  134.           CMP     DX,LASTCLST                   ; Repeat until End of Disk
  135.           JBE     GET_NEXT
  136.           CMP     BAD_CNT,0                     ; If no Bad Clusters,
  137.           JNE     CNT_BAD
  138.           MOV     AX,OFFSET NBAD_MSG            ;   Output No Bad Message
  139.           CALL    MSG_OUT
  140.           JMP     SHORT DONE
  141. CNT_BAD:  MOV     AX,OFFSET TOT_MSG
  142.           CALL    MSG_OUT
  143.           MOV     AX,BAD_CNT
  144.           CALL    OUT_CLST
  145. DONE:     MOV     AX,OFFSET CRLF                ; Output CRLF
  146.           CALL    MSG_OUT
  147.           MOV     AX,4C00H                      ; Exit to DOS
  148.           INT     21H
  149.  
  150. MSG_OUT:  PUSH    DX                            ; Save Register
  151.           MOV     DX,AX                         ; Print String to Video
  152.           MOV     AH,9
  153.           INT     21H
  154.           POP     DX                            ; Restore Register
  155.           RET                                   ; Done
  156.  
  157. NEXTCLST: CMP     FAT_BITS,12                   ; If FAT Size = 16 Bits,
  158.           JE      NEXTCLS1
  159.           SHL     BX,1                          ;   Simply Read Next Cluster #
  160.           MOV     BX,FATBUF[BX]
  161.           RET                                   ;   Done
  162. NEXTCLS1: PUSH    AX                            ; Save Registers
  163.           PUSH    CX
  164.           MOV     AX,BX                         ; Word # = Cluster # * 1.5
  165.           SHL     AX,1
  166.           ADD     BX,AX
  167.           SHR     BX,1
  168.           MOV     BX,FATBUF[BX]
  169.           JNC     NEXTCLS2                      ; If Odd, Use 12 MSB's
  170.           MOV     CL,4
  171.           SHR     BX,CL
  172. NEXTCLS2: AND     BX,0FFFH                      ; Else Use 12 LSB's
  173.           POP     CX                            ; Restore Registers
  174.           POP     AX
  175.           RET                                   ; Done
  176.  
  177. OUT_CLST: PUSH    AX                            ; Save Registers
  178.           PUSH    DI
  179.           MOV     DI,OFFSET CLSTSTR[5]          ; Convert Cluster # to Decimal
  180.           CALL    DEC5OUT
  181.           CALL    STRIP0                        ; Strip Off Leading Zeroes
  182.           MOV     AX,OFFSET CLSTSTR
  183.           CALL    MSG_OUT
  184.           POP     DI                            ; Restore Registers
  185.           POP     AX
  186.           RET                                   ; Done
  187.  
  188. STRIP0:   CMP     BYTE PTR [DI],'0'             ; If Character != '0', Done
  189.           JNE     STRIP1
  190.           CMP     BYTE PTR [DI+1],'0'           ; If Next Character != Digit,
  191.           JL      STRIP1                        ;   Done
  192.           CMP     BYTE PTR [DI+1],'9'
  193.           JG      STRIP1
  194.           MOV     BYTE PTR [DI],' '             ; Change '0' to ' '
  195.           INC     DI                            ; Point to Next Character
  196.           JMP     SHORT STRIP0                  ; Repeat
  197. STRIP1:   RET                                   ; Done
  198.  
  199. DEC2OUT:  PUSH    AX                            ; Save Registers
  200.           PUSH    BX
  201.           XOR     AH,AH                         ; Clear AH
  202.           MOV     BL,10                         ; AH=AX%10,AL=AX/10
  203.           DIV     BL
  204.           ADD     AX,'00'                       ; Convert to ASCII
  205.           SUB     DI,2
  206.           MOV     [DI],AX                       ; Store in String
  207.           POP     BX                            ; Restore Registers
  208.           POP     AX
  209.           RET                                   ; Done
  210.  
  211. DEC4OUT:  PUSH    AX                            ; Save Registers
  212.           PUSH    BX
  213.           MOV     BL,100                        ; AH=AX%100,AL=AX/100
  214.           DIV     BL
  215.           XCHG    AH,AL                         ; Convert 2 LSD's
  216.           CALL    DEC2OUT
  217.           XCHG    AH,AL                         ; Convert 2 MSD's
  218.           CALL    DEC2OUT
  219.           POP     BX                            ; Restore Registers
  220.           POP     AX
  221.           RET                                   ; Done
  222.  
  223. DEC5OUT:  PUSH    AX                            ; Save Registers
  224.           PUSH    BX
  225.           PUSH    DX                            ; DX=AX%10000,AX=AX/10000
  226.           MOV     BX,10000
  227.           XOR     DX,DX
  228.           DIV     BX
  229.           XCHG    DX,AX                         ; Convert 4 LSD's
  230.           CALL    DEC4OUT
  231.           XCHG    DX,AX                         ; Convert MSD
  232.           ADD     AL,'0'
  233.           SUB     DI,1
  234.           MOV     [DI],AL
  235.           POP     DX                            ; Restore Registers
  236.           POP     BX
  237.           POP     AX
  238.           RET                                   ; Done
  239.  
  240. FATBUF    LABEL   WORD
  241.  
  242. CODE      ENDS
  243.  
  244.           END     LISTBAD
  245.