home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
dskutl
/
hdsource.arc
/
HDFMT.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-02-24
|
16KB
|
427 lines
PAGE 64,132 ;PAGE WIDTH,LENGTH
.SALL
TITLE PC/AT DIAGNOSTIC - FORMAT ROUTINE
; **********************************************************************
; * *
; * MODULE NAME HDFMT *
; * AUTHOR JIM BRACKING *
; * *
; * DECSRIPTION THIS PROGRAM PERFORMS THE FOLLOWING *
; * FUNCTIONS: *
; * *
; * 1. FORMATS HARD DISKS *
; * *
; **********************************************************************
;
; **********************************************************************
; * EXTERNAL PROGRAM REFERENCES *
; **********************************************************************
EXTRN SCRMGR:NEAR
; **********************************************************************
; * EXTERNAL DATA REFERENCES *
; **********************************************************************
INCLUDE HDDATA.ASM
; **********************************************************************
; * EXTERNAL SUBROUTINE REFERENCES *
; **********************************************************************
INCLUDE HDSUB.ASM
EXTRN LOGERR:NEAR
; **********************************************************************
; * PUBLIC DECLARES *
; **********************************************************************
PUBLIC HDFMT
; **********************************************************************
; * MACROS *
; **********************************************************************
IF1
INCLUDE HD.MAC
INCLUDE \SCRMGR\SCRNWORK.MAC
ENDIF
; **********************************************************************
; * *
; * BEGIN *
; * *
; **********************************************************************
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG
HDFMT PROC NEAR
ASSUME DS:CSEG ;DATA SEGMENT
JMP BY_ID ;JMP AROUND ID
ID HDFMT
INCLUDE \SCRMGR\SCRNWORK.ASM
; **********************************************************************
; * EQUATES AND STRUCTURES *
; **********************************************************************
INCLUDE HDEQU.ASM
; **********************************************************************
; * SCREENS *
; **********************************************************************
SFIELD FM0,FM1,,@LABEL,RV+BLINK,14,34,' WARNING '
SFIELD FM1,FM2,,@LABEL,LO,15,18,'THIS WILL DESTROY ALL DATA ON THE HARD DISK'
SFIELD FM2,FM3,,@LABEL,LO,16,22,'REPLY Y TO CONTINUE OR N TO STOP -'
SFIELD FM3,FM0,,@YN+@UC+@NFULL+@REQ,LO,16,57,' '
SFIELD T05,T05,,@LABEL,RV,17,33,'FORMAT DRIVE'
;
SFIELD X00,X01,,@LABEL,RV,23,02,'CTRL-F1 TO START'
SFIELD X01,X02,,@LABEL,RV,23,29,'ESC FOR THE MAIN MENU'
SFIELD X02,X00,,@LABEL,RV,23,62,'CTRL-BRK TO STOP'
;
SFIELD XI0,XI1,,@LABEL,LO,19,05,'DRIVE =>'
SFIELD XI1,XI2,1,@EX+@NUM+@UC+@NFULL+@REQ,LO,19,14
SFIELD XI2,XI3A,,@LABEL,LO,20,05,'(1 OR 2)'
SFIELD XI3A,XI3B,,@LABEL,LO,21,05,'CLEAR DEFECTS =>'
SFIELD XI3B,XI3,1,@EX+@YN+@UC+@NFULL+@REQ,LO,21,22
SFIELD XI3,XI4,,@LABEL,LO,19,22,'INTERLEAVE =>'
SFIELD XI4,XI5,1,@EX+@NUM+@NFULL+@REQ,LO,19,36
SFIELD XI5,XI0,,@LABEL,LO,20,26,'(1-8)'
;
SFIELD XS0,XS1,,@LABEL,LO,19,46,'STATUS =>'
SFIELD XS1,XS0,,@LABEL,LO,19,56,'** IDLE ** '
;
SFIELD XS2,XS3,,@LABEL,LO,19,46,'STATUS =>'
SFIELD XS3,XS2,,@LABEL,HI,19,56,'** WORKING **'
;
SFIELD XC0,XC1,,@LABEL,LO,20,46,'CYLINDER =>'
SFIELD XC1,XC0,04,@LABEL,LO,20,58
;
SFIELD XE0,XE1,,@LABEL,LO,21,46,'ERRORS =>'
SFIELD XE1,XE0,04,@LABEL,LO,21,56
;
SFIELD E01,E02,,@LABEL,LO,16,02,' CYL XXXX HEAD XX HAS BEEN FLAGGED'
SFIELD E02,E03,04,@LABEL,LO,16,08
SFIELD E03,E01,02,@LABEL,LO,16,18
BY_ID:
HDFMT ENDP
; *********************************************************************
; * *
; * FORMAT DRIVE *
; * *
; *********************************************************************
FMT PROC
CLS LO,4,1,23,78 ;CLEAR THE SCREEN
BOX 17,0,08,80,LO ;OUTLINE
WRITEC 0CCH,LO,17,0,1 ; THE
WRITEC 0B9H,LO,17,79,1 ; SCREEN
WRITE T05 ;TYPE OF TEST
WRITE X00 ;COMMANDS
FMT_00:
WRITE XS0 ;STATUS
LEA BX,XI1 ;DRIVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
MOV [BX].S_DATA,' ' ;CLEAR DRIVE
LEA BX,XI4 ;INTERLEAVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
MOV [BX].S_DATA,'3' ;DEFAULT INTERLEAVE OF 3 (AT)
CMP PCT,00H ;IBM/AT??
JE FMT_01 ;YES
MOV [BX].S_DATA,'6' ;DEFAULT INTERLEAVE OF 6 (PC)
FMT_01:
LEA BX,XI3B ;DEFAULT NO TO
MOV [BX].S_DATA,'N' ; CLEAR DEFECTS
WRITE XI0 ;DRIVE + INTERLEAVE
FMT_02:
READR BX ;FETCH DRIVE AND INTERLEAVE
CALL TRANS_KEY ;TRANSLATE THE KEY
JNC FMT_04 ;SUCESSFULL
FMT_03:
CALL BEEP ;RING THE BELL
JMP FMT_02 ;TRY AGAIN
FMT_04:
CMP AL,ESC_KEY ;ESCAPE KEY??
JNE FMT_05 ;NO
JMP EXIT ;RETURN
FMT_05:
CMP AL,C_BRK ;CONTROL BREAK KEY??
JNE FMT_07 ;NO
JMP FMT ;YES - START OVER
FMT_07:
CMP AL,C_F1 ;CTRL_F1??
JNE FMT_03 ;NO - INVALID KEY
LEA BX,XI1 ;DRIVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
MOV AL,[BX].S_DATA ;FETCH DRIVE NUMBER
CMP AL,'1' ;VALID DRIVE??
JE FMT_08 ;YES
CMP AL,'2' ;VALID DRIVE??
JE FMT_08 ;YES
MOV [BX].S_ATTR,HI ;HIGHLIGHT IT
PMSG 22 ;DISPLAY THE MESSAGE
CALL BEEP ;RING THE BELL
WRITE XI0 ;DRIVE + INTERLEAVE
JMP FMT_02 ;TRY AGAIN
FMT_08:
AND AL,0FH ;ADJUST
DEC AL ; DRIVE NUMBER
CMP AL,NUM_DR ;DRIVE INSTALLED
JB FMT_10 ;YES
MOV [BX].S_ATTR,HI ;HIGHLIGHT IT
PMSG 21 ;DISPLAY THE MESSAGE
CALL BEEP ;RING THE BELL
WRITE XI0 ;DRIVE + INTERLEAVE
JMP FMT_02 ;TRY AGAIN
FMT_10:
MOV DR,AL ;SAVE DRIVE NUMBER
LEA BX,XI4 ;INTERLEAVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
MOV AL,[BX].S_DATA ;FETCH INTERLEAVE
CMP AL,'1' ;IN RANGE??
JB FMT_15 ;NO
CMP AL,'8' ;IN RANGE??
JA FMT_15 ;NO
JMP FMT_20 ;CONTINUE
FMT_15:
MOV [BX].S_ATTR,HI ;HIGHLIGHT IT
PMSG 23 ;DISPLAY THE MESSAGE
CALL BEEP ;RING THE BELL
WRITE XI2 ;DRIVE + INTERLEAVE
JMP FMT_02 ;TRY AGAIN
FMT_20:
CMP PCT,00H ;IBM/AT??
JNE FMT_35 ;NO
XOR AH,AH ;CLEAR AH
AND AL,0FH ;MAKE IT A DIGIT
DEC AL ;RELEATIVE TO ZERO
XOR DX,DX ;CLEAR DX
MOV CX,17 ;SECTORS PER TRACK
MUL CX
LEA SI,INL_TBL ;INTERLEAVE TABLE
ADD SI,AX ;TABLE INDEX
XOR AX,AX ;PAD CHARACTER
MOV CX,512 ;BUFFER SIZE
CLD ;FORWARD DIRECTION
LEA DI,FMT_BUFF ;FORMAT BUFFER
PUSH DS ;ESTABLISH
POP ES ; SEGMENT
REP STOSB ;ZERO THE BUFFER
MOV CX,17 ;NUMBER OF SECTORS
LEA DI,FMT_BUFF ;FORMAT BUFFER
FMT_30:
LODSB ;FETCH SECTOR NUMBER
XCHG AL,AH ;ADJUST FOR STOSW
STOSW ;SET SECTOR NUMBER
XOR AX,AX ;CLEAR AX
LOOP FMT_30 ;COMPLETE THE BUFFER
FMT_35:
LEA BX,XI1 ;DRIVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
LEA BX,XI4 ;INTERLEAVE ENTRY
MOV [BX].S_ATTR,LO ;RESTORE ATTRIBUTE
WRITE XI0 ;DRIVE + INTERLEAVE
LEA BX,FM3 ;REPLY ENTRY
MOV [BX].S_DATA,' ' ;CLEAR REPLY
CLS LO,4,2,16,78 ;CLEAR THE SCREEN
WRITE FM0 ;DISPLAY FORMAT MESSAGE
READ FM0 ;GET REPLY
LEA BX,FM3 ;REPLY ENTRY
CMP [BX].S_DATA,'Y' ;CONTINUE??
JE FMT_40 ;YES
JMP FMT ;RESTART
FMT_40:
CALL READ_PARMS ;FETCH DRIVE PARMS
MOV CUR_HD,0 ;INITIALIZE
MOV CUR_SEC,1 ; THE
MOV CUR_CYL,0 ; STARTING FIELDS
MOV ERR_CNT,0 ;CLEAR THE ERROR COUNT
MOV NUM_SEC,17 ;NUMBER OF SECTORS
WRITE XS2 ;STATUS
CLS LO,4,2,16,78 ;CLEAR THE SCREEN
CALL HIDE_CUR ;HIDE THE CURSOR
; *********************************************************************
; * BEGIN THE FORMAT PROCESS *
; *********************************************************************
CALL CTLR_DIAG ;EXECUTE CTLR HDNOSTICS
JNC FMT_50 ;SUCESSFULL
PMSG 24,HI ;FORMAT FAILED
CALL UPD_ERR ;DISPLAY ERROR COUNT
JMP FMT_00 ;TERMINATE FORMAT
; *********************************************************************
; * SCAN FOR DEFECTS *
; *********************************************************************
FMT_50:
PUSH DS ;ESTABLISH
POP ES ; SEGMENT
LEA DI,DATA_BUF ;DEFECT BUFFER
MOV CX,516/2 ;LENGTH IN WORDS
MOV AX,0FFFFH ;PAD DATA
CLD ;FORWARD DIRECTION
REP STOSW ;CLEAR THE BUFFER
MOV HD_CMD,VER_CMD ;VERIFY COMMAND
MOV NUM_SEC,1 ;NUMBER OF SECTORS
LEA DI,DATA_BUF ;FIRST ENTRY
LEA BX,XI3B ;DEFAULT NO TO
CMP [BX].S_DATA,'Y' ;CLEAR DEFECTS??
JE FMT_65 ;YES - SKIP DEFECT SCAN
FMT_55:
CALL UPD_CYL ;DISPLAY CYLINDER NUMBER
MOV AH,HD_CMD ;FETCH COMMAND
MOV AL,NUM_SEC ;NUMBER OF SECTORS
MOV DX,CUR_CYL ;CURRENT CYLINDER
XCHG DH,DL ;ADJUST IT
MOV CX,6 ;SHIFT COUNT
SHL DL,CL ;ADJUST CYL HIGH
OR DL,CUR_SEC ;SET SECTOR NUMBER
MOV CX,DX ;CX SET
MOV DH,CUR_HD ;SET HEAD
MOV DL,DR ;DRIVE
OR DL,80H ; NUMBER
INT 13H ;EXECUTE THE COMMAND
JNC FMT_60 ;SUCESSFULL
CMP AH,BSEC_ER ;FLAGGED TRACK??
JE FMT_57 ;YES
CMP AH,BTRK_ER ;FLAGGED TRACK??
JNE FMT_60 ;NO
FMT_57:
MOV AX,CUR_CYL ;SAVE
STOSW ; ALL
MOV AL,CUR_HD ; FLAGGED
STOSB ; AREAS
FMT_60:
CALL NEXT_TRK ;NEXT TRACK
JNC FMT_55 ;AND PROCESS IT
FMT_65:
CMP PCT,00H ;IBM/AT??
JE FMT_70 ;YES
JMP FMT_200 ;NO
; *********************************************************************
; * FMT IBM/AT *
; *********************************************************************
FMT_70:
MOV HD_CMD,FMT_CMD ;FORMAT COMMAND
LEA BX,FMT_BUFF ;FORMAT BUFFER
PUSH DS ;ESTABLISH
POP ES ; SEGMENT
MOV CUR_HD,0 ;INITIALIZE
MOV CUR_SEC,1 ; THE
MOV CUR_CYL,0 ; STARTING FIELDS
MOV ERR_CNT,0 ;CLEAR THE ERROR COUNT
MOV NUM_SEC,17 ;NUMBER OF SECTORS
FMT_80:
MOV AH,0BH ;CHECK FOR
INT 21H ; CONTROL BREAK
CALL UPD_CYL ;DISPLAY CURRENT CYLINDER
CALL EXEC_CMD ;FORMAT THE TRACK
JNC FMT_90 ;SUCESSFULL
CMP AL,0FFH ;CTLR BROKE??
JNE FMT_85 ;NO
JMP FMT_00
FMT_85:
CALL UPD_ERR ;DISPLAY ERROR COUNT
FMT_90:
CALL NEXT_TRK ;NEXT TRACK
JNC FMT_80 ;AND PROCESS IT
; *********************************************************************
; * FLAG DEFECTS *
; *********************************************************************
FMT_95:
LEA BX,XI3B ;DEFAULT NO TO
CMP DATA_BUF,0FFFFH ;ANY DEFECTS FOUND??
JNE FMT_100 ;YES
JMP FMT_150 ;EXIT
FMT_100:
LEA DI,FMT_BUFF ;FORMAT BUFFER
MOV AL,80H ;BAD SECTOR INDICATOR
MOV CX,17 ;NUMBER OF SECTORS
CLD ;FORWARD DIRECTION
FMT_105:
STOSB ;SET BAD SECTOR INDICATOR
INC DI ;NEXT SECTOR
LOOP FMT_105 ;AND PROCESS IT
;
LEA DI,DATA_BUF ;DEFECT BUFFER
FMT_110:
MOV AX,[DI] ;FETCH CYLINDER ADDRESS
CMP AX,0FFFFH ;ALL DONE??
JE FMT_150 ;YES
MOV CUR_CYL,AX ;SET CYLINDER
MOV AL,[DI+2] ;FETCH HEAD
MOV CUR_HD,AL ;AND SAVE IT
LEA BX,FMT_BUFF ;FORMAT BUFFER
MOV HD_CMD,FMBT_CMD ;FORMAT BAD TRACK COMMAND
CALL EXEC_CMD ;FLAG THE TRACK
MOV AX,CUR_CYL ;FORMAT
LEA BX,E02 ; CYLINDER
CALL CONV_ASCII
XOR AX,AX ;CLEAR AX
MOV AL,CUR_HD ;FORMAT
LEA BX,E03 ; HEAD
CALL CONV_ASCII
SCROLL LO,4,2,16,78 ;SCROLL
WRITE E01 ;DISPLAY THE MESSAGE
CALL LOGERR ;PRINT THE MESSAGE
ADD DI,3 ;NEXT DEFECT
JMP FMT_110 ;AND PROCESS IT
FMT_150:
MOV HD_CMD,SEEK_CMD ;LETS
MOV CUR_CYL,0 ; BRING
MOV CUR_HD,0 ; THE HEADS
CALL EXEC_CMD ; HOME
PMSG 25,HI ;FORMAT COMPLETE
JMP FMT_00 ;NEXT
; *********************************************************************
; * FMT IBM/PC *
; *********************************************************************
FMT_200:
MOV HD_CMD,WSEC_CMD ;WRITE SECTOR BUFFER
LEA BX,FMT_BUFF ;FORMAT BUFFER
PUSH DS ;ESTABLISH
POP ES ; SEGMENT
MOV CUR_HD,0 ;INITIALIZE
MOV CUR_SEC,1 ; THE
MOV CUR_CYL,0 ; STARTING FIELDS
MOV ERR_CNT,0 ;CLEAR THE ERROR COUNT
MOV NUM_SEC,17 ;NUMBER OF SECTORS
CALL EXEC_CMD ;CLEAR THE SECTOR BUFFER
;
MOV AH,FMD_CMD ;FORMAT DRIVE COMMAND
LEA BX,XI4 ;FETCH
MOV AL,[BX].S_DATA ; INTERLEAVE
AND AL,0FH ;MAKE IT A DIGIT
MOV DX,CUR_CYL ;CURRENT CYLINDER
XCHG DH,DL ;ADJUST IT
MOV CX,6 ;SHIFT COUNT
SHL DL,CL ;ADJUST CYL HIGH
OR DL,CUR_SEC ;SET SECTOR NUMBER
MOV CX,DX ;CX SET
MOV DH,CUR_HD ;SET HEAD
MOV DL,DR ;DRIVE
OR DL,80H ; NUMBER
INT 13H ;EXECUTE THE COMMAND
JNC FMT_210 ;SUCESSFULL
PMSG 24,HI ;FORMAT FAILED
JMP FMT_00
FMT_210:
JMP FMT_95 ;WRITE TRACK FLAGS
; *********************************************************************
; * E X I T *
; *********************************************************************
EXIT:
RET ;RETURN
FMT ENDP
; *********************************************************************
; * DISPLAY CURRENT CYLINDER *
; *********************************************************************
UPD_CYL PROC
PUSHALL
MOV AX,CUR_CYL ;FORMAT
LEA BX,XC1 ; CYLINDER
CALL CONV_ASCII ; DISPLAY
WRITE XC0 ;CYLINDER
POPALL
RET ;RETURN
UPD_CYL ENDP
; *********************************************************************
; * DISPLAY ERROR COUNT *
; *********************************************************************
UPD_ERR PROC
PUSHALL
XOR AX,AX ;CLEAR AX
MOV AX,ERR_CNT ;FORMAT
LEA BX,XE1 ; ERROR COUNT
CALL CONV_ASCII ; DISPLAY
WRITE XE0 ;ERROR COUNT
POPALL
RET ;RETURN
UPD_ERR ENDP
CSEG ENDS
END HDFMT