1270 lines
33 KiB
NASM
1270 lines
33 KiB
NASM
PAGE 109,132
|
||
|
||
TITLE MS-DOS 5.0 HDBIOK.ASM
|
||
|
||
;************************************************************************
|
||
;* *
|
||
;* *
|
||
;* MODULE NAME: HDBIOK.ASM *
|
||
;* *
|
||
;* *
|
||
;* COPYRIGHT (C) NEC CORPORATION 1990 *
|
||
;* *
|
||
;* NEC CONFIDENTIAL AND PROPRIETARY *
|
||
;* *
|
||
;* All rights reserved by NEC Corporation. *
|
||
;* this program must be used solely for *
|
||
;* the purpose for which it was furnished *
|
||
;* by NEC Corporation. No past of this program *
|
||
;* may be reproduced or disclosed to others, *
|
||
;* in any form, without the prior written *
|
||
;* permission of NEC Corporation. *
|
||
;* Use of copyright notice does not evidence *
|
||
;* publication of this program. *
|
||
;* *
|
||
;************************************************************************
|
||
;
|
||
|
||
PAGE
|
||
|
||
;---------------------------------------
|
||
;
|
||
; SYSTEM_COMMON AREA 85/02/19
|
||
;
|
||
;---------------------------------------
|
||
|
||
DATA SEGMENT AT 0000H ;DSEG 0
|
||
ORG 480H
|
||
BIOS_FLAG1 DB 1 DUP(?)
|
||
HDSK_MODE DB 1 DUP(?)
|
||
ORG 492H
|
||
DISK_RESET DB 1 DUP(?)
|
||
F2HD_MODE DB 1 DUP(?)
|
||
DISK_EQUIP2 DB 1 DUP(?)
|
||
ORG 500H
|
||
BIOS_FLAG DW 1 DUP(?)
|
||
|
||
ORG 55CH
|
||
DISK_EQUIP DW 1 DUP(?)
|
||
DISK_INT DW 1 DUP(?)
|
||
DISK_TYPE DB 1 DUP(?)
|
||
DISK_MODE DB 1 DUP(?)
|
||
DISK_TIME DW 1 DUP(?)
|
||
DISK_RESULT DW 16 DUP(?)
|
||
DISK_BOOT DB 1 DUP(?)
|
||
DISK_STATUS DB 1 DUP(?)
|
||
DISK_SENSE DW 2 DUP(?)
|
||
ORG 586H
|
||
DISK_SSB0A DW 1 DUP(?)
|
||
ORG 5E8H
|
||
DISK_PRM0 DW 2 DUP(?)
|
||
DISK_PRM1 DW 2 DUP(?)
|
||
|
||
DATA ENDS
|
||
;
|
||
PAGE
|
||
;
|
||
;
|
||
; This file defines the segment structure of the BIOS.
|
||
; It should be included at the beginning of each source file.
|
||
; All further segment declarations in the file can then be done by just
|
||
; by specifying the segment name, with no attribute, class, or align type.
|
||
|
||
datagrp group Bios_Data,Bios_Data_Init
|
||
|
||
Bios_Data segment word public 'Bios_Data'
|
||
Bios_Data ends
|
||
|
||
Bios_Data_Init segment word public 'Bios_Data_Init'
|
||
Bios_Data_Init ends
|
||
|
||
Filler segment para public 'Filler'
|
||
Filler ends
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
Bios_Code ends
|
||
|
||
Filler2 segment para public 'Filler2'
|
||
Filler2 ends
|
||
|
||
SysInitSeg segment word public 'system_init'
|
||
SysInitSeg ends
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
ASSUME CS:BIOS_CODE,DS:DATA
|
||
|
||
EXTRN H5_STUS:NEAR,H5_DPM:WORD
|
||
|
||
Bios_Code ends
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
ASSUME CS:BIOS_CODE,DS:DATA
|
||
|
||
PUBLIC HDBIOK_CODE_START
|
||
PUBLIC HDBIOK_CODE_END
|
||
PUBLIC HDBIOK_END
|
||
|
||
HDBIOK_CODE_START:
|
||
|
||
PUBLIC HD_ENTC
|
||
|
||
;
|
||
;------ 5" HARD DISK BASIC I/O ROUTINE
|
||
;
|
||
;
|
||
; '86/09/01
|
||
; '85/05/08
|
||
; '85/04/23
|
||
; '85/04/19 CREATED
|
||
; '88/04/xx DOS 3.3 N10 ROUTIN
|
||
;
|
||
; 5" HARD DISK BIOS
|
||
; AUTHOR I.HASHIBA
|
||
;
|
||
DISK_EQIP EQU BYTE PTR DS:[055DH]
|
||
DISK_INTF EQU BYTE PTR DS:[055FH]
|
||
DISK_INTO EQU WORD PTR DS:[0044H]
|
||
DISK_INTS EQU WORD PTR DS:[0046H]
|
||
DISK_STUS EQU BYTE PTR DS:[0585H]
|
||
DISK_SSB0W EQU WORD PTR DS:[0586H]
|
||
DISK_SSB0 EQU BYTE PTR DS:[0586H]
|
||
DISK_SSB1 EQU BYTE PTR DS:[0587H]
|
||
DISK_SSB2W EQU WORD PTR DS:[0588H]
|
||
DISK_SSB2 EQU BYTE PTR DS:[0588H]
|
||
DISK_SSB3 EQU BYTE PTR DS:[0589H]
|
||
;
|
||
DSK_IDR EQU 80H ;INPUT DATA REGISTER
|
||
DSK_ODR EQU 80H ;OUTPUT DATA REGISTER
|
||
DSK_CSR EQU 82H ;CHANNEL STATUS REGISTER
|
||
DSK_CCR EQU 82H ;CHANNEL CONTROL REGISTER
|
||
;
|
||
S_INT EQU 01H ;INTERRUPT
|
||
S_PER EQU 02H ;PARITY ERROR
|
||
S_IXO EQU 04H ;INPUT/OUTPUT
|
||
S_CXD EQU 08H ;COMMAND/DATA
|
||
S_MSG EQU 10H ;MESSAGE
|
||
S_BSY EQU 20H ;BUSY
|
||
S_ACK EQU 40H ;ACKNOWLEDGE
|
||
S_REQ EQU 80H ;REQUEST
|
||
;
|
||
C_SWC EQU 00H ;SWITCH
|
||
C_INT EQU 01H ;INTERRUPT ENABLE
|
||
C_DMA EQU 02H ;DIRECT MEMORY ACCESS ENABLE
|
||
C_RST EQU 08H ;RESET
|
||
C_SEL EQU 20H ;SELECT
|
||
C_CTL EQU 40H ;CONTROL
|
||
C_CHN EQU 80H ;CHANNEL ENABLE
|
||
|
||
DMA_ADR0 EQU 01H
|
||
DMA_CNT0 EQU 03H
|
||
DMA_ADR1 EQU 05H
|
||
DMA_CNT1 EQU 07H
|
||
DMA_ADR2 EQU 09H
|
||
DMA_CNT2 EQU 0BH
|
||
DMA_ADR3 EQU 0DH
|
||
DMA_CNT3 EQU 0FH
|
||
DMA_SMR EQU 15H
|
||
DMA_BPTR EQU 19H
|
||
DMA_BNK0 EQU 27H
|
||
DMA_BNK2 EQU 23H
|
||
DMA_BNK3 EQU 25H
|
||
DMA_CMD EQU 11H
|
||
DMA_MOD EQU 17H
|
||
DMA_MCL EQU 1BH
|
||
DMA_MSK EQU 15H
|
||
|
||
BIO_FLG EQU BYTE PTR 18[BP] ; FLAG
|
||
BIO_CMD EQU BYTE PTR 1[BP] ; COMMAND
|
||
BIO_UNT EQU BYTE PTR 0[BP] ; UNIT
|
||
BIO_DTL EQU WORD PTR 2[BP] ; DATA LENGTH
|
||
BIO_BLK EQU BYTE PTR 3[BP]
|
||
BIO_CYW EQU WORD PTR 4[BP]
|
||
BIO_CYL EQU BYTE PTR 4[BP] ; CYLINDER #
|
||
BIO_HED EQU BYTE PTR 7[BP] ; HEAD #
|
||
BIO_SEC EQU BYTE PTR 6[BP] ; SECTER #
|
||
BIO_NUM EQU BYTE PTR 5[BP] ; SECTER LENGTH
|
||
BIO_DTA EQU WORD PTR 8[BP] ; DATA OFFSET
|
||
BIO_DTS EQU WORD PTR 10[BP] ; DATA SEGMENT
|
||
|
||
;
|
||
;---------- ENTRY
|
||
;
|
||
HD_ENTC:
|
||
PUSHF
|
||
STI
|
||
CLD
|
||
PUSH DS
|
||
PUSH SI
|
||
PUSH DI
|
||
PUSH ES
|
||
PUSH BP
|
||
PUSH DX
|
||
PUSH CX
|
||
PUSH BX
|
||
PUSH AX
|
||
MOV BP,SP
|
||
XOR BX,BX
|
||
MOV DS,BX
|
||
MOV ES,BX
|
||
CLI ;DISABLE
|
||
MOV WORD PTR DISK_INTO,OFFSET H5_INTR
|
||
MOV DISK_INTS,CS
|
||
IN AL,0AH ;READ IMR
|
||
AND AL,0FDH
|
||
OUT 0AH,AL
|
||
STI ;ENABLE
|
||
AND AH,0FH
|
||
SAL AH,1
|
||
MOV BL,AH
|
||
H5_ENTR:
|
||
CALL CS:WORD PTR H5_JPT[BX]
|
||
MOV BIO_CMD,AH
|
||
AND BIO_FLG,0FEH
|
||
CMP AH,20H
|
||
JB H5_EXTC
|
||
OR BIO_FLG,01H
|
||
H5_EXTC:
|
||
MOV AL,04H
|
||
OUT DMA_SMR,AL
|
||
CLI
|
||
IN AL,0AH ;READ IMR
|
||
OR AL,02H
|
||
OUT 0AH,AL
|
||
DS_CEXT:
|
||
STI
|
||
POP AX
|
||
POP BX
|
||
POP CX
|
||
POP DX
|
||
POP BP
|
||
POP ES
|
||
POP DI
|
||
POP SI
|
||
POP DS
|
||
POPF
|
||
RET
|
||
;
|
||
;------ JUMP TABLE
|
||
;
|
||
H5_JPT DW OFFSET H5_SEEK
|
||
DW OFFSET H5_VRFY
|
||
DW OFFSET H5_NOP
|
||
DW OFFSET H5_INZT
|
||
DW OFFSET H5_SENS
|
||
DW OFFSET H5_WRIT
|
||
DW OFFSET H5_READ
|
||
DW OFFSET H5_RCAL
|
||
DW OFFSET H5_ASGN
|
||
DW OFFSET H5_NOP
|
||
DW OFFSET H5_NOP
|
||
DW OFFSET H5_FBAD
|
||
DW OFFSET H5_NOP
|
||
DW OFFSET H5_FORM
|
||
DW OFFSET H5_MODE ;MODE SET
|
||
DW OFFSET H5_RTRT
|
||
|
||
PAGE
|
||
|
||
;
|
||
;------ ASSIGN ALTERNATE TRACK ADDRESS
|
||
;
|
||
H5_ASGN:
|
||
CALL H5_CHKM
|
||
CALL H5_PRMH
|
||
CALL H5_LADS
|
||
MOV ES,BIO_DTS
|
||
MOV DI,BIO_DTA
|
||
MOV AL,DISK_SSB1
|
||
AND AL,1FH
|
||
STOSB
|
||
MOV AL,DISK_SSB2
|
||
STOSB
|
||
MOV AL,DISK_SSB3
|
||
STOSB
|
||
MOV AL,0
|
||
STOSB
|
||
;
|
||
;------ NO OPERATION
|
||
;
|
||
H5_NOP:
|
||
MOV AH,00H
|
||
RET
|
||
H5_RSET:
|
||
AND DISK_INTF,0FCH
|
||
CALL H5_BRST ;BUS RESET
|
||
JNZ H5_NOP
|
||
CALL DS_WSEC
|
||
XOR AH,AH
|
||
PUSH BP
|
||
PUSH AX
|
||
MOV BP,SP
|
||
MOV BIO_UNT,00H
|
||
CALL H5_ARRS
|
||
MOV BIO_UNT,01H
|
||
CALL H5_ARRS
|
||
POP AX
|
||
POP BP
|
||
MOV AH,00H
|
||
RET
|
||
H5_ARRS:
|
||
CALL H5_ADPR
|
||
CALL H5_RCAL
|
||
CALL H5_RTRT
|
||
RET
|
||
;
|
||
; BUS RESET SUBROUTINE
|
||
;
|
||
H5_BRST:
|
||
MOV AL,C_RST
|
||
OUT DSK_CCR,AL ;RESET
|
||
XOR CX,CX
|
||
LOOP $
|
||
MOV AL,0
|
||
OUT DSK_CCR,AL ;RESET
|
||
MOV AL,C_CTL
|
||
JMP SHORT $+2
|
||
OUT DSK_CCR,AL
|
||
JMP SHORT $+2
|
||
IN AL,DSK_CSR
|
||
TEST AL,S_BSY
|
||
RET
|
||
;
|
||
;------ INITIALIZE
|
||
;
|
||
H5_INZT:
|
||
AND DISK_EQIP,0FCH
|
||
AND DISK_INTF,0FCH
|
||
CALL H5_BRST ;BUS RESET
|
||
JNZ H5_NOP
|
||
;
|
||
MOV AL,C_SWC
|
||
OUT DSK_CCR,AL
|
||
JMP SHORT $+2
|
||
IN AL,DSK_CSR
|
||
MOV AH,AL
|
||
;
|
||
MOV DH,00H
|
||
AND AL,38H
|
||
CMP AL,38H
|
||
JE H5_INZ0
|
||
OR DH,01H
|
||
H5_INZ0:
|
||
AND AH,07H
|
||
CMP AH,07H
|
||
JE H5_INZ1
|
||
OR DH,02H
|
||
H5_INZ1:
|
||
MOV DL,2 ;READY CHECK COUNT AT WARM START
|
||
TEST BYTE PTR BIOS_FLAG,80H
|
||
JNZ H5_INZ2
|
||
MOV DL,30 ;READY CHECK COUNT AT COLD START
|
||
H5_INZ2:
|
||
CALL DS_WSEC ;WAIT LOOP 1 SECOND
|
||
XOR AH,AH
|
||
PUSH BP
|
||
PUSH DX ;DH,DL=BYTE PTR 3,2[BP]
|
||
PUSH AX
|
||
MOV BP,SP
|
||
;
|
||
MOV BIO_UNT,00H
|
||
CALL H5_ADPR
|
||
MOV BIO_UNT,01H
|
||
CALL H5_ADPR
|
||
;
|
||
H5_INZ4:
|
||
TEST BYTE PTR 3[BP],01H
|
||
JZ H5_INZ5
|
||
MOV BIO_UNT,00H
|
||
CALL H5_SENS
|
||
CMP AH,90H
|
||
JE H5_INZ41
|
||
TEST AH,0F0H
|
||
JNZ H5_INZ5
|
||
OR DISK_EQIP,01H
|
||
H5_INZ41:
|
||
AND BYTE PTR 3[BP],0FEH
|
||
H5_INZ5:
|
||
TEST BYTE PTR 3[BP],02H
|
||
JZ H5_INZ6
|
||
MOV BIO_UNT,01H
|
||
CALL H5_SENS
|
||
CMP AH,90H
|
||
JE H5_INZ51
|
||
TEST AH,0F0H
|
||
JNZ H5_INZ6
|
||
OR DISK_EQIP,02H
|
||
H5_INZ51:
|
||
AND BYTE PTR 3[BP],0FDH
|
||
H5_INZ6:
|
||
TEST BYTE PTR 3[BP],03H
|
||
JZ H5_INZ7
|
||
DEC BYTE PTR 2[BP]
|
||
JZ H5_INZ7
|
||
CALL DS_WSEC ;WAIT LOOP 1 SECOND
|
||
JMP SHORT H5_INZ4
|
||
H5_INZ7:
|
||
MOV BIO_UNT,00H
|
||
CALL H5_ARRS
|
||
MOV BIO_UNT,01H
|
||
CALL H5_ARRS
|
||
POP AX
|
||
POP DX
|
||
POP BP
|
||
H5_INZ8:
|
||
MOV AH,00H
|
||
RET
|
||
;
|
||
; SEEK COMMAND
|
||
;
|
||
H5_SEEK:
|
||
CALL H5_ADPR
|
||
CALL H5_PRMH
|
||
CALL H5_LADS
|
||
CALL H5_SLCT ;SELECTION
|
||
MOV AX,0B00H+C_CHN+C_CTL+C_INT
|
||
OUT DSK_CCR,AL
|
||
CALL H5_6BYT ;OUTPUT 6 BYTE COMMAND
|
||
XOR CX,CX
|
||
H5_SEK1:
|
||
TEST DISK_INTF,01H
|
||
LOOPZ H5_SEK1
|
||
JZ H5_SEK3
|
||
CALL H5_RSLT
|
||
RET
|
||
H5_SEK3:
|
||
CALL H5_RSLT
|
||
TEST AH,0F0H
|
||
JNZ H5_SEK4
|
||
MOV AH,10H
|
||
H5_SEK4:
|
||
RET
|
||
;
|
||
;------ SENSE
|
||
;
|
||
H5_SENS:
|
||
CALL H5_SLCT ;SELECTION
|
||
MOV AX,0000H+C_CHN+C_CTL+C_INT
|
||
OUT DSK_CCR,AL
|
||
CALL H5_COMD
|
||
MOV AH,BIO_UNT
|
||
MOV CL,5
|
||
SAL AH,CL
|
||
CALL H5_COMD
|
||
MOV AH,0
|
||
MOV CX,4
|
||
H5_SEN0:
|
||
CALL H5_COMD
|
||
LOOP H5_SEN0
|
||
CALL H5_RSLT
|
||
TEST AH,0F0H
|
||
JNZ H5_SEN1 ; ERROR
|
||
CALL H5_PRMH
|
||
OR AH,CS:20[BX] ;ES --> CS 88/04/11
|
||
TEST BIO_CMD,80H
|
||
JZ H5_SEN1
|
||
AND AH,0F0H
|
||
OR AH,CS:28[BX] ;ES --> CS 88/04/11
|
||
PUSH AX
|
||
MOV BIO_DTL,0100H
|
||
MOV BIO_SEC,33
|
||
CALL H5_RDSW
|
||
JZ H5_SEN2
|
||
MOV BIO_DTL,0200H
|
||
MOV BIO_SEC,17
|
||
H5_SEN2:
|
||
POP AX
|
||
MOV DL,CS:3[BX] ;ES --> CS 88/04/11
|
||
;# 860829
|
||
INC DL ;< 860829
|
||
MOV BIO_HED,DL
|
||
MOV DX,CS:4[BX] ;ES --> CS 88/04/11
|
||
XCHG DH,DL
|
||
MOV BIO_CYW,DX
|
||
H5_SEN1:
|
||
RET
|
||
;
|
||
;------ VERIFY DATA
|
||
;
|
||
H5_VRFY:
|
||
MOV AL,C_CTL
|
||
OUT DSK_CCR,AL
|
||
JMP SHORT $+2
|
||
IN AL,DSK_CSR
|
||
TEST AL,02H
|
||
MOV AX,0540H
|
||
JNZ H5_VRF1
|
||
MOV AX,0840H
|
||
H5_VRF1:
|
||
CALL H5_RWCM
|
||
CMP AH,08H
|
||
JNE H5_VRF0
|
||
TEST BIO_CMD,20H
|
||
JZ H5_CDER
|
||
OR AH,0B0H
|
||
H5_VRF0:
|
||
RET
|
||
;
|
||
;------ READ DATA
|
||
;
|
||
H5_READ:
|
||
MOV AX,0844H
|
||
CALL H5_RWCM
|
||
CMP AH,08H
|
||
JNE H5_REA0
|
||
TEST BIO_CMD,20H
|
||
JZ H5_CDER
|
||
OR AH,0B0H
|
||
H5_REA0:
|
||
RET
|
||
;
|
||
;------ CORRECTABLE DATA FIELD ERROR
|
||
;
|
||
H5_CDER:
|
||
MOV AH,40H
|
||
TEST DISK_SSB0,80H
|
||
JZ H5_CDE0
|
||
INC DISK_SSB3
|
||
ADC DISK_SSB2,0
|
||
ADC DISK_SSB1,0
|
||
IN AL,DMA_CNT0
|
||
MOV AH,AL
|
||
IN AL,DMA_CNT0
|
||
XCHG AL,AH
|
||
INC AX
|
||
PUSH AX
|
||
CALL H5_RDSW
|
||
POP AX
|
||
JZ H5_CDE3
|
||
SHR AH,1
|
||
CMP AH,0
|
||
JNZ H5_CDE3
|
||
MOV AH,80H
|
||
H5_CDE3:
|
||
MOV DISK_SSB0,AH
|
||
MOV AH,40H
|
||
CMP AL,0
|
||
JNE H5_CDE0
|
||
MOV AH,08H
|
||
CMP DISK_SSB0,00H
|
||
JE H5_CDE0
|
||
CALL H5_SLCT
|
||
MOV AX,0800H+C_CHN+C_CTL+C_DMA+C_INT
|
||
CALL H5_IOCM
|
||
CMP AH,08H
|
||
JE H5_CDER
|
||
JA H5_CDE0
|
||
MOV AH,08H
|
||
H5_CDE0:
|
||
RET
|
||
;
|
||
;------ WRITE DATA
|
||
;
|
||
H5_WRIT:
|
||
MOV AX,0A48H ;WRITE COMMAND
|
||
H5_RWCM:
|
||
CALL H5_CHKM
|
||
PUSH AX
|
||
CALL H5_DMAS
|
||
POP AX
|
||
JB H5_BUND ;DMA BOUNDALY ERROR
|
||
CALL H5_PRMH
|
||
CALL H5_LADS
|
||
CALL H5_SLCT
|
||
MOV AL,C_CHN+C_CTL+C_DMA+C_INT
|
||
H5_IOCM:
|
||
OUT DSK_CSR,AL
|
||
CALL H5_6BYT
|
||
CALL H5_RSLT
|
||
RET
|
||
H5_6BYT:
|
||
CALL H5_COMD
|
||
MOV AH,DISK_SSB1
|
||
CALL H5_COMD
|
||
MOV AH,DISK_SSB2
|
||
CALL H5_COMD
|
||
MOV AH,DISK_SSB3
|
||
CALL H5_COMD
|
||
MOV AH,DISK_SSB0
|
||
CALL H5_COMD
|
||
MOV AH,00H
|
||
TEST BIO_CMD,20H
|
||
JZ H5_6BYX
|
||
MOV AH,0C0H
|
||
H5_6BYX:
|
||
CALL H5_COMD
|
||
RET
|
||
;
|
||
;------ DMA BOUNDARY
|
||
;
|
||
H5_BUND:
|
||
MOV AH,20H
|
||
RET
|
||
;
|
||
H5_DMAS:
|
||
CLI ;90/03/22
|
||
CALL DS_PADR
|
||
PUSH AX
|
||
OUT DMA_ADR0,AL
|
||
MOV AL,AH
|
||
OUT DMA_ADR0,AL
|
||
MOV AL,CH
|
||
OUT DMA_BNK0,AL
|
||
MOV AX,BIO_DTL
|
||
DEC AX
|
||
OUT DMA_CNT0,AL
|
||
XCHG AL,AH
|
||
OUT DMA_CNT0,AL
|
||
XCHG AL,AH
|
||
POP CX
|
||
ADD AX,CX
|
||
MOV AL,00H
|
||
OUT DMA_SMR,AL
|
||
STI ;90/03/22
|
||
RET
|
||
;
|
||
;------ RECALIBRATE
|
||
;
|
||
H5_RCAL:
|
||
CALL H5_ADPR
|
||
CALL H5_SLCT
|
||
CALL H5_PRMH ;SETUP PARAMETOR ADDRESS
|
||
MOV AX,5
|
||
CALL H5_CYAD ;SETUP CYLINDER ADDRESS
|
||
CALL H5_LUNS ;SETUP LOGICAL UNIT NUMBER
|
||
MOV AX,0B00H+C_CHN+C_CTL+C_INT
|
||
CALL H5_IOCM ;SEEK TO CYLINDER 0
|
||
CALL H5_SLCT
|
||
XOR AX,AX
|
||
MOV DISK_SSB0W,AX
|
||
MOV DISK_SSB2W,AX
|
||
CALL H5_LUNS
|
||
MOV AX,0100H+C_CHN+C_CTL+C_INT
|
||
CALL H5_IOCM
|
||
PUSH AX
|
||
CALL H5_ADPM
|
||
POP AX
|
||
RET
|
||
;
|
||
;------ FORMAT BAD TRACK
|
||
;
|
||
H5_FBAD:
|
||
MOV AX,0E48H
|
||
CALL H5_CHKM
|
||
PUSH AX
|
||
CALL H5_DMAS
|
||
POP AX
|
||
JB H5_BUND ;DMA BOUNDALY ERROR
|
||
CALL H5_PRMH
|
||
CALL H5_LADS
|
||
MOV DL,BIO_BLK
|
||
MOV DISK_SSB0,DL
|
||
CALL H5_SLCT
|
||
MOV AL,C_CHN+C_CTL+C_DMA+C_INT
|
||
JMP H5_IOCM
|
||
;
|
||
;------ FORMAT TRACK/DRIVE
|
||
;
|
||
H5_FORM:
|
||
CALL H5_CHKM
|
||
MOV AX,0600H+C_CHN+C_CTL+C_INT
|
||
TEST BIO_CMD,80H
|
||
JZ H5_FOR0
|
||
CALL H5_RCAL
|
||
CMP AH,0
|
||
JNE H5_FOR1
|
||
MOV AX,0400H+C_CHN+C_CTL+C_INT
|
||
H5_FOR0:
|
||
CALL H5_PRMH
|
||
CALL H5_LADS
|
||
CALL H5_SLCT
|
||
MOV DL,BIO_BLK
|
||
MOV DISK_SSB0,DL
|
||
CALL H5_IOCM
|
||
H5_FOR1:
|
||
RET
|
||
;
|
||
; MODE SET
|
||
;
|
||
H5_MODE:
|
||
CALL H5_RDSW
|
||
TEST BIO_CMD,80H
|
||
MOV BL,AL
|
||
MOV AL,00H
|
||
JZ H5_MOD0
|
||
OR BL,08H
|
||
JMP SHORT H5_MODX
|
||
H5_MOD0:
|
||
TEST AH,80H
|
||
JZ H5_MODX
|
||
MOV AL,01H
|
||
H5_MODX:
|
||
XOR BH,BH
|
||
SAL BL,1
|
||
MOV BX,CS:WORD PTR H5_DPM[BX]
|
||
TEST BIO_UNT,01H
|
||
JNZ H5_MOD1
|
||
MOV DISK_PRM0+2,CS
|
||
MOV DISK_PRM0,BX
|
||
MOV AH,0FEH
|
||
JMP SHORT H5_MOD2
|
||
H5_MOD1:
|
||
MOV DISK_PRM1+2,CS
|
||
MOV DISK_PRM1,BX
|
||
SAL AL,1
|
||
MOV AH,0FDH
|
||
H5_MOD2:
|
||
AND HDSK_MODE,AH
|
||
OR HDSK_MODE,AL
|
||
MOV AH,00H
|
||
RET
|
||
;
|
||
; MODE CHECK
|
||
;
|
||
H5_CHKM:
|
||
MOV CX,0101H
|
||
AND CL,BIO_UNT
|
||
SAL CH,CL
|
||
TEST HDSK_MODE,CH
|
||
JNZ H5_CHKE
|
||
RET
|
||
H5_CHKE:
|
||
LEA SP,-2[BP]
|
||
MOV AH,40H
|
||
RET
|
||
;
|
||
;------ RETRACT
|
||
;
|
||
H5_RTRT:
|
||
CALL H5_ADPR
|
||
CALL H5_SLCT
|
||
CALL H5_PRMH ;SETUP PARAMETOR ADDRESS
|
||
MOV AX,CS:14[BX] ;ES --> CS 88/04/11
|
||
;GET RETRACT CYLINDER ADDRESS
|
||
XCHG AL,AH
|
||
CALL H5_CYAD ;SETUP CYLINDER ADDRESS
|
||
CALL H5_LUNS
|
||
MOV AX,0B00H+C_CHN+C_CTL+C_INT
|
||
CALL H5_IOCM
|
||
;
|
||
;------ ASSIGN DISK PARAMETER
|
||
;
|
||
H5_ADPM:
|
||
CALL H5_PRMH
|
||
MOV SI,BX
|
||
JMP SHORT H5_ADP0
|
||
H5_ADPR:
|
||
CALL H5_PRMH
|
||
LEA SI,10[BX]
|
||
H5_ADP0:
|
||
CALL H5_SLCT ;SELECT
|
||
MOV AH,0C2H
|
||
CALL H5_COMD
|
||
MOV AH,BIO_UNT
|
||
MOV CL,5
|
||
SAL AH,CL
|
||
CALL H5_COMD
|
||
MOV AH,0
|
||
MOV CX,4
|
||
H5_ADP1:
|
||
CALL H5_COMD
|
||
LOOP H5_ADP1
|
||
MOV CX,8
|
||
H5_ADP2:
|
||
LODS BYTE PTR CS:[SI] ;ES --> CS 88/04/11
|
||
MOV AH,AL
|
||
CALL H5_ODAT
|
||
LOOP H5_ADP2
|
||
CALL H5_RDSW
|
||
ROL AH,1
|
||
AND AH,01H
|
||
MOV AL,C_CHN+C_CTL
|
||
OUT DSK_CCR,AL
|
||
CALL H5_ODAT
|
||
MOV AH,00H
|
||
CALL H5_ODAT
|
||
JMP H5_NINT ;RESULT
|
||
;
|
||
;------ REQUEST SENSE
|
||
;
|
||
H5_RSEN:
|
||
CALL H5_SLCT
|
||
MOV AX,0300H+C_CHN+C_CTL
|
||
OUT DSK_CSR,AL
|
||
CALL H5_COMD
|
||
MOV AH,BIO_UNT ;UNIT #
|
||
MOV CL,5
|
||
SAL AH,CL
|
||
CALL H5_COMD
|
||
MOV AH,0
|
||
MOV CX,4
|
||
H5_RSE1:
|
||
CALL H5_COMD
|
||
LOOP H5_RSE1
|
||
PUSH DISK_SSB0W
|
||
PUSH DISK_SSB2W
|
||
XOR DI,DI
|
||
MOV ES,DI
|
||
MOV DI,OFFSET DISK_SSB0A
|
||
MOV CX,4
|
||
H5_RSE2:
|
||
CALL H5_IDAT ;READ 4 BYTES
|
||
LOOP H5_RSE2
|
||
CALL H5_PRMH
|
||
POP CX
|
||
XCHG CH,CL
|
||
MOV DX,DISK_SSB2W
|
||
XCHG DH,DL
|
||
CMP DX,CX
|
||
POP CX
|
||
ADC CH,0
|
||
MOV DISK_SSB1,CH
|
||
CALL H5_NINT
|
||
MOV BX,OFFSET H5_STUS
|
||
MOV AL,DISK_SSB0
|
||
AND AL,3FH
|
||
MOV AH,40H
|
||
CMP AL,24H
|
||
JNB H5_RSE3
|
||
XLAT CS:BYTE PTR [BX]
|
||
MOV AH,AL
|
||
H5_RSE3:
|
||
RET
|
||
;
|
||
;------ GET POINTER
|
||
;
|
||
H5_PRMH:
|
||
;--------------------------------------------------------- 88/04/12 --
|
||
; TEST BIO_UNT,01H
|
||
; JZ H5_PRM0
|
||
; LES BX,DWORD PTR DISK_PRM1
|
||
; RET
|
||
;H5_PRM0:
|
||
; LES BX,DWORD PTR DISK_PRM0
|
||
;---------------------------------------------------------------------
|
||
PUSH AX
|
||
XOR BX,BX
|
||
CALL H5_RDSW
|
||
;--------------------------------------------------------- 88/05/28 --
|
||
; JZ H5_PRM1
|
||
;---------------------------------------------------------------------
|
||
OR BL,08H
|
||
H5_PRM1:
|
||
OR BL,AL
|
||
SAL BL,1
|
||
MOV BX,CS:H5_DPM[BX]
|
||
;--------------------------------------------------------- 88/05/12 --
|
||
MOV AL,C_CTL
|
||
OUT DSK_CCR,AL
|
||
JMP SHORT $+2
|
||
;---------------------------------------------------------------------
|
||
POP AX
|
||
;---------------------------------------------------------------------
|
||
RET
|
||
;
|
||
; READ SWITCH
|
||
;
|
||
H5_RDSW:
|
||
MOV AL,C_SWC
|
||
OUT DSK_CCR,AL
|
||
JMP SHORT $+2
|
||
IN AL,DSK_CSR ;READ SWITCH
|
||
MOV AH,AL
|
||
TEST BIO_UNT,01H ;UNIT# ?
|
||
JZ H5_RDS0 ;JMP IF UNIT#1
|
||
AND AX,4007H
|
||
SHL AH,1
|
||
JMP SHORT H5_RDS1
|
||
H5_RDS0:
|
||
AND AX,8038H
|
||
SHR AL,1
|
||
SHR AL,1
|
||
SHR AL,1
|
||
H5_RDS1:
|
||
OR AL,AH
|
||
TEST AL,80H
|
||
RET
|
||
;
|
||
H5_CYAD:
|
||
MOV CX,CS:12[BX] ;ES --> CS 88/04/11
|
||
XCHG CL,CH
|
||
INC CX ;PHSICAL HEAD COUNT
|
||
MUL CX
|
||
MOV DX,AX
|
||
MOV CX,33
|
||
CALL H5_RDSW
|
||
JZ H5_CYA0
|
||
MOV CX,17
|
||
H5_CYA0:
|
||
MOV AX,DX
|
||
MUL CX
|
||
XCHG DL,DH
|
||
MOV DISK_SSB0W,DX
|
||
XCHG AL,AH
|
||
MOV DISK_SSB2W,AX
|
||
RET
|
||
;
|
||
;------ SELECTION
|
||
;
|
||
H5_SLCT:
|
||
PUSH AX
|
||
MOV AL,C_CTL
|
||
OUT DSK_CCR,AL
|
||
MOV DX,S_BSY*0100H
|
||
CALL H5_STAT
|
||
JNZ H5_TOUT
|
||
MOV AL,01H ;CONTROLER#1
|
||
OUT DSK_ODR,AL
|
||
MOV AL,C_SEL+C_CTL
|
||
JMP SHORT $+2
|
||
OUT DSK_CCR,AL
|
||
MOV DX,S_BSY*0100H+S_BSY
|
||
CALL H5_STAT
|
||
JNZ H5_TOUT
|
||
MOV AL,C_CHN+C_CTL
|
||
OUT DSK_CCR,AL
|
||
POP AX
|
||
RET
|
||
;
|
||
;------ INPUT DATA
|
||
;
|
||
H5_IDAT:
|
||
MOV DX,0FCA4H
|
||
CALL H5_STAT
|
||
JNE H5_TOUT
|
||
IN AL,DSK_IDR
|
||
STOSB
|
||
JMP SHORT H5_SACK
|
||
;
|
||
;------ OUTPUT DATA
|
||
;
|
||
H5_ODAT:
|
||
MOV DX,0FCA0H
|
||
CALL H5_STAT
|
||
JNE H5_TOUT
|
||
MOV AL,AH
|
||
OUT DSK_ODR,AL
|
||
JMP SHORT H5_SACK
|
||
;
|
||
;------ OUTPUT COMMAND
|
||
;
|
||
H5_COMD:
|
||
MOV DX,0FC00H+S_REQ+S_BSY+S_CXD
|
||
CALL H5_STAT
|
||
JNE H5_TOUT
|
||
MOV AL,AH
|
||
OUT DSK_ODR,AL
|
||
JMP SHORT $+2
|
||
H5_SACK:
|
||
MOV DX,S_ACK*0100H
|
||
CALL H5_STAT
|
||
JNZ H5_TOUT
|
||
RET
|
||
;
|
||
;------ TIME OUT
|
||
;
|
||
H5_TOUT:
|
||
LEA SP,-2[BP]
|
||
TEST BIO_CMD,0FH
|
||
JZ H5_TOU0
|
||
CALL H5_RSET
|
||
H5_TOU0:
|
||
MOV AH,90H
|
||
RET
|
||
;
|
||
;------ RESULT
|
||
;
|
||
H5_RSLT:
|
||
TEST DISK_INTF,01H
|
||
JZ H5_RSLT
|
||
XOR DISK_INTF,01H
|
||
H5_NINT: ;NON INTERRUPT
|
||
MOV DX,0FC00H+S_REQ+S_BSY+S_CXD+S_IXO
|
||
CALL H5_STAT
|
||
JNE H5_TOUT
|
||
IN AL,DSK_IDR
|
||
MOV DISK_STUS,AL
|
||
CALL H5_SACK
|
||
MOV DX,0FCBCH
|
||
CALL H5_STAT
|
||
JNE H5_TOUT
|
||
IN AL,DSK_IDR
|
||
CALL H5_SACK
|
||
MOV DX,0FC00H
|
||
CALL H5_STAT
|
||
JNZ H5_TOUT
|
||
MOV AL,C_CTL
|
||
OUT DSK_CCR,AL
|
||
MOV AH,00H
|
||
TEST DISK_STUS,03H
|
||
JZ H5_BSF0
|
||
MOV AH,40H
|
||
TEST DISK_STUS,01H
|
||
JNZ H5_BSF0
|
||
CALL H5_RSEN
|
||
H5_BSF0:
|
||
RET
|
||
;
|
||
; STATUS CHECK
|
||
;
|
||
H5_STAT:
|
||
PUSH CX
|
||
XOR CX,CX
|
||
H5_STAE:
|
||
IN AL,DSK_CSR
|
||
AND AL,DH
|
||
CMP AL,DL
|
||
LOOPNE H5_STAE
|
||
POP CX
|
||
RET
|
||
;
|
||
;------ LOGICAL ADDRESS
|
||
;
|
||
H5_LADS:
|
||
PUSH AX
|
||
TEST BIO_UNT,80H
|
||
JNZ H5_LAD0
|
||
MOV DL,BIO_SEC
|
||
MOV CX,BIO_CYW
|
||
MOV DISK_SSB1,DL
|
||
MOV DISK_SSB2,CH
|
||
MOV DISK_SSB3,CL
|
||
JMP SHORT H5_LAD1
|
||
H5_LAD0:
|
||
MOV AX,CS:24[BX] ;ES --> CS 88/04/11
|
||
MOV CX,BIO_CYW
|
||
MUL CX
|
||
ADD AL,BIO_HED
|
||
ADC AH,0
|
||
MOV DX,AX ;SAVE AX
|
||
MOV CX,33
|
||
CALL H5_RDSW
|
||
JZ H5_LAD2
|
||
MOV CX,17
|
||
H5_LAD2:
|
||
MOV AX,DX ;RESTORE AX
|
||
MUL CX
|
||
ADD AL,BIO_SEC
|
||
ADC AH,0
|
||
ADC DX,0
|
||
MOV DISK_SSB1,DL
|
||
MOV DISK_SSB2,AH
|
||
MOV DISK_SSB3,AL
|
||
H5_LAD1:
|
||
CALL H5_RDSW
|
||
MOV AL,BIO_BLK
|
||
JZ H5_LAD3
|
||
SHR AL,1 ;# 860829
|
||
CMP AL,0
|
||
JNZ H5_LAD3
|
||
MOV AL,80H
|
||
H5_LAD3:
|
||
MOV DISK_SSB0,AL
|
||
POP AX
|
||
H5_LUNS:
|
||
MOV CH,BIO_UNT
|
||
MOV CL,5
|
||
SAL CH,CL
|
||
OR DISK_SSB1,CH
|
||
RET
|
||
;
|
||
;------ INTERRUPT
|
||
;
|
||
H5_INTR:
|
||
PUSH AX
|
||
MOV AL,20H
|
||
OUT 08H,AL
|
||
MOV AL,0BH
|
||
OUT 08H,AL
|
||
JMP SHORT $+2
|
||
IN AL,08H
|
||
TEST AL,0FFH
|
||
JNZ H5_INT0
|
||
MOV AL,20H
|
||
OUT 00,AL
|
||
H5_INT0:
|
||
STI
|
||
JMP SHORT $+2
|
||
IN AL,DSK_CSR
|
||
AND AL,0FDH
|
||
CMP AL,0ADH
|
||
JE H5_INT1
|
||
AND AL,0F9H
|
||
CMP AL,0A1H
|
||
JNE H5_INT2
|
||
H5_INT1:
|
||
PUSH DS
|
||
XOR AX,AX
|
||
MOV DS,AX
|
||
OR DISK_INTF,01H
|
||
MOV AL,C_CHN+C_CTL
|
||
OUT DSK_CCR,AL
|
||
POP DS
|
||
H5_INT2:
|
||
POP AX
|
||
IRET
|
||
|
||
PAGE
|
||
;--------------------------------------------------------- 90/03/20 --
|
||
;
|
||
;------ DISK PARAMETER
|
||
;
|
||
;H5_DPM DW H5_05M,H5_10M,H5_15M,H5_20M
|
||
; DW H5_20H,H5_30H,H5_40H,H5_10H
|
||
;
|
||
; DW H5_05M,H5_10M,H5_15M,H5_20M
|
||
; DW H5_20X,H5_30H,H5_40H,H5_10H
|
||
;
|
||
;H5_05M DB 001H,001H,000H,003H,000H,098H,040H,000H,000H,000H
|
||
; DB 001H,001H,000H,003H,001H,054H,040H,000H,000H,000H
|
||
; DB 000H
|
||
; DB 000H,0AFH,050H
|
||
; DB 004H
|
||
; DB 000H,002H,094H
|
||
; DB 000H,000H
|
||
;H5_10M DB 001H,001H,000H,003H,001H,035H,080H,000H,000H,000H
|
||
; DB 001H,001H,000H,003H,001H,054H,080H,000H,000H,000H
|
||
; DB 001H
|
||
; DB 000H,0AFH,050H
|
||
; DB 004H
|
||
; DB 000H,002H,094H
|
||
; DB 001H,000H
|
||
;H5_15M DB 001H,001H,000H,005H,001H,035H,080H,000H,000H,000H
|
||
; DB 001H,001H,000H,005H,001H,054H,080H,000H,000H,000H
|
||
; DB 002H
|
||
; DB 001H,006H,0F8H
|
||
; DB 006H
|
||
; DB 000H,003H,0DEH
|
||
; DB 002H,000H
|
||
;H5_20M DB 001H,001H,000H,007H,001H,035H,080H,000H,000H,000H
|
||
; DB 001H,001H,000H,007H,001H,054H,080H,000H,000H,000H
|
||
; DB 003H
|
||
; DB 001H,05EH,0A0H
|
||
; DB 008H
|
||
; DB 000H,005H,028H
|
||
; DB 003H,000H
|
||
;H5_20H DB 001H,001H,000H,003H,002H,066H,000H,000H,000H,000H
|
||
; DB 001H,001H,000H,003H,002H,0A0H,000H,000H,000H,000H
|
||
; DB 003H
|
||
; DB 001H,05AH,080H
|
||
; DB 008H
|
||
; DB 000H,002H,094H
|
||
; DB 003H,000H
|
||
;H5_30H DB 001H,001H,000H,005H,002H,066H,000H,000H,000H,000H
|
||
; DB 001H,001H,000H,005H,002H,0A0H,000H,000H,000H,000H
|
||
; DB 004H
|
||
; DB 002H,007H,0C0H
|
||
; DB 006H
|
||
; DB 000H,003H,0DEH
|
||
; DB 005H,000H
|
||
;H5_40H DB 001H,001H,000H,007H,002H,066H,000H,000H,000H,000H
|
||
; DB 001H,001H,000H,007H,002H,0A0H,000H,000H,000H,000H
|
||
; DB 005H
|
||
; DB 002H,0B5H,000H
|
||
; DB 008H
|
||
; DB 000H,005H,028H
|
||
; DB 007H,000H
|
||
;H5_10H DB 001H,001H,000H,003H,001H,035H,080H,000H,000H,000H
|
||
; DB 001H,001H,000H,003H,001H,04CH,080H,000H,000H,000H
|
||
; DB 001H
|
||
; DB 000H,0ABH,030H
|
||
; DB 004H
|
||
; DB 000H,002H,094H
|
||
; DB 001H,000H
|
||
;
|
||
; XA MODE 20MB HARD DISK PARAMETOR
|
||
;
|
||
;H5_20X DB 001H,001H,000H,003H,002H,066H,000H,000H,000H,000H
|
||
; DB 001H,001H,000H,003H,002H,0A0H,000H,000H,000H,000H
|
||
; DB 003H
|
||
; DB 001H,05AH,080H
|
||
; DB 004H
|
||
; DB 000H,002H,094H
|
||
; DB 003H,000H
|
||
;
|
||
;------ ERROR TYPE/CODE
|
||
;
|
||
;H5_STUS DB 040H ; NO STATUS
|
||
; DB 040H ; NO INDEX SIGNAL
|
||
; DB 040H ; NO SEEK COMPLETE
|
||
; DB 040H ; WRITE FAULT
|
||
; DB 060H ; DRIVE NOT READY
|
||
; DB 040H ; DRIVE NOT SELECTED
|
||
; DB 040H ; NO TRACK 0
|
||
; DB 040H ; MULTIPLE DRIVES SELECTED
|
||
; DB 040H
|
||
; DB 040H
|
||
; DB 040H
|
||
; DB 040H
|
||
; DB 040H
|
||
; DB 040H ; SEEK IN PROGRESS
|
||
; DB 040H
|
||
; DB 040H
|
||
; DB 0A0H ; ID READ ERROR
|
||
; DB 0B0H ; UNCORRECTABLE DATA ERROR DURING READ
|
||
; DB 0E0H ; ID ADDRESS MARK NOT FOUND
|
||
; DB 0F0H ; DATA ADDRESS MARK NOT FOUND
|
||
; DB 0C0H ; RECORD NOT FOUND
|
||
; DB 0C8H ; SEEK ERROR
|
||
; DB 040H
|
||
; DB 070H ; WRITE PROTECTED
|
||
; DB 008H ; CORRECTABLE DATA FIELD ERROR
|
||
; DB 0D0H ; BAD BLOCK FOUND
|
||
; DB 040H ; FORMAT ERROR
|
||
; DB 040H
|
||
; DB 0B8H ; UNABLE TO READ THE ALTERNATE TRACK
|
||
; DB 040H
|
||
; DB 088H ; ATTEMPTED TO DIRECTRY ACCESS AN ALTERNATE TRACK
|
||
; DB 050H ; SEQUENCER TIME-OUT ERROR DURING A DISK OR A HOST TRANSFER
|
||
; DB 040H ; INVALID COMMAND RECEIVED FROM THE HOST
|
||
; DB 038H ; ILLEGAL DISK ADDRESS
|
||
; DB 040H
|
||
; DB 030H ; VOLUME OVERFLOW
|
||
;
|
||
; WAIT LOOP 1 SECOND SUBROUTINE
|
||
;
|
||
DS_WSEC:
|
||
XOR CX,CX
|
||
LOOP $
|
||
LOOP $
|
||
LOOP $
|
||
LOOP $
|
||
LOOP $
|
||
TEST BYTE PTR BIOS_FLAG1,01H ;80286 ?
|
||
JNZ DS_W286
|
||
TEST BYTE PTR BIOS_FLAG+1,0C0H
|
||
JZ DS_WSEX ;8086-5M
|
||
DS_W286:
|
||
LOOP $
|
||
LOOP $
|
||
LOOP $
|
||
TEST BYTE PTR BIOS_FLAG1,01H ;80286 ?
|
||
JZ DS_WSEX ;NO,
|
||
LOOP $
|
||
LOOP $
|
||
DS_WSEX:
|
||
RET
|
||
;
|
||
; DMA SETUP SUBROUTINE
|
||
;
|
||
DS_PADR:
|
||
OUT DMA_BPTR,AL
|
||
JMP SHORT $+2
|
||
OUT DMA_MOD,AL
|
||
MOV AX,BIO_DTS
|
||
MOV CL,4
|
||
ROL AX,CL
|
||
MOV CH,AL
|
||
AND AL,0F0H
|
||
ADD AX,BIO_DTA
|
||
ADC CH,0
|
||
AND CH,0FH
|
||
RET
|
||
|
||
HDBIOK_CODE_END:
|
||
HDBIOK_END:
|
||
|
||
Bios_Code ends
|
||
|
||
END
|
||
|
||
|