]> wirehaze git hosting - MS-DOS.git/blob - v2.0/source/GENFOR.ASM

wirehaze git hosting

Fix typo in readme.pt-br.md
[MS-DOS.git] / v2.0 / source / GENFOR.ASM
1 ; Generic FORMAT module for any ms-dos disk erases the directory,
2 ; zeros FAT, and marks bad sectors
3
4 INCLUDE DOST:DOSSYM.ASM
5
6 CODE SEGMENT PUBLIC 'CODE'
7
8 ASSUME CS:CODE,DS:CODE,ES:CODE
9
10 PUBLIC FATID,STARTSECTOR,SWITCHLIST,FREESPACE,FATSPACE
11 PUBLIC INIT,DISKFORMAT,BADSECTOR,DONE,WRTFAT,HARDFLAG
12 EXTRN SWITCHMAP:WORD,DRIVE:BYTE
13
14 WRTFAT:
15 MOV AH,GET_DPB
16 MOV DL,[DRIVE]
17 INC DL ;A = 1
18 INT 21H ;FORCE A FATREAD
19 PUSH CS
20 POP DS
21 MOV AL,[FATCNT]
22 MOV [CURCNT],AL ;SET UP FAT COUNT
23 MOV AX,[FATSTART]
24 MOV [COUNT],AX
25 FATLOOP:
26 MOV AL,BYTE PTR DRIVE
27 CBW
28 MOV CX,[FATSIZE]
29 MOV DX,[COUNT]
30 MOV BX,[FATSPACE]
31 INT 26H
32 POP AX
33 JC GORET
34 MOV CX,[FATSIZE]
35 ADD [COUNT],CX
36 DEC BYTE PTR [CURCNT]
37 JNZ FATLOOP
38 CLC ;Good return
39 GORET:
40 RET
41
42 FATSIZE DW ?
43 FATSTART DW ?
44 COUNT DW ?
45 STARTSECTOR DW ?
46 SPC DB ? ;SECTORS PER CLUSTER
47 FATCNT DB ? ;NUMBER OF FATS ON THIS DRIVE
48 CURCNT DB ?
49 DSKSIZE DW ? ;NUMBER OF SECTORS ON THE DRIVE
50 START DW 0 ;CURRENT TEST SECTOR
51
52 INIT:
53 MOV AH,GET_DPB
54 MOV DL,[DRIVE]
55 INC DL ;A = 1
56 INT 21H ;FORCE A FATREAD
57 MOV AL,[BX+4] ;SECTORS PER CLUSTER - 1
58 INC AL
59 MOV CH,AL ;CH = SECTORS PER CLUSTER
60 CBW
61 MOV BP,[BX+0DH] ;MAXCLUS + 1
62 DEC BP
63 MUL BP
64 MOV BP,AX
65 ADD BP,[BX+0BH] ;BP = NUMBER OF SECTORS ON THE DISK
66 MOV AL,[BX+0FH] ;GET SIZE OF FAT IN SECTORS
67 MOV AH,[BX+8] ;GET NUMBER OF FATS
68 MOV DX,[BX+6] ;FIRST SECTOR OF FAT
69 MOV CL,[BX+16H] ;FATID BYTE
70 MOV SI,[BX+2] ;SECTOR SIZE
71 MOV BX,[BX+0BH] ;FIRST SECTOR OF DATA
72 PUSH CS
73 POP DS
74 MOV [FATCNT],AH
75 MOV [DSKSIZE],BP
76 MOV [SPC],CH
77 MOV [FATSTART],DX
78 MOV [ENDLOC],CL
79 MOV [FATID],CL
80 MOV [STARTSECTOR],BX
81 XOR AH,AH
82 MOV [FATSIZE],AX
83 MUL SI ;AX = SIZE OF FAT
84 ADD [FREESPACE],AX
85 ADD [BUFFER],AX
86 MOV AX,BX
87 MUL SI
88 ADD [FREESPACE],AX ;AX = SIZE OF TEMP BUFFER
89 DISKFORMAT:
90 DONE:
91 XOR AX,AX
92 CLC
93 RET
94
95 BADSECTOR:
96 MOV DX,[START]
97 CMP DX,[DSKSIZE]
98 JAE DONE
99
100 MOV AL,[DRIVE]
101 MOV CL,[SPC] ;READ ONE ALLOCATIONS WORTH
102 XOR CH,CH
103 CMP BYTE PTR [FIRSTFLAG],0
104 JZ SETBX
105 MOV CX,[STARTSECTOR] ;FIRST TIME THROUGH READ SYSTEM AREA
106 MOV BYTE PTR [FIRSTFLAG],0
107 MOV DX,[START]
108 SETBX: MOV BX,[BUFFER]
109 PUSH CX
110 INT 25H ;TRY TO READ
111 POP AX ;CLEAN UP STACK
112 POP CX
113 JC GOTBAD ;KEEP LOOKING FOR BADSECTORS
114 ADD [START],CX
115 JMP BADSECTOR
116
117 GOTBAD:
118 MOV AX,CX
119 MOV BX,[START]
120 ADD [START],AX ;SET UP FOR NEXT CALL
121 CLC
122 RET
123
124 FIRSTFLAG DB 1 ;1 = FIRST CALL TO BADSECTOR
125 HARDFLAG DB 1
126 FATID DB 0FEH
127 SWITCHLIST DB 3,"OVS"
128 BUFFER DW ENDLOC
129 FREESPACE DW ENDLOC
130 FATSPACE DW ENDLOC
131 ENDLOC LABEL BYTE
132 DB 0FEH,0FFH,0FFH
133
134 CODE ENDS
135 END
136