MS-DOS/v2.0/source/GENFOR.ASM

136 lines
4.0 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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