source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH23h_HFeatures.asm@ 621

Last change on this file since 621 was 618, checked in by Krister Nordvall, 3 years ago

Changes:

  • Updated the BIOS makefile. Added the NO_ATAID_CORRECTION define back to the Tiny build as I've realized that the correction code should not be needed for builds without MODULE_EBIOS. Also added a new makefile target 'custom' to make it easier for people to make custom builds.
  • Fixed a bug where calling INT 13h/AH=15h for drives not handled by XUB (floppy drives for example) would return an error due to the fact that any non-zero return value in AH from the other BIOS would cause the CF to be set in Int13h_SetErrorCodeToIntpackInSSBPfromAH. The return path is now via Int13h_ReturnFromHandlerWithoutStoringErrorCode which means that no status/error code will be returned in the BDA but that should not be a problem as the other BIOS should do that anyway. This change also fixed another potential problem where return values in DL from the other BIOS were assumed to be drive numbers when MODULE_SERIAL_FLOPPY is included in the build.
  • Minor optimizations and fixes.
File size: 5.1 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=23h,
3; Set Controller Features Register.
4
5;
6; XTIDE Universal BIOS and Associated Tools
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
8;
9; This program is free software; you can redistribute it and/or modify
10; it under the terms of the GNU General Public License as published by
11; the Free Software Foundation; either version 2 of the License, or
12; (at your option) any later version.
13;
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17; GNU General Public License for more details.
18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19;
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; Int 13h function AH=23h, Set Controller Features Register.
26;
27; AH23h_HandlerForSetControllerFeatures
28; Parameters:
29; AL, CX: Same as in INTPACK
30; DL: Translated Drive number
31; DS:DI: Ptr to DPT (in RAMVARS segment)
32; SS:BP: Ptr to IDEPACK
33; Parameters on INTPACK:
34; AL: Feature Number (parameter to Features Register = subcommand)
35; (Parameter registers are undocumented, these are specific for this BIOS):
36; BL: Parameter to Sector Count Register (subcommand specific)
37; BH: Parameter to LBA Low / Sector Number Register (subcommand specific)
38; CL: Parameter to LBA Middle / Cylinder Low Register (subcommand specific)
39; CH: Parameter to LBA High / Cylinder High Register (subcommand specific)
40; Returns with INTPACK:
41; AH: Int 13h return status
42; CF: 0 if successful, 1 if error
43;--------------------------------------------------------------------
44AH23h_HandlerForSetControllerFeatures:
45 xchg si, ax ; SI = Feature Number
46 mov dx, [bp+IDEPACK.intpack+INTPACK.bx]
47%ifndef USE_186
48 call AH23h_SetControllerFeatures
49 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
50%else
51 push Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
52 ; Fall to AH23h_SetControllerFeatures
53%endif
54
55
56;--------------------------------------------------------------------
57; AH23h_SetControllerFeatures
58; Parameters:
59; DL: Parameter to Sector Count Register (subcommand specific)
60; DH: Parameter to LBA Low / Sector Number Register (subcommand specific)
61; CL: Parameter to LBA Middle / Cylinder Low Register (subcommand specific)
62; CH: Parameter to LBA High / Cylinder High Register (subcommand specific)
63; SI: Feature Number (parameter to Features Register = subcommand)
64; DS:DI: Ptr to DPT (in RAMVARS segment)
65; SS:BP: Ptr to IDEPACK
66; Returns:
67; AH: Int 13h return status
68; CF: 0 if successful, 1 if error
69; Corrupts registers:
70; AL, BX, CX, DX
71;--------------------------------------------------------------------
72AH23h_SetControllerFeatures:
73 mov al, COMMAND_SET_FEATURES
74 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
75 jmp Idepack_StoreNonExtParametersAndIssueCommandFromAL
76
77
78;--------------------------------------------------------------------
79; AH23h_Enable8bitPioMode
80; AH23h_Disable8bitPioMode
81; Parameters:
82; DS:DI: Ptr to DPT (in RAMVARS segment)
83; SS:BP: Ptr to IDEPACK
84; Returns:
85; AH: Int 13h return status
86; CF: 0 if successful, 1 if error
87; Corrupts registers:
88; AL, BX, CX, DX, SI
89;--------------------------------------------------------------------
90%ifdef MODULE_8BIT_IDE
91AH23h_Enable8bitPioMode:
92 mov si, FEATURE_ENABLE_8BIT_PIO_TRANSFER_MODE
93 jmp SHORT AH23h_SetControllerFeatures
94
95%ifdef MODULE_8BIT_IDE_ADVANCED
96AH23h_Disable8bitPioMode:
97 mov si, FEATURE_DISABLE_8BIT_PIO_TRANSFER_MODE
98 call AH23h_SetControllerFeatures
99 xor ah, ah ; Clear error since modern drives might not understand the command and are
100 ret ; always in 16-bit mode anyway
101%endif ; MODULE_8BIT_IDE_ADVANCED
102%endif ; MODULE_8BIT_IDE
103
104
105;--------------------------------------------------------------------
106; Enable/disable advanced power management command can be used to scale
107; power consumption and performance. Drive supporting Enable APM might not
108; support Disable APM so we set the drive to max performance if stand by
109; timer value is 0 (idle/standby disabled)
110;
111;
112; AH23h_EnableOrDisableAdvancedPowerManagement
113; Parameters:
114; DL: Stand By timer value (0=disable APM)
115; DS:DI: Ptr to DPT (in RAMVARS segment)
116; SS:BP: Ptr to IDEPACK
117; Returns:
118; AH: Int 13h return status
119; CF: 0 if successful, 1 if error
120; Corrupts registers:
121; AL, BX, CX, DX, SI
122;--------------------------------------------------------------------
123%ifdef MODULE_POWER_MANAGEMENT
124AH23h_EnableOrDisableAdvancedPowerManagement:
125 mov si, FEATURE_ENABLE_ADVANCED_POWER_MANAGEMENT
126 test dl, dl
127 jnz SHORT .EnablePowerSave
128 mov dl, 0FEh ; Maximum performance
129 SKIP2B f
130
131; TODO: We should add power management level to IDEVARS to be adjustable with xtidecfg
132.EnablePowerSave:
133 mov dl, 0BFh ; For Toshiba 1.8" HDD: 80h...BFh = Mode 1
134 jmp SHORT AH23h_SetControllerFeatures
135%endif ; MODULE_POWER_MANAGEMENT
Note: See TracBrowser for help on using the repository browser.