source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm@ 599

Last change on this file since 599 was 593, checked in by Tomi Tilli, 6 years ago

Flashing now works again.
Hack to get Windows 95 to work properly (MODULE_WIN95_CMOS_HACK included for 386 builds by default).
Edited makefile to produce large 386 build.
Fixed recovery time for QDI Vision VLB-IDE controllers.
No more warnings with Nasm 2.13.xx and later.
File dialog now properly restores default drive when file selection is cancelled.

File size: 4.8 KB
RevLine 
[99]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for accessing DPT data.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
[491]12;
[376]13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
[491]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[491]18;
[376]19
[3]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
[542]24; AccessDPT_GetDriveSelectByteToAL
[150]25; Parameters:
26; DS:DI: Ptr to Disk Parameter Table
27; Returns:
28; AL: Drive Select Byte
29; Corrupts registers:
30; Nothing
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
[542]33AccessDPT_GetDriveSelectByteToAL:
[421]34 mov al, [di+DPT.bFlagsLow]
[542]35 and al, FLGL_DPT_SLAVE | FLGL_DPT_LBA
[150]36 or al, MASK_DRVNHEAD_SET ; Bits set to 1 for old drives
37 ret
38
39
40;--------------------------------------------------------------------
41; AccessDPT_GetDeviceControlByteToAL
42; Parameters:
43; DS:DI: Ptr to Disk Parameter Table
44; Returns:
45; AL: Device Control Byte
46; Corrupts registers:
47; Nothing
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
50AccessDPT_GetDeviceControlByteToAL:
[411]51%ifdef MODULE_IRQ
[491]52
53%ifndef USE_UNDOC_INTEL
[150]54 xor al, al
[491]55%endif
56
57 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_ENABLE_IRQ ; Clears CF
58
59%ifdef USE_UNDOC_INTEL
[568]60 salc ; Clears AL using CF while preserving flags
[491]61%endif
62
[150]63 jnz SHORT .EnableDeviceIrq
[589]64 mov al, FLG_DEVCONTROL_nIEN ; Disable IRQ
[150]65.EnableDeviceIrq:
[593]66%else ; ifndef MODULE_IRQ
[411]67 mov al, FLG_DEVCONTROL_nIEN ; Disable IRQ
[491]68%endif ; MODULE_IRQ
[150]69 ret
70
[227]71
[150]72;--------------------------------------------------------------------
[227]73; AccessDPT_GetLCHStoAXBLBH
[3]74; Parameters:
75; DS:DI: Ptr to Disk Parameter Table
76; Returns:
[227]77; AX: Number of L-CHS cylinders
78; BL: Number of L-CHS heads
79; BH: Number of L-CHS sectors per track
[3]80; Corrupts registers:
[421]81; Nothing
[3]82;--------------------------------------------------------------------
[227]83AccessDPT_GetLCHStoAXBLBH:
[421]84 mov ax, [di+DPT.wLchsCylinders]
85 mov bx, [di+DPT.wLchsHeadsAndSectors]
[227]86 ret
[173]87
[227]88
[493]89%ifdef MODULE_8BIT_IDE_ADVANCED
[473]90;--------------------------------------------------------------------
91; AccessDPT_IsThisDeviceXTCF
92; Parameters:
93; DS:DI: Ptr to Disk Parameter Table
94; Returns:
95; AH: Device Type
[588]96; CF: Cleared if XTCF
97; Set if some other device
[473]98; Corrupts registers:
99; Nothing
100;--------------------------------------------------------------------
101AccessDPT_IsThisDeviceXTCF:
102 mov ah, [di+DPT_ATA.bDevice]
[588]103 cmp ah, FIRST_XTCF_DEVICE
104 jb SHORT .DeviceIsNotXTCF
105 cmp ah, LAST_XTCF_DEVICE+1
106 cmc
107.DeviceIsNotXTCF:
[473]108 ret
[493]109%endif ; MODULE_8BIT_IDE_ADVANCED
[473]110
111
[421]112%ifdef MODULE_EBIOS
[227]113;--------------------------------------------------------------------
[230]114; AccessDPT_GetLbaSectorCountToBXDXAX
115; Parameters:
116; DS:DI: Ptr to Disk Parameter Table
117; Returns:
118; BX:DX:AX: 48-bit sector count
119; Corrupts registers:
120; Nothing
121;--------------------------------------------------------------------
122AccessDPT_GetLbaSectorCountToBXDXAX:
123 mov ax, [di+DPT.twLbaSectors]
124 mov dx, [di+DPT.twLbaSectors+2]
125 mov bx, [di+DPT.twLbaSectors+4]
126 ret
[421]127%endif ; MODULE_EBIOS
[230]128
129
130;--------------------------------------------------------------------
[3]131; Returns pointer to DRVPARAMS for master or slave drive.
132;
133; AccessDPT_GetPointerToDRVPARAMStoCSBX
134; Parameters:
135; DS:DI: Ptr to Disk Parameter Table
136; Returns:
137; CS:BX: Ptr to DRVPARAMS
138; Corrupts registers:
139; Nothing
140;--------------------------------------------------------------------
141AccessDPT_GetPointerToDRVPARAMStoCSBX:
[473]142 call AccessDPT_GetIdevarsToCSBX
[150]143 add bx, BYTE IDEVARS.drvParamsMaster ; CS:BX points to Master Drive DRVPARAMS
[158]144 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
[150]145 jz SHORT .ReturnPointerToDRVPARAMS
146 add bx, BYTE DRVPARAMS_size ; CS:BX points to Slave Drive DRVPARAMS
147.ReturnPointerToDRVPARAMS:
[3]148 ret
[200]149
[421]150
[200]151;--------------------------------------------------------------------
[473]152; Needed many times during initialization so it is better to
153; make it as a function to save bytes.
154;
155; AccessDPT_GetIdevarsToCSBX
156; Parameters:
157; DS:DI: Ptr to Disk Parameter Table
158; Returns:
159; CS:BX: Ptr to IDEVARS for the drive
160; Corrupts registers:
161; Nothing
162;--------------------------------------------------------------------
163AccessDPT_GetIdevarsToCSBX:
[568]164 eMOVZX bx, [di+DPT.bIdevarsOffset]
[473]165 ret
166
Note: See TracBrowser for help on using the repository browser.