📄 format.asm
字号:
page 84,132
; SCCSID = @(#)format.asm 1.26 85/10/20
; SCCSID = @(#)format.asm 1.26 85/10/20
;***************************************************************
;
; 86-DOS FORMAT DISK UTILITY
;
; This routine formats a new disk,clears the FAT and DIRECTORY then
; optionally copies the SYSTEM and COMMAND.COM to this new disk
;
; SYNTAX: FORMAT [drive][/switch1][/switch2]...[/switch16]
;
; Regardless of the drive designator , the user will be prompted to
; insert the diskette to be formatted.
;
;***************************************************************
; 5/12/82 ARR Mod to ask for volume ID
; 5/19/82 ARR Fixed rounding bug in CLUSCAL:
; REV 1.5
; Added rev number message
; Added dir attribute to DELALL FCB
; REV 2.00
; Redone for 2.0
; REV 2.10
; 5/1/83 ARR Re-do to transfer system on small memory systems
; REV 2.20
; 6/17/83 system size re-initialization bug -- mjb001
; Rev 2.25
; 8/31/83 16-bit fat insertion
; Rev 2.26
; 11/2/83 MZ fix signed compare problems for bad sectors
; Rev 2.27
; 11/8/83 EE current directories are always saved and restored
; Rev 2.28
; 11/9/83 NP Printf and changed to an .EXE file
; Rev 2.29
; 11/11/83 ARR Fixed ASSIGN detection to use NameTrans call to see
; if drive letter remapped. No longer IBM only
; Rev 2.30
; 11/13/83 ARR SS does NOT = CS, so all use of BP needs CS override
; Rev 2.31
; 12/27/83 ARR REP STOSB instruction at Clean: changed to be
; sure ES = CS.
code segment public 'CODE'
code ends
printf_code segment public
extrn printf:far
printf_code ends
stack segment stack
db (362 - 80h) + 100H dup (?) ; (362-80h) is the additional IBM ROM
; overhead recently discovered by them.
stack ends
data segment public 'DATA'
data ends
public end_of_memory
_end segment public para 'DATA'
end_of_memory label byte
_end ends
code segment
assume cs:code,ds:nothing,es:nothing,ss:stack
;-------------------------------------------------------------------------------
; Define as public for debugging
; procedures
public GetSize
public AddToSystemSize
public Phase1Initialisation
public SetStartSector
public SetfBigFat
public Phase2Initialisation
public DiskFormat
public BadSector
public FormatTrack
public DisplayCurrentTrack
public NextTrack
public WriteFileSystem
public Done
public CurrentLogicalSector
public PrintErrorAbort
public GetDeviceParameters
public SetDeviceParameters
public START
public GOTBADDOS
public OKDOS
public BogusDrive
public DRVGD
public DRVSPEC
public NXTSWT
public GETPARM
public GETCHR
public INVALID
public SCANOFF
public MEMERR
public SAVSWT
public NotNet
public RE_ASSIGN
public NO_ASSIGN
public FatAllocated
public MEMERRJ
public MEM_OK
public RDFRST
public NEEDSYS
public INITCALL
public SWITCHCHK
public SYSLOOP
public FRMTPROB
public GETTRK
public TRKFND
public CLRTEST
public CMPTRKS
public PACKIT
public BadClus
public DoBig
public DoSet
public DRTFAT
public CLEARED
public LOUSE
public LOUSEP
public FATWRT
public SYSOK
public STATUS
public REPORTC
public ONCLUS
public MORE
public FEXIT
public SYSPRM
public fexitJ
public DoPrompt
public TARGPRM
public IsRemovable
public CheckRemove
public IsRemove
public NotRemove
public DSKPRM
public GOPRNIT
public crlf
public PrintString
public std_printf
public VOLID
public VRET
public DOVOL
public VOL_LOOP
public GOOD_CREATE
public VOLRET
public READDOS
public RDFILS
public FILESDONE
public CLSALL
public GOTBIOS
public GOTDOS
public CLSALLJ
public GOTCOM
public WRITEDOS
public GOTALLBIO
public BIOSDONE
public GOTNDOS
public PARTDOS
public GOTALLDOS
public DOSDONE
public PARTCOM
public GOTALLCOM
public COMDONE
public MAKEFIL
public CheckMany
public CLOSETARG
public IOLOOP
public GOTTARG
public GSYS
public TESTSYS
public GETOFFS
; public TESTSYSDISK ; dcl 8/23/86
public SETBIOS
public BIOSCLS
public SETBIOSSIZ
public DOSOPNOK
public DOSCLS
public SETDOSSIZ
public GotComHand
public COMCLS
public SETCOMSIZ
public GETFSIZ
public READFILE
public WRITEFILE
public FILIO
public NORMIO
public IORETP
public IORET
public NORMALIZE
public GotDeviceParameters
public SmallFAT
public LoadSectorTable
public NotBigTotalSectors
public NotBig
public FormatLoop
public FormatDone
public FailDiskFormat
public FormatReallyFailed
public ContinueFormat
public ReportBadTrack
public NoMoreTracks
public ExitNextTrack
public ThatsAllFolks
public WriteFATloop
public WriteDIRloop
public CanNotWriteFAT
public CanNotWriteDirectory
public ControlC_Handler
; bytes
public fBigFat
public formatError
public ROOTSTR
public DBLFLG
public DRIVE
public FILSTAT
public USERDIRS
public VOLFCB
public VOLNAM
public TRANSRC
public TRANDST
public INBUFF
public driveLetter
public systemDriveLetter
; words
public startSector
public fatSpace
public firstHead
public firstCylinder
public tracksLeft
public tracksPerDisk
public sectorsInRootDirectory
public directorySector
public printStringPointer
public MSTART
public MSIZE
public TempHandle
public BEGSEG
public SWITCHMAP
public SWITCHCOPY
public FAT
public CLUSSIZ
public SECSIZ
public SYSTRKS
public SECTORS
public ptr_msgHardDiskWarning
public ptr_msgInsertDisk
public ptr_msgReInsertDisk
public ptr_msgInsertDosDisk
public ptr_msgCurrentTrack
public currentHead
public currentCylinder
; other
public deviceParameters
public formatPacket
;-------------------------------------------------------------------------------
data segment
extrn msgAssignedDrive:byte
extrn msgBadDosVersion:byte
extrn msgDirectoryWriteError:byte
extrn msgFormatComplete:byte
extrn msgFormatNotSupported:byte
extrn msgFATwriteError:byte
extrn msgInvalidDeviceParameters:byte
extrn msgLabelPrompt:byte
extrn msgNeedDrive:byte
extrn msgNoSystemFiles:byte
extrn msgTooManyFilesOpen:byte
extrn msgNetDrive:byte
extrn msgInsertDisk:byte
extrn msgHardDiskWarning:byte
extrn msgSystemTransfered:byte
extrn msgFormatAnother?:byte
extrn msgBadCharacters:byte
extrn msgBadDrive:byte
extrn msgInvalidParameter:byte
extrn msgParametersNotSupported:byte
extrn msgReInsertDisk:byte
extrn msgInsertDosDisk:byte
extrn msgFormatFailure:byte
extrn msgNotSystemDisk:byte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bug007sp
; reintroduce following extrn
extrn msgNoRoomDestDisk:byte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bug007sp
extrn msgDiskUnusable:byte
extrn msgOutOfMemory:byte
extrn msgCurrentTrack:byte
extrn msgWriteProtected:byte
extrn msgNotReady:byte
extrn msgInterrupt:byte
extrn msgCRLF:byte
data ends
debug equ 0
.xlist
INCLUDE VERSIONA.INC
INCLUDE DOSMAC.INC
INCLUDE SYSCALL.INC
INCLUDE ERROR.INC
INCLUDE DPB.INC
INCLUDE CPMFCB.INC
INCLUDE DIRENT.INC
INCLUDE CURDIR.INC
INCLUDE PDB.INC
INCLUDE BPB.INC
.list
;-------------------------------------------------------------------------------
; Constants
;Limits
BIG_FAT_THRESHOLD equ 4086
;-------------------------------------------------------------------------------
;FORMAT Pre-defined switches
SWITCH_S EQU 1 ; System transfer
SWITCH_V EQU 2 ; Volume ID prompt
SWITCH_H EQU 4 ; E5 dir terminator
SWITCH_C EQU 8
SWITCH_T EQU 16
SWITCH_N EQU 32
SWITCH_1 EQU 64
SWITCH_4 EQU 128
SWITCH_8 EQU 256
SWITCH_B EQU 512
NUM_SWITCHES EQU SWITCH_T or SWITCH_N
DRNUM EQU 5CH
RECLEN EQU fcb_RECSIZ+7
RR EQU fcb_RR+7
;-------------------------------------------------------------------------------
; These are the data structures which we will need
include ioctl.INC
;Per system file data structure
a_FileStructure struc
fileHandle DW ?
fileSizeInParagraphs DW ?
fileSizeInBytes DD ?
fileOffset DD ?
fileStartSegment DW ?
fileDate DW ?
fileTime DW ?
a_FileStructure ends
;-------------------------------------------------------------------------------
; And this is the actual data
data segment
public deviceParameters
validSavedDeviceParameters db 0
savedDeviceParameters a_DeviceParameters <>
deviceParameters a_DeviceParameters <>
formatPacket a_FormatPacket <>
startSector dw ?
fatSpace dd ?
fBigFat db FALSE
firstHead dw ?
firstCylinder dw ?
tracksLeft dw ?
tracksPerDisk dw ?
public NumSectors ,TrackCnt
NumSectors dw 0FFFFh
TrackCnt dw 0FFFFh
public Old_Dir
Old_Dir db FALSE
public fLastChance
fLastChance db FALSE ; Flags reinvocation from
; LastChanceToSaveIt. Used by DSKPRM
sectorsInRootDirectory dw ?
directorySector dd 0
formatError db 0
printStringPointer dw 0
; Exit status defines
ExitStatus db 0
ExitOK equ 0
ExitCtrlC equ 3
ExitFatal equ 4
ExitNo equ 5
ROOTSTR DB ?
DB ":\",0
DBLFLG DB 0 ;Initialize flags to zero
IOCNT DD ?
MSTART DW ? ; Start of sys file buffer (para#)
MSIZE DW ? ; Size of above in paragraphs
TempHandle DW ?
FILSTAT DB ? ; In memory status of files
; XXXXXX00B BIOS not in
; XXXXXX01B BIOS partly in
; XXXXXX10B BIOS all in
; XXXX00XXB DOS not in
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -