summaryrefslogtreecommitdiff
path: root/v2.0/source/CHKMES.ASM
blob: 83af5bab4d24e63b2822c47a6b6f5f1380782670 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
TITLE   CHKDSK Messages

FALSE   EQU     0
TRUE    EQU     NOT FALSE

.xlist
.xcref
        INCLUDE DOSSYM.ASM
;The DOST: prefix is a DEC TOPS/20 directory prefix. Remove it for
;   assembly in MS-DOS assembly environments using MASM. The DOSSYM.ASM
;   file must exist though, it is included with OEM distribution.
.cref
.list
CODE    SEGMENT PUBLIC BYTE
CODE    ENDS

CONST   SEGMENT PUBLIC BYTE
        EXTRN   HIDSIZ:WORD,HIDCNT:WORD,DIRCNT:WORD,DIRSIZ:WORD,FILCNT:WORD
        EXTRN   FILSIZ:WORD,ORPHCNT:WORD,ORPHSIZ:WORD,BADSIZ:WORD,LCLUS:WORD
        EXTRN   DOFIX:BYTE
CONST   ENDS

DATA    SEGMENT PUBLIC BYTE
        EXTRN   DSIZE:WORD
DATA    ENDS

DG      GROUP   CODE,CONST,DATA


CODE    SEGMENT PUBLIC BYTE
ASSUME  CS:DG,DS:DG,ES:DG,SS:DG

        PUBLIC  RDSKERR,WDSKERR,SETSWITCH,PROMPTYN,DOINT26,CHAINREPORT,REPORT
        EXTRN   RDONE:NEAR,PRTCHR:NEAR,PRINT:NEAR,DOCRLF:NEAR
        EXTRN   DISP16BITS:NEAR,FINDCHAIN:NEAR
        EXTRN   DISP32BITS:NEAR,DISPCLUS:NEAR

DOINT26:
        PUSH    CX
        PUSH    AX
        PUSH    DX
        PUSH    BX
        INT     26H
        MOV     [HECODE],AL
        POP     AX                      ;FLAGS
        POP     BX
        POP     DX
        POP     AX
        POP     CX
        JNC     RET23
        MOV     SI,OFFSET DG:WRITING
        CALL    DSKERR
        JZ      DOINT26
RET23:  RET

RDSKERR:
        MOV     SI,OFFSET DG:READING
        JMP     SHORT DSKERR

WDSKERR:
        MOV     SI,OFFSET DG:WRITING
DSKERR:
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DI
        PUSH    ES
        MOV     AL,[HECODE]
        CMP     AL,12
        JBE     HAVCOD
        MOV     AL,12
HAVCOD:
        XOR     AH,AH
        MOV     DI,AX
        SHL     DI,1
        MOV     DX,WORD PTR [DI+MESBAS] ; Get pointer to error message
        CALL    PRINT          ; Print error type
        MOV     DX,OFFSET DG:ERRMES
        CALL    PRINT
        MOV     DX,SI
        CALL    PRINT
        MOV     DX,OFFSET DG:DRVMES
        CALL    PRINT
ASK:
        MOV     DX,OFFSET DG:REQUEST
        CALL    PRINT
        MOV     AX,(STD_CON_INPUT_FLUSH SHL 8)+STD_CON_INPUT
        INT     21H             ; Get response
        PUSH    AX
        CALL    DOCRLF
        POP     AX
        OR      AL,20H          ; Convert to lower case
        CMP     AL,"i"          ; Ignore?
        JZ      EEXITNZ
        CMP     AL,"r"          ; Retry?
        JZ      EEXIT
        CMP     AL,"a"          ; Abort?
        JNZ     ASK
        JMP     RDONE

EEXITNZ:
        OR      AL,AL           ; Resets zero flag
EEXIT:
        POP     ES
        POP     DI
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET

PROMPTYN:
;Prompt message in DX
;Prompt user for Y or N answer. Zero set if Y
        PUSH    SI
        CALL    PRINT
PAGAIN:
        MOV     DX,OFFSET DG:YES_NO
        CALL    PRINT
        MOV     DX,OFFSET DG:CONBUF
        MOV     AH,STD_CON_STRING_INPUT
        INT     21H
        CALL    DOCRLF
        MOV     SI,OFFSET DG:CONBUF+2
        CMP     BYTE PTR [SI-1],0
        JZ      PAGAIN
        LODSB
        OR      AL,20H          ;Convert to lower case
        CMP     AL,'y'
        JZ      GOTANS
        CMP     AL,'n'
        JZ      GOTNANS
        JMP     PAGAIN
