mirror of https://github.com/microsoft/MS-DOS.git
136 lines
4.0 KiB
NASM
136 lines
4.0 KiB
NASM
|
; Generic FORMAT module for any ms-dos disk erases the directory,
|
|||
|
; zeros FAT, and marks bad sectors
|
|||
|
|
|||
|
INCLUDE DOST:DOSSYM.ASM
|
|||
|
|
|||
|
CODE SEGMENT PUBLIC 'CODE'
|
|||
|
|
|||
|
ASSUME CS:CODE,DS:CODE,ES:CODE
|
|||
|
|
|||
|
PUBLIC FATID,STARTSECTOR,SWITCHLIST,FREESPACE,FATSPACE
|
|||
|
PUBLIC INIT,DISKFORMAT,BADSECTOR,DONE,WRTFAT,HARDFLAG
|
|||
|
EXTRN SWITCHMAP:WORD,DRIVE:BYTE
|
|||
|
|
|||
|
WRTFAT:
|
|||
|
MOV AH,GET_DPB
|
|||
|
MOV DL,[DRIVE]
|
|||
|
INC DL ;A = 1
|
|||
|
INT 21H ;FORCE A FATREAD
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV AL,[FATCNT]
|
|||
|
MOV [CURCNT],AL ;SET UP FAT COUNT
|
|||
|
MOV AX,[FATSTART]
|
|||
|
MOV [COUNT],AX
|
|||
|
FATLOOP:
|
|||
|
MOV AL,BYTE PTR DRIVE
|
|||
|
CBW
|
|||
|
MOV CX,[FATSIZE]
|
|||
|
MOV DX,[COUNT]
|
|||
|
MOV BX,[FATSPACE]
|
|||
|
INT 26H
|
|||
|
POP AX
|
|||
|
JC GORET
|
|||
|
MOV CX,[FATSIZE]
|
|||
|
ADD [COUNT],CX
|
|||
|
DEC BYTE PTR [CURCNT]
|
|||
|
JNZ FATLOOP
|
|||
|
CLC ;Good return
|
|||
|
GORET:
|
|||
|
RET
|
|||
|
|
|||
|
FATSIZE DW ?
|
|||
|
FATSTART DW ?
|
|||
|
COUNT DW ?
|
|||
|
STARTSECTOR DW ?
|
|||
|
SPC DB ? ;SECTORS PER CLUSTER
|
|||
|
FATCNT DB ? ;NUMBER OF FATS ON THIS DRIVE
|
|||
|
CURCNT DB ?
|
|||
|
DSKSIZE DW ? ;NUMBER OF SECTORS ON THE DRIVE
|
|||
|
START DW 0 ;CURRENT TEST SECTOR
|
|||
|
|
|||
|
INIT:
|
|||
|
MOV AH,GET_DPB
|
|||
|
MOV DL,[DRIVE]
|
|||
|
INC DL ;A = 1
|
|||
|
INT 21H ;FORCE A FATREAD
|
|||
|
MOV AL,[BX+4] ;SECTORS PER CLUSTER - 1
|
|||
|
INC AL
|
|||
|
MOV CH,AL ;CH = SECTORS PER CLUSTER
|
|||
|
CBW
|
|||
|
MOV BP,[BX+0DH] ;MAXCLUS + 1
|
|||
|
DEC BP
|
|||
|
MUL BP
|
|||
|
MOV BP,AX
|
|||
|
ADD BP,[BX+0BH] ;BP = NUMBER OF SECTORS ON THE DISK
|
|||
|
MOV AL,[BX+0FH] ;GET SIZE OF FAT IN SECTORS
|
|||
|
MOV AH,[BX+8] ;GET NUMBER OF FATS
|
|||
|
MOV DX,[BX+6] ;FIRST SECTOR OF FAT
|
|||
|
MOV CL,[BX+16H] ;FATID BYTE
|
|||
|
MOV SI,[BX+2] ;SECTOR SIZE
|
|||
|
MOV BX,[BX+0BH] ;FIRST SECTOR OF DATA
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV [FATCNT],AH
|
|||
|
MOV [DSKSIZE],BP
|
|||
|
MOV [SPC],CH
|
|||
|
MOV [FATSTART],DX
|
|||
|
MOV [ENDLOC],CL
|
|||
|
MOV [FATID],CL
|
|||
|
MOV [STARTSECTOR],BX
|
|||
|
XOR AH,AH
|
|||
|
MOV [FATSIZE],AX
|
|||
|
MUL SI ;AX = SIZE OF FAT
|
|||
|
ADD [FREESPACE],AX
|
|||
|
ADD [BUFFER],AX
|
|||
|
MOV AX,BX
|
|||
|
MUL SI
|
|||
|
ADD [FREESPACE],AX ;AX = SIZE OF TEMP BUFFER
|
|||
|
DISKFORMAT:
|
|||
|
DONE:
|
|||
|
XOR AX,AX
|
|||
|
CLC
|
|||
|
RET
|
|||
|
|
|||
|
BADSECTOR:
|
|||
|
MOV DX,[START]
|
|||
|
CMP DX,[DSKSIZE]
|
|||
|
JAE DONE
|
|||
|
|
|||
|
MOV AL,[DRIVE]
|
|||
|
MOV CL,[SPC] ;READ ONE ALLOCATIONS WORTH
|
|||
|
XOR CH,CH
|
|||
|
CMP BYTE PTR [FIRSTFLAG],0
|
|||
|
JZ SETBX
|
|||
|
MOV CX,[STARTSECTOR] ;FIRST TIME THROUGH READ SYSTEM AREA
|
|||
|
MOV BYTE PTR [FIRSTFLAG],0
|
|||
|
MOV DX,[START]
|
|||
|
SETBX: MOV BX,[BUFFER]
|
|||
|
PUSH CX
|
|||
|
INT 25H ;TRY TO READ
|
|||
|
POP AX ;CLEAN UP STACK
|
|||
|
POP CX
|
|||
|
JC GOTBAD ;KEEP LOOKING FOR BADSECTORS
|
|||
|
ADD [START],CX
|
|||
|
JMP BADSECTOR
|
|||
|
|
|||
|
GOTBAD:
|
|||
|
MOV AX,CX
|
|||
|
MOV BX,[START]
|
|||
|
ADD [START],AX ;SET UP FOR NEXT CALL
|
|||
|
CLC
|
|||
|
RET
|
|||
|
|
|||
|
FIRSTFLAG DB 1 ;1 = FIRST CALL TO BADSECTOR
|
|||
|
HARDFLAG DB 1
|
|||
|
FATID DB 0FEH
|
|||
|
SWITCHLIST DB 3,"OVS"
|
|||
|
BUFFER DW ENDLOC
|
|||
|
FREESPACE DW ENDLOC
|
|||
|
FATSPACE DW ENDLOC
|
|||
|
ENDLOC LABEL BYTE
|
|||
|
DB 0FEH,0FFH,0FFH
|
|||
|
|
|||
|
CODE ENDS
|
|||
|
END
|
|||
|
|