home *** CD-ROM | disk | FTP | other *** search
- ;
- ;
- ;
- TITLE * PARAMS.ASM *
- ;
- IF1
- %OUT [PASS1]
- ELSE
- %OUT [PASS2]
- ENDIF
- ;
- COLUMNS EQU 79
- CR EQU 0DH
- LF EQU 0AH
- CREATE EQU 3CH
- WRITEF EQU 40H
- CLOSEF EQU 3EH
- DISK EQU 13H
- MS_DOS EQU 21H
- VID_ROM EQU 10H
- PAR_TAB_LEN EQU 64
- PAR_TBL_INT EQU 41H
- CTL_BRK_INT EQU 1BH
- CTL_C_INT EQU 23H
- ;
- PARAMS STRUC
- NUMBER_OF_TRACKS DW ?
- NUMBER_OF_HEADS DB ?
- START_REDUCE_WRITE DW ?
- START_WRITE_PRECOMP DW ?
- MAX_BITS_TO_CORRECT DB ?
- CONTROL_OPTIONS DB ?
- TIME_OUT_READ_WRITE DB ?
- TIME_OUT_FORMAT DB ?
- TIME_OUT_DIAG DB ?
- RESERVED DB 4 DUP (?)
- PARAMS ENDS
- ;
- PSEG SEGMENT PARA PUBLIC 'CODE'
- ASSUME CS:PSEG, DS:PSEG, ES:PSEG, SS:PSEG
- ORG 100H
- MAIN PROC NEAR
- JMP BEGIN
- DB 'Copyright (C) 1987 Richard B. Johnson '
- CORUP DB CR,LF,'This program file is corrupt!$'
- BEGIN: CALL CHECK
- MOV DI,OFFSET SECBUF ;SECTOR BUFFER
- MOV CX,0FFH ;WORDS TO FILL
- MOV AX,0E500H ;FILL BYTE
- REP STOSW ;FILL IT UP
- POPF ;FROM THE CHECKSUM
- JZ GOOD ;UNMODIFIED FILE
- MOV DX,OFFSET CORUP ;WAS CORRUPT OTHERWISE
- CALL PROMPT ;TELL THEM
- MOV AX,4C01H ;EXIT WITH ERROR
- INT MS_DOS ;EXIT TO DOS
- GOOD: CALL INIT
- CALL CLS
- REPAINT:
- MOV SP,OFFSET STKTOP ;PUT STACK IN A SAFE PLACE
- MOV WORD PTR [DRIVE],80H ;NORMALIZE DRIVE NAME
- CALL SCREEN
- CALL BUFINP
- CALL COMMAND
- JMP SHORT REPAINT
- EXIT: JMP SHORT FINIS
- MAIN ENDP
- ;
- SCREEN PROC NEAR
- CALL PLOGO
- MOV DX,OFFSET PRP1
- CALL PROMPT
- MOV AL,BYTE PTR [MAX_DRIVES]
- CBW
- CALL ASCII
- MOV DX,OFFSET PRP2
- CALL PROMPT
- MOV SI,OFFSET DRIVE_ZERO ;PARAMETER TABLE
- CALL SHOW
- CALL PRESENT
- MOV DX,OFFSET CRLF
- CALL PROMPT
- MOV DX,OFFSET ASK
- CALL PROMPT
- RET
- SCREEN ENDP
- ;
- FINIS PROC NEAR
- CALL FORM1
- MOV DX,OFFSET BYEBYE
- CALL PROMPT
- MOV DX,OFFSET CRLF
- CALL PROMPT
- MOV AX,4C00H
- INT MS_DOS
- FINIS ENDP
- ;
- BUFINP PROC NEAR
- MOV BX,OFFSET CONBUF
- MOV BYTE PTR [BX],10
- MOV DX,BX
- MOV AH,10
- INT MS_DOS
- RET
- BUFINP ENDP
- ;
- PROMPT PROC NEAR
- MOV AH,9
- INT MS_DOS
- RET
- PROMPT ENDP
- ;
- ASCII PROC NEAR
- PUSH CX
- PUSH BX
- XOR CL,CL
- MOV BX,10000
- CALL SUBTR
- MOV BX,1000
- CALL SUBTR
- MOV BX,100
- CALL SUBTR
- MOV BX,10
- CALL SUBTR
- ADD AL,'0' ;ASCII BIAS
- MOV DL,AL
- CALL CONOUT
- POP BX
- POP CX
- RET
- ;
- SUBTR PROC NEAR
- MOV DL,'0'-1 ;ONE LESS THAN ASCII BIAS
- SUBTR0: INC DL ;BYTE COUNTER
- SUB AX,BX
- JNC SUBTR0 ;CONTINUE
- ADD AX,BX ;ONE TOO MANY, ADD BACK
- CMP DL,'0' ;SEE IF A ZERO
- JNZ CONOUT ;NO, PRINT THE NUMBER
- TEST CL,CL ;SEE IF A LEADING ZERO
- JNZ CONOUT ;NO LEADING ZERO
- MOV DL,' ' ;FILL WITH A SPACE
- JMP SHORT SPACE
- CONOUT PROC NEAR
- MOV CL,-1 ;LEADING ZERO FLAG
- SPACE PROC NEAR
- PUSH AX
- MOV AH,2 ;CONSOLE OUTPUT
- INT MS_DOS ;CHARACTER IS IN DL
- POP AX
- RET
- SPACE ENDP
- CONOUT ENDP
- SUBTR ENDP
- ASCII ENDP
- ;
- INIT PROC NEAR
- MOV WORD PTR [DRIVE],80H ;FIX UP DRIVE NUMBER
- CALL GET_PAR ;GET DRIVE PARAMSTERS
- INT DISK ;GET DRIVE PARAMETERS
- TEST DL,DL ;SEE IS ANY DRIVES
- JNZ SOME ;YES
- RET ;NO DRIVES
- SOME: MOV BYTE PTR [MAX_DRIVES],DL ;NUMBER OF DRIVES
- MOV CX,4 ;TABLE ENTRIES
- PUSH DS ;SAVE DATA SEGMENT
- XOR AX,AX ;GET A ZERO
- MOV DS,AX ;INTO DATA SEGMENT
- MOV SI,PAR_TBL_INT * 4 ;PARAMETER TABLE
- LODSW ;GET OFFSET
- MOV DS,WORD PTR [SI] ;GET SEGMENT
- MOV SI,AX
- MOV WORD PTR ES:[SAV_OFF],AX ;SAVE LOCATIONS IN LOCAL CODE
- MOV WORD PTR ES:[SAV_SEG],DS
- MOV DI,OFFSET DRIVE_ZERO ;FIRST DRIVE TABLE
- MOVDAT: PUSH CX ;SAVE DRIVE COUNT
- MOV CX,PAR_LEN ;LENGTH OF PARAMETER TABLE
- REP MOVSB ;PUT IN OUR SEGMENT
- POP CX ;RESTORE DRIVE COUNT
- LOOP MOVDAT
- MOV AL,BYTE PTR DS:[2] ;SIZE OF PROM/MOD 255
- POP DS ;RESTORE DATA
- XOR AH,AH ;DUMP HIGH BYTE
- XOR DX,DX ;READY FOR MULTIPLY
- MOV CX,512 ;MOD 512
- MUL CX
- MOV WORD PTR [PROM_LEN],AX ;SAVE PROM LENGTH
- RET
- INIT ENDP
- ;
- SHOW PROC NEAR
- MOV DX,OFFSET PRP3 ;NUMBER OF TRACKS
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_TRK: MOV AX,WORD PTR [BX+SI.NUMBER_OF_TRACKS]
- ADD BX,16
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_TRK
- ;
- MOV DX,OFFSET PRP4 ;NUMBER OF HEADS
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_HDS: MOV AL,BYTE PTR [BX+SI.NUMBER_OF_HEADS]
- ADD BX,16
- CBW
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_HDS
- ;
- MOV DX,OFFSET PRP5 ;START REDUCE WRITE
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_RWT: MOV AX,WORD PTR [BX+SI.START_REDUCE_WRITE]
- ADD BX,16
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_RWT
- ;
- MOV DX,OFFSET PRP6 ;START PRECOMPENSATION
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_WPC: MOV AX,WORD PTR [BX+SI.START_WRITE_PRECOMP]
- ADD BX,16
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_WPC
- ;
- MOV DX,OFFSET PRP7 ;ERROR CORRECTION
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_BTC: MOV AL,BYTE PTR [BX+SI.MAX_BITS_TO_CORRECT]
- ADD BX,16
- CBW
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_BTC
- ;
- MOV DX,OFFSET PRP8 ;OPTIONS BYTE
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_OPT: MOV AL,BYTE PTR [BX+SI.CONTROL_OPTIONS]
- ADD BX,16
- XOR AH,AH
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_OPT
- ;
- MOV DX,OFFSET PRP9 ;TIMEOUT
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_TIMR: MOV AL,BYTE PTR [BX+SI.TIME_OUT_READ_WRITE]
- ADD BX,16
- XOR AH,AH
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_TIMR
- ;
- MOV DX,OFFSET PRP10 ;TIMEOUT
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_TIMF: MOV AL,BYTE PTR [BX+SI.TIME_OUT_FORMAT]
- ADD BX,16
- XOR AH,AH
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_TIMF
- ;
- MOV DX,OFFSET PRP11 ;TIMEOUT
- CALL PROMPT
- MOV CX,4 ;FOUR DRIVE TYPES
- XOR BX,BX ;OFFSET ZERO
- N_TIMD: MOV AL,BYTE PTR [BX+SI.TIME_OUT_DIAG]
- ADD BX,16
- XOR AH,AH
- PUSH AX
- CALL ASCII
- POP AX
- CALL HEXW
- LOOP N_TIMD
- RET
- SHOW ENDP
- ;
- HEXW PROC NEAR
- PUSH AX ;SAVE BYTE
- MOV DX,OFFSET SPACES
- CALL PROMPT
- POP AX
- PUSH AX
- XCHG AH,AL
- CALL HEXB
- POP AX
- CALL HEXB
- MOV DX,OFFSET ENDHEX
- CALL PROMPT
- RET
- HEXW ENDP
- ;
- ; Convert byte in AL to ASCII hex. AX, DX is destroyed.
- ;
- HEXB PROC NEAR
- MOV AH,AL ;SAVE BYTE
- SAR AL,1
- SAR AL,1
- SAR AL,1
- SAR AL,1
- CALL HEX1
- MOV AL,AH ;GET STARTING BYTE
- HEX1: AND AL,0FH ;SAVE ONLY LOW FOUR BITS
- ADD AL,90H ;ADD BIAS
- DAA ;OLD INTEL TRICK
- ADC AL,40H
- DAA
- PUSH AX
- MOV DL,AL
- MOV AH,2 ;CONSOLE OUTPUT
- INT MS_DOS ;CHARACTER IS IN DL
- POP AX
- RET
- HEXB ENDP
- ;
- PRESENT PROC NEAR
- MOV DX,OFFSET CUR
- CALL PROMPT
- MOV WORD PTR [DRIVE],80H ;FIRST DRIVE
- CALL GET_PAR ;GET DRIVE PARAMETERS
- MOV CL,DL
- XOR CH,CH
- MANY: PUSH CX
- CALL GET_TYPE
- MOV DX,OFFSET PRP12 ;POINT TO 'DRIVE
- CALL PROMPT ;PRINT TO SCREEN
- MOV AX,WORD PTR [DRIVE] ;GET DRIVE COUNTER
- SUB AX,80H
- CALL ASCII
- MOV DX,OFFSET PRP13 ;POINT TO 'HEADS
- CALL PROMPT ;PRINT TO SCREEN
- CALL GET_PAR
- MOV AL,DH ;GET HEADS
- INC AL ;HEADS START TO ZERO
- CBW
- CALL ASCII ;PRINT TO SCREEN
- MOV DX,OFFSET PRP14 ;POINT TO CYLINDERS
- CALL PROMPT
- PUSH CX ;SAVE SECTORS/CYLINDERS
- XCHG CH,CL ;PUT MAX CYL IN LOW BYTE
- ROL CH,1 ;WRAP AROUND TO LOW BITS
- ROL CH,1
- AND CH,00000011B ;MASK HIGH BITS
- MOV AX,CX ;TO PRINT
- INC AX ;CYLINDERS START AT ZERO
- INC AX ;USED TO BE USE FOR BAD SECTOR MAP
- CALL ASCII
- MOV DX,OFFSET PRP15 ;POINT TO SECTORS
- CALL PROMPT
- POP CX ;RESTORE SECTORS/CYLINDERS
- AND CL,00111111B ;MASK CYLINDER BITS
- MOV AL,CL ;COPY TO AX
- XOR AH,AH
- CALL ASCII ;PRINT IT
- MOV DX,OFFSET TYP
- CALL PROMPT
- MOV BX,WORD PTR [DRIVE] ;GET CURRENT DRIVE
- SUB BX,80H ;OFFSET OF DRIVE ZERO
- ADD BX,OFFSET TYPE0 ;POINT TO DISCRIPTOR
- MOV AL,BYTE PTR [BX] ;GET DRIVE TYPE
- INC AL ;TYPES START AT ONE
- CBW
- CALL ASCII ;PRINT TO SCREEN
- INC WORD PTR [DRIVE] ;READY NEXT DRIVE
- POP CX
- LOOP MANY
- RET
- PRESENT ENDP
- ;
- GET_TYPE PROC NEAR
- CALL SET_INT ;CHANGE PARAMETER TABLE
- CALL GET_PAR ;GET DRIVE PARAMETERS
- DEC DH ;KNOCK HEADS DOWN
- PUSH DX ;SAVE FOR NOW
- DEC BYTE PTR [DRIVE_ZERO.NUMBER_OF_HEADS]
- CALL GET_PAR ;GET DRIVE PARAMETERS
- INC BYTE PTR [DRIVE_ZERO.NUMBER_OF_HEADS] ;RESTORE CORRECT
- POP AX ;IT WAS DX WHEN PUSHED
- CMP AX,DX ;SEE IF PARAMS CHANGED
- MOV AL,0 ;ASSUME DRIVE ZERO
- JZ TYPEOK ;WAS THE CORRECT DRIVE TYPE
- ;
- CALL GET_PAR ;GET DRIVE PARAMETERS
- DEC DH ;KNOCK HEADS DOWN
- PUSH DX ;SAVE FOR NOW
- DEC BYTE PTR [DRIVE_ONE.NUMBER_OF_HEADS]
- CALL GET_PAR ;GET DRIVE PARAMETERS
- INC BYTE PTR [DRIVE_ONE.NUMBER_OF_HEADS] ;RESTORE CORRECT
- POP AX ;IT WAS DX WHEN PUSHED
- CMP AX,DX ;SEE IF PARAMS CHANGED
- MOV AL,1 ;ASSUME DRIVE ONE
- JZ TYPEOK ;WAS THE CORRECT DRIVE TYPE
- ;
- DEC DH ;KNOCK HEADS DOWN
- PUSH DX ;SAVE FOR NOW
- DEC BYTE PTR [DRIVE_TWO.NUMBER_OF_HEADS]
- CALL GET_PAR ;GET DRIVE PARAMETERS
- INC BYTE PTR [DRIVE_TWO.NUMBER_OF_HEADS] ;RESTORE CORRECT
- POP AX ;IT WAS DX WHEN PUSHED
- CMP AX,DX ;SEE IF PARAMS CHANGED
- MOV AL,2 ;ASSUME DRIVE TWO
- JZ TYPEOK ;WAS THE CORRECT DRIVE TYPE
- ;
- CALL GET_PAR ;GET DRIVE PARAMETERS
- DEC DH ;KNOCK HEADS DOWN
- PUSH DX ;SAVE FOR NOW
- DEC BYTE PTR [DRIVE_THREE.NUMBER_OF_HEADS]
- CALL GET_PAR ;GET DRIVE PARAMETERS
- INC BYTE PTR [DRIVE_THREE.NUMBER_OF_HEADS] ;RESTORE CORRECT
- POP AX ;IT WAS DX WHEN PUSSED
- CMP AX,DX ;SEE IF PARAMS CHANGED
- MOV AL,3 ;ASSUME DRIVE THREE
- JZ TYPEOK ;WAS THE CORRECT DRIVE TYPE
- MOV AL,-1 ;NONE OF ABOVE
- TYPEOK:
- MOV BX,WORD PTR [DRIVE] ;GET DRIVE
- SUB BX,80H ;NORMALIZE
- ADD BX,OFFSET TYPE0 ;WHERE TO PUT THE DRIVE TYPE
- MOV BYTE PTR [BX],AL
- CALL RES_INT ;RESTORE INTERRUPTS
- RET
- GET_TYPE ENDP
- ;
- GET_PAR PROC NEAR
- CALL INI_DRV ;INITIALIZE TABLE
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE PARAMSTERS
- MOV AX,0800H
- INT DISK
- RET
- GET_PAR ENDP
- ;
- FORMAT PROC NEAR
- MOV DX,OFFSET CRLF
- CALL PROMPT
- JMP SHORT FORM2
- FORM1 PROC NEAR
- MOV DL,CR
- CALL SPACE
- MOV CX,64
- FORM2: MOV DL,' '
- CALL SPACE
- LOOP FORM2
- RET
- FORM1 ENDP
- FORMAT ENDP
- ;
- PLOGO PROC NEAR
- CALL TOPLINE
- MOV CX,SPACES1
- CALL FORMAT
- MOV DX,OFFSET LOGO1
- CALL PROMPT
- MOV CX,SPACES2
- CALL FORMAT
- MOV DX,OFFSET LOGO2
- CALL PROMPT
- RET
- PLOGO ENDP
- ;
- ; Clear screen and put cursor at home position.
- ;
- CLS PROC NEAR
- MOV AX,0600H
- MOV BH,7 ;NORMAL ATTRIBUTE
- XOR CX,CX ;UPPER LEFT HAND CORNER
- MOV DX,1850H ;LOWER RIGHT
- INT VID_ROM
- RET
- CLS ENDP
- ;
- TOPLINE PROC NEAR
- MOV DX,0000H ;FIRST ROW FIRST COLUMN
- MOV AH,2 ;SET CURSOR POSITION
- XOR BH,BH ;PAGE ZERO
- INT VID_ROM
- RET
- TOPLINE ENDP
- ;
- COMMAND PROC NEAR
- MOV SI,OFFSET CONBUF + 1 ;POINT TO COMMAND LINE
- LODSB ;GET BYTES TYPED
- TEST AL,AL
- JZ CMDEX ;NOTHING TYPED
- CBW
- MOV CX,AX
- CALL UPPER ;FORCE TO UPPER CASE
- MOV SI,OFFSET TABLE
- MOV CX,TAB_LEN ;BYTES IN THE TABLE
- COMP: PUSH CX
- MOV CX,3 ;BYTES IN THE STRING
- MOV DI,OFFSET CONBUF + 2
- REPZ CMPSB
- POP CX ;RESTORE WORDS IN TABLE
- JNZ AGAIN
- CALL WORD PTR [SI] ;GO THERE
- JMP SHORT CMDEX ;GO HOME
- AGAIN: LOOP COMP
- CMDEX: CALL FORM1
- RET
- COMMAND ENDP
- ;
- UPPER PROC NEAR
- MOV DI,SI
- FORCE: LODSB
- CMP AL,'a' ;CHECK RANGE
- JC NOLOW ;NOT A LOWER CASE LETTER
- CMP AL,'z'+1 ;LARGER THAN A 'z'?
- JNC NOLOW ;NOT LOWER CASE
- AND AL,95 ;MASK LOWER CASE BITS
- NOLOW: STOSB
- LOOP FORCE
- UPEXIT: RET
- UPPER ENDP
- ;
- TABLE DB 'CHA'
- DW CHANGE
- DB 'WRI'
- DW WRITE
- DB 'TRY'
- DW TRY
- DB 'TES'
- DW HDTEST
- DB 'NEW'
- DW REDO
- DB 'CHE'
- DW CHKSUM
- DB 'EXI'
- DW FINIS
- DB 'EXP'
- DW EXPAND
- DB 'SHI'
- DW SHIP
- DB 'SPE'
- DW SPEED
- DB 'FOR'
- DW NFORMAT
- TAB_LEN EQU $ - TABLE
- ;
- REDO PROC NEAR
- MOV DX,OFFSET NEW
- CALL PROMPT
- CALL INIT
- RET
- REDO ENDP
- ;
- CHANGE PROC NEAR
- CALL FORM1
- MOV DX,OFFSET CHANG
- CALL PROMPT
- MOV DX,OFFSET DTYPE
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- TEST AX,AX ;ANYTHING TYPED?
- JZ HOME ;NO
- CMP AL,5 ;FOUR OR LESS?
- JC CHGOK ;YES
- HOME: RET
- CHGOK: MOV SI,OFFSET DRIVE_ZERO
- DEC AL ;CORRECT FOR OFFSET ZERO
- CBW
- MOV CL,4 ;TIMES SIXTEEN
- SHL AX,CL
- ADD SI,AX ;NEW OFFSET
- ;
- CALL CLS
- CALL TOPLINE
- MOV DX,OFFSET PRP3
- CALL PROMPT
- MOV AX,WORD PTR [SI.NUMBER_OF_TRACKS]
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT1
- MOV WORD PTR [SI.NUMBER_OF_TRACKS],AX
- ;
- NEXT1: MOV DX,OFFSET PRP4
- CALL PROMPT
- MOV AL,BYTE PTR [SI.NUMBER_OF_HEADS]
- CBW
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT2
- MOV BYTE PTR [SI.NUMBER_OF_HEADS],AL
- ;
- NEXT2: MOV DX,OFFSET PRP5
- CALL PROMPT
- MOV AX,WORD PTR [SI.START_REDUCE_WRITE]
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT3
- MOV WORD PTR [SI.START_REDUCE_WRITE],AX
- ;
- NEXT3: MOV DX,OFFSET PRP6
- CALL PROMPT
- MOV AX,WORD PTR [SI.START_WRITE_PRECOMP]
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT4
- MOV WORD PTR [SI.START_WRITE_PRECOMP],AX
- ;
- NEXT4: MOV DX,OFFSET PRP7
- CALL PROMPT
- MOV AL,BYTE PTR [SI.MAX_BITS_TO_CORRECT]
- CBW
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT5
- MOV BYTE PTR [SI.MAX_BITS_TO_CORRECT],AL
- ;
- NEXT5: MOV DX,OFFSET PRP8
- CALL PROMPT
- MOV AL,BYTE PTR [SI.CONTROL_OPTIONS]
- XOR AH,AH
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT6
- MOV BYTE PTR [SI.CONTROL_OPTIONS],AL
- ;
- NEXT6: MOV DX,OFFSET PRP9
- CALL PROMPT
- MOV AL,BYTE PTR [SI.TIME_OUT_READ_WRITE]
- XOR AH,AH
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT7
- MOV BYTE PTR [SI.TIME_OUT_READ_WRITE],AL
- ;
- NEXT7: MOV DX,OFFSET PRP10
- CALL PROMPT
- MOV AL,BYTE PTR [SI.TIME_OUT_FORMAT]
- XOR AH,AH
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT8
- MOV BYTE PTR [SI.TIME_OUT_FORMAT],AL
- ;
- NEXT8: MOV DX,OFFSET PRP11
- CALL PROMPT
- MOV AL,BYTE PTR [SI.TIME_OUT_DIAG]
- XOR AH,AH
- CALL ASCII
- MOV DX,OFFSET SPACER
- CALL PROMPT
- CALL BUFINP
- CALL EXTRACT
- JCXZ NEXT9
- MOV BYTE PTR [SI.TIME_OUT_DIAG],AL
- ;
- NEXT9: CALL CLS
- RET
- CHANGE ENDP
- ;
- EXTRACT PROC NEAR
- PUSH SI ;SAVE INDEX
- MOV SI,OFFSET CONBUF + 1 ;POINT TO BUFFER
- LODSB ;GET CHARACTERS TYPED
- CBW
- MOV CX,AX ;USE AS A COUNT
- JCXZ ENDIT
- XOR BX,BX ;USE FOR ACCUMULATOR
- SUMEM: LODSB ;GET BYTE
- SUB AL,'0' ;REMOVE ASCII BIAS
- JC ENDIT ;END OF STRING
- CMP AL,10
- JNC ENDIT ;CHECK RANGE
- CBW
- PUSH AX ;SAVE FOR NOW
- MOV AX,BX ;GET ACCUMULATED RESULT
- XOR DX,DX ;READY FOR MULTIPLY
- MUL WORD PTR [TEN] ;MULTIPLY RUNNING COUNT
- MOV BX,AX ;GET NEW COUNT
- POP AX ;RESTORE CONVERTED BYTE
- ADD BX,AX ;ACCUMULATE
- LOOP SUMEM ;CONTINUE TO END
- INC CX ;USE AS A FLAG
- ENDIT: MOV AX,BX ;GET ACCUMUMATOR
- POP SI ;RESTORE INDEX
- RET
- TEN DW 10
- EXTRACT ENDP
- ;
- WRITE PROC NEAR
- ASSUME DS:PSEG
- CALL FORM1
- MOV DX,OFFSET WRITIN
- CALL PROMPT
- MOV DX,OFFSET FNAME ;POINT TO FILENAME
- XOR CX,CX ;NORMAL FILE
- MOV AH,CREATE ;CREATE A FILE
- INT MS_DOS ;DO IT
- JNC NOERR1
- MOV DX,OFFSET MAKERR ;CAN'T DO IT
- CALL PROMPT
- CALL BUFINP
- JMP WREND
- ;
- NOERR1: MOV WORD PTR [HANDLE],AX ;SAVE HANDLE
- MOV BX,AX ;COPY
- XOR DX,DX ;OFFSET ZERO
- MOV CX,WORD PTR [SAV_OFF] ;GET BYTES TO WRITE
- PUSH DS ;SAVE SEGMENT
- MOV DS,WORD PTR [SAV_SEG] ;HD BIOS SEGMENT
- MOV AH,WRITEF ;WRITE FIRST PORTION
- INT MS_DOS
- POP DS ;RESTORE SEGMENT
- JNC NOERR2
- MOV DX,OFFSET WRERR
- CALL PROMPT
- CALL BUFINP
- JMP SHORT WREND
- ;
- NOERR2: MOV DX,OFFSET DRIVE_ZERO ;NEW PARAMETERS
- MOV CX,PAR_TAB_LEN ;BYTES TO WRITE
- MOV AH,WRITEF
- MOV BX,WORD PTR [HANDLE] ;OPEN FILE
- INT MS_DOS ;WRITE SECOND SECTION
- JNC NOERR3
- MOV DX,OFFSET WRERR
- CALL PROMPT
- CALL BUFINP
- JMP SHORT WREND
- ;
- NOERR3: MOV DX,WORD PTR [SAV_OFF] ;GET OFFSET AGAIN
- ADD DX,PAR_TAB_LEN ;BYPASS ROM TABLE
- MOV CX,WORD PTR [PROM_LEN] ;GET SIZE OF THE PROM
- SUB CX,PAR_TAB_LEN ;SUBTRACT PARAMETER TABLE LEN
- SUB CX,WORD PTR [SAV_OFF]
- MOV BX,WORD PTR [HANDLE] ;OPEN FILE
- PUSH DS ;SAVE AGAIN
- MOV DS,WORD PTR [SAV_SEG] ;GET ADDRESS AGAIN
- MOV AH,WRITEF
- INT MS_DOS
- POP DS ;RESTORE SEGMENT
- JNC NOERR4
- MOV DX,OFFSET WRERR
- CALL PROMPT
- CALL BUFINP
- JMP SHORT WREND
- ;
- NOERR4: CMP WORD PTR [SAV_SEG],0C800H
- JZ NOERR5
- MOV DX,OFFSET BADSEG
- CALL PROMPT
- CALL BUFINP
- NOERR5: MOV BX,WORD PTR [HANDLE] ;OPEN FILE
- MOV AH,CLOSEF
- INT MS_DOS
- WREND: RET
- WRITE ENDP
- ;
- TRY PROC NEAR
- MOV DX,OFFSET OUTSIDE
- CALL PROMPT
- CALL SET_INT ;SET UP NEW TABLES
- ;
- ; Free some memory
- ;
- MOV BX,OFFSET TOP ;GET TOP OF PROGRAM
- MOV CL,4 ;CONVERT TO PARAGRAPHS
- SHR BX,CL ;DIV BY SIXTEEN
- INC BX ;ROUND UP
- MOV AH,4AH ;FUNCTION
- INT MS_DOS ;DO IT
- ;
- ; Load execute COMMAND.COM
- ;
- MOV AX,CS
- MOV WORD PTR [SEG_1],AX ;PARAMETER BLOCK FIXUPS
- MOV WORD PTR [SEG_2],AX
- MOV WORD PTR [SEG_3],AX
- MOV BYTE PTR DS:[80H],0 ;SHOW NOTHING TYPED
- MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
- MOV DX,OFFSET COMND ;POINT TO FILENAME
- MOV BX,OFFSET BLOCK ;POINT TO PARAMETER BLOCK
- MOV AX,4B00H ;LOAD/EXECUTE
- INT MS_DOS
- ;
- ; Recreate environment upon return.
- ;
- MOV AX,CS ;GET CODE SEGMENT
- MOV DS,AX
- MOV ES,AX
- CLI
- MOV SS,AX
- MOV SP,WORD PTR [SP_SAV]
- STI
- JNC FOUND1
- MOV DX,OFFSET UNABLE1 ;CAN'T FIND THE FILE
- CALL PROMPT ;SHOW WE CAN'T FIND FILE
- MOV DX,OFFSET RETURN
- CALL PROMPT
- CALL BUFINP
- FOUND1: CALL RES_INT ;RESTORE PARAM TABLE
- CALL CLS ;CLEAR THE SCREEN
- RET
- TRY ENDP
- ;
- CHKSUM PROC NEAR
- CALL FORM1
- MOV DX,OFFSET SUMIT
- CALL PROMPT
- MOV BX,OFFSET TOP ;GET TOP OF PROGRAM
- MOV CL,4 ;CONVERT TO PARAGRAPHS
- SHR BX,CL ;DIV BY SIXTEEN
- INC BX ;ROUND UP
- MOV AH,4AH ;FUNCTION
- INT MS_DOS ;DO IT
- ;
- ; Move command line string
- ;
- MOV SI,OFFSET KNOW ;POINT TO COMMAND LINE STRING
- MOV DI,80H ;MOVE TO 80H
- MOV CL,CMD_LEN ;LENGTH TO MOVE
- XOR CH,CH ;DUMP
- REP MOVSB
-
- ;
- ; Load execute CHECKSUM.COM
- ;
- MOV AX,CS
- MOV WORD PTR [SEG_1],AX ;PARAMETER BLOCK FIXUPS
- MOV WORD PTR [SEG_2],AX
- MOV WORD PTR [SEG_3],AX
- MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
- MOV DX,OFFSET CHKSMF ;POINT TO FILENAME
- MOV BX,OFFSET BLOCK ;POINT TO PARAMETER BLOCK
- MOV AX,4B00H ;LOAD/EXECUTE
- INT MS_DOS
- ;
- ; Recreate environment upon return.
- ;
- MOV AX,CS ;GET CODE SEGMENT
- MOV DS,AX
- MOV ES,AX
- CLI
- MOV SS,AX
- MOV SP,WORD PTR [SP_SAV]
- STI
- JNC FOUND2
- MOV DX,OFFSET UNABLE2 ;NO FILE
- CALL PROMPT ;SHOW WE CAN'T FIND FILE
- MOV DX,OFFSET RETURN
- CALL PROMPT
- CALL BUFINP
- FOUND2: CALL CLS ;CLEAR THE SCREEN
- RET
- CHKSUM ENDP
- ;
- HDTEST PROC NEAR
- CALL FORM1
- MOV DX,OFFSET HDTS
- CALL PROMPT
- CALL SET_INT
- MOV BX,OFFSET TOP ;GET TOP OF PROGRAM
- MOV CL,4 ;CONVERT TO PARAGRAPHS
- SHR BX,CL ;DIV BY SIXTEEN
- INC BX ;ROUND UP
- MOV AH,4AH ;FUNCTION
- INT MS_DOS ;DO IT
- ;
- ; Load execute HDTEST.COM
- ;
- MOV AX,CS
- MOV WORD PTR [SEG_1],AX ;PARAMETER BLOCK FIXUPS
- MOV WORD PTR [SEG_2],AX
- MOV WORD PTR [SEG_3],AX
- MOV BYTE PTR DS:[80H],0 ;SHOW NO COMMAND LINE
- MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
- MOV DX,OFFSET DTESTF ;POINT TO FILENAME
- MOV BX,OFFSET BLOCK ;POINT TO PARAMETER BLOCK
- MOV AX,4B00H ;LOAD/EXECUTE
- INT MS_DOS
- ;
- ; Recreate environment upon return.
- ;
- MOV AX,CS ;GET CODE SEGMENT
- MOV DS,AX
- MOV ES,AX
- CLI
- MOV SS,AX
- MOV SP,WORD PTR [SP_SAV]
- STI
- JNC FOUND3
- MOV DX,OFFSET UNABLE3 ;NO FILE
- CALL PROMPT ;SHOW WE CAN'T FIND FILE
- FOUND3: MOV DX,OFFSET RETURN
- CALL PROMPT
- CALL RES_INT ;RESTORE INTERRUPTS
- CALL BUFINP
- CALL CLS ;CLEAR THE SCREEN
- RET
- HDTEST ENDP
- ;
- ;
- SPEED PROC NEAR
- CALL FORM1
- MOV DX,OFFSET SPED
- CALL PROMPT
- CALL SET_INT
- MOV BX,OFFSET TOP ;GET TOP OF PROGRAM
- MOV CL,4 ;CONVERT TO PARAGRAPHS
- SHR BX,CL ;DIV BY SIXTEEN
- INC BX ;ROUND UP
- MOV AH,4AH ;FUNCTION
- INT MS_DOS ;DO IT
- ;
- ; Load execute HDSPEED.COM
- ;
- MOV AX,CS
- MOV WORD PTR [SEG_1],AX ;PARAMETER BLOCK FIXUPS
- MOV WORD PTR [SEG_2],AX
- MOV WORD PTR [SEG_3],AX
- MOV BYTE PTR DS:[80H],0 ;SHOW NO COMMAND LINE
- MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
- MOV DX,OFFSET SPEEDF ;POINT TO FILENAME
- MOV BX,OFFSET BLOCK ;POINT TO PARAMETER BLOCK
- MOV AX,4B00H ;LOAD/EXECUTE
- INT MS_DOS
- ;
- ; Recreate environment upon return.
- ;
- MOV AX,CS ;GET CODE SEGMENT
- MOV DS,AX
- MOV ES,AX
- CLI
- MOV SS,AX
- MOV SP,WORD PTR [SP_SAV]
- STI
- JNC FOUND4
- MOV DX,OFFSET UNABLE4 ;CAN'T FIND FILE
- CALL PROMPT ;SHOW WE CAN'T FIND FILE
- FOUND4: MOV DX,OFFSET RETURN
- CALL PROMPT
- CALL RES_INT ;RESTORE INTERRUPTS
- CALL BUFINP
- CALL CLS ;CLEAR THE SCREEN
- RET
- SPEED ENDP
- ;
- ;
- SHIP PROC NEAR
- CALL FORM1
- MOV DX,OFFSET SHIPP
- CALL PROMPT
- CALL SET_INT
- MOV BX,OFFSET TOP ;GET TOP OF PROGRAM
- MOV CL,4 ;CONVERT TO PARAGRAPHS
- SHR BX,CL ;DIV BY SIXTEEN
- INC BX ;ROUND UP
- MOV AH,4AH ;FUNCTION
- INT MS_DOS ;DO IT
- ;
- ; Load execute SHIP.COM
- ;
- MOV AX,CS
- MOV WORD PTR [SEG_1],AX ;PARAMETER BLOCK FIXUPS
- MOV WORD PTR [SEG_2],AX
- MOV WORD PTR [SEG_3],AX
- MOV BYTE PTR DS:[80H],0 ;SHOW NO COMMAND LINE
- MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
- MOV DX,OFFSET SHIPF ;POINT TO FILENAME
- MOV BX,OFFSET BLOCK ;POINT TO PARAMETER BLOCK
- MOV AX,4B00H ;LOAD/EXECUTE
- INT MS_DOS
- ;
- ; Recreate environment upon return.
- ;
- MOV AX,CS ;GET CODE SEGMENT
- MOV DS,AX
- MOV ES,AX
- CLI
- MOV SS,AX
- MOV SP,WORD PTR [SP_SAV]
- STI
- JNC FOUND5
- MOV DX,OFFSET UNABLE5 ;CAN'T FIND FILE
- CALL PROMPT ;SHOW WE CAN'T FIND FILE
- FOUND5: MOV DX,OFFSET RETURN
- CALL PROMPT
- CALL RES_INT ;RESTORE INTERRUPTS
- CALL BUFINP
- CALL CLS ;CLEAR THE SCREEN
- RET
- SHIP ENDP
- ;
- SET_INT PROC NEAR
- PUSH ES ;SAVE SEGMENT
- MOV AH,35H ;GET INT VECTOR
- MOV AL,PAR_TBL_INT ;DISK PARAMETER TABLE
- INT MS_DOS ;RETURNS IN ES:BX
- MOV WORD PTR [PAR_OFF],BX ;SAVE IN CODE SEGMENT
- MOV WORD PTR [PAR_SEG],ES
- POP ES ;RESTORE SEGMENT
- ;
- MOV DX,OFFSET DRIVE_ZERO ;NEW PARAMETER TABLE
- MOV AH,25H ;PATCH INT VECTOR
- MOV AL,PAR_TBL_INT ;INTERRUPT TO PATCH
- INT MS_DOS ;PATCH VECTOR
- ;
- INI_DRV PROC NEAR
- MOV AH,9 ;INITIALIZE DRIVE PARAMS
- MOV DX,80H
- INT DISK ;DO IT
- RET
- INI_DRV ENDP
- SET_INT ENDP
- ;
- ; Restore moved vectors
- ;
- RES_INT PROC NEAR
- MOV DX,WORD PTR [PAR_OFF] ;GET SAVED OFFSET
- PUSH DS ;SAVE SEGMENT
- MOV DS,WORD PTR [PAR_SEG] ;GET SAVED VECTOR SEGMENT
- MOV AH,25H ;PATCH INT VECTOR
- MOV AL,PAR_TBL_INT ;INTERRUPT TO PATCH
- INT MS_DOS ;RESTORE VECTOR
- POP DS ;RESTORE SEGMENT
- ;
- MOV AH,9 ;INITIALIZE DRIVE PARAMS
- MOV DX,80H
- INT DISK ;DO IT
- RET
- RES_INT ENDP
- ;
- EXPAND PROC NEAR
- CALL FORM1 ;FILL UP SPACES
- MOV DX,OFFSET EXP ;WANNA DO THIS?
- CALL PROMPT ;ASK
- CALL BUFINP ;GET RESPONSE
- CMP BYTE PTR [CONBUF+1],0
- JZ EXPXT
- AND BYTE PTR [CONBUF+2],95 ;MAP TO UPPER CASE
- CMP BYTE PTR [CONBUF+2],'Y'
- JZ DOIT
- EXPXT: RET
- DOIT: CALL FORM1
- MOV DX,OFFSET PRP16 ;POINT TO WHICH DRIVE?
- CALL PROMPT ;ASK
- CALL BUFINP ;GET RESPONSE
- CALL EXTRACT ;GET BINARY
- JCXZ EXPXT ;NOTHING TYPED
- CMP AX,2 ;CHECK LIMITS
- JNC EXPXT ;NO SUCH DRIVE
- ADD AX,80H ;ADD IN BIAS
- MOV WORD PTR [DRIVE],AX
- ;
- CALL SET_INT ;SET UP INTERRUPT
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE NAME
- MOV BX,OFFSET SECBUF ;SECTOR BUFFER
- MOV AX,0F00H ;WRITE TO SECTOR BUFFER
- INT DISK ;WRITE TO SECTOR BUFFER
- ;
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE
- CALL GET_PAR ;GET DRIVE PARAMETERS
- XCHG CH,CL ;WHOLE TRACK INTO CL
- AND CH,11000000B ;MASK SECTORS
- ROL CH,1
- ROL CH,1 ;INTO LOW POSITION
- MOV WORD PTR [MAX_TRK],CX ;SAVE FOR NOW
- DEXP: INC WORD PTR [MAX_TRK] ;TRY TO ADD ANOTHER TRACK
- MOV DX,OFFSET ATTEMPT ;POINT TO PROMPT
- CALL PROMPT
- MOV AX,WORD PTR [MAX_TRK]
- INC AX
- PUSH AX
- CALL ASCII ;PRINT NEW MAX TRACK
- POP AX
- MOV BX,WORD PTR [DRIVE] ;GET DRIVE IN USE
- SUB BX,80H ;REMOVE BIAS
- ADD BX,OFFSET TYPE0 ;WHERE THE 'TYPE' IS
- MOV BL,BYTE PTR [BX] ;GET DRIVE TYPE
- XOR BH,BH ;RESET HIGH BYTE
- MOV CL,4 ;LENGTH OF THE TABLE
- ROL BX,CL ;TIMES SIXTEEN
- ADD BX,OFFSET DRIVE_ZERO ;PARAMETER TABLE
- MOV WORD PTR [BX],AX ;PUT IN NEW MAX CYLINDER
- CALL INI_DRV ;INITIALIZE
- ;
- MOV BX,WORD PTR [MAX_TRK] ;GET MAX TRACK AGAIN
- XCHG BH,BL ;SWAP HIGH/LOW
- MOV CL,6 ;BITS TO MOVE
- SHL BL,CL ;MOVE EM OVER
- MOV CX,BX ;COPY NEW CYLINDER
- OR CL,1 ;SECTOR ONE
- ;
- ; Format the drive starting at CX cylinder.
- ;
- PUSH CX ;SAVE CYLINDER
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE
- MOV AX,0705H ;FORMAT STARTING AT TRK CX
- INT DISK ;WITH INTERLEAVE OF 5
- POP CX ;RESTORE CYLINDER
- JC DDONE
- ;
- ; No reported errors so attempt to read the new track 10 times
- ;
- MOV BYTE PTR [RCOUNT],10 ;TIMES TO READ
- ROVER: PUSH CX ;SAVE CYLINDER
- MOV AX,0411H ;VERIFY 17 SECTORS
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE
- INT DISK
- POP CX ;RESTORE CYLINDER
- JC DDONE
- DEC BYTE PTR [RCOUNT] ;READ COUNTER
- JNZ ROVER
- ;
- ; No reported errors so back up one track to see if we just overwrote
- ; previous track.
- ;
- PUSH CX ;SAVE CYLINDER
- MOV BX,WORD PTR [MAX_TRK] ;GET MAX TRACK AGAIN
- DEC BX ;BUMP TRACK DOWN
- XCHG BH,BL ;SWAP HIGH/LOW
- MOV CL,6 ;BITS TO MOVE
- SHL BL,CL ;MOVE EM OVER
- MOV CX,BX ;COPY NEW CYLINDER
- OR CL,1 ;SECTOR ONE
- MOV AX,0411H ;VERIFY 17 SECTORS
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE
- INT DISK
- POP CX ;RESTORE CYLINDER
- JC DDONE ;CAN'T DO IT, DRIVE IS OFF
- PUSH CX ;SAVE CYLINDER
- MOV CX,1 ;SECTOR 1 CYL 0
- MOV AX,0411H ;VERIFY 17 SECTORS
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE
- INT DISK
- POP CX ;RESTORE CYLINDERS
- JC DDONE
- MOV DX,OFFSET VERIFY
- CALL PROMPT
- JMP DEXP ;CONTINUE
- ;
- DDONE: CALL RES_INT ;RESTORE INTERRUPTS
- MOV BX,WORD PTR [DRIVE] ;GET DRIVE IN USE
- SUB BX,80H ;REMOVE BIAS
- ADD BX,OFFSET TYPE0 ;WHERE THE 'TYPE' IS
- MOV BL,BYTE PTR [BX] ;GET DRIVE TYPE
- XOR BH,BH ;RESET HIGH BYTE
- MOV CL,4 ;LENGTH OF THE TABLE
- ROL BX,CL ;TIMES SIXTEEN
- ADD BX,OFFSET DRIVE_ZERO ;PARAMETER TABLE
- DEC WORD PTR [BX] ;RESTORE NEW MAX CYLINDER
- MOV DX,OFFSET PRP18 ;ASK 'WANNA FORMAT MORE?
- CALL PROMPT
- CALL BUFINP ;GET RESPONSE
- CMP BYTE PTR [CONBUF+1],0
- JZ EXEXT
- AND BYTE PTR [CONBUF+2],95 ;MAP TO UPPER CASE
- CMP BYTE PTR [CONBUF+2],'Y'
- JNZ EXEXT
- CALL RFORMAT ;REFORMAT THE DRIVE
- EXEXT: RET
- EXPAND ENDP
- ;
- NFORMAT PROC NEAR
- CALL FORM1 ;FILL UP SPACES
- MOV DX,OFFSET PRP21 ;ASK 'WANNA FORMAT ?
- CALL PROMPT
- CALL BUFINP ;GET RESPONSE
- CMP BYTE PTR [CONBUF+1],0
- JZ NOWAY ;DIDN'T THINK SO
- AND BYTE PTR [CONBUF+2],95 ;MAP TO UPPER CASE
- CMP BYTE PTR [CONBUF+2],'Y'
- JNZ NOWAY
- CALL FORM1
- MOV DX,OFFSET PRP16 ;POINT TO WHICH DRIVE?
- CALL PROMPT ;ASK
- CALL BUFINP ;GET RESPONSE
- CALL EXTRACT ;GET BINARY
- JCXZ NOWAY ;NOTHING TYPED
- CMP AX,2 ;CHECK LIMITS
- JNC NOWAY ;NO SUCH DRIVE
- ADD AX,80H ;ADD IN BIAS
- MOV WORD PTR [DRIVE],AX
- JMP SHORT RFORMAT
- NOWAY: RET
- RFORMAT PROC NEAR
- CALL FORM1 ;FILL UP SPACES
- MOV DX,OFFSET PRP20 ;INTERLEAVE FACTOR?
- CALL PROMPT ;ASK
- CALL BUFINP ;GET RESPONSE
- CALL EXTRACT ;CONVERT TO BINARY
- JCXZ NOFMT
- PUSH AX ;SAVE
- CALL FORM1
- MOV DX,OFFSET PRP19 ;POINT TO 'FORMATTING
- CALL PROMPT
- MOV AX,WORD PTR [DRIVE]
- XOR AH,AH
- SUB AL,80H
- CALL ASCII
- MOV DX,WORD PTR [DRIVE] ;GET DRIVE NAME
- MOV BX,OFFSET SECBUF ;SECTOR BUFFER
- MOV AX,0F00H ;WRITE TO SECTOR BUFFER
- INT DISK ;WRITE TO SECTOR BUFFER
- CALL SET_INT ;SET UP INTERRUPT
- CALL INI_DRV ;INITIALIZE
- MOV DX,WORD PTR [DRIVE] ;THE DRIVE
- MOV CX,1 ;TRACK ZERO SECTOR ONE
- POP AX
- MOV AH,07 ;FORMAT STARTING AT TRK CX
- INT DISK ;WITH INTERLEAVE OF 5
- CALL RES_INT ;RESTORE INTERRUPTS
- NOFMT: RET
- RFORMAT ENDP
- NFORMAT ENDP
- ;
- DRIVE_ZERO PARAMS <,,,,,,,,,>
- PAR_LEN EQU $ - DRIVE_ZERO
- DRIVE_ONE PARAMS <,,,,,,,,,>
- DRIVE_TWO PARAMS <,,,,,,,,,>
- DRIVE_THREE PARAMS <,,,,,,,,,>
- MAX_DRIVES DB ?
- ;
- LOGO1 DB 'Hard Disk Adjustment Tool Version 3.0$'
- SPACES1 EQU (COLUMNS - ($ - LOGO1))/2
- LOGO2 DB 'Copyright (C) 1987 Richard B. Johnson$'
- SPACES2 EQU (COLUMNS - ($ - LOGO2))/2
- LOGOLEN2 EQU $ - LOGO2
- ATTEMPT DB CR,' '
- DB CR,'EXPAND> Attempting to write cyl. $'
- VERIFY DB ' Verify OK $'
- PRP1 DB CR,LF,LF,'Number of drives present.$'
- PRP2 DB CR,LF,'Hard disk drive type.....'
- DB ' 1'
- DB ' '
- DB ' 2'
- DB ' '
- DB ' 3'
- DB ' '
- DB ' 4'
- DB ' $'
- PRP3 DB CR,LF,'1: Number of tracks......$'
- PRP4 DB CR,LF,'2: Number of heads.......$'
- PRP5 DB CR,LF,'3: Cyl. reduced current..$'
- PRP6 DB CR,LF,'4: Cyl. write precomp....$'
- PRP7 DB CR,LF,'5: Bits to error correct.$'
- PRP8 DB CR,LF,'6: Control option byte...$'
- PRP9 DB CR,LF,'7: Time-out for R/W......$'
- PRP10 DB CR,LF,'8: Time-out for format...$'
- PRP11 DB CR,LF,'9: Time-out for diag.....$'
- PRP12 DB CR,LF,'Drive$'
- PRP13 DB ' Heads =$'
- PRP14 DB ' Cylinders =$'
- PRP15 DB ' Sectors =$'
- PRP16 DB CR,'FORMAT> Which drive? 0 - 1 $'
- PRP18 DB CR,'FORMAT> Want to reformat the entire drive? Y/N $'
- PRP19 DB CR,'FORMAT> Formatting drive$'
- PRP20 DB CR,'FORMAT> Interleave factor? 1 - 15 $'
- PRP21 DB CR,'FORMAT> Do you really want to do this? Y/N $'
- TYP DB ' Type =$'
- CUR DB CR,LF,' -'
- DB ' Current drive parameters '
- DB '-$'
- ASK DB CR,LF,' Change, Checksum, Exit, Expand, Format, New,'
- DB ' Ship, Speed, Test, Try, Write'
- DB CR,LF,'ADJUST> $'
- WRITIN DB CR,'WRITING> HDISK.ROM$'
- BYEBYE DB CR,'EXITING> $'
- CHANG DB CR,'CHANGE> $'
- OUTSIDE DB CR,'TRY> (Type EXIT to return) $'
- HDTS DB CR,'TEST> $'
- SPED DB CR,'SPEED> $'
- SHIPP DB CR,'SHIP> $'
- NEW DB CR,'NEW> $'
- SUMIT DB CR,'CHECKSUM> HDISK.ROM$'
- EXP DB CR,'EXPAND> Do you really want to do this? Y/N $'
- RETURN DB ' [Return] $'
- DTYPE DB 'Drive type? (1 - 4) $'
- CRLF DB CR,LF,'$'
- SPACES DB ' [$'
- ENDHEX DB ']$'
- SPACER DB ': $'
- FNAME DB 'HDISK.ROM',0
- COMND DB '\COMMAND.COM',0
- CHKSMF DB 'CHECKSUM.COM',0
- DTESTF DB 'HDTEST.COM',0
- SPEEDF DB 'HDSPEED.COM',0
- SHIPF DB 'SHIP.COM',0
- UNABLE1 DB ' Unable to execute \COMMAND.COM'
- DB CR,LF,'(Must exist in the TOP directory) $'
- UNABLE2 DB ' Unable to execute CHECKSUM.COM'
- DB CR,LF,'(Must exist in the default directory) $'
- UNABLE3 DB ' Unable to execute HDTEST.COM'
- DB CR,LF,'(Must exist in the default directory) $'
- UNABLE4 DB ' Unable to execute HDSPEED.COM'
- DB CR,LF,'(Must exist in the default directory) $'
- UNABLE5 DB ' Unable to execute SHIP.COM'
- DB CR,LF,'(Must exist in the default directory) $'
- MAKERR DB ' Unable to CREATE directory entry [Return] $'
- WRERR DB ' Unable to WRITE to the disk [Return] $'
- BADSEG DB ' BIOS ROM pointer wrong. '
- DB 'Reboot with NO device drivers! [Return] $'
- KNOW DB CMD_LEN - 2
- DB ' HDISK.ROM',CR
- CMD_LEN EQU ($ - KNOW)
- HANDLE DW ?
- DRIVE DW 80H
- SAV_OFF DW ? ;OFFSET OF HARD DISK TABLES
- SAV_SEG DW ? ;SEGMENT OF HARD DISK BIOS
- PAR_OFF DW ? ;HDISK PARAMETER TABLE OFFSET
- PAR_SEG DW ? ;HDISK PARAMETER TABLE SEGMENT
- SP_SAV DW ? ;SAVE STACK FOR OVERLAY
- PROM_LEN DW ? ;SIZE OF THE HD BIOS PROM
- MAX_TRK DW ?
- TYPE0 DB -1
- TYPE1 DB -1
- RCOUNT DB ?
- BLOCK DW 0 ;SEGMENT ADDRESS OF ENVIRONMENT
- DW 80H
- SEG_1 DW ?
- DW 5CH
- SEG_2 DW ?
- DW 6CH
- SEG_3 DW ?
- ;
- CONBUF LABEL WORD
- DB 16 DUP(?)
- ;
- DB 30 DUP('STACK ')
- STKTOP LABEL WORD
- EVEN
- SECBUF LABEL BYTE
- CHECK PROC NEAR
- XOR AH,0 ;START WITH ZERO
- MOV SI,100H ;WHERE THE DATA STARTS
- MOV CX,(OFFSET TOP - OFFSET MAIN) ;BYTES TO CHECK
- CHKEM: LODSB ;GET BYTE
- ADD AH,AL
- LOOP CHKEM
- POP AX ;GET RETURN ADDRESS
- PUSHF ;SAVE FLAGS ON STACK
- PUSH AX ;SAVE RETURN ADDRESS
- RET ;GO HOME
- CHECK ENDP
- ORG SECBUF + 512
- TOP EQU $
- PSEG ENDS
- END MAIN