GOTNANS:
        OR      AL,AL           ;Reset zero
GOTANS:
        POP     SI
        RET

SETSWITCH:
;Look for F or V switch in command line
        MOV     SI,80H
        LODSB
        MOV     DI,SI
        MOV     CL,AL
        XOR     CH,CH
        JCXZ    RET10           ;No parameters
        MOV     AL,[SWITCHAR]
MORESCAN:
        REPNZ   SCASB
        JNZ     RET10
        JCXZ    BADSWITCHA
        MOV     AH,[DI]
        INC     DI
        OR      AH,20H          ;Convert to lower case
        CMP     AH,'f'
        JNZ     CHECKV
        INC     [DOFIX]
        JMP     SHORT CHEKMORE
CHECKV:
        CMP     AH,'v'
        JZ      SETNOISY
        CALL    BADSWITCH
        JMP     SHORT CHEKMORE
SETNOISY:
        INC     [NOISY]
CHEKMORE:
        LOOP    MORESCAN
        RET

BADSWITCHA:
        MOV     AH,' '                  ;Print a non switch
BADSWITCH:
        PUSH    AX
        MOV     DL,[SWITCHAR]
        CALL    PRTCHR
        POP     AX
        PUSH    AX
        MOV     DL,AH
        CALL    PRTCHR
        MOV     DX,OFFSET DG:BADSWMES
        CALL    PRINT
        POP     AX
RET10:  RET


;**************************************
; Prints XXX lost clusters found in YYY chains message
; On entry SI is the XXX value and the YYY value is
; in ORPHCNT.
; NOTE:
;       The DISP16BITS routine prints the number in DI:SI followed
;          by the message pointed to by BX. If it is desired to
;          print a message before the first number, point at the
;          message with DX and call PRINT.

CHAINREPORT:
        XOR     DI,DI
        MOV     BX,OFFSET DG:ORPHMES2
        CALL    DISP16BITS
        CALL    FINDCHAIN
        MOV     BX,OFFSET DG:CHNUMMES
        MOV     SI,[ORPHCNT]
        XOR     DI,DI
        CALL    DISP16BITS              ;Tell user how many chains found
        RET

;*****************************************
;Prints all of the reporting data
;NOTE:
;       The DISPCLUS, DISP16BITS and DISP32BITS routines
;          print the number in DI:SI followed
;          by the message pointed to by BX. If it is desired to
;          print a message before the first number, point at the
;          message with DX and call PRINT.

REPORT:
        MOV     AX,[DSIZE]
        MOV     BX,OFFSET DG:DSKSPC
        CALL    DISPCLUS                ;Total size
        CMP     [HIDCNT],0
        JZ      USERLIN
        MOV     AX,[HIDSIZ]             ;Hidden files
        MOV     BX,OFFSET DG:INMES
        CALL    DISPCLUS
        MOV     SI,[HIDCNT]
        XOR     DI,DI
        MOV     BX,OFFSET DG:HIDMES
        CALL    DISP16BITS
USERLIN:
        CMP     [DIRCNT],0
        JZ      DIRLIN
        MOV     AX,[DIRSIZ]
        MOV     BX,OFFSET DG:INMES
        CALL    DISPCLUS
        MOV     SI,[DIRCNT]
        XOR     DI,DI
        MOV     BX,OFFSET DG:DIRMES
        CALL    DISP16BITS
DIRLIN:
        CMP     [FILCNT],0
        JZ      ORPHLIN
        MOV     AX,[FILSIZ]             ;Regular files
        MOV     BX,OFFSET DG:INMES
        CALL    DISPCLUS
        MOV     SI,[FILCNT]
        XOR     DI,DI
        MOV     BX,OFFSET DG:FILEMES
        CALL    DISP16BITS
ORPHLIN:
        MOV     AX,[ORPHSIZ]
        OR      AX,AX
        JZ      BADLIN
        MOV     BX,OFFSET DG:INMES      ;Orphans
        CMP     [DOFIX],0
        JNZ     ALLSET1
        MOV     BX,OFFSET DG:INMES2     ;Orphans
ALLSET1:
        CALL    DISPCLUS
        MOV     SI,[ORPHCNT]
        XOR     DI,DI
        MOV     BX,OFFSET DG:ORPHMES
        CALL    DISP16BITS
BADLIN:
        MOV     AX,[BADSIZ]
        OR      AX,AX
        JZ      AVAILIN
        MOV     BX,OFFSET DG:BADSPC     ;Bad sectors
        CALL    DISPCLUS
