📄 drivers.mac
字号:
;***
;* $Workfile: drivers.mac $
;* $Revision: 1.2 $
;* $Author: Dave Sewell $
;* $Date: 08 Aug 1989 16:44:04 $
;***
SUBTTL MS-DOS device driver definitions
PAGE 66, 132
COMMENT @
drivers.mac : December 9, 1988 : Alan Butt
This files contains a set of "Standard" definitions for all Expansion
Box device drivers
@
OPTION PROC:PRIVATE
recover MACRO
jmp short $+2
ENDM
MICROSOFT_OEM_ID EQU 0
SEWELL_OEM_ID EQU (298 SHL 5)
INTERLNK_ID EQU 0
VFXD_Device_ID EQU SEWELL_OEM_ID OR INTERLNK_ID
EXECUTION_TIME_BOOST EQU 10000 ; Time in milliseconds to extend slice
RELEASE_TIME_SLICE_2F EQU 1680h ; Int 2F API function to release slice
SERIAL_IDLER EQU 0
SET_VMSTAT_HIGH_PRI_BACK EQU 1 ; Set High_Priority_Background flag for VM
RESET_VMSTAT_HIGH_PRI_BACK EQU 2 ; Reset " " "
ADJUST_EXECUTION_TIME EQU 3 ; Extend current time slice for VM
RELEASE_TIME_SLICE EQU 4 ; Release current time slice for VM
PARALLEL_IDLER EQU 5
INTERLNK_MULTIPLEX_ID EQU 56H
;--- Definition of bits in the sequence number/flags byte
BYTE_LENGTH EQU 10000000B
CONTINUED_PACKET EQU 01000000B
COMPRESSED EQU 00100000B
SEVEN_WIRE EQU 00010000B
USE_CHECKSUM EQU 00001000B
ECHOPLEX EQU 00000100B
SEQUENCE_BITS EQU 00000011B
IDLE_BITS EQU 11111100B
COMM_CRIT_ERR EQU (88 - 13H)
MINIMUM_TICKS EQU 5
RECV_PACK_TICKS EQU 401
SYNC_TICKS EQU (2 * 18)
CONNECT_TICKS EQU 5
SEQUENCE_BITS EQU 00000011B
MAX_FIXUPS EQU 5
; Device attribute codes: ATT_* define the various bits to be used in th
; device driver attribute word of the device header.
ATT_CHARACTER equ 8000H ; Character device
ATT_BLOCK equ 0000H ; Block device
ATT_IOCTL equ 4000H ; IOCTL read and write supported
ATT_NON_IBM equ 2000H ; Non-IBM format (block)
ATT_OUTBUSY equ 2000H ; Output Until Busy supported (Char)
ATT_OCRM equ 0800H ; Open/Close/Removeable media supported*
ATT_GEN_IOCTL equ 0040H ; Generic IOCTL & Get/Set log dev**
ATT_INT29 equ 0010H ; accepts special interupt 29h
ATT_CLOCK equ 0008H ; this is the CLOCK device
ATT_NUL equ 0004H ; Current NUL device
ATT_HUGE equ 0002H ; 32-bit sector addressing (block)
ATT_STDOUT equ 0002H ; Current standard output (character)
ATT_STDIN equ 0001H ; Current standard input
; * MS-DOS 3.0+
; ** MS-DOS 3.2+
DEVICE_NAME_SIZE EQU 8 ; Characters in device_header.name_num
device_header STRUC ; Device header structure
next_offset dw -1 ; Link to next driver (offset)
next_seg dw -1 ; Link to next driver (segment)
attribute dw ATT_CHARACTER ; Device driver attribute word
strategy dw ? ; Offset to strategy entry point
inter dw ? ; Offset to interrupt entry point
name_num db " " ; Device name or number of units
device_header ENDS
STATUS_ERROR equ 8000H ; error status
STATUS_BUSY equ 0200H ; busy status
STATUS_DONE equ 0100H ; Done
ERR_WRITE_PROT equ 00H ; write-protect error
ERR_UNK_UNIT equ 01H ; Unknown unit
ERR_NOT_READY equ 02H ; Drive not ready
ERR_UNK_COMMAND equ 03H ; Unknown command
ERR_CRC equ 04H ; CRC error
ERR_BAD_LENGTH equ 05H ; Bad drive request structure length
ERR_SEEK equ 06H ; Seek error
ERR_UNK_MEDIA equ 07H ; Unknown media
ERR_NOT_FOUND equ 08H ; Sector not found
ERR_PAPER_OUT equ 09H ; Printer out of paper
ERR_WRITE_FAULT equ 0aH ; Write fault
ERR_READ_FAULT equ 0bH ; Read fault
ERR_FAILURE equ 0ch ; General Failure
ERR_DISK_CHANGE equ 0fh ; Invalid disk change
INIT_DRIVER EQU 0
MEDIA_CHECK EQU 1
BUILD_BPB EQU 2
IOCTL_READ EQU 3
READ EQU 4
ND_READ EQU 5
INPUT_STATUS EQU 6
FLUSH_INPUT EQU 7
WRITE EQU 8
WRITE_VERIFY EQU 9
OUTPUT_STATUS EQU 10
FLUSH_OUTPUT EQU 11
IOCTL_WRITE EQU 12
DEVICE_OPEN EQU 13
DEVICE_CLOSE EQU 14
REMOVABLE_MEDIA EQU 15
OUTPUT_UNTIL_BUSY EQU 16
GENERIC_IOCTL EQU 19
GET_LOGICAL_DEVICE EQU 23
SET_LOGICAL_DEVICE EQU 24
MAX_VOLUME EQU 12 ; Maximum volume label length
MEDIA_CHANGED equ -1 ; Media changed code
MEDIA_DONT_KNOW equ 0 ; Don't know if media has changed or not
MEDIA_NOT_CHANGED equ 1 ; Media has not changed code
bios_parameter_block STRUC
bytes_per_sector dw ? ; Bytes per sector
sectors_per_unit db ? ; Sectors per cluster (power of 2)
reserved_sectors dw ? ; Number of reserved sectors (start @ 0)
number_of_fats db ? ; Number of file allocation tables
root_dir_entries dw ? ; Maximum root directory entries
total_sectors dw ? ; Total number of sectors for media
media_id_byte db ? ; Media ID byte
sectors_per_fat dw ? ; Number of sectors occupied by one FAT
sectors_per_track dw ? ; Sectors per track (MS-DOS 3.0+)
number_of_heads dw ? ; Number of heads (MS-DOS 3.0+)
hidden_sectors dw ? ; Number of hidden sectors (MS-DOS 3.0+)
high_hidden dw ? ; High order word of hidden sects (3.2+)
long_total_sectors dd ? ; Total number of sectors if 08H-09H
; (total_sectors) is zero (MS-DOS 3.2+)
db 6 dup (?)
bios_parameter_block ENDS
; If number of clusters addressable on a device is greater than or equal to
; MIN_16_BIT_CLUSTERS, then 16-bit FAT table entries must be used
MIN_16_BIT_CLUSTERS EQU 4087 ; 0FF7H
; The disk paramenter structure is used by undocumented DOS calls 0x32, 0x52,
; and 0x53. This structure is defined for MS-DOS 2.0 - MS-DOS 4.0.
;
; The structures for the disk parameter blocks differ according to the DOS
; version.
dpb_dos2 STRUC ; DOS's Disk Parameter Block
dpb2_drive db ? ; Drive # (0 = A, 1 = B, ...)
dpb2_unit db ? ; Unit number within device driver
dpb2_bytes_per_sector dw ? ; Number of bytes per sector
dpb2_max_cluster db ? ; Largest sector number in cluster
; add one for number of sectors/cluster
dpb2_log2_cluster db ? ; Log base two of the cluster size
dpb2_reserved_sectors dw ? ; Number of reserved (boot) sectors
dpb2_number_of_fats db ? ; Number of copies of the FAT
dpb2_root_dir_entries dw ? ; Number of root directory entries
dpb2_first_data dw ? ; First sector of data on medium
dpb2_max_number dw ? ; Largest possible cluster number
; subtract one for number of clusters
dpb2_sectors_per_fat db ? ; Number of sectors in one FAT copy
dpb2_first_root dw ? ; First sector of root directory
dpb2_device_driver dd ? ; Corresponding device driver address
dpb2_media_id db ? ; Media descriptor byte
dpb2_valid db ? ; 0FF indicates block must be rebuild
dpb2_next_block dd ? ; address of next device block in list
dpb2_dir_start dw ? ; Starting cluster of current directory
; zero indicates the root directory
dpb2_path_name db 64 DUP(?) ; ASCIIZ current directory path string
dpb_dos2 ENDS
dpb_dos3 STRUC ; DOS's Disk Parameter Block
dpb3_drive db ? ; Drive # (0 = A, 1 = B, ...)
dpb3_unit db ? ; Unit number within device driver
dpb3_bytes_per_sector dw ? ; Number of bytes per sector
dpb3_max_cluster db ? ; Largest sector number in cluster
; add one for number of sectors/cluster
dpb3_log2_cluster db ? ; Log base two of the cluster size
dpb3_reserved_sectors dw ? ; Number of reserved (boot) sectors
dpb3_number_of_fats db ? ; Number of copies of the FAT
dpb3_root_dir_entries dw ? ; Number of root directory entries
dpb3_first_data dw ? ; First sector of data on medium
dpb3_max_number dw ? ; Largest possible cluster number
; subtract one for number of clusters
dpb3_sectors_per_fat db ? ; Number of sectors in one FAT copy
dpb3_first_root dw ? ; First sector of root directory
dpb3_device_driver dd ? ; Corresponding device driver address
dpb3_media_id db ? ; Media descriptor byte
dpb3_valid db ? ; 0FF indicates block must be rebuild
dpb3_next_block dd ? ; address of next device block in list
dpb3_unknown_zero dw ? ; Unknown value (usually zero?)
dpb3_unknown_ffff dw ? ; Unknown value (usually ffff?)
dpb_dos3 ENDS
dpb_dos4 STRUC ; DOS's Disk Parameter Block
dpb4_drive db ? ; Drive # (0 = A, 1 = B, ...)
dpb4_unit db ? ; Unit number within device driver
dpb4_bytes_per_sector dw ? ; Number of bytes per sector
dpb4_max_cluster db ? ; Largest sector number in cluster
; add one for number of sectors/cluster
dpb4_log2_cluster db ? ; Log base two of the cluster size
dpb4_reserved_sectors dw ? ; Number of reserved (boot) sectors
dpb4_number_of_fats db ? ; Number of copies of the FAT
dpb4_root_dir_entries dw ? ; Number of root directory entries
dpb4_first_data dw ? ; First sector of data on medium
dpb4_max_number dw ? ; Largest possible cluster number
; subtract one for number of clusters
dpb4_sectors_per_fat db ? ; Number of sectors in one FAT copy
dpb4_unknown_byte db ? ; Unknown byte (usually 00)
dpb4_first_root dw ? ; First sector of root directory
dpb4_device_driver dd ? ; Corresponding device driver address
dpb4_media_id db ? ; Media descriptor byte
dpb4_valid db ? ; 0FF indicates block must be rebuild
dpb4_next_block dd ? ; address of next device block in list
dpb4_unknown_zero dw ? ; Unknown value (usually zero?)
dpb4_unknown_ffff dw ? ; Unknown value (usually ffff?)
dpb_dos4 ENDS
MAX_DEVICES EQU 26 ; Maximum number of units for the block
; device drivers.
MAX_CHAR_DEVICES EQU 20 ; Max # of character devices
MAX_PORTS EQU 8 ; Size of ports array (in words)
; Minimum and maximum serial block sizes.
PRODUCT_DOSLINK EQU 0
PRODUCT_VERSION EQU ((MAJOR_VER SHL 8) OR MINOR_VER)
static_rhp STRUC ; Static RHP definition
rhp_length db ? ; Request header length
rhp_unit db ? ; Block-device unit number
rhp_command db ? ; Command code (driver subfunction)
rhp_status dw ? ; Driver return status
db 8 DUP (?)
static_rhp ENDS
init_req STRUC ; initialize request
db TYPE static_rhp DUP (?)
db (12H - (TYPE static_rhp)) DUP (?)
init_cmd dd ? ; Segment:Offset of line loading driver
init_first db ? ; First unit number
init_req ENDS
init_ans STRUC ; Initialization answer
db TYPE static_rhp DUP (?)
init_units db ? ; Units supported
init_end dd ? ; Segment:offset free mem above driver
init_bpb dd ? ; Segment:Offset BPB pointer array
init_ans ENDS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -