home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
pcmag
/
vol9n03.arc
/
LODBOOT.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-01-05
|
36KB
|
623 lines
PAGE 60,132
TITLE LODboot - Boot and partition sector reload program.
; SUBTTL General program description and use of common storage
; ----------------------------------------------------------------------------;
; LODboot - ReLoad Boot or partition sectors from CHKboot created files;
;-----------------------------------------------------------------------------;
; LODBOOT 1.0 ■ PCDATA TOOLKIT Copyright (c) 1990 Ziff Communications Co. ;
; PC Magazine ■ Wolfgang Stiller ;
; ;
;-----------------------------------------------------------------------------;
;Purpose: ;
; To recover from damage to either the DOS boot sector or a hard disk's ;
; partition sector (table). LODBOOT will read the boot or partition ;
; sector reload file created by CHKboot, verify that it has not been ;
; corrupted and then reload the appropriate sector. ;
;-----------------------------------------------------------------------------;
;Format: ;
; ;
; LODBOOT [/B] [/P] [/2] ;
; ;
; Only one of the above parameters can be specified at a time. ;
; ;
; /B Reloads the boot record from the file @@BOOT.SCT which was previously ;
; created by an execution of "CHKboot /I". ;
; /P Reloads the partition sector onto the first physical hard disk drive ;
; from file @@PARTIT.SCT. ;
; /2 Same as "/P" but writes to second physical fixed disk drive. ;
;-----------------------------------------------------------------------------;
;Remarks: ;
; LODBOOT will not reload both a boot and a partition sector at the same ;
; time. If both are damaged, the partition sector should be reloaded ;
; first. LODBOOT will check the .SCT reload files and will refuse to ;
; reload if the files have been corrupted. Both reload files contain 32 ;
; bits of integrity check information. ;
; ;
; In order to reload a DOS boot sector, the file @@BOOT.SCT must be in ;
; the current directory which must be on the DOS disk(ette) to be ;
; reloaded. To reload a partition sector, the file @@PARTIT.SCT must be ;
; in the current directory. This need not be on the disk to be reloaded. ;
; ;
; LODBOOT will return the following DOS errorlevels: ;
; 00 - Reload of boot or partition sector was successful. ;
; 32 - Invalid or missing reload file (@@BOOT.SCT or @@PARTIT.SCT). ;
; 64 - I/O error occurred while trying disk read/write. ;
;128 - No parameters entered or invalid syntax. ;
; ;
;-----------------------------------------------------------------------------;
;---------------------------------------------------------------;
; Constants: ;
;---------------------------------------------------------------;
BOX EQU 254 ;Small box character code
CR EQU 0Dh
LF EQU 0Ah
CRLF EQU 0A0Dh ;Carriage return line feed.
Boot_type EQU 0FFh ;Indicator of a boot sector (.PRM)
Part_type EQU 055h ;Indicator of a partition sector(.PRM)
; Double line drawing character definitions
Horizontal EQU 205 ;Horizontal double line
Vertical EQU 186 ;Vertical double line
UPRT_corner EQU 187 ;Upper righthand corner
UPLT_corner EQU 201 ;Upper lefthand corner
LWLT_corner EQU 200 ;Lower lefthand corner
LWRT_corner EQU 188 ;Lower righthand corner
CSEG SEGMENT
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
SUBTTL Main program
;******************************************************************************;
;** Main program begins here -LODBOOT- **;
;******************************************************************************;
ORG 100H ; THIS IS A COM TYPE PROGRAM
LODBOOT:
CALL Parse_parms ;Parse cmdline paramters + prnt header
MOV DX, offset Header_Msg ;Put out title display
MOV AH,09H ;DOS display string function
INT 21H
; Check system sector size
MOV AH,36h ;Check sector size and free space
XOR DL,DL ;Check current disk (DL=0 is current)
INT 21h
MOV Sector_Size,CX ;Save # of bytes per sector
XOR BP,BP ;Zero out highest error level code
CMP Boot_wanted,'Y' ;Does user want BOOT rec loaded?
JNE No_Boot ; If not skip loading the boot rec
CALL Read_Boot_SCT ;Read and verify the relaod file
CALL Write_Boot_Sector ;Do actual write of sector 0 (DOS)
NO_BOOT:
CMP Partition_wanted,'Y' ;Does user want Partition loaded?
JNE End_Execution ; If not skip loading the Partition
CALL Read_Part_SCT ;Read and verify the relaod file
CALL Write_Part_Sector ;Do actual BIOS write of partition
End_Execution: ;Successful termination of program
MOV AX,BP ;BP contains highest error level
MOV AH,4Ch ;DOS terminate with errorlevel funct
INT 21h
;---------------------------------------------------;
; C O M P A R E B U F F E R S U M S ;
;---------------------------------------------------;
;Register conventions: ;
; ;
; DI - Contains checksum for this file ;
; DX - XOR sum ;
;---------------------------------------------------;
Compare_Buffer_Sums: ;See if any changes to the sector
CMP WORD PTR[SCT_CW1],'oW' ;Any change to check word?
JNE Buffer_change_detected ; If not =, report the change
CMP WORD PTR[SCT_CW2],'gn' ;Any change to check word?
JNE Buffer_change_detected ; If not =, report the change
CMP WORD PTR[SCT_Ind],0FFFFh ;Any change to indicator word?
JNE Buffer_change_detected ; If not =, report the change
CMP SCT_XOR,DX ;Any change to XOR sum?
JNE Buffer_change_detected ; If not =, report the change
CMP SCT_CHK,DI ;Is the checksum OK?
JNE Buffer_change_detected ; If not, report the change
; ELSE all is OK with Buffer sector
MOV DX,offset OK_Msg ;Explain that all is well
MOV AH,09H ;DOS display string function
INT 21h
RET
Buffer_Change_detected: ;Report problem with Buffer record
MOV DX,offset Bad_Msg ;Explain that its bad
MOV AH,09H ;DOS display string function
INT 21H
Missing_or_Invalid_Reload_File:
CALL Wait_For_Key ;Beep and force user to hit a key
MOV AX,4C20h ;DOS terminate with 32 error level
INT 21h
;---------------------------------------------------;
; W R I T E B O O T S E C T O R ;
;---------------------------------------------------;
;Write the DOS boot sector using DOS I/O requests. ;
;---------------------------------------------------;
Write_Boot_Sector:
PUSH BP ;Save all current registers
Try_boot_write_again: ;Come here to retry the extended
;form of the write if normal int 26h failed. Note, it is NOT an error
;that we re-execute the 19h function...some systems require this
MOV DX,offset Boot_Msg ;Display message about boot record
MOV AH,09H ;DOS display string function
INT 21H
MOV AH,19h ;DOS get current disk drive function
INT 21h ;Get current disk drive in AL (0=A)
CMP DOS_Version,4 ;Are we running under DOS 4.x?
JNE Old_DOS ;If not, do normal int 26 call
; Process DOS 4.0 disks using extended format of INT26 (handles disks > 32mb)
MOV CX,-1 ;Set indicator to handle >32 mb disks
MOV BX,Offset INT26_Parms ;Point to 10 byte parameter block
MOV Buffer_Segment,DS ;Segment address in parameter block
JMP SHORT DOS_Abs_Write ;Do DOS Absolute sector read
Old_DOS:
MOV CX,1 ;Write just one sector
XOR DX,DX ;DX=0 to write DOS relative sector 0
MOV BX,Offset buffer ;Place to put the sector
DOS_Abs_Write:
INT 26h ;DOS absolute disk write function
JNC Boot_write_OK ;If I/O was successful
;Else we had an I/O error
;
; Since some OEM versions of DOS such as COMPAQ 3.31 also support the extended
; format of the int 26h call for disks > 32mb we will lie and say this is
; DOS 4.x and try the interrupt 4.0 using the extended format call.
POPF ;Restore flags INT 26 put on stack
CMP DOS_Version,4 ;Did we already try DOS 4.x type int?
JE Unrecoverable_IO_Error ; If so, then boot Write failed
; otherwise try extended int 26h
MOV DOS_Version,4 ; Force extended int 26h use (lie)
JMP SHORT Try_Boot_Write_Again ; do func 19h and then extd int 26h
Unrecoverable_IO_Error: ;Exit here if I/O has failed
MOV DX,offset IO_ERR_MSG ;Explain that input/output failed
MOV AH,09H ;DOS display string function
INT 21H
Error_termination:
CALL Wait_For_Key ;Beep and force user to hit a key
MOV AX,4C40h ; terminate with 64 DOS ERRORLEVEL
INT 21h
Boot_write_OK:
POPF ;restore flags pushed by INT 26h
POP BP ;Restore active registers
MOV DX,offset BOOT_Done ;Tell user that all is OKeeDOKEY
MOV AH,09H ;DOS display string function
INT 21H
RET
Open_Failure: ;Come here when open of .SCT fails
MOV DX,offset Open_Fail_Msg ;Explain that open failed
MOV AH,09H ;DOS display string function
INT 21H
JMP SHORT Missing_or_Invalid_Reload_File ;Alert to serious problem
;---------------------------------------------------;
; W R I T E P A R T S E C T O R ;
;---------------------------------------------------;
;Write the partition sector using BIOS I/O request ;
;---------------------------------------------------;
Write_part_Sector:
MOV DX,offset Part_Msg ;Display writing partition sectr msg
MOV AH,09H ;DOS display string function
INT 21H
MOV AH,03 ;BIOS floppy write function of INT 13h
MOV DL,BYTE PTR[Drive_number] ;Drive 80 (1st) or 81 (2nd) hard drive
MOV AL,1 ;Write only 1 sector
MOV CX,1 ;Write (CH) track 0, (CL) sector 1
XOR DH,DH ;write head number zero
MOV BX,Offset buffer ;Place to put the sector
INT 13h ;BIOS absolute (floppy) disk write
JNC Part_write_OK ;If I/O was successful
;Else the we had an I/O error
MOV DX,offset No_HardDisk_MSG ;Display message about missing part
MOV AH,09H ;DOS display string function
INT 21H
JMP SHORT Unrecoverable_IO_Error
Part_write_OK:
MOV DX,offset Part_Done ;Tell user that all is OKeeDOKEY
MOV AH,09H ;DOS display string function
INT 21H
RET
;---------------------------------------------------;
; R E A D B O O T S E C T O R (F I L E) ;
;---------------------------------------------------;
;Read the reloadable version of the boot sector from;
;DISK. Also validate the boot sector after reading. ;
;---------------------------------------------------;
Read_Boot_SCT:
MOV DX,offset BootR_MSG ;Display msg about reading .SCT file
MOV AH,09H ;DOS display string function
INT 21H
MOV AX,3D00h ;DOS open file for read command
MOV DX,Offset Boot_File_Name
INT 21h
JNC Open_Boot_OK ;IF all went OK then return
JMP Open_Failure ;Inform user that open failed
Open_Boot_OK:
MOV BX,AX ;Handle for Boot sector file
MOV AH,3Fh ;DOS Read function code
MOV CX,581 ;read 581 bytes from disk
MOV DX,OFFSET Read_Buffer ;Location to put data from disk
INT 21h ;Do the I/O
JNC Boot_Read_OK ;If I/O was successful
;Else the we had an I/O error
JMP Buffer_Change_Detected ;Tell user that reload file is bad
Boot_Read_OK: ;Read of reload file was OK
MOV AH,3Eh ;DOS close file function code
INT 21h ;Close the file
CALL Calc_Sums ;Calculate CHK and XOR sums
CALL Compare_Buffer_Sums ;Verify that they match
CMP BYTE PTR[SCT_Type],Boot_type ;Is it really a boot sector?
JE Boot_Validate_Done ; yes it is...
JMP Buffer_Change_Detected ; else, Report the error to the user
Boot_Validate_Done:
RET
;---------------------------------------------------;
; R E A D P A R T S E C T O R (F I L E) ;
;---------------------------------------------------;
;Read reloadable version of the partition sector. ;
;Also validate the itegrity of the reload file. ;
;---------------------------------------------------;
Read_Part_SCT:
MOV DX,offset PartR_MSG ;Display msg about writing Part file
MOV AH,09H ;DOS display string function
INT 21H
MOV AX,3D00h ;DOS open file for read command
MOV DX,Offset Part_File_Name
INT 21h
JNC open_Part_OK ;IF all went OK then return
JMP OPEN_Failure ;Inform user that open failed
Open_Part_OK:
MOV BX,AX ;Handle for Part sector file
MOV AH,3Fh ;DOS Read function code
MOV CX,581 ;Read 581 bytes from disk
MOV DX,OFFSET Read_Buffer ;Location to put data from disk
INT 21h ;Do the I/O
JNC Part_Read_OK ;If I/O was successful
;Else the we had an I/O error
JMP Buffer_Change_Detected ;Tell user that reload file is bad
Part_Read_OK: ;Read of partition reload file OK
MOV AH,3Eh ;DOS close file function code
INT 21h ;Close the file
CALL Calc_Sums ;Calculate CHK and XOR sums
CALL Compare_Buffer_Sums ;Verify that they match
CMP BYTE PTR[SCT_Type],Part_type ;Is it really a boot sector?
JE Part_Validate_Done ; yes it is...
JMP Buffer_Change_Detected ; else, Report the error to the user
Part_Validate_Done:
RET
SUBTTL General Purpose subroutines
PAGE
;******************************************************************************;
;** General purpose subroutines follow **;
;******************************************************************************;
SUBTTL General purpose subroutines
PAGE
;---------------------------------------------------;
; C A L C S U M S - Calculate XOR + CHK sums ;
;---------------------------------------------------;
; INPUT: reads 1st sector in BUFFER to scan ;
; ;
;Register conventions: ;
; ;
; AL - Each new character read into this register ;
; CX - number of chars read in -decreasing counter ;
; DI - Contains checksum for this file ;
; DX - XOR sum ;
; SI - index pointing into file BUFFER ;
; --------------------------------------------------;
Calc_Sums:
MOV SI,offset BUFFER ;Point SI to buffer containing sector
MOV CX,Sector_Size ;Process all bytes in a sector
XOR DX,DX ;Zero XOR sum
XOR DI,DI ;Zero CHK sum
XOR AH,AH ;Zero upper part of AX for addition
; Innermost read char loop - keep this fast!
NEXT_CHAR:
LODSB ;Get char into AL
XOR DL,AL ;cumulative XOR into DX
;following instr modified by /X parm
ROL_op: ROL DX,1 ;Keep shifting to XOR sum to left
;following instr modified by /C parm
ADD_op: ADD DI,AX ;cumulative check sum
LOOP NEXT_CHAR ;CONTINUE SCANNING CHARS UNTIL EOB
RET ;All done calculating sums!
;---------------------------------------------------;
; W A I T F O R K E Y ;
;---------------------------------------------------;
; 1) Send out a BEEP ;
; 2) Determine screen attribute (screen colors) ;
; 3) Determine what line cursor is on ;
; 4) Put out message to hit any key on that line ;
; 5) Wait for any key press ;
; 6) Erase message using current screen attribute ;
; 7) Position currsor back at start of current line.;
; --------------------------------------------------;
; *** NO REGISTERS ARE SAVED *** ;
; --------------------------------------------------;
Wait_For_Key: ;Force user to notice error
; Produce a beep to alert the user: (use BIOS TTY func to write an ASCII BELL)
MOV AX,0E07H ;BIOS func (0Eh) to write (07H) beep
XOR BH,BH ;Select page zero for output
INT 10H ;BIOS video function (0Eh=write char)
;Find out what attribute is being used for display
MOV AH,08h ;read attrib + char function
INT 10h ;Call BIOS
PUSH AX ;Save AH=attribute byte
;Find out what line the cursor is on
MOV AH,03h ;Read cursor position function
INT 10h ;BIOS video services
PUSH DX ;DH contains row (line #) Save it!
; Position cursor to current line + column 28: (TO BIOS row 27)
MOV AH,02 ;BIOS int 10h set cursor position func
XOR BH,BH ;Set page to zero
;DH contains current row
MOV DL,1Bh ;Set cusor current row and col 27
INT 10h ;BIOS video services
; Put -Hit any key- message out with inverse video attribute type on
; XOR BH,BH ;Set page to zero (BH is still 0)
MOV BL,0F0h ;Inverse video attribute
MOV CX,1 ;Character count
MOV SI,offset Hit_Key_Msg ;The hit-any-key message
Display_next_video_char:
MOV AH,09H ;BIOS int 10h write attrib + char func
LODSB ;Get next character for output
PUSH SI ;Save SI (int 10h may corrupt it)
INT 10h ;Put character and attribute out
INC DX ;Advance cursor position
MOV AH,02 ;Adv cursor function
INT 10h ; advance the cursor (BIOS)
POP SI ;Restore saved SI
CMP SI,offset Hit_key_Msg_end ;are we at end of message?
JB Display_next_video_char ; If not get next char for display
; Else, wait for key press by user
; Wait for user to hit any key
XOR AX,AX
INT 16h ;Wait for user to hit a key
; Erase HIT ANY KEY message
POP DX ;DH=current line number
POP BX ;BH=user's screen attribute
MOV AH,06h ;INIT window function
XOR AL,AL ;Zero AL to clear window
MOV CH,DH ;Current row (y coor upr lft)
MOV CL,00 ;Start in first char position
MOV DL,79 ;Last char pos - blank entire line
INT 10h ;Blank out line
; Position cursor to start of blanked line
MOV AH,02 ;BIOS int 10h set cursor position func
XOR DL,DL ;DH=cur line, DL=0: first char pos
XOR BX,BX ;Use video page zero
INT 10h ;BIOS video services
RET ;Return to caller
SUBTTL Initialization Code
PAGE
; ----------------------------------------------------------------------------;
; Initialization code - parse parms + put out msgs ;
; ----------------------------------------------------------------------------;
Parse_parms: ;Parse input parameters
MOV AH,30h ;Check DOS version
INT 21h ; Ask DOS: "who are you?"
OR AL,AL ;Check if before DOS 2.x (AL=0)
JNE DOS_is_OK ;If good DOS vers, then continue
MOV DX, OFFSET Bad_DOS_Msg ; ELSE Send MSG that
MOV AH,09h ; DOS version is too low.
INT 21h
INT 20h ; Old style DOS terminate interupt
DOS_is_OK:
MOV DOS_Version,AL ;Save major DOS version number (0-4)
MOV SI,80H ;Parameter area in PSP
MOV CL,[SI] ;Get # of chars in input parm
XOR CH,CH ;CLEAR UPPER BYTE OF CHR COUNT
OR CL,CL ;CHECK FOR 0 CHARS (NO INPUT)
MOV DX, OFFSET Explanation ;Give user full explanation of prgm
JNZ Continue_parse ;If some parameters keep going
JMP Help_display ; Else, give user some help info
Continue_parse:
INC SI ;POINT TO FIRST CHARACTER
CLD ;FORWARD DIRECTION
DEL_SPACES:
LODSB ;Get byte at DS:SI and inc SI
CMP AL,'/' ;Is it a "/"
JE Scan_for_parms ;If so, we have a parameter
LOOP DEL_SPACES ;CONT CHECKING UNTIL LAST CHAR
JMP Help_Display
;---------------------------------------------------------------------------;
; Conventions for command line parsing: ;
; SI points to next char to be checked in the parm field at DS:80 ;
; CX is count of characters left to be scanned ;
;---------------------------------------------------------------------------;
Scan_for_parms:
CMP CX,01 ;Check if we out of chars to scan
JA Parm_Scan ;If some are left, check parameters
JMP Help_display ;If so, user needs HELP
Check_parm_chars_left: ;Check if enough chars left for a parm
CMP CX,01 ;Check if we out of chars to scan
JA Parm_Scan ; if not continue chcking for /parms
RET ; If so, return
Parm_Scan: ;Check for presence of a /_ parm
CMP AL,'/' ;check for "/" parm character
JE Parm_found
CMP AL,' ' ;check for blanks
JNE Unrecog_parm ;If other than blank its illegal...
LODSB ;Keep checking next character
LOOP Parm_Scan
RET ;All done
Parm_Found: ;Check if parm is valid
DEC CX ;Adjust chars remaining counter
JCXZ Unrecog_parm ;IF no chars left then parm is invalid
LODSB ;Get next char
DEC CX ;Adjust chars remaining counter
CMP AL,'2' ;Is it the Initialize parm?
JE Two_parm ;2 parm detected..
AND AL,5Fh ;Capitalize char
CMP AL,'P' ;Is it Partition table parm?
JE P_parm ;P parameter detected
CMP AL,'B' ;Is it the Boot record parm?
JE B_parm ;I parm detected..
Unrecog_parm: ; an illegal paramter:
MOV DX, offset Bad_Parm_Msg ;indicate illegal parm was found
MOV AH,09H ;DOS display string function
INT 21H
JMP SHORT ERR_Exit ;terminate with error level set
Too_Many_Parms: ;User has entered more than 1 parm
MOV DX, offset Too_ManyP_Msg ;indicate more than 1 found
MOV AH,09H ;DOS display string function
INT 21H
JMP SHORT ERR_Exit ;terminate with error level set
P_parm:
CMP Parm_Already_Found,'Y' ;Is this the 2nd parm?
JE Too_Many_Parms ; If so, give error message
MOV Partition_wanted,'Y' ;Indicate user wants partition table
MOV Parm_Already_Found,'Y' ;Indicate user has entered a parm
LODSB ;Keep checking next character
JMP SHORT Check_Parm_chars_left ;Check for additional parms
B_parm:
CMP Parm_Already_Found,'Y' ;Has user already selected /P
JE Too_Many_Parms ; If so, give error message
MOV Boot_wanted,'Y' ;Indicate user wants boot record
MOV Parm_Already_Found,'Y' ;Indicate user has entered a parm
LODSB ;Keep checking next character
JMP SHORT Check_Parm_chars_left ;Check for additional parms
Two_parm: ;/2 parm (read partition on 2nd disk)
CMP Parm_Already_Found,'Y' ;Has user already selected /P
JE Too_Many_Parms ; If so, give error message
MOV Partition_wanted,'Y' ;Indicate user wants a partition table
MOV Partition2_wanted,'Y' ;Indicate user wants 2nd partitn table
MOV Parm_Already_Found,'Y' ;Indicate user has entered a parm
INC Drive_number ;Write drive num 81 (2nd hard drive)
LODSB ;Keep checking next character
JMP Check_Parm_chars_left ;Check for additional parms
ERR_EXIT:
CALL Wait_For_Key ;Beep and force user to hit a key
Syntax_msg_only:
MOV DX, offset Syntax_Msg ;show user correct syntax
Help_Display:
MOV AH,09H ;DOS display string function
INT 21H
MOV AX,4C80h ; terminate with 128 DOS ERRORLEVEL
INT 21h
SUBTTL Definition of Data structures
PAGE
;******************************************************************************;
;** Definition of Data areas follow **;
;******************************************************************************;
Boot_wanted DB 'N' ;Read DOS boot sector Y or N?
Partition_Wanted DB 'N' ;Read any Partition sector Y or N?
Partition2_Wanted DB 'N' ;Read part on 2nd disk Y or N?
Parm_Already_found DB 'N' ;Read part on 2nd disk Y or N?
DOS_Version DB 00 ;Major version of DOS used (0 - 4)
Sector_Size DW 00 ;Number of bytes per sector
INT26_Parms LABEL BYTE ;DOS 4.0 INT25/26 parameter block
Sector_Number DD 00 ;DOS logical sector number to write
Sector_Count DW 01 ;Write 1 sector
Buffer_Offset DW OFFSET Buffer ;Buffer address - offset
Buffer_Segment DW 0 ; segment - set at run time
BootR_MSG DB 'Reading "@@BOOT.SCT."',CR,LF,'$'
PartR_MSG DB 'Reading "@@PARTIT.SCT".',CR,LF,'$'
IO_ERR_Msg DB 'An unrecoverable I/O error has occurred.',CR,LF,'$'
No_hardDisk_MSG DB 'Partition sector not processed. Unable to write to disk'
DB CR,LF,'$'
Open_Fail_Msg DB 'Unable to open the (.SCT) reload file.',CR,LF,'$'
Part_Msg DB 'Writing the partition sector....','$'
Boot_Msg DB 'Writing the DOS boot sector....','$'
Part_done DB 'Partition sector successfully reloaded.',CR,LF,'$'
Boot_done DB 'Boot sector successfully reloaded.',CR,LF,'$'
Bad_DOS_Msg DB 'DOS 2.x or higher required.',CR,LF,'$'
OK_Msg DB 'Sector reload file (.SCT) is '
DB ' valid.',CR,LF,'$'
Bad_Msg DB ' Sector reload file (*.SCT) is corrupted (changed).',CR,LF
DB 'It is not safe to reload from it.',CR,LF,'$'
Hit_Key_MSG DB '-Hit any key-'
Hit_Key_MSG_end EQU $
Boot_File_name DB '@@BOOT.SCT',00 ;ASCIIZ string of boot sector file
Part_File_name DB '@@PARTIT.SCT',00 ;ASCIIZ string of partition file
Drive_number DW 80h ;Drive number for BIOS hard disk read
Too_ManyP_Msg DB 'Only one parameter may be used at a time (/B, /P or /2).'
DB cr,lf,lf,'$'
Bad_Parm_Msg DB 'Unrecognized parameter detected.',cr,lf,'$'
Explanation DB 'LODBOOT will reload either the DOS boot record or the '
DB 'partition sector',CR,LF
DB '(not both at the same time) from the "@@BOOT.SCT" or the'
DB ' "@@PARTIT.SCT"',CR,LF
DB 'reload files. These files are created by "CHKboot/I". These'
DB ' files must be on',CR,LF
DB 'the disk and directory from which you run LODBOOT.'
DB CR,LF,LF
Syntax_Msg DB CR,LF,'Syntax is: LODBOOT [/B] [/P] [/2]',CR,LF,LF
DB ' "/B" Reads "@@BOOT.SCT" and reloads the DOS boot record on '
DB 'the current disk.',CR,LF
DB ' "/P" Reads "@@PARTIT.SCT" and reloads partition sector on '
DB '1st physical hard',CR,LF
DB ' disk drive.',CR,LF
DB ' "/2" Reloads partition sector on 2nd physical hard disk.'
DB CR,LF,LF
DB 'Only one of the above parameters may be specified at a time.'
DB CR,LF,LF
DB 'The ".SCT" reload files must be created by program "CHKboot". '
DB 'LODBOOT',CR,LF
DB 'will detect if the ".SCT" files have changed. If these files '
DB 'have been',CR,LF
DB 'corrupted (changed), LODBOOT will refuse to reload the sectors'
DB '.',CR,LF,LF
Header_msg LABEL BYTE
DB UPLT_Corner,76 DUP(Horizontal),UPRT_Corner,CR,LF
DB vertical," LODBOOT 1.0 ■ PCDATA TOOLKIT Copyright (c) 1990 Ziff "
DB "Communications Co. ",vertical,CR,LF
DB Vertical," PC Magazine ■ Wolfgang Stiller "
DB " ",vertical,CR,LF
DB LWLT_Corner,76 DUP(Horizontal),LWRT_Corner,CR,LF,'$'
Read_Buffer DB 'LODBOOT reload file. Copy me to a floppy.abc'
SCT_CW1 DB 'defghi' ;Check word 1 in header
SCT_CW2 DB 'jklmnopqrs',CR,LF ;word 2
SCT_Ind DW 0FFFFh ;Special boot/partition indicator
SCT_TYPE DB 0FFh ;Indicate if this is boot or part rec
; FF=Boot and 55=Partition sector
SCT_CHK DW 00h ;CHK SUM
SCT_XOR DW 00h ;XOR SUM
Buffer label byte ;All storage + code following is in
; the input file buffer.
CSEG EndS
END LODBOOT