AVAILIN:
        MOV     AX,[DSIZE]
        SUB     AX,[DIRSIZ]
        SUB     AX,[FILSIZ]
        SUB     AX,[HIDSIZ]
        SUB     AX,[BADSIZ]
        SUB     AX,[ORPHSIZ]
        SUB     AX,[LCLUS]
        MOV     BX,OFFSET DG:FRESPC
        CALL    DISPCLUS                ;Free space is whats left
        MOV     AX,DS:WORD PTR [2]      ;Find out about memory
        MOV     DX,16
        MUL     DX
        MOV     SI,AX
        MOV     DI,DX
        MOV     BX,OFFSET DG:TOTMEM
        CALL    DISP32BITS
        MOV     AX,DS:WORD PTR [2]
        MOV     DX,CS
        SUB     AX,DX
        MOV     DX,16
        MUL     DX
        MOV     SI,AX
        MOV     DI,DX
        MOV     BX,OFFSET DG:FREMEM
        CALL    DISP32BITS
        RET

CODE    ENDS


CONST   SEGMENT PUBLIC BYTE

        EXTRN   HECODE:BYTE,SWITCHAR:BYTE,NOISY:BYTE,DOFIX:BYTE,CONBUF:BYTE

        PUBLIC  CRLF2,CRLF,BADVER,BADDRV
        PUBLIC  BADSUBDIR,CENTRY,CLUSBAD,BADATT,BADSIZM
        PUBLIC  FIXMES,DIRECMES,CDDDMES
        PUBLIC  FREEBYMESF_PRE,FREEBYMES_PRE,FREEBYMESF_POST,FREEBYMES_POST
        PUBLIC  CREATMES,NDOTMES
        PUBLIC  BADTARG1,BADTARG2,BADCD,FATALMES,BADRDMES
        PUBLIC  BADDRVM,STACKMES,BADDPBDIR
        PUBLIC  BADDRVM2
        PUBLIC  NULNZ,NULDMES,BADCLUS,NORECDOT
        PUBLIC  NORECDDOT,IDMES1,IDPOST,VNAME,TCHAR
        PUBLIC  MONTAB,BADREAD_PRE,BADREAD_POST,BADWRITE_PRE
        PUBLIC  BADWRITE_POST,BADCHAIN,CROSSMES_PRE,CROSSMES_POST
        PUBLIC  FREEMES
        PUBLIC  OPNERR
        PUBLIC  CONTAINS,EXTENTS,NOEXTENTS,INDENT
        PUBLIC  BADIDBYT,PTRANDIR,PTRANDIR2


MESBAS  DW      OFFSET DG:ERR0
        DW      OFFSET DG:ERR1
        DW      OFFSET DG:ERR2
        DW      OFFSET DG:ERR3
        DW      OFFSET DG:ERR4
        DW      OFFSET DG:ERR5
        DW      OFFSET DG:ERR6
        DW      OFFSET DG:ERR7
        DW      OFFSET DG:ERR8
        DW      OFFSET DG:ERR9
        DW      OFFSET DG:ERR10
        DW      OFFSET DG:ERR11
        DW      OFFSET DG:ERR12

CRLF2   DB      13,10
CRLF    DB      13,10,"$"

;Messages

BADVER  DB      "Incorrect DOS version",13,10,"$"
BADDRV  DB      "Invalid drive specification$"

BADSWMES  DB     " Invalid parameter",13,10,"$"

BADSUBDIR DB    "   Invalid sub-directory entry.",13,10,"$"
CENTRY  DB      "   Entry has a bad $"
CLUSBAD DB      " link$"
BADATT  DB      " attribute$"
BADSIZM DB      " size$"

;"BADTARG1<name of dir followed by CR LF>BADTARG2"
BADTARG1 DB     "Cannot CHDIR to $"
BADTARG2 DB     "   tree past this point not processed.",13,10,"$"

BADCD   DB      "Cannot CHDIR to root",13,10,"$"

FATALMES DB     "Processing cannot continue.",13,10,"$"
BADRDMES DB     "File allocation table bad drive "
BADDRVM  DB     "A.",13,10,"$"
STACKMES DB     "Insufficient memory.",13,10,"$"
BADDPBDIR DB    "Invalid current directory.",13,10,"$"

;INT 24 MESSAGE SHOULD AGREE WITH COMMAND

