2025-04-27 07:49:33 -04:00

966 lines
33 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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