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

2490 lines
99 KiB
NASM
Raw Permalink 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.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PAGE 109,132
TITLE MS-DOS 5.0 MODISK.ASM
;************************************************************************
;* *
;* *
;* MODULE NAME: MODISK.ASM *
;* *
;* *
;* COPYRIGHT (C) NEC CORPORATION 1990 *
;* *
;* NEC CONFIDENTIAL AND PROPRIETARY *
;* *
;* All rights reserved by NEC Corporation. *
;* this program must be used solely for *
;* 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. *
;* *
;************************************************************************
;************************************************************************
;************************************************************************
;* *
;* PROGRAM DEVISION *
;* *
;************************************************************************
;
; 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_Data segment word public 'Bios_Data'
EXTRN CURUA:BYTE,CURDRV:BYTE
EXTRN HDS_OFFSET:WORD
EXTRN HDS_LAST:WORD
EXTRN HDDSKS_1:NEAR
EXTRN COM1:BYTE
EXTRN EXLPTBL:WORD
EXTRN HDIO_FLG:BYTE
EXTRN EXIT:FAR
EXTRN ERR_EXIT:FAR
EXTRN PTRSAV:DWORD
EXTRN LNG_TRNS:WORD
EXTRN DSK_BUF2:NEAR
;----------------------------------------------- DOS5 90/12/14 -------
EXTRN START_SEC_H:WORD
EXTRN BLOCK_TRNS_H:WORD
EXTRN OLD_AX:WORD
EXTRN BPBCOPY:WORD
;---------------------------------------------------------------------
;----------------------------------------------- DOS5 91/01/09 -------
EXTRN MO_HEAD:BYTE, MO_SECTOR:BYTE
EXTRN MAX_PART:BYTE, VOL_INF_LENGTH:WORD
EXTRN B_COMMAND:BYTE, B_FLAG:BYTE, B_SCSIID:BYTE
EXTRN B_LUN:BYTE, B_LBAVH:BYTE, B_LBAH:BYTE
EXTRN B_LBAM:BYTE, B_LBAL:BYTE, B_DOFFSET:WORD
EXTRN B_DSEGMENT:WORD, B_DLENGTH:WORD
EXTRN B_ODC_STATUS:BYTE, B_SCSI_STATUS:BYTE
EXTRN B_SENSE_KEY:BYTE, B_SENSE_CODE:BYTE
EXTRN YUKO_UNIT:BYTE, SUB_UNIT:BYTE
EXTRN SUB_ID:BYTE, MO_DEV_OFFSET:WORD, MO_SUB_OFFSET:BYTE
EXTRN READ_V_FLG:BYTE, ERR_STATUS:BYTE
EXTRN LNG_TRNSMO:WORD, LNG_PTRNS:WORD, BLOCK_TRNS:WORD
EXTRN SEC_PBLOCK:WORD
EXTRN CALLADDR:WORD, MO_DEVICE_TBL:BYTE
EXTRN MO_ADDR_LENGTH:WORD, MO_ADDR_TBL:BYTE, ERR_CODE_TBL:NEAR
EXTRN PARAMETER:BYTE, CDB:BYTE, REMAIN_ADDR:WORD
EXTRN REMAIN_LNG:WORD
EXTRN RTRY_CNT:BYTE, VRFY_FLG:BYTE, RW_SW:BYTE, COM:BYTE
EXTRN CUR_TRNS:WORD, NO_TRNS:WORD, LNG_SEC:WORD
EXTRN READ_BUF:BYTE
extrn save_ax:word,save_ss:word,save_sp:word,stack:near
;---------------------------------------------------------------------
EXTRN FAT12:BYTE, FAT16:BYTE
EXTRN NO_NAME:BYTE
EXTRN CURDA:BYTE
;----------------------------------------------- DOS5 91/08/08 -------
EXTRN MOSW2:BYTE, MAXSEC:WORD, Lockcnt:byte
EXTRN time_buf:byte, time_to_retry:word
;---------------------------------------------------------------------
Bios_Data ends
Bios_Code segment word public 'Bios_Code'
EXTRN SetDrive:NEAR
; extrn save_ax:word,save_ss:word,save_sp:word,stack:near
;----------------------------------------------- DOS5 90/12/14 -------
EXTRN BDATA_SEG:WORD
;---------------------------------------------------------------------
EXTRN MOV_MEDIA_IDS:NEAR
;----------------------------------------------- DOS5 91/10/08 -------
;<patch BIOS50-P02>
EXTRN PATCH01:NEAR
public MEDIA_RE_ERR, MEDIA_RE_071
;---------------------------------------------------------------------
Bios_Code ends
Bios_Code segment word public 'Bios_Code'
ASSUME CS:BIOS_CODE,DS:DATAGRP
MODISK_CODE_START:
PUBLIC MODISK_CODE_END
PUBLIC MODISK_END
PUBLIC MEDIA_MO
PUBLIC OPEN_MO
PUBLIC CLOSE_MO
PUBLIC GET_MO
PUBLIC CMN_RW_MO
PUBLIC CMD_CLEAR,MO_BIOS
PUBLIC CMD_CLEAR_FAR,MO_BIOS_FAR
;----------------------------------------------- DOS5 91/08/00 -------
public LockMO, UnlockMO
;---------------------------------------------------------------------
;
;*********************************************************
;* STRACTUR TABLE AREA *
;*********************************************************
;****************************************
;* REQUEST HEADER <20>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@ *
;****************************************
REQUEST_HDR STRUC ; MS-DOS COMMAND PACKET FORMAT
REQ_LEN DB ? ; COMMAND PACKET LENGTH
REQ_UNIT DB ? ; SUB UNIT NUMBER
REQ_CMD DB ? ; COMMAND CODE
REQ_STATUS DW ? ; STATUS
REQ_RESERVE DB 8 DUP(?); RESERVE AREA
REQUEST_HDR ENDS ;
;****************************************
;* INIT COMMAND <20>@<40>@<40>@ <20>@ *
;****************************************
INIT_HDR STRUC ; STRUCTUR USE INIT COMMAND
INIT_RQH DB SIZE REQUEST_HDR DUP(?)
INIT_UNITS DB ? ; UNIT NUMBER
INIT_ENDADDR DD ? ; POINTER FOR FREE AREA
INIT_BPBARRY DD ? ; POINTER FOR BPB ARRY
INIT_DEVNO DB ? ; DEVICE NUMBER
INIT_HDR ENDS ;
;****************************************
;* MEDIA CHECK <20>@<40>@<40>@<40>@ <20>@ *
;****************************************
MEDIA_HDR STRUC ; STRUCTUR USE MEDIA CHECK COMMAND
MEDIA_RQH DB SIZE REQUEST_HDR DUP(?)
MEDIA_DESCRIPT DB ? ; MEDIA DESCRIPTR
MEDIA_STATUS DB ? ; MEDIA CHENGE STATUS
MEDIA_VOLID DD ? ; VOLUM ID PTR
MEDIA_HDR ENDS ;
;****************************************
;* BUILD BPB <20>@<40>@<40>@<40>@<40>@<40>@ <20>@ *
;****************************************
BUILD_HDR STRUC ; STRUCTUR USE BUILD BPB COMMAND
BUILD_RQH DB SIZE REQUEST_HDR DUP(?)
BUILD_DESCRIPT DB ? ; MEDIA DESCRIPTER
BUILD_ADDR DD ? ; BOOT SECTOR READ ADDR
BUILD_BPBPTR DD ? ; BPB TBL POINTER
BUILD_HDR ENDS ;
PAGE
;****************************************
;* READ / WRITE / WRITE & VERIFY *
;****************************************
RW_HDR STRUC ; STRUCTUR USE READ WRITE ETC COMMAND
RW_RQH DB SIZE REQUEST_HDR DUP(?)
RW_DESCRIPT DB ? ; MEDIA DESCRIPTER
RW_ADDR DD ? ; TRANSFER ADDR
RW_COUNT DW ? ; TRABSFER BLOCK LENGTH
RW_SECTOR DW ? ; TRANSFER BLOCK NUMBER
RW_VID DD ? ; VOLUM ID PTR
RW_HDR ENDS ;
;****************************************
;* BPB *
;****************************************
MO_BPB_STR STRUC
BPB_BYTE DW ? ; BYTE / SECTOR
BPB_CSEC DB ? ; SECTOR / CLUSTER
BPB_RSEC DW ? ; RESERVE SECTOR
BPB_FAT DB ? ; FAT AREA
BPB_DIR DW ? ; ROOT DIRECTORY ENTRY
BPB_MSEC DW ? ; SECTOR / MEDIA
BPB_MDIC DB ? ; MEDIA DESCRIPTER
BPB_FSEC DW ? ; SECTOR / FAT AREA
bpb_tsec DW ? ; sector / track
bpb_head DW ? ; number of head
bpb_osec DW ? ; out sector
bpb_vid DB 11 dup (?) ; volum id
DB 0 ;
MO_BPB_STR ENDS
;** BIOS PARAMETER BLOCK DEFINITION
;
; The BPB contains information about the disk structure. It dates
; back to the earliest FAT systems and so FAT information is
; intermingled with physical driver information.
;
; A boot sector contains a BPB for its device; for other disks
; the driver creates a BPB. DOS keeps copies of some of this
; information in the DPB.
;
; The BDS structure contains a BPB within it.
;
A_BPB STRUC
BPB_BYTESPERSECTOR DW ?
BPB_SECTORSPERCLUSTER DB ?
BPB_RESERVEDSECTORS DW ?
BPB_NUMBEROFFATS DB ?
BPB_ROOTENTRIES DW ?
BPB_TOTALSECTORS DW ?
BPB_MEDIADESCRIPTOR DB ?
BPB_SECTORSPERFAT DW ?
BPB_SECTORSPERTRACK DW ?
BPB_HEADS DW ?
BPB_HIDDENSECTORS DW ?
DW ?
BPB_BIGTOTALSECTORS DW ?
DW ?
DB 6 DUP(?) ; NOTE: many times these
; ; 6 bytes are omitted
; ; when BPB manipulations
; ; are performed!
A_BPB ENDS
EXT_BOOT_SIGNATURE EQU 41 ;Extended boot signature
;
EXT_BPB_INFO STRUC
EBPB_BYTESPERSECTOR DW ?
EBPB_SECTORSPERCLUSTER DB ?
EBPB_RESERVEDSECTORS DW ?
EBPB_NUMBEROFFATS DB ?
EBPB_ROOTENTRIES DW ?
EBPB_TOTALSECTORS DW ?
EBPB_MEDIADESCRIPTOR DB ?
EBPB_SECTORSPERFAT DW ?
EBPB_SECTORSPERTRACK DW ?
EBPB_HEADS DW ?
EBPB_HIDDENSECTOR DD ?
EBPB_BIGTOTALSECTORS DD ?
EXT_BPB_INFO ENDS
;
;AN001; EXT_PHYDRV, EXT_CURHD included in the header for OS2.
EXT_IBMBOOT_HEADER STRUC
EXT_BOOT_JUMP DB 3 DUP (?)
EXT_BOOT_OEM DB 8 DUP (?)
EXT_BOOT_BPB DB size EXT_BPB_INFO dup (?)
EXT_PHYDRV DB 80h
EXT_CURHD DB 0
EXT_BOOT_SIG DB EXT_BOOT_SIGNATURE
EXT_BOOT_SERIAL DD ?
EXT_BOOT_VOL_LABEL DB 11 DUP (?)
EXT_SYSTEM_ID DB 8 DUP (?)
EXT_IBMBOOT_HEADER ENDS
; values for various flags in bds_flags.
fnon_removable equ 01h ;for non-removable media
fchangeline equ 02h ;if changeline supported on drive
return_fake_bpb equ 04h ; when set, don't do a build bpb
; just return the fake one
good_tracklayout equ 08h ; the track layout has no funny sectors
fi_am_mult equ 10h ;if more than one logical for this physical
fi_own_physical equ 20h ;signify logical owner of this physical
fchanged equ 40h ;indicates media changed
set_dasd_true equ 80h ; set dasd before next format
fchanged_by_format equ 100h ;media changed by format
unformatted_media equ 200h ;an001; fixed disk only
bds_struc struc
bds_link dd 0ffffh ; link to next bds
bds_drivenum db 80 ; int 13 drive number
bds_drivelet db 3 ; dos drive number
; We want to embed a BPB declaration here, but we can't initialize
; it properly if we do, so we duplicate the byte/word/dword architecture
; of the BPB declaration.
;BDS_BPB db size BPBSTRUC dup (?) ; actual BPB
BDS_BPB dw 512 ; BPB_BYTESPERSECTOR
db 1 ; BPB_SECTORSPERCLUSTER
dw 1 ; BPB_RESERVEDSECTORS
db 2 ; BPB_NUMBEROFFATS
dw 16 ; BPB_ROOTENTRIES
dw 0 ; BPB_TOTALSECTORS
db 0f8h ; BPB_MEDIADESCRIPTOR
dw 1 ; BPB_SECTORSPERFAT
dw 0 ; BPB_SECTORSPERTRACK
dw 0 ; BPB_HEADS
dd 0 ; BPB_HIDDENSECTORS
dd 0 ; BPB_BIGTOTALSECTORS
bds_fatsiz db 0 ; flags...
bds_opcnt dw 0 ; open ref. count
bds_formfactor db 3 ; form factor index
bds_flags dw 0020h ; various flags
bds_ccyln dw 40 ; max number of cylinders
BDS_RBPB db size A_BPB dup (0) ; recommended BPB
bds_track db -1 ; last track accessed on drive
bds_tim_lo dw 1 ; time of last access. keep
bds_tim_hi dw 0 ; these contiguous.
bds_volid db "NO NAME ",0 ; volume id of medium
bds_vol_serial dd 0 ;current volume serial number from boot record
bds_filesys_id db "FAT12 ",0 ; current file system id from boot record
bds_struc ends
;****************************************
;* DEVICE MANEGEMENT TABLE <20>@<40>@<40>@<40>@<40>@*
;****************************************
MO_DEV_STR STRUC ;
MO_DEV_UNIT DB ? ; UNIT#
MO_DEV_FLG DB ? ; FLAG
MO_DEV_ID DB ? ; SCSI ID
MO_DEV_RFU DB ? ; RFU
MO_DEV_STR ENDS ;
PAGE
;*********************************************************
;* EQU *
;*********************************************************
;********************************
;* SCSI COMAND TABLE *
;********************************
_TEST_UNIT = 00H ; Test Unit Ready
_REZERO_UNIT = 01H ;
_FORMAT_UNIT = 04H ;
_READ1 = 08H ;
_WRITE1 = 0AH ;
_INQUIRY = 12H ; Inquiry
_PREVENT_ALLOW = 1EH ; Door Lock
_READ_CAPACITY = 25H ;
_READ2 = 28H ; Read
_WRITE2 = 2AH ;
_WRITE_VERIFY = 2EH ;
_LOAD_UNLOAD = 0C1H ;
_ERASE = 0E0H ;
_READ_ID_HOLE = 0E3H ;
_SENSE_ALT_TRACK = 0E7H ;
;********************************
;* MS_DOS ERR STATUS EQU *
;********************************
_ERR_00 = 00H ; <20><><EFBFBD>C<EFBFBD>g<EFBFBD>v<EFBFBD><76><EFBFBD>e<EFBFBD>N<EFBFBD>g<EFBFBD>i<EFBFBD>ی<EFBFBD><DB8C>j<EFBFBD>
_ERR_01 = 01H ; <20><><EFBFBD><EFBFBD><EFBFBD>ȃ<EFBFBD><C883>j<EFBFBD>b<EFBFBD>g
_ERR_02 = 02H ; <20>h<EFBFBD><68><EFBFBD>C<EFBFBD>u<EFBFBD>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>Ă<EFBFBD><C482>Ȃ<EFBFBD>
_ERR_03 = 03H ; <20><><EFBFBD><EFBFBD><EFBFBD>ȃR<C883>}<7D><><EFBFBD>h
_ERR_04 = 04H ; <20>b<EFBFBD>q<EFBFBD>b<EFBFBD>G<EFBFBD><47><EFBFBD>[
_ERR_05 = 05H ; <20>s<EFBFBD><73><EFBFBD>ȃh<C883><68><EFBFBD>C<EFBFBD>u<EFBFBD><75><EFBFBD>N<EFBFBD>G<EFBFBD>X<EFBFBD>g<EFBFBD>̒<EFBFBD><CC92><EFBFBD>
_ERR_06 = 06H ; <20>V<EFBFBD>[<5B>N<EFBFBD>G<EFBFBD><47><EFBFBD>[
_ERR_07 = 07H ; <20><><EFBFBD><EFBFBD><EFBFBD>ȃ<EFBFBD><C883>f<EFBFBD>B<EFBFBD>A
_ERR_08 = 08H ; <20>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>݂<EFBFBD><DD82>Ȃ<EFBFBD>
_ERR_09 = 09H ; <20>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>^<5E>̗p<CC97><70><EFBFBD>؂<EFBFBD>
_ERR_0A = 0AH ; <20><><EFBFBD>C<EFBFBD>g<EFBFBD>G<EFBFBD><47><EFBFBD>[
_ERR_0B = 0BH ; <20><><EFBFBD>[<5B>h<EFBFBD>G<EFBFBD><47><EFBFBD>[
_ERR_0C = 0CH ; <20><><EFBFBD>ʓI<CA93>ȃG<C883><47><EFBFBD>[
_ERR_0D = 0DH ; <20>\<5C><>
_ERR_0E = 0EH ; <20>\<5C><>
_ERR_0F = 0FH ; <20>s<EFBFBD><73><EFBFBD>ȃf<C883>B<EFBFBD>X<EFBFBD>N<EFBFBD>̌<EFBFBD><CC8C><EFBFBD>
;----------------------------------------------- DOS5 90/12/14 -------
;********************************
;* OTHER EQU *
;********************************
BPB_SIZE EQU 17
HDDSK_SIZE EQU BPB_SIZE*4
;---------------------------------------------------------------------
PAGE
;********************************************************************
;* *
;* DATA DIVISION *
;* *
;********************************************************************
;****************************************
;* VOLUM INFORMATION *
;****************************************
;MO_CYLINDER DW 4656 ; <20><><EFBFBD>f<EFBFBD>B<EFBFBD>X<EFBFBD>N<EFBFBD><4E><EFBFBD>u
;MO_HEAD DB 1 ; <20><><EFBFBD>z<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD>l
;MO_SECTOR DB 64 ;
;
;MAX_PART DB 16 ; <20>p<EFBFBD>[<5B>e<EFBFBD>B<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>”\<5C><>
;VOL_INF_LENGTH DW 32 ; <20>{<7B><><EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD><EFBFBD>
;
;****************************************
;* COMMAND PACKET FOR MO-BIOS *
;****************************************
; EVEN
;B_COMMAND DB 00H ; COMMAND
;B_FLAG DB 00H ; COMMAND FLAG
;B_SCSIID DB 00H ; SCSI ID
;B_LUN DB 00H ; SCSI LUN
;B_LBAVH DB 00H ; Logical Block Address Very Hight
;B_LBAH DB 00H ; Logical Block Address Hight
;B_LBAM DB 00H ; Logical Block Address Middle
;B_LBAL DB 00H ; Logical Block Address Low
;B_DOFFSET DW 0000H ; Data Area Pointer Offset
;B_DSEGMENT DW 0000H ; Data Area Pointer Segment
;B_DLENGTH DW 0000H ; Data Area Length
;B_ODC_STATUS DB 00H ; ODC 141 Status
;B_SCSI_STATUS DB 00H ; SCSI Status
;B_SENSE_KEY DB 00H ;
;B_SENSE_CODE DB 00H ;
;B_RESERVE DW 0000H ; RESERVE
;
;****************************************
;* WORK DATA *
;****************************************
;YUKO_UNIT DB 04H ; <20>P<EFBFBD><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>̗L<CC97><4C><EFBFBD>p<EFBFBD>[<5B>e<EFBFBD>B<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;MO_LPFLG DB 00H ; <20>f<EFBFBD>o<EFBFBD>C<EFBFBD>X<EFBFBD>ڑ<EFBFBD><DA91><EFBFBD><EFBFBD><EFBFBD>
;SUB_UNIT DB 00H ; <20>T<EFBFBD>u<EFBFBD><75><EFBFBD>j<EFBFBD>b<EFBFBD>g<EFBFBD>ԍ<EFBFBD><D48D>Z<EFBFBD>[<5B>u<EFBFBD>G<EFBFBD><47><EFBFBD>A
;SUB_ID DB 00H ; <20>T<EFBFBD>u<EFBFBD><75><EFBFBD>j<EFBFBD>b<EFBFBD>g<EFBFBD>r<EFBFBD>b<EFBFBD>r<EFBFBD>h-<2D>h<EFBFBD>c<EFBFBD>Z<EFBFBD>[<5B>u<EFBFBD>G<EFBFBD><47><EFBFBD>A
;RETRY_COUNT DB 00H ; RETRAY COUNTER
;MO_DEV_OFFSET DW 0000H ; <20><><EFBFBD>Y<EFBFBD><59><EFBFBD>u<EFBFBD>f<EFBFBD>o<EFBFBD>C<EFBFBD>X<EFBFBD>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>g<EFBFBD>d<EFBFBD>`<60>c<EFBFBD>|<7C>C<EFBFBD><43><EFBFBD>^
;MO_SUB_OFFSET DB 00H ; <20><><EFBFBD>Y<EFBFBD><59><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>΃h<CE83><68><EFBFBD>C<EFBFBD>u<EFBFBD>ԍ<EFBFBD>
;READ_V_FLG DB 00H ; VOLUM LABEL READ FLG
;READ_LABEL DB 00H ; VOLUM LABEL READ END FLG
;ERR_STATUS DB 00H ; ERR STATUS FOR MS-DOS
;
;****************************************
;* read write process use data *
;****************************************
;VRFY_FLG DB 00H ; VERYFAY FLAG
;RW_SW DB 00H ; READ & WRITE FUNCTION SWITCH
;COM DB 00H ; COMMAND CODE SET AREA
;LNG_TRNSMO DW 0000H ; <20>]<5D><><EFBFBD>v<EFBFBD><76><EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD>@
;LNG_PTRNS DW 0000H ; <20>]<5D><><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
;BLOCK_TRNS DW 0000H ; <20>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>ԍ<EFBFBD>
;CUR_TRNS DW 0000H ; <20>]<5D><><EFBFBD>ρ@<40>̈搔
;NO_TRNS DW 0000H ; <20><><EFBFBD>]<5D><><EFBFBD>@<40>̈搔
;LNG_SEC DW 0000H ; <20>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>̃o<CC83>C<EFBFBD>g<EFBFBD><67>
;SEC_PBLOCK DW 0000H ; <20>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
;SCSI_FLG DB 00H ;
;NSMO DB 00H ;
;CALLADDR DW 0000H
;
;PAGE
;****************************************
;* DEVICE DRIVER SYSTEM INFORMATION *
;****************************************
;
; EVEN
;MO_DEV_LENGTH DW 4 ; <20>P<EFBFBD>f<EFBFBD>o<EFBFBD>C<EFBFBD>X<EFBFBD>Ǘ<EFBFBD><C797>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD><EFBFBD>
;MO_DEVICE_TBL DB 32 DUP(00H) ; <20>f<EFBFBD>o<EFBFBD>C<EFBFBD>X<EFBFBD>Ǘ<EFBFBD><C797>e<EFBFBD>[<5B>u<EFBFBD><75> (4*8)
; +-------+-------+-------+-------+
; | SUB | FLAG | SCSI | RFU |
; | UNIT# | (AI) | ID | |
; +-------+-------+-------+-------+
; 01 - <20>a<EFBFBD>o<EFBFBD>a<EFBFBD>X<EFBFBD>V<EFBFBD>ς<EFBFBD>
; 02 - <20>a<EFBFBD>o<EFBFBD>a<EFBFBD><61><EFBFBD>X<EFBFBD>V
;
;
; EVEN
;MO_ADDR_LENGTH DW 12 ; <20>P<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD>Ǘ<EFBFBD><C797>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD><EFBFBD>
;
;MO_ADDR_TBL DB 96 DUP(00H) ; 12*8
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | IPL SECTOR | <20>_<EFBFBD><5F><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>J<EFBFBD>n SECTOR |
; | L M H VH | L M H VH |
; +-------+-------+-------+-------+-------+-------+-------+-------+
; +-------+-------+-------+-------+
; | <20>_<EFBFBD><5F><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>I<EFBFBD><49> SECTOR | <20><><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>Őݒ肳<DD92><E882B3><EFBFBD><EFBFBD>
; | L M H VH |
; +-------+-------+-------+-------+
;
;NO_NAME DB 'NO_NAME ',0 ;
;
;****************************************
;* ERR CODE TBL (16 DATA / 1LINE) *
;****************************************
;
;ERR_CODE_TBL:
;-----------------------------------------------------------------------+---
; low 0 1 2 3 4 5 6 7 8 9 A B C D E F +
;-------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
; DB 0CH,0CH,0CH,0AH,02H,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ; 0
; DB 04H,0BH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ; 1
; DB 0CH,08H,0CH,0CH,0CH,01H,05H,00H,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ; 2
; DB 0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ; 3
; DB 0CH,0CH,0CH,0CH,0CH,0CH,0CH,04H,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ; 4
;
PAGE
;************************************************
;* MEDIA CHECK COMMAND PROCESS *
;*----------------------------------------------*
;* *
;* IN AL<- SUB UNIT # *
;* *
;* *
;************************************************
;=========
MEDIA_MO:
;=========
CALL GET_SCSI_ID ;
CALL M_TEST_UNIT ; TEST & UNIT READY
JAE MEDIA_C00 ; CF=0 THEN JMP
JMP short MEDIA_CHG00 ; ERR JMP
MEDIA_C00:
MOV BX , WORD PTR [MO_DEV_OFFSET] ; DEVICE TBL PTR HEAD
XOR AH , AH
MOV AL , BYTE PTR [MO_SUB_OFFSET] ; LOGICAL UNIT#/MEDIA
SHL AX , 1 ; *DEVICE TBL LENGTH (4)
SHL AX , 1 ;
ADD BX , AX ; BX <- OFFSET OF TBL
MOV AH , 0FFH ; -1 SET
CMP [BX.MO_DEV_FLG] , 02H ; MEDIA CHG FLG?
JZ MEDIA_REINIT ; IF CHENGED THEN JMP
MEDIA_NO_CHG: ; MEDIA NO CHG PROCESS
MOV AH , 01H ; 1 SET (MEDIA NO CHENG)
JMP MEDIA_EXIT ;
;****************************************
;* PROCESS WHEN MEDIA CHENGED *
;****************************************
MEDIA_CHG00:
;----------------------------------------------- DOS5 91/08/00 -------
MOV DL , SUB_ID ; SET UA H1.7.27
OR DL , 0A0H ; DA
MOV CL , 09H ; FUNCTION CODE SET H1.7.27
MOV AX , 0001H ; SET MODISK AI FLAG H1.7.27
INT 220 ; H1.7.27
;---------------------------------------------------------------------
CMP B_SENSE_KEY , 06H ; UNIT ATTENSION?
JZ MEDIA_CHG10 ;
JMP MEDIA_ERR ;
MEDIA_CHG10:
;----------------------------------------------- DOS5 91/08/00 -------
; MOV DL , SUB_ID ; SET UA H1.7.27
; OR DL , 0A0H ; DA
; MOV CL , 09H ; FUNCTION CODE SET H1.7.27
; MOV AX , 0001H ; SET MODISK AI FLAG H1.7.27
; INT 220 ; H1.7.27
;---------------------------------------------------------------------
MOV AH , 0FFH ; -1 SET
MEDIA_REINIT:
PUSH AX
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO ?
jne MEDIA_RESTART ; no
mov si,03h ; large partition, 16 bit fat
jmp short MEDIA_RE_06
MEDIA_RESTART:
;---------------------------------------------------------------------
;----------------------------------------------- DOS5 90/12/18 -------
MOV ES,CS:[BDATA_SEG]
; MOV AX,CS
; MOV ES,AX
;---------------------------------------------------------------------
MOV DI,OFFSET DSK_BUF2
CALL FORMAT_CHK ;
JAE MEDIA_RE_00 ;
JMP MEDIA_RE_ERR ; CF = ON SCSI ERR
;
MEDIA_RE_00:
CMP CL , 00H ;
JZ MEDIA_RE_01 ; FORMAT THEN JMP
MOV ERR_STATUS , _ERR_08 ; UN FORMAT STATUS SET
JMP MEDIA_RE_ERR ;
;****************************************
;* SET LOGICAL VOLUM INFORMATION *
;****************************************
MEDIA_RE_01:
CALL READ_VOL_INF ; VOL INFORMATION READ
JAE MEDIA_RE_02 ;
JMP MEDIA_RE_ERR ;
;****************************************
;* CHECK PARTITIONS *
;****************************************
MEDIA_RE_02:
MOV DL , MO_SUB_OFFSET ; DRIVE NUMBER OFFSET / MEDIA
MOV CH , MAX_PART ; MAX PARTISHION IN VOLUM
XOR CL , CL ; BUSY PARTISION COUNTER
MEDIA_RE_03: ; CHECK SYSTEM FLAG
MOV SI,0000h
CMP BYTE PTR ES:[DI+01H] , 81H ;(ACTIVE & MS-DOS 12bit FAT)
JZ MEDIA_RE_MATCH ; JMP MATCH
MOV SI,0001h
CMP BYTE PTR ES:[DI+01H] , 91H ;(ACTIVE & MS-DOS 16bit FAT)
;----------------------------------------------- DOS5 90/12/20 -------
JZ MEDIA_RE_MATCH ; JMP MATCH
MOV SI,0003h
CMP BYTE PTR ES:[DI+01H] , 0A1H ;(ACTIVE LARGE PARTITION)
;---------------------------------------------------------------------
JNZ MEDIA_RE_04 ; JMP NOT MATCH
MEDIA_RE_MATCH:
CMP CL , DL ; CHECK UNIT
JZ MEDIA_RE_06 ; FIND!
INC CL ;
MEDIA_RE_04:
ADD DI , VOL_INF_LENGTH ;
DEC CH ;
JNZ MEDIA_RE_05 ; NON ACTIVE RETURN
MOV ERR_STATUS , _ERR_02 ; NOT READY STATUS SET
JMP MEDIA_RE_ERR ; ERR RET
MEDIA_RE_05:
JMP MEDIA_RE_03 ;
;---------------------------------------------------------------------
;*****************************
;* READ BPB <20>@<40>@ *
;*****************************
MEDIA_RE_06:
;----------------------------------------------- DOS5 91/01/22 -------
PUSH DI
MOV AL,CURDRV
CALL SETDRIVE
AND WORD PTR [DI].BDS_FLAGS, NOT UNFORMATTED_MEDIA
;----------------------------------------------- DOS5 91/02/19 ------
MOV BX,OFFSET EXLPTBL
MOV AL,CURDA
OR AL,CURUA
MEDIA_RE_SRCH:
CMP BYTE PTR [BX+1],AL
JE MEDIA_RE_SRCHEND
ADD BX,2
JMP MEDIA_RE_SRCH
MEDIA_RE_SRCHEND:
XOR AH,AH
MOV AL,MO_SUB_OFFSET
ADD BX,AX
ADD BX,AX
MOV BYTE PTR [DI].BDS_FATSIZ, 0 ;Reset BigFAT flag
AND BYTE PTR [BX], 0FDH ; Large partition bit
TEST SI,0001h
JZ MEDIA_READ_BPB
MOV BYTE PTR [DI].BDS_FATSIZ, 40H ;set BigFAT flaag
TEST SI,0002h
JZ MEDIA_READ_BPB
OR BYTE PTR [BX], 02H ;set large partitin bit
MEDIA_READ_BPB:
;---------------------------------------------------------------------
POP DI
CALL CONV_L_P ; DS:SI <- MO_ADDR_TBL PTR
CALL READ_BPB ; DI <- GET BPB PTR
;----------------------------------------------- DOS5 91/10/08 -------
;<patch BIOS50-P02>
jc MEDIA_RE_ERR ;
jmp PATCH01
db 90h
MEDIA_RE_071:
;---------------
; JAE MEDIA_RE_07 ;
; JMP short MEDIA_RE_ERR ;
;MEDIA_RE_07:
; MOV SI , DI ;
;------------------------------------------------------------------------------
MOV BX , MO_DEV_OFFSET ; CHECK FIRST BPB SET ? /MEDIA
MOV AL , MO_SUB_OFFSET ;
XOR AH , AH ;
SHL AX , 1 ; *4 (1DEVTBL LENGTH)
SHL AX , 1 ;
MOV DI , BX ;
ADD BX , AX ; DI <- DEV TBL PTR
MOV CL , YUKO_UNIT ;
XOR CH , CH ;
MEDIA_RE_08:
CMP BYTE PTR [DI.MO_DEV_FLG] , 01H ;
JZ MEDIA_RE_09 ; NOT FIRST BPB SET THEN JMP
ADD DI , AX ;
LOOP MEDIA_RE_08 ;
MOV AL,CURDRV
CALL SETDRIVE
MOV [DI].BDS_OPCNT,00H
MEDIA_RE_09:
MOV BYTE PTR [BX.MO_DEV_FLG] , 01H ; SET BPB UPDATE FLAG
POP AX
MEDIA_EXIT:
LES BX , PTRSAV ; CMD PACKET PTR GET
MOV ES:[BX.MEDIA_STATUS] , AH ;
MOV AL,CURDRV
CALL SETDRIVE
LEA SI,[DI].BDS_VOLID
MOV WORD PTR ES:[BX.MEDIA_VOLID] , SI
MOV WORD PTR ES:[BX.MEDIA_VOLID+2] , DS
MOV AL , 00H ; NORMAL END STATUS
JMP EXIT ;
MEDIA_RE_ERR:
POP AX
MEDIA_ERR:
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
je MEDIA_ERR10 ; skip setting flags
;---------------------------------------------------------------------
;----------------------------------------------- DOS5 91/01/22 -------
MOV AL,CURDRV
CALL SETDRIVE
OR WORD PTR [DI].BDS_FLAGS, UNFORMATTED_MEDIA
;---------------------------------------------------------------------
;----------------------------------------------- DOS5 91/08/00 -------
MEDIA_ERR10:
;---------------------------------------------------------------------
MOV AL,[ERR_STATUS] ;SET ERROR STATUS
JMP ERR_EXIT ;
PAGE
;************************************************
;* BUILD BPB COMMAND PROCESS *
;*----------------------------------------------*
;* *
;* IN AL<- SUB UNIT # *
;* *
;* *
;************************************************
;=========
GET_MO:
;=========
CALL GET_SCSI_ID ;
XOR AH,AH
MOV AL,CURUA
MOV CL,HDDSK_SIZE
MUL CL
MOV SI,OFFSET HDDSKS_1
ADD SI,AX
MOV AL,[MO_SUB_OFFSET] ;MO DISK PT NUMBER
MOV CL,BPB_SIZE
MUL CL
ADD SI,AX
;----------------------------------------------- DOS5 90/12/14 -------
MOV ES,CS:[BDATA_SEG]
MOV DI,OFFSET BPBCOPY
PUSH DI
MOV CX,13 ;SIZE OF OLD BPB
REP MOVSB
PUSH SI ;SAVE IT
MOV AL,MO_SECTOR
XOR AH,AH
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
jne GET10
mov ax,19h
GET10:
;---------------------------------------------------------------------
STOSW ;SET SECTORS/TRACK
MOV AL,MO_HEAD
XOR AH,AH
STOSW ;SET HEADS/CYLINDER
MOV SI,OFFSET HDS_OFFSET
XOR AH,AH
MOV AL,CURUA
MOV CL,10H
MUL CL
ADD SI,AX
MOV AL,[MO_SUB_OFFSET]
MOV CL,4
MUL CL
ADD SI,AX
MOV CX,2
REP MOVSW ;SET HIDDEN SECTORS
POP SI
MOV CX,2
REP MOVSW ;SET BIG TOTAL SECTORS
POP SI ;SET ADDR OF BPBCOPY
;---------------------------------------------------------------------
BUILD_10: ; STATUS SET FOR DOS
LES BX , [PTRSAV]
;;----------------------------------------------- DOS5 90/02/23 -------
;; MOV WORD PTR ES:[BX.BUILD_BPBPTR] , SI ; BPB OFFSET SET
;; MOV WORD PTR ES:[BX.BUILD_BPBPTR+2] , DS ; BPB SEGMENT SET
;;---------------------------------------------------------------------
MOV AL,BYTE PTR ES:[BX.BUILD_DESCRIPT] ; MEDIA DESCRIPTER
INC AL ;
;----------------------------------------------- DOS5 90/02/23 -------
RET
;;--------------------
;; MOV BYTE PTR ES:[BX.BUILD_DESCRIPT] , AL ; SET MEDIA DESCRIPTER
;; XOR AL,AL ;
;;---------------------------------------------------------------------
;;
;;BUILD_RET:
;; POP [CALLADDR]
;; JMP EXIT ;
;;
;;BUILD_ERR:
;; POP [CALLADDR]
;; JMP ERR_EXIT ;
;;---------------------------------------------------------------------
PAGE
;************************************************
;* OPEN COMMAND PROCESS 0DH *
;*----------------------------------------------*
;* *
;* IN AL <- SUB UNIT # *
;* *
;************************************************
;=======
OPEN_MO:
;=======
;----------------------------------------------- DOS5 91/08/00 -------
cmp byte ptr [di].BDS_Opcnt,01h ; FIRST OPEN?
jne MO_OPEN_EXIT
call LockMO
;---------------
;; CALL GET_SCSI_ID ;
;;----------------------------------------------- DOS5 90/12/22 -------
;;PATCH FIX
; CMP BYTE PTR [DI].BDS_Opcnt,01H ; FIRST OPEN?
;;------------------
;; MOV AL,CURDRV
;; CALL SetDrive
;; CMP BYTE PTR [BX+Opcnt],01H ; FIRST OPEN?
;;---------------------------------------------------------------------
; JNE MO_OPEN_EXIT ; ALL READY
;
;; MO DEVICE OPEN * DOOR LOCK PROCESS
;
; CALL CMD_CLEAR ; SUB ROUTINE COMMAND AREA CLEAR
; ; DS:BX <- COMMAND AREA PTR
; MOV B_COMMAND,_PREVENT_ALLOW ; PREVENT ALLOW (DOOR LOCK)
; MOV B_SCSIID,AL ; SET SCSI ID
; MOV B_FLAG,01H ; DOOR LOCK
;
; CALL CMD_FOR_SCSI ; SCSI COMMAND EXE (ES:BX PACKET PTR)
;----------------------------------------------------------------------
JAE MO_OPEN_EXIT ;
MOV AL,[ERR_STATUS]
JMP ERR_EXIT ; ERR RETURN
MO_OPEN_EXIT:
JMP EXIT ;
;----------------------------------------------- DOS5 91/08/00 -------
;* DOOR LOCK PROCESS
LockMO:
call GET_SCSI_ID
mov bl,SUB_ID
xor bh,bh
cmp byte ptr Lockcnt.[bx],0 ; already be locked?
jne LockMO_Ret ; yes
push bx
call CMD_CLEAR ; SUB ROUTINE COMMAND AREA CLEAR
; DS:BX <- COMMAND AREA PTR
mov B_COMMAND,_PREVENT_ALLOW ; PREVENT ALLOW (DOOR LOCK)
mov B_SCSIID,AL ; SET SCSI ID
mov B_FLAG,01H ; DOOR LOCK
call CMD_FOR_SCSI ; SCSI COMMAND EXE (ES:BX PACKET PTR)
pop bx
jc LockMO_Err
LockMO_Ret:
inc byte ptr Lockcnt.[bx]
LockMO_Err:
ret
;----------------------------------------------------------------------
;************************************************
;* CLOSE COMMAND PROCESS 0EH *
;*----------------------------------------------*
;* *
;* IN AL <- SUB UNIT # *
;* *
;************************************************
;========
CLOSE_MO:
;========
;----------------------------------------------- DOS5 91/08/00 -------
cmp byte ptr [di].BDS_Opcnt,00h ; CLOSE OK?
jne MO_CLOSE_EXIT
call UnlockMO
;---------------
; CALL GET_SCSI_ID ;
;;----------------------------------------------- DOS5 90/12/22 -------
;;PATCH FIX
; CMP BYTE PTR [DI].BDS_Opcnt,00H ; CLOSE OK?
;;------------------
;; MOV AL,CURDRV
;; CALL SetDrive
;; CMP BYTE PTR [BX+Opcnt],00H ; CLOSE OK ?
;;---------------------------------------------------------------------
; JNE MO_CLOSE_EXIT ; ALL READY
;
;; MO DEVICE CLOSE * DOOR UNLOCK PROCESS
;
; CALL CMD_CLEAR ; SUB ROUTINE COMMAND AREA CLEAR
; ; DS:BX <- COMMAND AREA PTR
; MOV B_COMMAND,_PREVENT_ALLOW ; PREVENT ALLOW (LOCK)
; MOV B_SCSIID,AL ; SET SCSI ID
; MOV B_FLAG,00H ; DOOR UNLOCK
;
; CALL CMD_FOR_SCSI ; SCSI COMMAND EXE (ES:BX PACKET PTR)
;----------------------------------------------------------------------
JAE MO_CLOSE_EXIT ;
MOV AL,[ERR_STATUS]
JMP ERR_EXIT ;
MO_CLOSE_EXIT:
JMP EXIT ;
;----------------------------------------------- DOS5 91/08/00 -------
;* DOOR UNLOCK PROCESS
UnlockMO:
call GET_SCSI_ID
mov bl,SUB_ID
xor bh,bh
cmp byte ptr Lockcnt.[bx],1 ; is it time to unlock ?
jne UnlockMO_Ret ; no
push bx
call CMD_CLEAR ; SUB ROUTINE COMMAND AREA CLEAR
; DS:BX <- COMMAND AREA PTR
mov B_COMMAND,_PREVENT_ALLOW ; PREVENT ALLOW (LOCK)
mov B_SCSIID,AL ; SET SCSI ID
mov B_FLAG,00H ; DOOR UNLOCK
call CMD_FOR_SCSI ; SCSI COMMAND EXE (ES:BX PACKET PTR)
pop bx
jc UnlockMO_Err
UnlockMO_Ret:
dec byte ptr Lockcnt.[bx]
UnlockMO_Err:
ret
;----------------------------------------------------------------------
PAGE
;********************************************************************
;* *
;* SUBROUTINE DIVISION *
;* *
;********************************************************************
;***************************************
;* FORMAT CHECK *
;*-------------------------------------*
;* IN : ES:DI READ BUFFER *
;* OUT: CL=00 FORMAT *
;* 01 NOT FORMAT *
;* CF=ON ERR *
;***************************************
;==========
FORMAT_CHK:
;==========
;----------------------------------------------- DOS5 91/01/11 -------
MOV BYTE PTR [RTRY_CNT],05H ;
;------------------
; MOV BYTE PTR [RTRY_CNT],03H ;
;---------------------------------------------------------------------
FORMAT_00: ; RETRY LABEL
CALL CMD_CLEAR ;
MOV BYTE PTR [B_COMMAND],_READ2 ; SET COMMAND
MOV WORD PTR [B_LBAVH],0000H ; TURGET BLOCK IPL
MOV WORD PTR [B_LBAM],0000H ;
MOV WORD PTR [B_DLENGTH],0001H ; 1 SECTOR(READ WITH VOL INF)
MOV [B_DOFFSET],DI ; READ BUFFSER PTR SET
MOV [B_DSEGMENT],ES ;
CALL CMD_FOR_SCSI ;
JAE FORMAT_01 ; READ_OK JMP
SUB BYTE PTR [RTRY_CNT],01H ; READ ERR
CMP BYTE PTR [RTRY_CNT],00H ; RETRY END?
JNZ FORMAT_00 ; JMP RETRY
CMP BYTE PTR [B_SENSE_CODE],0FEH ; UN PHYSICAL FORMAT DISK?
JZ FORMAT_02 ; YES THEN JMP H1.7.5
CMP BYTE PTR [B_SENSE_CODE],0ABH ; CAN'T READ
JZ FORMAT_02 ; YES THEN JMP H1.7.6
STC ; SET CF
JMP short FORMAT_RET ; Can't read
;********************************
;* CHECK VOL FORMAT (IPL1,55AAH)*
;********************************
FORMAT_01:
CMP BYTE PTR ES:[DI+4],'I' ;
JNZ FORMAT_02
CMP BYTE PTR ES:[DI+5],'P' ;
JNZ FORMAT_02
CMP BYTE PTR ES:[DI+6],'L' ;
JNZ FORMAT_02
CMP BYTE PTR ES:[DI+7],'1' ;
JNZ FORMAT_02
CMP WORD PTR ES:[DI+1022],0AA55H ;
JNZ FORMAT_02
XOR CL,CL ; CL=00 FORMAT OK
CLC ;
JMP short FORMAT_RET ;
FORMAT_02:
MOV CL,01H ; NOT FORMAT STATUS SET
CLC
FORMAT_RET:
RET ;
PAGE
;***************************************
;* VOL INFORMATION READ *
;*-------------------------------------*
;* IN : ES:DI READ BUFFER *
;* OUT: CF = ON ERR *
;***************************************
;============
READ_VOL_INF:
;============
;----------------------------------------------- DOS5 91/01/11 -------
MOV BYTE PTR [RTRY_CNT],05H ;
;------------------
; MOV BYTE PTR [RTRY_CNT],03H ;
;---------------------------------------------------------------------
READ_VOL_00: ; RETRY LABEL
CALL CMD_CLEAR ;
MOV BYTE PTR [B_COMMAND],_READ2 ; SET COMMAND
MOV WORD PTR [B_LBAVH],0000H ; TURGET BLOCK VOL INF
MOV byte PTR [B_LBAM],00H ;
MOV byte PTR [B_LBAL],01H ;
MOV WORD PTR [B_DLENGTH],0001H ; 1 SECTOR
MOV [B_DOFFSET],DI ; READ BUFFER PTR SET
MOV [B_DSEGMENT],ES ;
CALL CMD_FOR_SCSI ;
JAE READ_VOL_RET ; READ_OK JMP
SUB BYTE PTR [RTRY_CNT],01H ; READ ERR
CMP BYTE PTR [RTRY_CNT],00H ; RETRY END?
JNZ READ_VOL_00 ; JMP RETRY
STC ; SET CF
READ_VOL_RET:
RET
;***************************************
;* CONVERT PHISYCAL ADDR FROM LOGICAL *
;*-------------------------------------*
;* IN: ES:DI <- VOL INFORMATION TBL *
;* *
;* OUT: DS:SI <- MO_ADDR_TBL PTR *
;* *
;***************************************
;========
CONV_L_P:
;========
PUSH DI ;
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
MOV SI,OFFSET MO_ADDR_TBL ; ADDR TBL HEAD POINTER
MOV AX,[MO_ADDR_LENGTH] ; 1 ADDR TBL LENGTH
MUL [SUB_UNIT] ;
ADD SI,AX ; DI<-MO ADDR TBL OFFSET
XOR AH,AH ;
MOV AL,[MO_HEAD] ;
MUL [MO_SECTOR] ; AX<-SECTOR/CYLINDER
ADD DI,04H ; IPL ADDR SET
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ; if 3.5" MO
je CONV10 ; skip addr_tbl setting
;---------------------------------------------------------------------
CALL SET_ADDR_TBL ; SET PHISICAL ADDR IPL,START,END
;----------------------------------------------- DOS5 91/08/00 -------
CONV10:
;---------------------------------------------------------------------
PUSH SI
PUSH DI
PUSH ES
;----------------------------------------------- DOS5 90/12/18 -------
MOV ES,CS:[BDATA_SEG]
; PUSH CS
; POP ES
;---------------------------------------------------------------------
MOV DI,OFFSET HDS_OFFSET
MOV AL,CURUA
MOV CL,10H ;HDS_OFFSET I UNIT SIZE
MUL CL
ADD DI,AX
MOV AL,[MO_SUB_OFFSET];MO DISK PT NUMBER
MOV CL,4
MUL CL
ADD DI,AX
ADD SI,4
MOV CX,4
REP MOVSB
;----------------------------------------------- DOS5 91/01/20 -------
MOV AL,CURDRV
CALL SETDRIVE
LEA DI,[DI].BDS_BPB.BPB_HIDDENSECTORS
SUB SI,4
MOV CX,4
REP MOVSB
;---------------------------------------------------------------------
MOV DI,OFFSET HDS_LAST
MOV AL,CURUA
MOV CL,10H ;HDS_OFFSET I UNIT SIZE
MUL CL
ADD DI,AX
MOV AL,[MO_SUB_OFFSET];MO DISK PT NUMBER
MOV CL,4
MUL CL
ADD DI,AX
MOV CX,4
REP MOVSB
POP ES
POP DI
POP SI
POP DX ;
POP CX ;
POP BX ;
POP AX ;
POP DI ;
RET ;
PAGE
;***************************************
;* SET ADDR INFORMATION FROM VOL INF *
;*-------------------------------------*
;* IN: AX <- SECTOR/CYLINDER *
;* ES:DI <- VOL INF IPL ADDR PTR *
;* DS:SI <- SET ADDR TBL POINTER *
;* *
;* OUT: DS:SI <- ADDR TBL PTR *
;***************************************
;============
SET_ADDR_TBL:
;============
PUSH SI ;
MOV CX,3 ; IPL,START,END SET
SET_ADDR_LOOP:
PUSH CX ; LOOP COUNTER SAVE
PUSH AX ;
XOR DX,DX ;
XOR CX,CX ;
MOV CL,BYTE PTR ES:[DI]; CX <- SECTOR
XOR AX,AX ;
MOV AL,BYTE PTR [MO_SECTOR] ;
MUL BYTE PTR ES:[DI+1] ; AX <- SECTOR/HEAD * HEAD
ADD CX,AX ; ADD SECTOR
POP AX ;
PUSH AX ;
CLC ;
MUL WORD PTR ES:[DI+2] ; DX:AX SECTOR/CYLINDER * CYLINDER
ADD AX,CX ; ADD
ADC DX,0000H ; ADD CF
XCHG BX,AX ; BX <- AX
POP AX ; AX <- SECTOR/CYLINDER
POP CX ; CX <- COUNTER RESET
PUSH CX ;
PUSH AX ;
CMP CX,1 ; END ADDR SET ?
JNZ NOT_SET_END ;
DEC AX ;
ADD BX,AX ; + (1CYLINDER-1)
ADC DX,0000H ;
NOT_SET_END:
XCHG AX,BX ;
MOV WORD PTR [SI],AX ; L,M SET
MOV WORD PTR [SI+2],DX ; H,VH SET
POP AX ;
POP CX ; LOOP COUNTER RESET
ADD SI,4 ;
ADD DI,4 ;
LOOP SET_ADDR_LOOP ;
POP SI ;
RET ;
PAGE
;***************************************
;* BPB READ & SET BPB TBL *
;*-------------------------------------*
;* IN: DS:SI <- ADDR TBL PTR *
;* *
;* OUT: DS:DI <- BPB PTR *
;* *
;***************************************
;========
READ_BPB:
;========
;----------------------------------------------- DOS5 91/01/11 -------
MOV BYTE PTR [RTRY_CNT] , 05H ;
;------------------
; MOV BYTE PTR [RTRY_CNT] , 03H ;
;---------------------------------------------------------------------
READ_BPB_00: ; RETRY LABEL
CALL CMD_CLEAR ;
MOV BYTE PTR [B_COMMAND] , _READ2 ; SET COMMAND
MOV AX , WORD PTR [SI] ; START OF IPL L,M
MOV BYTE PTR [B_LBAM] , AH ;
MOV BYTE PTR [B_LBAL] , AL ;
MOV AX , WORD PTR [SI+2] ; START OF IPL H,VH
MOV BYTE PTR [B_LBAVH] , AH ;
MOV BYTE PTR [B_LBAH] , AL ;
MOV WORD PTR [B_DLENGTH] , 0001H ; 1SECTOR (LOGICAL BLOCK #0)
MOV BX , OFFSET DSK_BUF2 ; BOOT SECTOR READ OFFSET
MOV [B_DOFFSET] , BX ; DATA AREA PTR SET
PUSH CS:[BDATA_SEG]
POP [B_DSEGMENT] ; BOOT SECTOR READ SEGEMNT
; MOV CS:[B_DSEGMENT] , CS ; BOOT SECTOR READ SEGEMNT
CALL CMD_FOR_SCSI ;
JAE READ_BPB_01 ; READ_OK JMP
SUB BYTE PTR [RTRY_CNT] , 01H ; READ ERR
JNZ READ_BPB_00 ; JMP RETRY
STC ;
JMP READ_BPB_RET ;
;********************************
;* SET BPB FOR BPB TBL *
;********************************
READ_BPB_01:
XOR AH,AH
MOV AL,CURUA
MOV CL,HDDSK_SIZE
MUL CL
MOV DI,OFFSET HDDSKS_1
ADD DI,AX
MOV AL,[MO_SUB_OFFSET] ;MO DISK PT NUMBER
MOV CL,BPB_SIZE
MUL CL
ADD DI,AX
PUSH DS ;
PUSH DI ;
MOV SI , OFFSET DSK_BUF2 ; BOOT SECTOR READ OFFSET
;----------------------------------------------- DOS5 90/12/18 -------
MOV DS,CS:[BDATA_SEG]
; MOV AX , CS
; MOV DS , AX ; BOOT SECTOR READ SEGEMNT
;---------------------------------------------------------------------
ADD SI , 11 ; BPB PTR SET
MOV CX , 0DH ; STRING WORD
;----------------------------------------------- DOS5 90/12/18 -------
MOV ES,CS:[BDATA_SEG]
; MOV AX , CS ;
; MOV ES , AX ;
;---------------------------------------------------------------------
REP MOVSB ; 13 BYTE STRING
;----------------------------------------------- DOS5 91/02/19 -------
CMP WORD PTR DSK_BUF2.EXT_BOOT_BPB.BPB_TOTALSECTORS,0
JE READ_BPB_BIG
MOV AX,0
MOV CX,2
REP STOSW ;set 0
JMP SHORT READ_BPB_02
READ_BPB_BIG:
;----------------------------------------------- DOS5 90/12/14 -------
ADD SI,8
MOV CX,2
REP MOVSW ;TRANSFER DW-SECTOR
READ_BPB_02:
;---------------------------------------------------------------------
;----------------------------------------------- DOS5 91/01/20 -------
MOV AL,CURDRV
CALL SETDRIVE
MOV SI,OFFSET DSK_BUF2.EXT_BOOT_BPB
LEA DI,[DI].BDS_BPB
MOV CX,13
REP MOVSB
MOV AL,MO_SECTOR
XOR AH,AH
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
jne SET_SECTOR
mov ax,WORD PTR DSK_BUF2.EXT_BOOT_BPB.BPB_SECTORSPERTRACK
SET_SECTOR:
;---------------------------------------------------------------------
STOSW ;SET SECTORS/TRACK
MOV AL,MO_HEAD
XOR AH,AH
STOSW ;SET HEADS/CYLINDER
ADD DI,4 ;SKIP HIDDEN SECTORS
CMP WORD PTR DSK_BUF2.EXT_BOOT_BPB.BPB_TOTALSECTORS,0
JE SET_BIGTOTAL
MOV AX,0
MOV CX,2
REP STOSW ;set 0
JMP SHORT READ_BPB_03
SET_BIGTOTAL:
ADD SI,8
MOV CX,2
REP MOVSW ;BIGTOTALSECTORS
;----------------------------------------------- DOS5 91/02/19 -------
READ_BPB_03:
MOV AL,CURDRV
CALL SETDRIVE
CALL MOV_MEDIA_IDS
JNC READ_BPB_04 ;If formatted 3.3c or before
MOV WORD PTR [DI.BDS_VOL_SERIAL],0 ; then reset serial number
MOV WORD PTR [DI.BDS_VOL_SERIAL+2],0; VolID, File SystemID
PUSH DI
MOV SI,OFFSET NO_NAME
LEA DI,[DI].BDS_VOLID
MOV CX,11
REP MOVSB
POP DI
MOV SI,OFFSET FAT12
LEA DI,[DI].BDS_FILESYS_ID
MOV CX,8
REP MOVSB
READ_BPB_04:
;---------------------------------------------------------------------
POP DI ;
POP DS ;
CLC ;
READ_BPB_RET:
RET ;
PAGE
;***************************************
;* TEST UNIT READY COMMAND TRANSFER *
;*-------------------------------------*
;* IN: NOTHING *
;* *
;* OUT: NOTHING *
;* *
;***************************************
;===========
M_TEST_UNIT:
;===========
;----------------------------------------------- DOS5 91/09/00 -------
mov byte ptr [RTRY_CNT],05h
M_TEST_RETRY:
;---------------------------------------------------------------------
CALL CMD_CLEAR ;
MOV BYTE PTR [B_COMMAND] , _TEST_UNIT ;
CALL CMD_FOR_SCSI ;
;----------------------------------------------- DOS5 91/09/00 -------
jnc M_TEST_EXIT
cmp [MOSW2],0ffh ;if 3.5" MO
jne M_TEST_ERR
cmp [B_ODC_STATUS],08h ;busy?
jne M_TEST_ERR
dec [RTRY_CNT]
jz M_TEST_ERR
call get_time
mov bx,ax
wait_loop:
xor cx,cx
loop $
call get_time
sub ax,bx
jnc @f
add ax,60
@@: cmp ax,[time_to_retry]
jb wait_loop
jmp M_TEST_RETRY
M_TEST_ERR:
stc
M_TEST_EXIT:
;---------------------------------------------------------------------
RET ;
;----------------------------------------------- DOS5 91/09/00 -------
get_time proc near
push es
push bx
push cx
mov ax,0
push ds
pop es
mov bx,offset time_buf
int 1ch
mov al,byte ptr es:[bx+5]
and ax,00f0h
mov cl,4
shr ax,cl
mov cx,ax
shl ax,1 ; ax=ax*10
shl ax,1 ;
add ax,cx ;
shl ax,1 ;
mov cl,byte ptr es:[bx+5]
and cx,000fh
add ax,cx
pop cx
pop bx
pop es
ret
get_time endp
;---------------------------------------------------------------------
;***************************************
;* COMMAND PACKET FOR MO_BIOS CLEAR *
;*-------------------------------------*
;* IN: NOTHING *
;* *
;* OUT: NOTHING *
;* *
;***************************************
CMD_CLEAR_far PROC FAR
CALL CMD_CLEAR
RET
CMD_CLEAR_far ENDP
;========
CMD_CLEAR:
;========
PUSH AX ;
PUSH DI ;
PUSH CX ;
PUSH ES ;
;----------------------------------------------- DOS5 91/01/10 -------
MOV CX , DS ;
; MOV CX , CS ;
;---------------------------------------------------------------------
MOV ES , CX ;
MOV CX , 10 ; 10 WORD CLEAR
MOV DI , OFFSET B_COMMAND ; MO-BIOS COMMAND PACKET PTR
MOV AX , 0000H ;
CLD ;
REP STOSW ; CLEAR
POP ES ;
POP CX ;
POP DI ;
POP AX ;
RET ;
PAGE
;****************************************
;* READ WRITE COMMON PHASE *
;****************************************
CMN_RW_MO:
CALL GET_SCSI_ID ;
CMP [COM1],06H
JNZ WRITE_MO
READ_MO:
MOV BYTE PTR [RW_SW],0 ; SET READ FUNCTION
MOV BYTE PTR [COM],_READ2 ; SET READ COMMAND
JMP short COMMON_PHASE05
WRITE_MO:
MOV BYTE PTR [RW_SW] , 1 ; SET WRITE FUNCTION
MOV BYTE PTR [COM] , _WRITE_VERIFY ; SET WRITE COMMAND
COMMON_PHASE05:
MOV BX , WORD PTR [MO_DEV_OFFSET] ; CHECK MEDIA RECOGNITION
XOR AH , AH ;
MOV AL , BYTE PTR [MO_SUB_OFFSET] ;
SHL AX , 1 ;
SHL AX , 1 ;
ADD BX , AX ;
CMP BYTE PTR [BX.MO_DEV_FLG] , 01H ; CHECK ACTIVE
JZ COMMON_PHASE10
TEST BYTE PTR [READ_V_FLG] , 01H ; WHEN VOL LABEL READ ?
JNZ COMMON_PHASE10 ; THEN READ OK
MOV BYTE PTR [ERR_STATUS] , _ERR_0C ; NOT BPB UPDATE ERR
JMP HD_ERROR ;
COMMON_PHASE10:
MOV BP , DI ; BP <- <20>]<5D><><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X OFFSET
MOV CX , LNG_TRNS
MOV LNG_TRNSMO , CX ; <20>]<5D><><EFBFBD>v<EFBFBD><76><EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
MOV BLOCK_TRNS , DX ; <20>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>ԍ<EFBFBD>
;----------------------------------------------- DOS5 90/12/14 -------
MOV DX,START_SEC_H
MOV BLOCK_TRNS_H,DX
;---------------------------------------------------------------------
MOV CUR_TRNS , 0 ; CLEAR TRANSFERED BLOCK LENGTH
MOV NO_TRNS , 0 ; CLEAR NON
CMN_RW_SCSI: ;
CMP LNG_TRNSMO , 0 ; TRANSFER BLOCK LENGTH = 0 ?
JNZ CMNPHASE10 ;
JMP RW_COMMON_RET ; ZF ON RETURN
CMNPHASE10:
PUSH CX
XOR AH,AH
MOV AL,CURUA
MOV CL,HDDSK_SIZE
MUL CL
MOV BX,OFFSET HDDSKS_1
ADD BX,AX
MOV AL,[MO_SUB_OFFSET] ;MO DISK PT NUMBER
MOV CL,BPB_SIZE
MUL CL
ADD BX,AX
POP CX
MOV AX , WORD PTR [BX] ; AX<-<2D>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>̃o<CC83>C<EFBFBD>g<EFBFBD><67>
MOV LNG_SEC , AX ;
HD_RW:
MOV NO_TRNS , 0 ; CLEAR NON-TRANSFED BLOCK
MOV BX , OFFSET MO_ADDR_TBL ;
XOR AH , AH ;
MOV AL , SUB_UNIT ;
MUL [MO_ADDR_LENGTH] ;
ADD BX , AX ;
ADD BX , 4 ; set start sector of partition
PUSH BX ;
MOV AX , WORD PTR [LNG_SEC] ; <20>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>̃o<CC83>C<EFBFBD>g<EFBFBD><67>
MOV BX , 1024 ; <20><><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>̃o<CC83>C<EFBFBD>g<EFBFBD><67>
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
jne HD_RW10
mov bx,512 ; 512 bytes/physical sector
HD_RW10:
;---------------------------------------------------------------------
XOR DX , DX ;
DIV BX ; AX <- DX:AX/BX
MOV CX , AX ; <20>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
MOV [SEC_PBLOCK] , CX ;
POP BX ;
MOV AX , [LNG_TRNSMO] ; <20>]<5D><><EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
MUL [SEC_PBLOCK] ; <20>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
CMP BYTE PTR [READ_V_FLG] , 01H ;
JNZ NOT_V_READ ;
MOV AX , 1 ; SET 1SECTOR WHEN LABEL READ
NOT_V_READ:
MOV [LNG_PTRNS] , AX ; <20>]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
MOV CX,SEC_PBLOCK
;----------------------------------------------- DOS5 90/12/14 -------
MOV AX,BLOCK_TRNS_H ;CALCULATE HIGH WORD FIRST
XOR DX,DX
MUL CX
MOV OLD_AX,AX ;SAVE RESULT HIGH
MOV AX,BLOCK_TRNS ;THEN CALCULATE LOW WORD
XOR DX,DX
MUL CX
ADD DX,OLD_AX ;RESULT IN DX:AX
;------------------
; MOV AX , BLOCK_TRNS ; AX<-<2D>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>ԍ<EFBFBD>
; XOR DX , DX ;
; MUL CX ; DX:AX<-<2D>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD>_<EFBFBD><5F><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>ԍ<EFBFBD>
;---------------------------------------------------------------------
ADD AX , [BX] ;
ADC DX , [BX+2] ; DX:AX<-<2D>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E>ԍ<EFBFBD>
;
;----------------------------------------------- DOS5 91/08/00 -------
mov MAXSEC,128
cmp [MOSW2],0ffh ;if 3.5" MO
je HD_LOOP
mov MAXSEC,64
;---------------------------------------------------------------------
CALL REM_CHK ; CHECK READ ADDR LIMIT
JB HD_ERROR ;
HD_LOOP:
;----------------------------------------------- DOS5 91/08/00 -------
mov bx,MAXSEC ;
cmp LNG_PTRNS , bx ; 64K WRAP AROUND CHECK
jbe L_OK ;
mov LNG_PTRNS , bx ;
;---------------
; CMP LNG_PTRNS , 64 ; 64K WRAP AROUND CHECK
; JBE L_OK ;
; MOV LNG_PTRNS , 64 ;
;---------------------------------------------------------------------
L_OK:
;----------------------------------------------- DOS5 91/01/11 -------
MOV BYTE PTR [RTRY_CNT] , 5 ; SET RETRY TIMES
;------------------
; MOV BYTE PTR [RTRY_CNT] , 3 ; SET RETRY TIMES
;---------------------------------------------------------------------
RW_LOOP_HD:
CALL S_HCMD ; EXE MO_BIOS
JB RTRY_RW_HD ;
CALL VERIFY ;
CLC ;
JMP short RW_COMMON_RET ; NORMAL RETURN
RTRY_RW_HD:
CMP B_SENSE_KEY , 02H ; UNIT ATTENSHION
JZ HD_ERROR00 ;
CMP B_SENSE_KEY , 06H ;
JNZ RETRY_RW_HD00 ; MEDIA CHENGED
HD_ERROR00:
CALL CHECK_MEDIA_OPEN ; ERR
JMP short HD_ERROR ;
RETRY_RW_HD00: ;
DEC BYTE PTR [RTRY_CNT] ;
JZ HD_ERROR ;
JMP RW_LOOP_HD ; JMP RETRAY
;***** RETURN PROCESS *******************
RW_COMMON_RET:
RET ;
HD_ERROR:
MOV AL,[ERR_STATUS]
STC ; CF<-ON
RET ;
PAGE
;*************************************
;* VERYIFY *
;* *
;* NO OPERATION *
;* *
;*************************************
VERIFY:
CMP BYTE PTR [VRFY_FLG] , 0 ;
JZ VERIFY_RET ;
VERIFY_RET:
RET ;
;***************************************
;* CHECK ADDR LIMIT *
;*-------------------------------------*
;* IN : BX<-ADDR TBL PTR *
;* AX:DX <- READ START SECTOR *
;* OUT: CF = ON ERR *
;* OFF OK *
;***************************************
;-------
REM_CHK:
;-------
PUSH DX
PUSH AX
CLC ;
ADD AX , WORD PTR [LNG_PTRNS] ; COMPUTE END SECTOR
ADC DX , 0000H ;
CMP DX , WORD PTR [BX+6] ;
JA REM_ERR ;
JB REM_OK ;
CMP AX , WORD PTR [BX+4] ;
JBE REM_OK ;
REM_ERR:
MOV [ERR_STATUS] , _ERR_0C ;
STC ;
JMP SHORT REM_RET ;
REM_OK:
CLC
REM_RET:
POP AX
POP DX
RET
;***************************************
;* ABNORMAL MEDIA CHENGE CHECK *
;*-------------------------------------*
;* *
;* *
;* *
;***************************************
;-----------------
CHECK_MEDIA_OPEN:
;-----------------
PUSH DI
MOV AL,CURDRV
CALL SETDRIVE
LEA SI,[DI].BDS_OPCNT
POP DI
CMP BYTE PTR [SI] , 00H ; NOW OPEN ?
JZ CHECK_MEDIA_RET ; NO THEN JMP
MOV ERR_STATUS , _ERR_0F ;
MOV BYTE PTR [SI] , 00H ; COUNTER RESET
CHECK_MEDIA_RET:
MOV DL , SUB_ID ; SET UA
OR DL , 0A0H
MOV CL , 09H ; FUNCTION CODE SET
MOV AX , 0001H ; SET MODISK AI FLAG
INT 220 ;
RET
PAGE
;***************************************
;* GET SCSI ID *
;*-------------------------------------*
;* *
;* OUT: [SUB_ID] <- SCSI ID *
;* [MO_DEV_OFFSET] *
;* [SUB_OFFSET] *
;***************************************
;===========
GET_SCSI_ID:
;===========
PUSH AX ;
PUSH BX ;
PUSH DX ;
;----------------------------------------------- DOS5 91/08/00 -------
xor dl,dl
;---------------------------------------------------------------------
PUSH CX
MOV BX,OFFSET EXLPTBL
XOR CX,CX
GET_ID05:
;----------------------------------------------- DOS5 91/08/00 -------
test byte ptr [bx],01h ;CHECK MO DISK FLAG
jz GET_ID200
mov al,byte ptr [bx+1]
cmp al,byte ptr [bx-1]
je GET_ID100
xor dl,dl
GET_ID100:
inc dl ; num of partition
cmp cl,CURDRV
je GET_ID07
GET_ID200:
;----------------------------------------------- DOS5 90/12/22 -------
; TEST BYTE PTR [BX],01H ;CHECK MO DISK FLAG
; JNZ GET_ID07
;;------------------
;; CMP BYTE PTR [BX],01H ;CHECK MO DISK FLAG
;; JE GET_ID07
;;---------------------------------------------------------------------
INC BX
INC BX
INC CX
JMP GET_ID05
GET_ID07:
;----------------------------------------------- DOS5 91/08/00 -------
pop cx
dec dl ; convert to 0 based number
mov dh,dl
mov bx,offset MO_DEVICE_TBL
and al,0fh
GET_ID08:
cmp al,[bx.MO_DEV_ID]
je GET_ID10
add bx,16 ; 16 byte / 1 unit
add dh,4 ; 4 entry / 1 unit
jmp GET_ID08
GET_ID10:
mov SUB_UNIT,dh ; unit # of MO_DEVICE_TBL
;---------------
; MOV AL,CURDRV
; SUB AL,CL
; MOV SUB_UNIT,AL
; POP CX
;
; MOV BX , OFFSET MO_DEVICE_TBL ;
; MOV DL , BYTE PTR [SUB_UNIT] ; DL <- LOGICAL UNIT#/MEDIA
; MOV AL , DL
;
;GET_ID_10:
; SUB AL , BYTE PTR [YUKO_UNIT] ;
; JB GET_ID_20 ; OFFSET GET
; PUSH AX ;
; MOV AL , BYTE PTR [YUKO_UNIT] ;
; XOR AH , AH ;
; SHL AX , 1 ; *4 1DEVTBL LENGTH
; SHL AX , 1 ;
; ADD BX , AX ;
; POP AX ;
; MOV DL , AL ; DL <- LOGICAL UNIT#/MEDIA
; JMP GET_ID_10 ; NEXT TBL
;---------------------------------------------------------------------
GET_ID_20:
MOV AL , [BX.MO_DEV_ID] ; SCSI ID SET
MOV BYTE PTR [SUB_ID] , AL ; SCSI ID SAVE
MOV WORD PTR [MO_DEV_OFFSET] , BX ;
MOV BYTE PTR [MO_SUB_OFFSET] , DL ;
POP DX ;
POP BX ;
POP AX ;
RET
;***************************************
;* COMMAND FOR SCSI BIOS *
;*-------------------------------------*
;* IN: DX:AX <20>]<5D><><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^ *
;* ES:BP <20>]<5D><><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X *
;* *
;* OUT: CF ON<-ERR *
;***************************************
;======
S_HCMD:
;======
CALL CMD_CLEAR ;
MOV BL , [COM] ; COMMAND CODE SET
MOV B_COMMAND , BL ;
MOV B_LBAVH , DH ; VERY HIGH SET
MOV B_LBAH , DL ; HIGH SET
MOV B_LBAM , AH ; M SET
MOV B_LBAL , AL ; LOW SET
MOV BX , [LNG_PTRNS] ; <20>]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>N<EFBFBD>^<5E><>
MOV B_DLENGTH , BX ;
MOV B_DOFFSET , BP ;
MOV B_DSEGMENT , ES ;
CALL CMD_FOR_SCSI ;
S_HCMD_RET:
RET ;
PAGE
;***************************************
;* SCSI CMD FOR MO_BIOS *
;*-------------------------------------*
;* IN : [B_COMMAND] *
;* OUT: CF=01 ERR *
;* [ERR_STATUS] *
;***************************************
;===========
CMD_FOR_SCSI:
;===========
PUSH BX
PUSH ES
MOV BX , DS
MOV ES , BX
MOV BH , [SUB_ID] ; SCSI ID SET
MOV BYTE PTR [B_SCSIID] , BH ;
MOV BX , OFFSET B_COMMAND ;
CALL MO_BIOS ;
JB MT_01 ; CF <- ON ERR
CMP [B_ODC_STATUS] , 00H ;
JZ MT_00 ;
JMP short MT_03 ;
MT_00:
CLC ;
CMP [B_SCSI_STATUS] , 06H ; SCSI NORMAL END?
JZ MT_RET ;
MT_01:
STC ;
MOV [ERR_STATUS] , _ERR_02 ; SCSI ERR
JMP short MT_RET ;
MT_03:
CALL CHECK_ERR_STATUS ;
STC
MT_RET:
POP ES
POP BX
RET
;***************************************
;* ODC CONTROLER STATUS CHECK *
;*-------------------------------------*
;* IN: [B_SENSE_CODE] *
;* *
;* OUT: [ERR_STATUS]<-FOR MS-DOS *
;***************************************
;===============
CHECK_ERR_STATUS:
;===============
PUSH SI ;
PUSH AX ;
MOV [ERR_STATUS] , 00H ;
MOV AL , BYTE PTR [B_SENSE_CODE] ;
CMP AL , 50H ;
JB GET_ERR_CODE ; IF SENSE_CODE < 50H THEN JMP
CMP BYTE PTR [B_SENSE_CODE] , 98H ; Write err? H1.7.5
JNE CHECK_ERR_01 ; H1.7.5
MOV [ERR_STATUS] , _ERR_0A ;Write err ststus set H1.7.5
JMP SHORT CHECK_ERR_RET ; H1.7.5
CHECK_ERR_01: ; H1.7.5
CMP BYTE PTR [B_SENSE_CODE] , 0ABH ; Read err? H1.7.5
JNE CHECK_ERR_02 ; H1.7.5
MOV [ERR_STATUS] , _ERR_0B ; Read err ststus set H1.7.5
JMP SHORT CHECK_ERR_RET ; H1.7.5
CHECK_ERR_02:
MOV [ERR_STATUS] , _ERR_0C ;
JMP SHORT CHECK_ERR_RET ;
GET_ERR_CODE:
MOV SI , OFFSET ERR_CODE_TBL ; GET ERR CODE FROM TBL
XOR AH , AH ;
ADD SI , AX ;
MOV AL , BYTE PTR [SI] ;
MOV [ERR_STATUS] , AL ;
CHECK_ERR_RET:
POP AX
POP SI ;
RET
PAGE
SUBTTL <EFBFBD>n<EFBFBD>c<EFBFBD>b<EFBFBD>P<EFBFBD>S<EFBFBD>P<EFBFBD>@<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>f<EFBFBD>B<EFBFBD>X<EFBFBD>N<EFBFBD>@<EFBFBD>R<EFBFBD>}<EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>a<EFBFBD>h<EFBFBD>n<EFBFBD>r
;************************************************************************
;****************************************************************
;* *
;* <20><><EFBFBD>ʃv<CA83><76><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>Ƃ̃C<CC83><43><EFBFBD>^<5E>t<EFBFBD>F<EFBFBD>[<5B>X *
;* *
;* +---------------+---------------+ *
;* ES:BX -> | Command code | Command flag | +00H *
;* +---------------+---------------+ *
;* | SCSI-ID | Reserve | +02H *
;* +---------------+---------------+ *
;* | Logical Block address (V-H/H)| +04H *
;* +---------------+---------------+ *
;* | " (M/L) | +06H *
;* +---------------+---------------+ *
;* | Data area pointer (offset) | +08H *
;* +---------------+---------------+ *
;* | " (segment) | +0AH *
;* +---------------+---------------+ *
;* | Data length | +0CH *
;* +---------------+---------------+ *
;* | ODC141 Status | SCSI Status | +0EH *
;* +---------------+---------------+ *
;* | Sense Key | Sense Code | +10H *
;* +---------------+---------------+ *
;* | Reserve | +12H *
;* +---------------+---------------+ *
;* *
;* *
;* <20>b<EFBFBD>`<60>k<EFBFBD>k <20>l<EFBFBD>n<EFBFBD>Q<EFBFBD>a<EFBFBD>h<EFBFBD>n<EFBFBD>r *
;* *
;* <20>o<EFBFBD>́F<CD81>b<EFBFBD>e<EFBFBD>E<EFBFBD>E<EFBFBD>E<EFBFBD>n<EFBFBD>e<EFBFBD>e<EFBFBD>@<40>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>I<EFBFBD><49> *
;* <20>n<EFBFBD>m <20><><EFBFBD><EFBFBD>݂<EFBFBD><DD82>ۗ<EFBFBD> *
;* *
;* <20>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
;* <20>X<EFBFBD>V<EFBFBD><56><EFBFBD>ĕԂ<C495><D482>B *
;* <20>i<EFBFBD><69><EFBFBD>̂c<CC82><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><77><EFBFBD>j*
;* *
;* <20>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
;* <20>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD>̖<EFBFBD><CC96><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̒<EFBFBD><CC92><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD><D482>B *
;* <20>i<EFBFBD>O<EFBFBD>̏ꍇ<CC8F>́A<CD81>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD>Ă̒<C482><CC92><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*
;* <20>@<40>ɂȂ<C982><C882>j *
;* *
;****************************************************************
PAGE
CMD_CNT = 8
;*****************************************************************
;** **
;** MO_BIOS main routine **
;** **
;*****************************************************************
MO_BIOS_FAR PROC FAR
CALL MO_BIOS
RET
MO_BIOS_FAR ENDP
MO_BIOS: ;
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH SI ;
PUSH DI ;
PUSH BP ;
PUSH DS ;
PUSH ES ;
or HDIO_FLG,01h ;
CLI
mov [save_ax],ax
mov [save_ss],ss
mov [save_sp],sp
mov ax,ds
mov ss,ax
mov sp,offset stack
mov ax,[save_ax]
STI
;----------------------------------------------- DOS5 91/01/10 -------
MOV AX , DS ;
; MOV AX , CS ;
; MOV DS , AX ;
;---------------------------------------------------------------------
PUSH ES ; Work area clear
MOV ES , AX ;
XOR AX , AX ;
LEA DI , REMAIN_ADDR ;
MOV CX , 3 ;
REP STOSW ;
POP ES ;
MOV AL , ES:[BX]._CMD ; Get command code
LEA SI , MO_CMD_TBL ;
MOV CX , CMD_CNT ;
CMD_SEARCH: ;
CMP AL , CS:[SI] ; Found command code ?
JE MO_CMD_GO ; [Yes]
ADD SI , 3 ; Next command code pointer
LOOP CMD_SEARCH ;
CLC ; Command error
JMP SHORT SET_PATH ;
MO_CMD_GO: ;
INC SI ; Function routine pointer
;---------------------------------------;
CALL cs:[SI] ;
;---------------------------------------;
JC SET_PATH ; Command don't go
MOV AX , [REMAIN_ADDR] ; Next buffer address set (offset)
MOV ES:[BX]._BPTR , AX ; "
MOV AX , [REMAIN_ADDR+2] ; " (segment)
MOV ES:[BX]._BPTR+2 , AX ; "
MOV AX , [REMAIN_LNG] ; Remain data length set
MOV ES:[BX]._LNG , AX ; "
SET_PATH: ;
CLI
mov ss,[save_ss]
mov sp,[save_sp]
pushf
and HDIO_FLG,0feh ;
popf
STI
POP ES ;
POP DS ;
POP BP ;
POP DI ;
POP SI ;
POP DX ;
POP CX ;
POP BX ;
POP AX ;
RET ;
PAGE
;*****************************************************************
;** **
;** ODC141 Function process area **
;** **
;*****************************************************************
;****************************************
;* TEST UNIT READY *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;=========
TEST_UNIT:
;=========
CALL CLR_PARA_AREA ;
MOV AL , 6 ; CDB Length set
MOV [PARAMETER+2] , AL ; "
MOV AL , 00H ; Command code set
MOV [CDB] , AL ; "
CALL SET_ID_NO ; SCSI-ID Set (CDB and AL)
CALL SCSI_01_CMD ;
JZ TEST_UNIT ; Command retry
RET ;
PAGE
;****************************************
;* READ *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;====
READ:
;====
CALL CLR_PARA_AREA ;
MOV AX , 0A44H ; Send vector and CDB Length set
MOV Word Ptr [PARAMETER+1] , AX; "
MOV AL , 28H ; Command code set
MOV [CDB] , AL ; "
MOV AX , ES:[BX]._SPTR ; Read sector pointer set (MSB)
MOV Word Ptr [CDB+2] , AX ; "
MOV AX , ES:[BX]._SPTR+2 ; " (LSB)
MOV Word Ptr [CDB+4] , AX ; "
MOV AX , ES:[BX]._LNG ; Read block count set
XCHG AL , AH ; "
MOV Word Ptr [CDB+7] , AX ; "
XCHG AH , AL ;
MOV CL , 10 ;
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
jne READ10
mov cl,9 ; 512 bytes/physical sector
READ10:
;---------------------------------------------------------------------
SHL AX , CL ; Sector count * 1024
PUSH AX ;
MOV AL , 00H ; read without error check
MOV [CDB+9] , AL ; "
CALL SET_ID_NO ; SCSI-ID Set (CDB and AL)
POP CX ; Read data length set
CALL SCSI_01_CMD ;
JZ READ ; Command retry
RET ;
;****************************************
;* WRITE *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;============
WRITE:
WRITE_VERIFY:
;============
CALL CLR_PARA_AREA ;
MOV AX , 0A48H ; Send vector and CDB Length set
MOV Word Ptr [PARAMETER+1] , AX; "
MOV AL , _WRITE2 ; Command code set
MOV [CDB] , AL ; "
MOV AX , ES:[BX]._SPTR ; Write sector pointer set (MSB)
MOV Word Ptr [CDB+2] , AX ; "
MOV AX , ES:[BX]._SPTR+2 ; " (LSB)
MOV Word Ptr [CDB+4] , AX ; "
MOV AX , ES:[BX]._LNG ; Write block count set
XCHG AL , AH ; "
MOV Word Ptr [CDB+7] , AX ; "
XCHG AH , AL ;
MOV CL , 10 ;
;----------------------------------------------- DOS5 91/08/00 -------
cmp [MOSW2],0ffh ;if 3.5" MO
jne WRITE10
mov cl,9 ; 512 bytes/physical sector
WRITE10:
;---------------------------------------------------------------------
SHL AX , CL ; Sector count * 1024
PUSH AX ;
MOV AL , 00H ; Function set (Change sector and Track)
MOV [CDB+9] , AL ; "
CALL SET_ID_NO ; SCSI-ID Set (CDB and AL)
POP CX ; Write data length set
CALL SCSI_01_CMD ;
JZ WRITE ; Command retry
RET ;
PAGE
;****************************************
;* INQUIRY *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;=======
INQUIRY:
;=======
CALL CLR_PARA_AREA ;
MOV AX , 0644H ; Send vector and CDB Length set
MOV Word Ptr [PARAMETER+1] , AX; "
MOV AL , 12H ; Command code set
MOV [CDB] , AL ; "
MOV AX , ES:[BX]._LNG ; Get data length set
MOV [CDB+4] , AL ; "
CALL SET_ID_NO ; SCSI-ID Set (CDB and AL)
MOV CX , ES:[BX]._LNG ; Get data length set
CALL SCSI_01_CMD ;
INQ_RET:
RET ;
;****************************************
;* PREVENT/ALLOW MEDIA REMOVAL *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;=============
PREVENT_ALLOW:
;=============
CALL CLR_PARA_AREA ;
MOV AL , 6 ; CDB Length set
MOV [PARAMETER+2] , AL ; "
MOV AL , 1EH ; Command code set
MOV [CDB] , AL ; "
MOV AL , ES:[BX]._FLAG ; Command flag set
MOV [CDB+4] , AL ; "
CALL SET_ID_NO ; SCSI-ID Set (CDB and AL)
CALL SCSI_01_CMD ;
JZ PREVENT_ALLOW ; Command retry
RET ;
PAGE
;*****************************************************************
;** **
;** All function common subroutine area **
;** **
;*****************************************************************
;****************************************
;* Parameter area clear process *
;*--------------------------------------*
;* IN : Nothing *
;* *
;* OUT : Nothing *
;****************************************
;-------------
CLR_PARA_AREA:
;-------------
PUSH ES ;
;----------------------------------------------- DOS5 91/01/10 -------
MOV AX , DS ;
; MOV AX , CS ;
;---------------------------------------------------------------------
MOV ES , AX ;
XOR AX , AX ; Parameter clear data
LEA DI , [PARAMETER] ;
MOV CX , 7 ; Parameter area length (word)
REP STOSW ;
POP ES ;
RET ;
;****************************************
;* SCSI-ID Parameter & CDB Set process *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : AL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SCSI-ID *
;****************************************
;---------
SET_ID_NO:
;---------
MOV AL , ES:[BX]._LUN ; Get LUN (For ICB)
MOV CL , 5 ;
SHL AL , CL ; For ODC141 CDB
OR [CDB+1] , AL ; CDB Set
MOV AL , ES:[BX]._SCSI_ID ; Get SCSI-ID No. (For ICB)
OR AL , 0C0H ; For SCSI-BIOS Parameter
XOR CX , CX ;
RET ;
PAGE
;****************************************
;*SCSI-BIOS Command put process (GRP0,1)*
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* AL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SCSI-ID *
;* CX <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Data length *
;* *
;* OUT : CF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Command don't go*
;* ZF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Peset put *
;****************************************
;-----------
SCSI_01_CMD:
;-----------
RET ;
;****************************************
;* SCSI LSI Reset process *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;----------
SCSI_RESET:
;----------
ifndef ;NEC 93/2/18
MOV AH , 00H ; Reset command code
MOV AL , ES:[BX]._SCSI_ID ; SCSI-ID Set
OR AL , 0C0H ;
MOV DX , 0080H ;
INT 1BH ;
endif ;NEC 93/2/18
RET ;
;****************************************
;* SCSI STATUS PHASE *
;*--------------------------------------*
;* IN : ES:BX <20><><EFBFBD> ICB Pointer *
;* *
;* OUT : Nothing *
;****************************************
;*
;***** Status phase *****
;*
STATUS_PHASE0: ;
RET ;
PAGE
;*****************************************************************
;*****************************************************************
;** **
;** **
;** DATA AREA **
;** **
;** **
;*****************************************************************
;*****************************************************************
;****************************************
;* Command table *
;****************************************
MO_CMD_TBL:
DB 00H ; Group 0
DW TEST_UNIT
DB 08H
DW READ
DB 0AH
DW WRITE
DB 12H
DW INQUIRY
DB 1EH
DW PREVENT_ALLOW
DB 28H
DW READ
DB 2AH
DW WRITE
DB 2EH
DW WRITE_VERIFY
;;----------------------------------------------- DOS5 91/01/10 -------
;;****************************************
;;* For SCSI Parameter area *
;;****************************************
;;
;;PARAMETER DB 00H ; Target LUN
;; DB 00H ; Data send vector
;; DB 00H ; CDB Length
;; DB 00H ; Reserve
;;CDB DB 00H ; Command code 0
;; DB 00H ; Bit7-5 LUN 1
;; DB 00H ; 2
;; DB 00H ; 3
;; DB 00H ; 4
;; DB 00H ; 5
;; DB 00H ; 6
;; DB 00H ; 7
;; DB 00H ; 8
;; DB 00H ; 9
;;
;;****************************************
;;* Work data area *
;;****************************************
;;
;;REMAIN_ADDR DW 0000H ; Next buffer address (offset)
;; DW 0000H ; " (segment)
;;REMAIN_LNG DW 0000H ; Remain length
;;
;;BUFFER DB 23 DUP (0CCH)
;;---------------------------------------------------------------------
ICB_TBL STRUC
_CMD DB 00H ; Command code
_FLAG DB 00H ; " flag
_SCSI_ID DB 00H ; SCSI-ID
_LUN DB 00H ; Local Unit Number
_SPTR DW 0000H ; Logical block address (MSB)
DW 0000H ; " (LSB)
_BPTR DW 0000H ; Buffer pointer (offset)
DW 0000H ; " (segment)
_LNG DW 0000H ; Data length
_ODC_ST DB 00H ; Completion status
_SCSI_ST DB 00H ; SCSI Status
_SEN_KEY DB 00H ; Sense key
_SEN_DT DB 00H ; Sense code
DB 00H ; Reserve
DB 00H ; Reserve
ICB_TBL ENDS
MODISK_CODE_END:
MODISK_END:
BIOS_CODE ENDS
END