summaryrefslogtreecommitdiff
path: root/v2.0/source/CHKPROC.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/CHKPROC.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/CHKPROC.ASM')
-rw-r--r--v2.0/source/CHKPROC.ASM1408
1 files changed, 1408 insertions, 0 deletions
diff --git a/v2.0/source/CHKPROC.ASM b/v2.0/source/CHKPROC.ASM
new file mode 100644
index 0000000..b003f83
--- /dev/null
+++ b/v2.0/source/CHKPROC.ASM
@@ -0,0 +1,1408 @@
1TITLE CHKPROC - Procedures called from chkdsk
2
3FALSE EQU 0
4TRUE EQU NOT FALSE
5
6DRVCHAR EQU ":"
7
8 INCLUDE DOSSYM.ASM
9
10SUBTTL Segments used in load order
11
12CODE SEGMENT PUBLIC
13CODE ENDS
14
15CONST SEGMENT PUBLIC BYTE
16
17 EXTRN CLUSBAD:BYTE,BADATT:BYTE,BADSIZM:BYTE
18 EXTRN DIRECMES:BYTE,CDDDMES:BYTE,NDOTMES:BYTE
19 EXTRN BADTARG1:BYTE,BADTARG2:BYTE,FATALMES:BYTE
20 EXTRN STACKMES:BYTE,BADDPBDIR:BYTE,CREATMES:BYTE
21 EXTRN FREEBYMES_PRE:BYTE,FREEBYMESF_PRE:BYTE
22 EXTRN FREEBYMES_POST:BYTE,FREEBYMESF_POST:BYTE
23 EXTRN NULNZ:BYTE,NULDMES:BYTE,BADCLUS:BYTE
24 EXTRN NORECDDOT:BYTE,NORECDOT:BYTE,DOTMES:BYTE
25 EXTRN BADWRITE_PRE:BYTE,BADCHAIN:BYTE,CROSSMES_PRE:BYTE
26 EXTRN BADWRITE_POST:BYTE,CROSSMES_POST:BYTE,INDENT:BYTE
27 EXTRN PTRANDIR:BYTE,PTRANDIR2:BYTE,FREEMES:BYTE,FIXMES:BYTE
28
29 EXTRN NOISY:BYTE,DOFIX:BYTE,DIRBUF:WORD,DOTENT:BYTE,FIXMFLG:BYTE
30 EXTRN HAVFIX:BYTE,SECONDPASS:BYTE,LCLUS:WORD,DIRTYFAT:BYTE
31 EXTRN NUL:BYTE,ALLFILE:BYTE,PARSTR:BYTE,ERRSUB:WORD,USERDIR:BYTE
32 EXTRN HIDCNT:WORD,HIDSIZ:WORD,FILCNT:WORD,FILSIZ:WORD,DIRCHAR:BYTE
33 EXTRN DIRCNT:WORD,DIRSIZ:WORD,FRAGMENT:BYTE,HECODE:BYTE
34 EXTRN BADSIZ:WORD,ORPHSIZ:WORD,DDOTENT:BYTE,CROSSCNT:WORD
35 EXTRN ORPHCNT:WORD,ORPHFCB:BYTE,ORPHEXT:BYTE,ALLDRV:BYTE,DIRCHAR:BYTE
36
37CONST ENDS
38
39DATA SEGMENT PUBLIC WORD
40
41 EXTRN THISDPB:DWORD,HARDCH:DWORD,CONTCH:DWORD,USERDEV:BYTE
42 EXTRN CSIZE:BYTE,SSIZE:WORD,DSIZE:WORD,MCLUS:WORD,NAMBUF:BYTE
43 EXTRN DOTSNOGOOD:BYTE,ZEROTRUNC:BYTE,ISCROSS:BYTE,SRFCBPT:WORD
44 EXTRN FATMAP:WORD,SECBUF:WORD,ERRCNT:BYTE,STACKLIM:WORD,FAT:WORD
45
46DATA ENDS
47
48DG GROUP CODE,CONST,DATA
49
50SUBTTL Initialized Data
51PAGE
52
53
54CODE SEGMENT PUBLIC
55ASSUME CS:DG,DS:DG,ES:DG,SS:DG
56
57 PUBLIC INT_23,INT_24,FINDCHAIN,DONE,AMDONE,RDONE
58 PUBLIC FATAL,DIRPROC,CHKMAP,CHKCROSS,UNPACK
59 PUBLIC PRINTTHISEL2,CHECKERR,PRINTCURRDIRERR
60
61 EXTRN EPRINT:NEAR,DOCRLF:NEAR,PRINT:NEAR
62 EXTRN PROMPTYN:NEAR,DOINT26:NEAR,SUBERRP:NEAR
63 EXTRN DOTCOMBMES:NEAR,DISP16BITS:NEAR
64 EXTRN CHAINREPORT:NEAR,DISPCLUS:NEAR
65 EXTRN PRTCHR:NEAR,WDSKERR:NEAR,CHECKFILES:NEAR
66 EXTRN FCB_TO_ASCZ:NEAR,FIGREC:NEAR,RDSKERR:NEAR
67
68CHKPROC:
69
70SUBTTL DIRPROC -- Recursive directory processing
71
72; YOU ARE ADVISED NOT TO COPY THE FOLLOWING METHOD!!!
73
74DOTDOTHARDWAY:
75 LDS DI,[THISDPB]
76ASSUME DS:NOTHING
77 MOV [DI.dpb_current_dir],-1 ;Invalidate path
78 MOV SI,DI
79 ADD SI,dpb_dir_text
80 MOV CX,SI
81FINDEND:
82 LODSB ;Scan to end of current path
83 OR AL,AL
84 JNZ FINDEND
85 DEC SI ;Point at the NUL
86DELLOOP: ;Delete last element
87 CMP SI,CX
88 JZ SETROOT
89 CMP BYTE PTR [SI],"/"
90 JZ SETTERM
91 CMP BYTE PTR [SI],"\"
92 JZ SETTERM
93 DEC SI
94 JMP SHORT DELLOOP
95
96SETTERM:
97 MOV BYTE PTR [SI],0
98SETCURR:
99 PUSH CS
100 POP DS
101ASSUME DS:DG
102 MOV DX,OFFSET DG:DOTMES
103 MOV AH,CHDIR ;Chdir to altered path
104 INT 21H
105 RET
106
107SETROOT:
108ASSUME DS:NOTHING
109 MOV [DI.dpb_current_dir],0 ;Set Path to Root
110 JMP SHORT SETCURR ;The CHDIR will fail, but who cares
111
112
113;Structures used by DIRPROC
114
115SRCHFCB STRUC
116 DB 44 DUP (?)
117SRCHFCB ENDS
118SFCBSIZ EQU SIZE SRCHFCB
119THISENT EQU 17H ;Relative entry number of current entry
120
121DIRENT STRUC
122 DB 7 DUP (?) ;Ext FCB junk
123 DB ? ;Drive
124DIRNAM DB 11 DUP (?)
125DIRATT DB ?
126 DB 10 DUP (?)
127DIRTIM DW ?
128DIRDAT DW ?
129DIRCLUS DW ?
130DIRESIZ DD ?
131DIRENT ENDS
132ENTSIZ EQU SIZE DIRENT
133
134;Attribute bits
135
136RDONLY EQU 1
137HIDDN EQU 2
138SYSTM EQU 4
139VOLIDA EQU 8
140ISDIR EQU 10H
141
142ASSUME DS:DG
143
144NODOT: ;No .
145 PUSH AX ;Return from SRCH
146 CMP [NOISY],0
147 JNZ DOEXTMES1
148 CALL SUBERRP
149 JMP SHORT MESD1
150DOEXTMES1:
151 MOV SI,OFFSET DG:DOTMES
152 CALL PRINTCURRDIRERR
153 MOV DX,OFFSET DG:NDOTMES
154 CALL EPRINT
155MESD1:
156 XOR AX,AX
157 PUSH BX
158 PUSH BP
159 CALL GETENT
160 POP BP
161 PUSH BP
162 CMP BYTE PTR [DI],0E5H ;Have place to put .?
163 JNZ CANTREC ;Nope
164 MOV SI,OFFSET DG:DOTENT
165 MOV CX,11
166 REP MOVSB ;Name
167 PUSH AX
168 MOV AL,ISDIR
169 STOSB ;Attribute
170 ADD DI,10
171 XOR AX,AX
172 STOSW ;Date = 0
173 STOSW ;Time = 0
174 MOV AX,[BP+6]
175 STOSW ;Alloc #
176 XOR AX,AX
177 STOSW
178 STOSW ;Size
179 POP AX
180 MOV [HAVFIX],1 ;Have a fix
181 CMP [DOFIX],0
182 JZ DOTGOON ;No fix if not F
183 MOV CX,1
184 CALL DOINT26
185 JMP SHORT DOTGOON
186
187CANTREC:
188 INC [DOTSNOGOOD]
189 CMP [NOISY],0
190 JZ DOTGOON
191 MOV DX,OFFSET DG:NORECDOT
192 CALL EPRINT
193DOTGOON:
194 POP BP
195 POP BX
196 POP AX
197 MOV SI,OFFSET DG:DIRBUF
198 JMP CHKDOTDOT ;Go look for ..
199
200NODDOT: ;No ..
201 PUSH AX ;Return from SRCH
202 CMP [NOISY],0
203 JNZ DOEXTMES2
204 CALL SUBERRP
205 JMP SHORT MESD2
206DOEXTMES2:
207 MOV SI,OFFSET DG:PARSTR
208 CALL PRINTCURRDIRERR
209 MOV DX,OFFSET DG:NDOTMES
210 CALL EPRINT
211MESD2:
212 MOV AX,1
213 PUSH BX
214 PUSH BP
215 CALL GETENT
216 POP BP
217 PUSH BP
218 CMP BYTE PTR [DI],0E5H ;Place to put it?
219 JNZ CANTREC2 ;Nope
220 MOV SI,OFFSET DG:DDOTENT
221 MOV CX,11
222 REP MOVSB ;Name
223 PUSH AX
224 MOV AL,ISDIR
225 STOSB ;Attribute
226 ADD DI,10
227 XOR AX,AX
228 STOSW ;Date
229 STOSW ;Time
230 MOV AX,[BP+4]
231 STOSW ;Alloc #
232 XOR AX,AX
233 STOSW
234 STOSW ;Size
235 POP AX
236 MOV [HAVFIX],1 ;Got a fix
237 CMP [DOFIX],0
238 JZ NFIX ;No fix if no F, carry clear
239 MOV CX,1
240 CALL DOINT26
241NFIX:
242 POP BP
243 POP BX
244 POP AX
245 MOV SI,OFFSET DG:DIRBUF
246 JMP ROOTDIR ;Process files
247
248CANTREC2:
249 POP BP
250 POP BX
251 POP AX
252 CMP [NOISY],0
253 JZ DOTSBAD
254 MOV DX,OFFSET DG:NORECDDOT
255 CALL EPRINT
256 JMP DOTSBAD
257
258NULLDIRERR:
259 CMP [NOISY],0
260 JNZ DOEXTMES3
261 CALL SUBERRP
262 JMP SHORT DOTSBAD
263DOEXTMES3:
264 MOV SI,OFFSET DG:NUL
265 CALL PRINTCURRDIRERR
266 MOV DX,OFFSET DG:NULDMES
267 CALL EPRINT
268DOTSBAD: ;Can't recover
269 MOV DX,OFFSET DG:BADTARG2
270 CALL EPRINT
271 CALL DOTDOTHARDWAY
272 INC [DOTSNOGOOD]
273 JMP DIRDONE ;Terminate tree walk at this level
274
275ROOTDIRJ: JMP ROOTDIR
276
277PAGE
278DIRPROC:
279;Recursive tree walker
280;dirproc(self,parent)
281 MOV [DOTSNOGOOD],0 ;Init to dots OK
282 MOV [ERRSUB],0 ;No subdir errors yet
283 PUSH BP ;Save frame pointer
284 MOV BP,SP
285 SUB SP,SFCBSIZ ;Only local var
286 CMP SP,[STACKLIM]
287 JA STACKISOK
288 MOV BX,OFFSET DG:STACKMES ;Out of stack
289 JMP FATAL
290STACKISOK:
291 CMP [NOISY],0
292 JZ NOPRINT
293 CMP [SECONDPASS],0
294 JNZ NOPRINT ;Don't do it again on second pass
295 MOV DX,OFFSET DG:DIRECMES ;Tell user where we are
296 CALL PRINT
297 MOV SI,OFFSET DG:NUL
298 CALL PRINTCURRDIR
299 CALL DOCRLF
300NOPRINT:
301 MOV SI,OFFSET DG:ALLFILE
302 MOV DI,SP
303 PUSH DI
304 MOV CX,SFCBSIZ
305 REP MOVSB ;Initialize search FCB
306 POP DX
307 MOV BX,DX ;BX points to SRCH FCB
308 MOV AH,DIR_SEARCH_FIRST
309 INT 21H
310 CMP WORD PTR [BP+6],0 ;Am I the root
311 JZ ROOTDIRJ ;Yes, no . or ..
312 OR AL,AL
313 JZ NONULLDERR
314 JMP NULLDIRERR ;Dir is empty!
315NONULLDERR:
316 MOV SI,OFFSET DG:DIRBUF + DIRNAM
317 MOV DI,OFFSET DG:DOTENT
318 MOV CX,11
319 REP CMPSB
320 JZ DOTOK ;Got a . as first entry
321 JMP NODOT ;No .
322DOTOK:
323 MOV SI,OFFSET DG:DIRBUF
324 MOV AL,[SI.DIRATT]
325 TEST AL,ISDIR
326 JNZ DATTOK
327 PUSH SI ;. not a dir?
328 MOV SI,OFFSET DG:DOTMES
329 MOV DX,OFFSET DG:BADATT
330 CALL DOTCOMBMES
331 POP SI
332 OR [SI.DIRATT],ISDIR
333 CALL FIXENT ;Fix it
334DATTOK:
335 MOV AX,[SI.DIRCLUS]
336 CMP AX,[BP+6] ;. link = MYSELF?
337 JZ DLINKOK
338 PUSH SI ;Link messed up
339 MOV SI,OFFSET DG:DOTMES
340 MOV DX,OFFSET DG:CLUSBAD
341 CALL DOTCOMBMES
342 POP SI
343 MOV AX,[BP+6]
344 MOV [SI.DIRCLUS],AX
345 CALL FIXENT ;Fix it
346DLINKOK:
347 MOV AX,WORD PTR [SI.DIRESIZ]
348 OR AX,AX
349 JNZ BADDSIZ
350 MOV AX,WORD PTR [SI.DIRESIZ+2]
351 OR AX,AX
352 JZ DSIZOK
353BADDSIZ: ;Size should be zero
354 PUSH SI
355 MOV SI,OFFSET DG:DOTMES
356 MOV DX,OFFSET DG:BADSIZM
357 CALL DOTCOMBMES
358 POP SI
359 XOR AX,AX
360 MOV WORD PTR [SI.DIRESIZ],AX
361 MOV WORD PTR [SI.DIRESIZ+2],AX
362 CALL FIXENT ;Fix it
363DSIZOK: ;Get next (should be ..)
364 MOV DX,BX
365 MOV AH,DIR_SEARCH_NEXT
366 INT 21H
367CHKDOTDOT: ;Come here after . failure
368 OR AL,AL
369 JZ DOTDOTOK
370NODDOTJ: JMP NODDOT ;No ..
371DOTDOTOK:
372 MOV SI,OFFSET DG:DIRBUF + DIRNAM
373 MOV DI,OFFSET DG:DDOTENT
374 MOV CX,11
375 REP CMPSB
376 JNZ NODDOTJ ;No ..
377 MOV SI,OFFSET DG:DIRBUF
378 MOV AL,[SI.DIRATT]
379 TEST AL,ISDIR
380 JNZ DDATTOK ;.. must be a dir
381 PUSH SI
382 MOV SI,OFFSET DG:PARSTR
383 MOV DX,OFFSET DG:BADATT
384 CALL DOTCOMBMES
385 POP SI
386 OR [SI.DIRATT],ISDIR
387 CALL FIXENT ;Fix it
388DDATTOK:
389 PUSH SI
390 MOV AX,[SI.DIRCLUS]
391 CMP AX,[BP+4] ;.. link must be PARENT
392 JZ DDLINKOK
393 MOV SI,OFFSET DG:PARSTR
394 MOV DX,OFFSET DG:CLUSBAD
395 CALL DOTCOMBMES
396 POP SI
397 MOV AX,[BP+4]
398 MOV [SI.DIRCLUS],AX
399 CALL FIXENT ;Fix it
400DDLINKOK:
401 MOV AX,WORD PTR [SI.DIRESIZ]
402 OR AX,AX
403 JNZ BADDDSIZ
404 MOV AX,WORD PTR [SI.DIRESIZ+2]
405 OR AX,AX
406 JZ DDSIZOK
407BADDDSIZ: ;.. size should be 0
408 PUSH SI
409 MOV SI,OFFSET DG:PARSTR
410 MOV DX,OFFSET DG:BADSIZM
411 CALL DOTCOMBMES
412 POP SI
413 XOR AX,AX
414 MOV WORD PTR [SI.DIRESIZ],AX
415 MOV WORD PTR [SI.DIRESIZ+2],AX
416 CALL FIXENT ;Fix it
417DDSIZOK:
418 MOV DX,BX ;Next entry
419 MOV AH,DIR_SEARCH_NEXT
420 INT 21H
421
422ROOTDIR: ;Come here after .. failure also
423 OR AL,AL
424 JZ MOREDIR ;More to go
425 CMP WORD PTR [BP+6],0 ;Am I the root?
426 JZ DIRDONE ;Yes, no chdir
427 MOV DX,OFFSET DG:PARSTR
428 MOV AH,CHDIR ;Chdir to parent (..)
429 INT 21H
430 JNC DIRDONE ;Worked
431 CMP [NOISY],0
432 JZ DODDH
433 MOV SI,OFFSET DG:NUL
434 CALL PRINTCURRDIRERR
435 MOV DX,OFFSET DG:CDDDMES
436 CALL EPRINT
437DODDH:
438 CALL DOTDOTHARDWAY ;Try again
439DIRDONE:
440 MOV SP,BP ;Pop local vars
441 POP BP ;Restore frame
442 RET 4 ;Pop args
443
444MOREDIR:
445 MOV SI,OFFSET DG:DIRBUF
446 TEST [SI.DIRATT],ISDIR
447 JNZ NEWDIR ;Is a new directory
448 CMP [SECONDPASS],0
449 JZ FPROC1 ;First pass
450 CALL CROSSLOOK ;Check for cross links
451 JMP DDSIZOK ;Next
452FPROC1:
453 CMP [NOISY],0
454 JZ NOPRINT2
455 MOV DX,OFFSET DG:INDENT ;Tell user where we are
456 CALL PRINT
457 PUSH BX
458 MOV BX,SI
459 CALL PRINTTHISEL
460 CALL DOCRLF
461 MOV SI,BX
462 POP BX
463NOPRINT2:
464 MOV AL,81H ;Head of file
465 CALL MARKFAT
466 TEST [SI.DIRATT],VOLIDA
467 JNZ HIDENFILE ;VOL ID counts as hidden
468 TEST [SI.DIRATT],HIDDN
469 JZ NORMFILE
470HIDENFILE:
471 INC [HIDCNT]
472 ADD [HIDSIZ],CX
473 JMP DDSIZOK ;Next
474NORMFILE:
475 INC [FILCNT]
476 ADD [FILSIZ],CX
477 JMP DDSIZOK ;Next
478
479NEWDIR:
480 CMP [SECONDPASS],0
481 JZ DPROC1
482 CALL CROSSLOOK ;Check for cross links
483 JMP SHORT DPROC2
484DPROC1:
485 MOV AL,82H ;Head of dir
486 CALL MARKFAT
487 INC [DIRCNT]
488 ADD [DIRSIZ],CX
489 CMP [ZEROTRUNC],0
490 JZ DPROC2 ;Dir not truncated
491CONVDIR:
492 AND [SI.DIRATT],NOT ISDIR ;Turn into file
493 CALL FIXENT
494 JMP DDSIZOK ;Next
495DPROC2:
496 PUSH [ERRSUB]
497 PUSH BX ;Save my srch FCB pointer
498 PUSH [SI.DIRCLUS] ;MYSELF for next directory
499 PUSH [BP+6] ;His PARENT is me
500 ADD SI,DIRNAM
501 MOV DI,OFFSET DG:NAMBUF
502 PUSH DI
503 CALL FCB_TO_ASCZ
504 POP DX
505 MOV AH,CHDIR ;CHDIR to new dir
506 INT 21H
507 JC CANTTARG ;Barfed
508 CALL DIRPROC
509 POP BX ;Get my SRCH FCB pointer back
510 POP [ERRSUB]
511 CMP [DOTSNOGOOD],0
512 JNZ ASKCONV
513 JMP DDSIZOK ;Next
514
515CANTTARG:
516 POP AX ;Clean stack
517 POP AX
518 POP AX
519 POP AX
520 PUSH DX ;Save pointer to bad DIR
521 MOV DX,OFFSET DG:BADTARG1
522 CALL EPRINT
523 POP SI ;Pointer to bad DIR
524 CALL PRINTCURRDIRERR
525 MOV DX,OFFSET DG:BADTARG2
526 CALL EPRINT
527DDSIZOKJ: JMP DDSIZOK ;Next
528
529ASKCONV:
530 CMP [SECONDPASS],0
531 JNZ DDSIZOKJ ;Leave on second pass
532 MOV DX,OFFSET DG:PTRANDIR
533 CMP [NOISY],0
534 JNZ PRINTTRMES
535 MOV DX,OFFSET DG:PTRANDIR2
536PRINTTRMES:
537 CALL PROMPTYN ;Ask user what to do
538 JNZ DDSIZOKJ ;User say leave alone
539 PUSH BP
540 PUSH BX
541 MOV AX,[BX+THISENT] ;Entry number
542 CALL GETENT ;Get the entry
543 MOV SI,DI
544 MOV DI,OFFSET DG:DIRBUF
545 PUSH DI
546 ADD DI,DIRNAM
547 MOV CX,32
548 REP MOVSB ;Transfer entry to DIRBUF
549 POP SI
550 PUSH SI
551 MOV SI,[SI.DIRCLUS] ;First cluster
552 CALL GETFILSIZ
553 POP SI
554 POP BX
555 POP BP
556 MOV WORD PTR [SI.DIRESIZ],AX ;Fix entry
557 MOV WORD PTR [SI.DIRESIZ+2],DX
558 JMP CONVDIR
559
560SUBTTL FAT Look routines
561PAGE
562CROSSLOOK:
563;Same as MRKFAT only simpler for pass 2
564 MOV [SRFCBPT],BX
565 MOV BX,SI
566 MOV SI,[BX.DIRCLUS]
567 CALL CROSSCHK
568 JNZ CROSSLINKJ
569CHLP:
570 PUSH BX
571 CALL UNPACK
572 POP BX
573 XCHG SI,DI
574 CMP SI,0FF8H
575 JAE CHAINDONEJ
576 CALL CROSSCHK
577 JZ CHLP
578CROSSLINKJ: JMP SHORT CROSSLINK
579
580CROSSCHK:
581 MOV DI,[FATMAP]
582 ADD DI,SI
583 MOV AH,[DI]
584 TEST AH,10H
585 RET
586
587NOCLUSTERSJ: JMP NOCLUSTERS
588
589MARKFAT:
590; Map the file and perform checks
591; SI points to dir entry
592; AL is head mark with app type
593; On return CX is number of clusters
594; BX,SI preserved
595; ZEROTRUNC is non zero if the file was trimmed to zero length
596; ISCROSS is non zero if the file is cross linked
597
598 MOV [ZEROTRUNC],0 ;Initialize
599 MOV [ISCROSS],0
600 MOV [SRFCBPT],BX
601 MOV BX,SI
602 XOR CX,CX
603 MOV SI,[BX.DIRCLUS]
604 CMP SI,2
605 JB NOCLUSTERSJ ;Bad cluster # or nul file (SI = 0)
606 CMP SI,[MCLUS]
607 JA NOCLUSTERSJ ;Bad cluster #
608 PUSH BX
609 CALL UNPACK
610 POP BX
611 JZ NOCLUSTERSJ ;Bad cluster (it is marked free)
612 CALL MARKMAP
613 JNZ CROSSLINK
614 AND AL,7FH ;Turn off head bit
615CHASELOOP:
616 PUSH BX
617 CALL UNPACK
618 POP BX
619 INC CX
620 XCHG SI,DI
621 CMP SI,0FF8H
622 JAE CHAINDONE
623 CMP SI,2
624 JB MRKBAD
625 CMP SI,[MCLUS]
626 JBE MRKOK
627MRKBAD: ;Bad cluster # in chain
628 PUSH CX
629 PUSH DI
630 CALL PRINTTHISELERR
631 MOV DX,OFFSET DG:BADCHAIN
632 CALL EPRINT
633 POP SI
634 MOV DX,0FFFH ;Insert EOF
635 PUSH BX
636 CALL PACK
637 POP BX
638 POP CX
639CHAINDONEJ: JMP SHORT CHAINDONE
640
641MRKOK:
642 CALL MARKMAP
643 JZ CHASELOOP
644CROSSLINK: ;File is cross linked
645 INC [ISCROSS]
646 CMP [SECONDPASS],0
647 JZ CHAINDONE ;Crosslinks only on second pass
648 PUSH SI ;Cluster number
649 CALL PRINTTHISEL
650 CALL DOCRLF
651 MOV DX,OFFSET DG:CROSSMES_PRE
652 CALL PRINT
653 POP SI
654 PUSH BX
655 PUSH CX
656 MOV BX,OFFSET DG:CROSSMES_POST
657 XOR DI,DI
658 CALL DISP16BITS
659 POP CX
660 POP BX
661CHAINDONE:
662 TEST [BX.DIRATT],ISDIR
663 JNZ NOSIZE ;Don't size dirs
664 CMP [ISCROSS],0
665 JNZ NOSIZE ;Don't size cross linked files
666 CMP [SECONDPASS],0
667 JNZ NOSIZE ;Don't size on pass 2 (CX garbage)
668 MOV AL,[CSIZE]
669 XOR AH,AH
670 MUL [SSIZE]
671 PUSH AX ;Size in bytes of one alloc unit
672 MUL CX
673 MOV DI,DX ;Save allocation size
674 MOV SI,AX
675 SUB AX,WORD PTR [BX.DIRESIZ]
676 SBB DX,WORD PTR [BX.DIRESIZ+2]
677 JC BADFSIZ ;Size to big
678 OR DX,DX
679 JNZ BADFSIZ ;Size to small
680 POP DX
681 CMP AX,DX
682 JB NOSIZE ;Size within one Alloc unit
683 PUSH DX ;Size to small
684BADFSIZ:
685 POP DX
686 PUSH CX ;Save size of file
687 MOV WORD PTR [BX.DIRESIZ],SI
688 MOV WORD PTR [BX.DIRESIZ+2],DI
689 CALL FIXENT2 ;Fix it
690 CALL PRINTTHISELERR
691 MOV DX,OFFSET DG:BADCLUS
692 CALL EPRINT
693 POP CX ;Restore size of file
694NOSIZE:
695 MOV SI,BX
696 MOV BX,[SRFCBPT]
697 RET
698
699NOCLUSTERS:
700;File is zero length
701 OR SI,SI
702 JZ CHKSIZ ;Firclus is OK, Check size
703 MOV DX,OFFSET DG:NULNZ
704ADJUST:
705 PUSH DX
706 CALL PRINTTHISELERR
707 POP DX
708 CALL EPRINT
709 XOR SI,SI
710 MOV [BX.DIRCLUS],SI ;Set it to 0
711 MOV WORD PTR [BX.DIRESIZ],SI ;Set size too
712 MOV WORD PTR [BX.DIRESIZ+2],SI
713 CALL FIXENT2 ;Fix it
714 INC [ZEROTRUNC] ;Indicate truncation
715 JMP CHAINDONE
716
717CHKSIZ:
718 MOV DX,OFFSET DG:BADCLUS
719 CMP WORD PTR [BX.DIRESIZ],0
720 JNZ ADJUST ;Size wrong
721 CMP WORD PTR [BX.DIRESIZ+2],0
722 JNZ ADJUST ;Size wrong
723 JMP CHAINDONE ;Size OK
724
725UNPACK:
726;Cluster number in SI, Return contents in DI, BX destroyed
727;ZERO SET IF CLUSTER IS FREE
728 MOV BX,OFFSET DG:FAT
729 MOV DI,SI
730 SHR DI,1
731 ADD DI,SI
732 MOV DI,WORD PTR [DI+BX]
733 TEST SI,1
734 JZ HAVCLUS
735 SHR DI,1
736 SHR DI,1
737 SHR DI,1
738 SHR DI,1
739HAVCLUS:
740 AND DI,0FFFH
741 RET
742
743PACK:
744; SI CLUSTER NUMBER TO BE PACKED
745; DX DATA TO BE PLACED IN CLUSTER (SI)
746; BX,DX DESTROYED
747 MOV [DIRTYFAT],1 ;Set FAT dirty byte
748 MOV [HAVFIX],1 ;Indicate a fix
749 MOV BX,OFFSET DG:FAT
750 PUSH SI
751 MOV DI,SI
752 SHR SI,1
753 ADD SI,BX
754 ADD SI,DI
755 SHR DI,1
756 MOV DI,[SI]
757 JNC ALIGNED
758 SHL DX,1
759 SHL DX,1
760 SHL DX,1
761 SHL DX,1
762 AND DI,0FH
763 JMP SHORT PACKIN
764ALIGNED:
765 AND DI,0F000H
766PACKIN:
767 OR DI,DX
768 MOV [SI],DI
769 POP SI
770 RET
771
772
773
774MARKMAP:
775; Mark in AL
776; Cluster in SI
777; AL,SI,CX preserved
778; ZERO RESET IF CROSSLINK, AH IS THE MARK THAT WAS THERE
779 MOV DI,[FATMAP]
780 ADD DI,SI
781 MOV AH,[DI]
782 OR AH,AH
783 PUSH AX
784 JZ SETMARK
785 MOV AL,AH
786 INC [CROSSCNT] ;Count the crosslink
787 OR AL,10H ;Resets zero
788SETMARK:
789 MOV [DI],AL
790 POP AX
791 RET
792
793
794CHKMAP:
795;Compare FAT and FATMAP looking for badsectors orphans
796 MOV SI,[FATMAP]
797 INC SI
798 INC SI
799 MOV DX,2
800 MOV CX,[DSIZE]
801CHKMAPLP:
802 LODSB
803 OR AL,AL
804 JNZ CONTLP ;Already seen this one
805 XCHG SI,DX
806 CALL UNPACK
807 XCHG SI,DX
808 JZ CONTLP ;Free cluster
809 CMP DI,0FF7H ;Bad sector?
810 JNZ ORPHAN ;No, found an orphan
811 INC [BADSIZ]
812 MOV BYTE PTR [SI-1],4 ;Flag it
813 JMP CONTLP
814ORPHAN:
815 INC [ORPHSIZ]
816 MOV BYTE PTR [SI-1],8 ;Flag it
817CONTLP:
818 INC DX ;Next cluster
819 LOOP CHKMAPLP
820 MOV SI,[ORPHSIZ]
821 OR SI,SI
822 JZ RET18 ;No orphans
823 CALL RECOVER
824RET18: RET
825
826RECOVER:
827;free orphans or do chain recovery
828 CALL CHECKNOFMES
829 CALL DOCRLF
830 CALL CHAINREPORT
831 MOV DX,OFFSET DG:FREEMES
832 CALL PROMPTYN ;Ask user
833 JNZ NOCHAINREC
834 JMP CHAINREC
835NOCHAINREC:
836 MOV SI,[FATMAP] ;Free all orphans
837 INC SI
838 INC SI
839 MOV DX,2
840 MOV CX,[DSIZE]
841CHKMAPLP2:
842 LODSB
843 TEST AL,8
844 JZ NEXTCLUS
845 XCHG SI,DX
846 PUSH DX
847 XOR DX,DX
848 CALL PACK ;Mark as free
849 POP DX
850 XCHG SI,DX
851NEXTCLUS:
852 INC DX
853 LOOP CHKMAPLP2
854 XOR AX,AX
855 XCHG AX,[ORPHSIZ]
856 PUSH AX
857 MOV DX,OFFSET DG:FREEBYMESF_PRE
858 CMP [DOFIX],0
859 JNZ PRINTFMES
860 MOV DX,OFFSET DG:FREEBYMES_PRE
861PRINTFMES:
862 CALL PRINT
863 POP AX
864 MOV BX,OFFSET DG:FREEBYMESF_POST
865 CMP [DOFIX],0
866 JNZ DISPFRB
867 MOV BX,OFFSET DG:FREEBYMES_POST
868 MOV [LCLUS],AX
869DISPFRB:
870 CALL DISPCLUS ;Tell how much freed
871 RET
872
873FINDCHAIN:
874;Do chain recovery on orphans
875 MOV SI,[FATMAP]
876 INC SI
877 INC SI
878 MOV DX,2
879 MOV CX,[DSIZE]
880CHKMAPLP3:
881 LODSB
882 TEST AL,8 ;Orphan?
883 JZ NEXTCLUS2 ;Nope
884 TEST AL,1 ;Seen before ?
885 JNZ NEXTCLUS2 ;Yup
886 PUSH SI ;Save search environment
887 PUSH CX
888 PUSH DX
889 DEC SI
890 OR BYTE PTR [SI],81H ;Mark as seen and head
891 INC [ORPHCNT] ;Found a chain
892 MOV SI,DX
893CHAINLP:
894 CALL UNPACK
895 XCHG SI,DI
896 CMP SI,0FF8H
897 JAE CHGOON ;EOF
898 PUSH DI
899 CMP SI,2
900 JB INSERTEOF ;Bad cluster number
901 CMP SI,[MCLUS]
902 JA INSERTEOF ;Bad cluster number
903 CMP SI,DI
904 JZ INSERTEOF ;Tight loop
905 CALL CROSSCHK
906 TEST AH,8 ;Points to a non-orphan?
907 JNZ CHKCHHEAD ;Nope
908INSERTEOF:
909 POP SI ;Need to stick EOF here
910 MOV DX,0FFFH
911 CALL PACK
912 JMP SHORT CHGOON
913CHKCHHEAD:
914 TEST AH,80H ;Previosly marked head?
915 JZ ADDCHAIN ;Nope
916 AND BYTE PTR [DI],NOT 80H ;Turn off head bit
917 DEC [ORPHCNT] ;Wasn't really a head
918 POP DI ;Clean stack
919 JMP SHORT CHGOON
920ADDCHAIN:
921 TEST AH,1 ;Previosly seen?
922 JNZ INSERTEOF ;Yup, don't make a cross link
923 OR BYTE PTR [DI],1 ;Mark as seen
924 POP DI ;Clean stack
925 JMP CHAINLP ;Follow chain
926
927CHGOON:
928 POP DX ;Restore search
929 POP CX
930 POP SI
931NEXTCLUS2:
932 INC DX
933 LOOP CHKMAPLP3
934 RET
935
936CHAINREC:
937 LDS DI,[THISDPB]
938ASSUME DS:NOTHING
939 MOV CX,[DI.dpb_root_entries]
940 PUSH CS
941 POP DS
942ASSUME DS:DG
943 MOV SI,[FATMAP]
944 INC SI
945 INC SI
946 MOV DI,1
947 CALL NEXTORPH
948 PUSH SI
949 PUSH DI
950 MOV SI,DI
951 XOR AX,AX
952 MOV DX,[ORPHCNT]
953MAKFILLP:
954 PUSH AX
955 PUSH CX
956 PUSH DX
957 PUSH SI
958 CALL GETENT
959 POP SI
960 CMP BYTE PTR [DI],0E5H
961 JZ GOTENT
962 CMP BYTE PTR [DI],0
963 JNZ NEXTENT
964GOTENT:
965 MOV [HAVFIX],1 ;Making a fix
966 CMP [DOFIX],0
967 JZ ENTMADE ;Not supposed to, carry clear
968 MOV [DI+26],SI ;FIRCLUS Pointer
969 PUSH AX ;Save INT 26 data
970 PUSH DX
971 PUSH BX
972 MOV AH,DISK_RESET ;Force current state
973 INT 21H
974 MOV DX,OFFSET DG:ORPHFCB
975 MOV AH,FCB_OPEN
976OPAGAIN:
977 INT 21H
978 OR AL,AL
979 JNZ GOTORPHNAM
980 CALL MAKORPHNAM ;Try next name
981 JMP SHORT OPAGAIN
982
983GOTORPHNAM:
984 MOV SI,OFFSET DG:ORPHFCB + 1 ;ORPHFCB Now has good name
985 MOV CX,11
986 REP MOVSB
987 CALL MAKORPHNAM ;Make next name
988 XOR AX,AX
989 MOV CX,15
990 REP STOSB
991 MOV SI,[DI]
992 INC DI ;Skip FIRCLUS
993 INC DI
994 PUSH DI
995 CALL GETFILSIZ
996 POP DI
997 STOSW
998 MOV AX,DX
999 STOSW
1000 POP BX
1001 POP DX
1002 POP AX
1003 MOV CX,1
1004 CALL DOINT26
1005ENTMADE:
1006 POP DX
1007 POP CX
1008 POP AX
1009 POP DI
1010 POP SI
1011 DEC DX
1012 OR DX,DX
1013 JZ RET100
1014 CALL NEXTORPH
1015 PUSH SI
1016 PUSH DI
1017 MOV SI,DI
1018 JMP SHORT NXTORP
1019
1020NEXTENT:
1021 POP DX
1022 POP CX
1023 POP AX
1024NXTORP:
1025 INC AX
1026 LOOP MAKFILLPJ
1027 POP AX ;Clean Stack
1028 POP AX
1029 SUB [ORPHCNT],DX ;Couldn't make them all
1030 MOV DX,OFFSET DG:CREATMES
1031 CALL EPRINT
1032RET100: RET
1033
1034MAKFILLPJ: JMP MAKFILLP
1035
1036NEXTORPH:
1037 PUSH AX
1038 LODSB
1039 INC DI
1040 CMP AL,89H
1041 POP AX
1042 JZ RET100
1043 JMP SHORT NEXTORPH
1044
1045MAKORPHNAM:
1046 PUSH SI
1047 MOV SI,OFFSET DG:ORPHEXT - 1
1048NAM0:
1049 INC BYTE PTR [SI]
1050 CMP BYTE PTR [SI],'9'
1051 JLE NAMMADE
1052 MOV BYTE PTR [SI],'0'
1053 DEC SI
1054 JMP NAM0
1055
1056NAMMADE:
1057 POP SI
1058 RET
1059
1060GETFILSIZ:
1061;SI is start cluster, returns filesize as DX:AX
1062 XOR AX,AX
1063NCLUS:
1064 CALL UNPACK
1065 XCHG SI,DI
1066 INC AX
1067 CMP SI,0FF8H
1068 JAE GOTEOF
1069 CMP SI,2
1070 JAE NCLUS
1071GOTEOF:
1072 MOV BL,[CSIZE]
1073 XOR BH,BH
1074 MUL BX
1075 MUL [SSIZE]
1076 RET
1077
1078
1079
1080CHKCROSS:
1081;Check for Crosslinks, do second pass if any to find pairs
1082 MOV SI,[CROSSCNT]
1083 OR SI,SI
1084 JZ RET8 ;None
1085 CALL DOCRLF
1086 INC [SECONDPASS]
1087 XOR AX,AX
1088 PUSH AX
1089 PUSH AX
1090 CALL DIRPROC ;Do it again
1091RET8: RET
1092
1093SUBTTL AMDONE - Finish up routine
1094PAGE
1095AMDONE:
1096ASSUME DS:NOTHING
1097 CMP [DIRTYFAT],0
1098 JZ NOWRITE ;FAT not dirty
1099 CMP [DOFIX],0
1100 JZ NOWRITE ;Not supposed to fix
1101REWRITE:
1102 LDS BX,[THISDPB]
1103ASSUME DS:NOTHING
1104 MOV CL,[BX.dpb_FAT_size] ;Sectors for one fat
1105 XOR CH,CH
1106 MOV DI,CX
1107 MOV CL,[BX.dpb_FAT_count] ;Number of FATs
1108 MOV DX,[BX.dpb_first_FAT] ;First sector of FAT
1109 PUSH CS
1110 POP DS
1111ASSUME DS:DG
1112 MOV [ERRCNT],CH
1113 MOV BX,OFFSET DG:FAT
1114 MOV AL,[ALLDRV]
1115 DEC AL
1116 MOV AH,'1'
1117 PUSH CX
1118WRTLOOP:
1119 XCHG CX,DI
1120 PUSH DX
1121 PUSH CX
1122 PUSH DI
1123 PUSH AX
1124 INT 26H ;Write out the FAT
1125 MOV [HECODE],AL
1126 POP AX ;Flags
1127 JNC WRTOK
1128 INC [ERRCNT]
1129 MOV DX,OFFSET DG:BADWRITE_PRE
1130 CALL PRINT
1131 POP AX
1132 PUSH AX
1133 MOV DL,AH
1134 CALL PRTCHR
1135 MOV DX,OFFSET DG:BADWRITE_POST
1136 CALL PRINT
1137WRTOK:
1138 POP AX
1139 POP CX
1140 POP DI
1141 POP DX
1142 INC AH
1143 ADD DX,DI
1144 LOOP WRTLOOP ;Next FAT
1145 POP CX ;Number of FATs
1146 CMP CL,[ERRCNT] ;Error on all?
1147 JNZ NOWRITE ;no
1148 CALL WDSKERR
1149 JZ REWRITE
1150NOWRITE:
1151 MOV AH,DISK_RESET ;Invalidate any buffers in system
1152 INT 21H
1153 MOV DX,OFFSET DG:USERDIR ;Recover users directory
1154 MOV AH,CHDIR
1155 INT 21H
1156 CMP BYTE PTR [FRAGMENT],1 ;Check for any fragmented files?
1157 JNZ DONE ;No -- we're finished
1158 CALL CHECKFILES ;Yes -- report any fragments
1159DONE:
1160ASSUME DS:NOTHING
1161 MOV DL,[USERDEV] ;Recover users drive
1162 MOV AH,SET_DEFAULT_DRIVE
1163 INT 21H
1164 RET
1165
1166SUBTTL Routines for manipulating dir entries
1167PAGE
1168FIXENT2:
1169;Same as FIXENT only [SRFCBPT] points to the search FCB, BX points to the entry
1170 PUSH SI
1171 PUSH BX
1172 PUSH CX
1173 MOV SI,BX
1174 MOV BX,[SRFCBPT]
1175 CALL FIXENT
1176 POP CX
1177 POP BX
1178 POP SI
1179RET20: RET
1180
1181FIXENT:
1182;BX Points to search FCB
1183;SI Points to Entry to fix
1184 MOV [HAVFIX],1 ;Indicate a fix
1185 CMP [DOFIX],0
1186 JZ RET20 ;But don't do it!
1187 PUSH BP
1188 PUSH BX
1189 PUSH SI
1190 PUSH SI ;Entry pointer
1191 MOV AX,[BX+THISENT] ;Entry number
1192 CALL GETENT
1193 POP SI ;Entry pointer
1194 ADD SI,DIRNAM ;Point to start of entry
1195 MOV CX,32
1196 REP MOVSB
1197 INC CL
1198 CALL DOINT26
1199 POP SI
1200 POP BX
1201 POP BP
1202 RET
1203
1204GETENT:
1205;AX is desired entry number (in current directory)
1206;
1207;DI points to entry in SECBUF
1208;AX DX BX set to do an INT 26 to write it back out (CX must be reset to 1)
1209;ALL registers destroyed (via int 25)
1210 LDS DI,[THISDPB]
1211ASSUME DS:NOTHING
1212 MOV BX,[DI.dpb_current_dir]
1213 PUSH CS
1214 POP DS
1215ASSUME DS:DG
1216 CMP BX,0FF8H
1217 JB CLUSISOK
1218 MOV BX,OFFSET DG:BADDPBDIR ;This should never happen
1219 JMP FATAL
1220CLUSISOK:
1221 MOV CL,4
1222 SHL AX,CL
1223 XOR DX,DX
1224 SHL AX,1
1225 RCL DX,1 ;Account for overflow
1226 MOV CX,[SSIZE]
1227 AND CL,255-31 ;Must be a multiple of 32
1228 DIV CX ;DX is position in sector, AX is dir sector #
1229 OR BX,BX
1230 JZ WANTROOT
1231 DIV [CSIZE] ;AL # clusters to skip, AH position in cluster
1232 MOV CL,AL
1233 XOR CH,CH
1234 JCXZ GOTCLUS
1235 MOV SI,BX
1236SKIPLP:
1237 CALL UNPACK
1238 XCHG SI,DI
1239 LOOP SKIPLP
1240 MOV BX,SI
1241GOTCLUS:
1242 PUSH DX ;Position in sector
1243 CALL FIGREC ;Convert to sector #
1244DOROOTDIR:
1245 MOV BX,[SECBUF]
1246 MOV AL,[ALLDRV]
1247 DEC AL
1248RDRETRY:
1249 PUSH AX
1250 PUSH DX
1251 PUSH BX
1252 MOV CX,1
1253 INT 25H ;Read it
1254 MOV [HECODE],AL
1255 POP AX ;FLAGS
1256 POP BX
1257 POP DX
1258 POP AX
1259 JNC RDOK2
1260 CALL RDSKERR
1261 JZ RDRETRY
1262RDOK2:
1263 POP DI ;Offset into sector
1264 ADD DI,BX ;Add sector base offset
1265 RET
1266
1267WANTROOT:
1268 PUSH DX
1269 LDS DI,[THISDPB]
1270ASSUME DS:NOTHING
1271 MOV DX,AX
1272 ADD DX,[DI.dpb_dir_sector]
1273 PUSH CS
1274 POP DS
1275ASSUME DS:DG
1276 JMP DOROOTDIR
1277
1278CHECKNOFMES:
1279 MOV AL,1
1280 XCHG AL,[FIXMFLG]
1281 OR AL,AL
1282 JNZ RET14 ;Don't print it more than once
1283 CMP [DOFIX],0
1284 JNZ RET14 ;Don't print it if F switch specified
1285 PUSH DX
1286 MOV DX,OFFSET DG:FIXMES
1287 CALL PRINT
1288 POP DX
1289 RET
1290
1291CHECKERR:
1292 CALL CHECKNOFMES
1293 CMP [SECONDPASS],0
1294RET14: RET
1295
1296PRINTCURRDIRERR:
1297 CALL CHECKERR
1298 JNZ RET14
1299 CALL PRINTCURRDIR
1300 JMP SHORT ERREX
1301
1302PRINTTHISELERR:
1303 CALL CHECKERR
1304 JNZ RET14
1305 CALL PRINTTHISEL
1306ERREX:
1307 CALL DOCRLF
1308 RET
1309
1310PRINTTHISEL:
1311 MOV SI,BX
1312 ADD SI,DIRNAM
1313PRINTTHISEL2:
1314 MOV DI,OFFSET DG:NAMBUF
1315 PUSH DI
1316 CALL FCB_TO_ASCZ
1317 POP SI
1318PRINTCURRDIR:
1319 PUSH SI
1320 MOV DL,[ALLDRV]
1321 ADD DL,'@'
1322 CALL PRTCHR
1323 MOV DL,DRVCHAR
1324 CALL PRTCHR
1325 LDS SI,[THISDPB]
1326ASSUME DS:NOTHING
1327 CMP [SI.dpb_current_dir],0
1328 JZ CURISROOT
1329 MOV DL,[DIRCHAR]
1330 CALL PRTCHR
1331 ADD SI,dpb_dir_text
1332PCURRLP:
1333 LODSB
1334 OR AL,AL
1335 JZ CURISROOT
1336 MOV DL,AL
1337 CALL PRTCHR
1338 JMP PCURRLP
1339
1340CURISROOT:
1341 PUSH CS
1342 POP DS
1343ASSUME DS:DG
1344 POP SI
1345 CMP BYTE PTR [SI],0
1346 JZ LPDONE ;If tail string NUL, no '/'
1347 MOV DL,[DIRCHAR]
1348 CALL PRTCHR
1349ERRLOOP:
1350 LODSB
1351 OR AL,AL
1352 JZ LPDONE
1353 MOV DL,AL
1354 CALL PRTCHR
1355 JMP ERRLOOP
1356LPDONE:
1357 RET
1358
1359FATAL:
1360;Unrecoverable error
1361 MOV DX,OFFSET DG:FATALMES
1362 CALL PRINT
1363 MOV DX,BX
1364 CALL PRINT
1365 MOV DL,[USERDEV] ;At least leave on same drive
1366 MOV AH,SET_DEFAULT_DRIVE
1367 INT 21H
1368 INT 20H
1369
1370
1371INT_24_RETADDR DW OFFSET DG:INT_24_BACK
1372
1373INT_24 PROC FAR
1374ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
1375 PUSHF
1376 PUSH CS
1377 PUSH [INT_24_RETADDR]
1378 PUSH WORD PTR [HARDCH+2]
1379 PUSH WORD PTR [HARDCH]
1380 RET
1381INT_24 ENDP
1382
1383INT_24_BACK:
1384 CMP AL,2 ;Abort?
1385 JNZ IRETI
1386 CALL DONE ;Forget about directory, restore users drive
1387 INT 20H
1388IRETI:
1389 IRET
1390
1391INT_23:
1392 LDS DX,[HARDCH]
1393 MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 24H
1394 INT 21H
1395 LDS DX,[CONTCH]
1396 MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 23H
1397 INT 21H
1398 PUSH CS
1399 POP DS
1400ASSUME DS:DG
1401 MOV [FRAGMENT],0
1402RDONE:
1403 CALL NOWRITE ;Restore users drive and directory
1404 INT 20H
1405
1406CODE ENDS
1407 END CHKPROC
1408