READING DB      "read$"
WRITING DB      "writ$"
ERRMES  DB      " error $"
DRVMES  DB      "ing drive "
BADDRVM2  DB    "A",13,10,"$"
REQUEST DB      "Abort, Retry, Ignore? $"
ERR0    DB      "Write protect$"
ERR1    DB      "Bad unit$"
ERR2    DB      "Not ready$"
ERR3    DB      "Bad command$"
ERR4    DB      "Data$"
ERR5    DB      "Bad call format$"
ERR6    DB      "Seek$"
ERR7    DB      "Non-DOS disk$"
ERR8    DB      "Sector not found$"
ERR9    DB      "No paper$"
ERR10   DB      "Write fault$"
ERR11   DB      "Read fault$"
ERR12   DB      "Disk$"


NDOTMES DB      "   Does not exist.",13,10,"$"
NULNZ   DB      "   First cluster number is invalid,",13,10
        DB      "    entry truncated.",13,10,"$"
NULDMES DB      "   Directory is totally empty, no . or ..",13,10,"$"
BADCLUS DB      "   Allocation error, size adjusted.",13,10,"$"
NORECDOT DB     "   Cannot recover . entry, processing continued.",13,10,"$"
NORECDDOT DB    "   Cannot recover .. entry,"

;VOLUME ID

;"IDMES1/name at VNAME<date and time>IDPOST"
IDPOST  DB      13,10,"$"               ;WARNING this is currently the tail of
                                        ; the previos message!!!
IDMES1  DB      "Volume "
VNAME   DB      12 DUP(' ')
        DB      "created $"
TCHAR   DB      'a'
MONTAB  DB      "JanFebMarAprMayJunJulAugSepOctNovDec"



;"BADREAD_PRE<# of FAT>BADREAD_POST"
BADREAD_PRE DB      "Disk error reading FAT $"

;"BADWRITE_PRE<# of FAT>BADWRITE_POST"
BADWRITE_PRE DB     "Disk error writing FAT $"

BADCHAIN DB     "   Has invalid cluster, file truncated."

BADREAD_POST    LABEL   BYTE
BADWRITE_POST   LABEL   BYTE

;"<name of file followed by CR LF>CROSSMES_PRE<# of cluster>CROSSMES_POST"
CROSSMES_POST   DB  13,10,"$"           ;WARNING Is tail of previos messages
CROSSMES_PRE    DB  "   Is cross linked on cluster $"

;CHAINREPORT messages
ORPHMES2 DB     " lost clusters found in $"
CHNUMMES DB     " chains.",13,10,"$"

FREEMES DB      "Convert lost chains to files $"

;REPORT messages
ORPHMES DB      " recovered files",13,10,"$"
DSKSPC  DB      " bytes total disk space",13,10,"$"
INMES   DB      " bytes in $"
INMES2  DB      " bytes would be in",13,10
        DB      "          $"
FILEMES DB      " user files",13,10,"$"
BADSPC  DB      " bytes in bad sectors",13,10,"$"
HIDMES  DB      " hidden files",13,10,"$"
DIRMES  DB      " directories",13,10,"$"
FRESPC  DB      " bytes available on disk",13,10,13,10,"$"
TOTMEM  DB      " bytes total memory",13,10,"$"
FREMEM  DB      " bytes free",13,10,13,10,"$"

;"<filename followed by CR LF>CONTAINS<# non-contig blocks>EXTENTS"
CONTAINS DB     "   Contains $"
EXTENTS DB      " non-contiguous blocks.",13,10,"$"

NOEXTENTS DB    "All specified file(s) are contiguous.",13,10,"$"
INDENT  DB      "      $"

BADIDBYT DB     "Probable non-DOS disk."
        DB      13,10,"Continue $"
YES_NO  DB      "(Y/N)? $"
PTRANDIR DB     "   Unrecoverable error in directory.",13,10
PTRANDIR2 DB    "   Convert directory to file $"
FIXMES  DB      13,10,"Errors found, F parameter not specified."
        DB      13,10,"Corrections will not be written to disk.",13,10,13,10,"$"
DIRECMES DB     "Directory $"
CDDDMES DB      "   CHDIR .. failed, trying alternate method.",13,10,"$"


FREEBYMESF_POST DB   " bytes disk space freed.",13,10
FREEBYMESF_PRE  DB   "$"
FREEBYMES_POST  DB   " bytes disk space",13,10
                DB   "          would be freed.",13,10
FREEBYMES_PRE   DB   "$"


CREATMES DB     "Insufficient room in root directory."
        DB      13,10,"Erase files in root and repeat CHKDSK.",13,10,"$"
OPNERR  DB      "   File not found.",13,10,"$"


CONST   ENDS
        END