966 lines
33 KiB
NASM
966 lines
33 KiB
NASM
PAGE 109,132
|
||
TITLE EXFNC
|
||
|
||
;************************************************************************
|
||
;* *
|
||
;* *
|
||
;* MODULE NAME: EXFNC *
|
||
;* *
|
||
;* *
|
||
;* COPYRIGHT (C) NEC CORPORATION 1988 *
|
||
;* *
|
||
;* 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. *
|
||
;* *
|
||
;************************************************************************
|
||
|
||
;********************************************************
|
||
;* 5" HARD DISK BIOS *
|
||
;* SENSE *
|
||
;* SET OPRATION MODE *
|
||
;* *
|
||
;********************************************************
|
||
;****************************************
|
||
;* *
|
||
;* HD BIOS ROM *
|
||
;* PC-9800-27K *
|
||
;* *
|
||
;****************************************
|
||
|
||
;****************************************
|
||
;* *
|
||
;* BIOS ITEM DESIGN *
|
||
;* *
|
||
;* *
|
||
;****************************************
|
||
|
||
INTVEC SEGMENT AT 0000H
|
||
ORG 480H
|
||
BIOS_FLAG1 DB ?
|
||
HDSK_MODE DB ?
|
||
ORG 500H
|
||
BIOS_FLAG DW ?
|
||
ORG 55FH
|
||
DISK_INTF DB ?
|
||
ORG 585H
|
||
DISK_STUS DB ?
|
||
DISK_SSB0 DB ?
|
||
DISK_SSB1 DB ?
|
||
DISK_SSB2 DB ?
|
||
DISK_SSB3 DB ?
|
||
ORG 5E8H
|
||
DISK_PRM0 DW 2 DUP(?)
|
||
DISK_PRM1 DW 2 DUP(?)
|
||
|
||
INTVEC 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:DATAGRP
|
||
|
||
PUBLIC SAVE_INT1B
|
||
PUBLIC EXFNC_CODE_START,EXFNC_CODE_END
|
||
PUBLIC EXFNC_END
|
||
PUBLIC EXFNC_START_CODE
|
||
; PUBLIC DISK_PRM0,DISK_PRM1
|
||
PUBLIC H5_DPM
|
||
PUBLIC H5_STUS
|
||
; PUBLIC INTVEC
|
||
|
||
|
||
;****************************************
|
||
;* *
|
||
;* EQU TABLE *
|
||
;* *
|
||
;* *
|
||
;****************************************
|
||
|
||
DMA_SMR EQU 15H
|
||
;
|
||
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
|
||
|
||
BIO_BLK EQU BYTE PTR 3[BP]
|
||
BIO_CYW EQU WORD PTR 4[BP]
|
||
|
||
BIO_UNT EQU BYTE PTR 0[BP] ; UNIT
|
||
BIO_CMD EQU BYTE PTR 1[BP] ; COMMAND
|
||
BIO_DTL EQU WORD PTR 2[BP] ; DATA LENGTH
|
||
BIO_CYL EQU BYTE PTR 4[BP] ; CYLINDER #
|
||
BIO_NUM EQU BYTE PTR 5[BP] ; SECTER LENGTH
|
||
BIO_SEC EQU BYTE PTR 6[BP] ; SECTER #
|
||
BIO_HED EQU BYTE PTR 7[BP] ; HEAD #
|
||
BIO_DTA EQU WORD PTR 8[BP] ; DATA OFFSET
|
||
BIO_DTS EQU WORD PTR 10[BP] ; DATA SEGMENT
|
||
BIO_FLG EQU BYTE PTR 22[BP] ; FLAG
|
||
|
||
; ORG 100H
|
||
|
||
;****************************************
|
||
;* *
|
||
;* CODE START *
|
||
;* *
|
||
;* *
|
||
;****************************************
|
||
EXFNC_CODE_START:
|
||
EXFNC_START_CODE:
|
||
|
||
CMP AL,80H ; HD #0 ?
|
||
JZ INT1B000
|
||
CMP AL,00H ; HD #0 ?
|
||
JZ INT1B000
|
||
CMP AL,81H ; HD #1 ?
|
||
JZ INT1B000
|
||
CMP AL,01H ; HD #1 ?
|
||
JZ INT1B000
|
||
JMP short OLD_INT1B
|
||
INT1B000:
|
||
CMP AH,84H ; SENSE ?
|
||
JZ INT1B001
|
||
CMP AH,0EH ; SET OPERATION PC-9801
|
||
JZ INT1B001
|
||
CMP AH,8EH ; SET OPERATION PC-98XA
|
||
JZ INT1B001
|
||
OLD_INT1B:
|
||
JMP CS:DWORD PTR [SAVE_INT1B] ;OLD INT1B VECTER
|
||
|
||
INT1B001:
|
||
STI
|
||
CLD
|
||
PUSH DS
|
||
PUSH SI
|
||
PUSH DI
|
||
PUSH ES
|
||
PUSH BP
|
||
PUSH DX
|
||
PUSH CX
|
||
PUSH BX
|
||
PUSH AX
|
||
|
||
ASSUME DS:INTVEC
|
||
|
||
MOV BP,SP
|
||
XOR BX,BX
|
||
MOV DS,BX
|
||
MOV BL,BIO_CMD
|
||
SAL BL,1
|
||
AND BX,001EH
|
||
CMP AH,84H ; SENSE ?
|
||
JZ INT1B002
|
||
JMP short INT1B003
|
||
|
||
INT1B002:
|
||
CALL H5_SENS
|
||
JMP short INT1B004
|
||
INT1B003:
|
||
CALL H5_MODE
|
||
INT1B004:
|
||
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
|
||
|
||
POP AX
|
||
POP BX
|
||
POP CX
|
||
POP DX
|
||
POP BP
|
||
POP ES
|
||
POP DI
|
||
POP SI
|
||
POP DS
|
||
IRET
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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
|
||
|
||
;****************************************
|
||
;* *
|
||
;* *
|
||
;* *
|
||
;* *
|
||
;****************************************
|
||
|
||
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
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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 WORD PTR DISK_SSB0,AX
|
||
MOV WORD PTR DISK_SSB2,AX
|
||
CALL H5_LUNS
|
||
MOV AX,0100H+C_CHN+C_CTL+C_INT
|
||
CALL H5_IOCM
|
||
PUSH AX
|
||
CALL H5_ADPM
|
||
POP AX
|
||
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: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
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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:
|
||
LODSB
|
||
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 WORD PTR DISK_SSB0
|
||
PUSH WORD PTR DISK_SSB2
|
||
XOR DI,DI
|
||
MOV ES,DI
|
||
MOV DI,OFFSET DISK_SSB0
|
||
MOV CX,4
|
||
H5_RSE2:
|
||
CALL H5_IDAT ;READ 4 BYTES
|
||
LOOP H5_RSE2
|
||
CALL H5_PRMH
|
||
POP CX
|
||
XCHG CH,CL
|
||
MOV DX,WORD PTR DISK_SSB2
|
||
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 AL
|
||
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
|
||
JZ H5_PRM1
|
||
OR BL,08H
|
||
H5_PRM1:
|
||
OR BL,AL
|
||
SAL BL,1
|
||
MOV BX,CS:H5_DPM[BX]
|
||
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 WORD PTR DISK_SSB0,DX
|
||
XCHG AL,AH
|
||
MOV WORD PTR DISK_SSB2,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
|
||
|
||
|
||
H5_LUNS:
|
||
MOV CH,BIO_UNT
|
||
MOV CL,5
|
||
SAL CH,CL
|
||
OR DISK_SSB1,CH
|
||
RET
|
||
|
||
;****************************************
|
||
;* *
|
||
;* 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
|
||
|
||
|
||
SAVE_INT1B DW 2 DUP(?)
|
||
|
||
EXFNC_CODE_END:
|
||
EXFNC_END:
|
||
|
||
BIOS_CODE ENDS
|
||
|
||
END
|
||
|