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

Last change on this file since 588 was 588, checked in by krille_n_@…, 9 years ago

Changes:

  • Fixed a bug in AH24h_HSetBlocks.asm from r550. Trying to set a too large block size with an XT-CF card in DMA transfer mode would corrupt the stack.
  • Fixed a bug from r545 where the list of devices under g_szDeviceTypeValues in Strings.asm was no longer up to date causing the boot menu to display the wrong string for devices numbered higher than DEVICE_8BIT_XTCF_PIO8.
  • Made some fairly significant changes to the XT-CF code to reduce size. Two changes in functionality; 1) Added a simple check to validate the request for a change of the XT-CF transfer mode. 2) Changing transfer mode to use DMA no longer calls AH24h_SetBlockSize if the block size already is within the limits of DMA transfers. UNTESTED
  • XTIDECFG now clears IDEVARS.bIRQ when changing IDE controller to a serial device to keep the boot menu from displaying it since the serial device doesn't use IRQs at all.
  • Other minor optimizations.
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
64    or      al, FLG_DEVCONTROL_nIEN ; Disable IRQ
65.EnableDeviceIrq:
[411]66%else
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.