source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/MasterSlaveMenu.asm @ 592

Last change on this file since 592 was 592, checked in by krille_n_, 6 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
File size: 18.8 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   "Master/Slave Drive" menu structs and functions.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
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.
12;
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
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing initialized data
21SECTION .data
22
23ALIGN WORD_ALIGN
24g_MenupageForMasterSlaveMenu:
25istruc MENUPAGE
26    at  MENUPAGE.fnEnter,           dw  MasterSlaveMenu_EnterMenuOrModifyItemVisibility
27    at  MENUPAGE.fnBack,            dw  IdeControllerMenu_EnterMenuOrModifyItemVisibility
28    at  MENUPAGE.wMenuitems,        dw  10
29iend
30
31g_MenuitemMasterSlaveBackToIdeControllerMenu:
32istruc MENUITEM
33    at  MENUITEM.fnActivate,        dw  IdeControllerMenu_EnterMenuOrModifyItemVisibility
34    at  MENUITEM.szName,            dw  g_szItemDrvBackToIde
35    at  MENUITEM.szQuickInfo,       dw  g_szItemDrvBackToIde
36    at  MENUITEM.szHelp,            dw  g_szItemDrvBackToIde
37    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
38    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGEBACK
39iend
40
41g_MenuitemMasterSlaveBlockModeTransfers:
42istruc MENUITEM
43    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
44    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
45    at  MENUITEM.szName,            dw  g_szItemDrvBlockMode
46    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvBlockMode
47    at  MENUITEM.szHelp,            dw  g_szHelpDrvBlockMode
48    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_FLAGVALUE
49    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
50    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
51    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvBlockMode
52    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceBooleanFlag
53    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForFlagBooleans
54    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  FLG_DRVPARAMS_BLOCKMODE
55iend
56
57g_MenuitemMasterSlaveChsTranslateMode:
58istruc MENUITEM
59    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
60    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
61    at  MENUITEM.szName,            dw  g_szItemDrvXlateMode
62    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvXlateMode
63    at  MENUITEM.szHelp,            dw  g_szNfoDrvXlateMode
64    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MASKVALUE
65    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
66    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
67    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvXlateMode
68    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiseXlateMode
69    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForXlateMode
70    at  MENUITEM.itemValue + ITEM_VALUE.rgszChoiceToStringLookup,   dw  g_rgszChoiceToStringLookupForXlateMode
71    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  MASK_DRVPARAMS_TRANSLATEMODE
72    at  MENUITEM.itemValue + ITEM_VALUE.bFieldPosition,             db  TRANSLATEMODE_FIELD_POSITION
73iend
74
75g_MenuitemMasterSlaveWriteCache:
76istruc MENUITEM
77    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
78    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
79    at  MENUITEM.szName,            dw  g_szItemDrvWriteCache
80    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvWriteCache
81    at  MENUITEM.szHelp,            dw  g_szHelpDrvWriteCache
82    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MASKVALUE
83    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
84    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
85    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvWriteCache
86    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiseWrCache
87    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForWriteCache
88    at  MENUITEM.itemValue + ITEM_VALUE.rgszChoiceToStringLookup,   dw  g_rgszChoiceToStringLookupForWriteCache
89    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  MASK_DRVPARAMS_WRITECACHE
90    at  MENUITEM.itemValue + ITEM_VALUE.bFieldPosition,             db  0
91iend
92
93g_MenuitemMasterSlaveUserCHS:
94istruc MENUITEM
95    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
96    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
97    at  MENUITEM.szName,            dw  g_szItemDrvUserCHS
98    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvUserCHS
99    at  MENUITEM.szHelp,            dw  g_szHelpDrvUserCHS
100    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_FLAGVALUE
101    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
102    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
103    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvUserCHS
104    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceBooleanFlag
105    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForFlagBooleans
106    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  FLG_DRVPARAMS_USERCHS
107    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  MasterSlaveMenu_WriteCHSFlag
108iend
109
110g_MenuitemMasterSlaveCylinders:
111istruc MENUITEM
112    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateUnsignedInputForMenuitemInDSSI
113    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
114    at  MENUITEM.szName,            dw  g_szItemDrvCyls
115    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvCyls
116    at  MENUITEM.szHelp,            dw  g_szNfoDrvCyls
117    at  MENUITEM.bFlags,            db  NULL
118    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
119    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
120    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvCyls
121    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  1
122    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  MAX_PCHS_CYLINDERS
123%define                 MASTERSLAVE_CYLINDERS_DEFAULT                   1024        ; Max L-CHS Cylinders
124iend
125
126g_MenuitemMasterSlaveHeads:
127istruc MENUITEM
128    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateUnsignedInputForMenuitemInDSSI
129    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
130    at  MENUITEM.szName,            dw  g_szItemDrvHeads
131    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvHeads
132    at  MENUITEM.szHelp,            dw  g_szNfoDrvHeads
133    at  MENUITEM.bFlags,            db  FLG_MENUITEM_BYTEVALUE
134    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
135    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
136    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvHeads
137    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  1
138    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  MAX_PCHS_HEADS
139%define                 MASTERSLAVE_HEADS_DEFAULT                       MAX_PCHS_HEADS
140iend
141
142g_MenuitemMasterSlaveSectors:
143istruc MENUITEM
144    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateUnsignedInputForMenuitemInDSSI
145    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
146    at  MENUITEM.szName,            dw  g_szItemDrvSect
147    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvSect
148    at  MENUITEM.szHelp,            dw  g_szNfoDrvSect
149    at  MENUITEM.bFlags,            db  FLG_MENUITEM_BYTEVALUE
150    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
151    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
152    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvSect
153    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  1
154    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  MAX_PCHS_SECTORS_PER_TRACK
155%define                 MASTERSLAVE_SECTORS_DEFAULT                     MAX_PCHS_SECTORS_PER_TRACK
156iend
157
158g_MenuitemMasterSlaveUserLBA:
159istruc MENUITEM
160    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
161    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
162    at  MENUITEM.szName,            dw  g_szItemDrvUserLBA
163    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvUserLBA
164    at  MENUITEM.szHelp,            dw  g_szHelpDrvUserLBA
165    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_FLAGVALUE
166    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
167    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
168    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvUserLBA
169    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceBooleanFlag
170    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForFlagBooleans
171    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  FLG_DRVPARAMS_USERLBA
172    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  MasterSlaveMenu_WriteLBAFlag
173iend
174
175g_MenuitemMasterSlaveUserLbaValue:
176istruc MENUITEM
177    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateUnsignedInputForMenuitemInDSSI
178    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
179    at  MENUITEM.szName,            dw  g_szItemDrvLbaSectors
180    at  MENUITEM.szQuickInfo,       dw  g_szNfoDrvLbaSectors
181    at  MENUITEM.szHelp,            dw  g_szNfoDrvLbaSectors
182    at  MENUITEM.bFlags,            db  NULL
183    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
184    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
185    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDrvLbaSectors
186    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  16                          ; 8 GiB (but a little more than L-CHS limit)
187    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  10000000h / (1024 * 1024)   ; Limit to 28-bit LBA
188    at  MENUITEM.itemValue + ITEM_VALUE.fnValueReader,              dw  ValueReaderForUserLbaValue
189    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  ValueWriterForUserLbaValue
190%define             MASTERSLAVE_USERLBA_DEFAULT                     64                              ; 32 GiB (max supported by Win95)
191iend
192
193
194g_rgwChoiceToValueLookupForWriteCache:
195    dw  DEFAULT_WRITE_CACHE
196    dw  DISABLE_WRITE_CACHE
197    dw  ENABLE_WRITE_CACHE
198g_rgszChoiceToStringLookupForWriteCache:
199    dw  g_szValueBootDispModeDefault
200    dw  g_szValueDrvWrCaDis
201    dw  g_szValueDrvWrCaEn
202
203g_rgwChoiceToValueLookupForXlateMode:
204    dw  TRANSLATEMODE_NORMAL
205    dw  TRANSLATEMODE_LARGE
206    dw  TRANSLATEMODE_ASSISTED_LBA
207    dw  TRANSLATEMODE_AUTO
208g_rgszChoiceToStringLookupForXlateMode:
209    dw  g_szValueDrvXlateNormal
210    dw  g_szValueDrvXlateLarge
211    dw  g_szValueDrvXlateLBA
212    dw  g_szValueDrvXlateAuto
213
214
215; Section containing code
216SECTION .text
217
218;--------------------------------------------------------------------
219; MasterSlaveMenu_InitializeToDrvparamsOffsetInBX
220;   Parameters:
221;       SS:BP:  Menu handle
222;   Returns:
223;       Nothing
224;   Corrupts registers:
225;       AX
226;--------------------------------------------------------------------
227ALIGN JUMP_ALIGN
228MasterSlaveMenu_InitializeToDrvparamsOffsetInBX:
229    push    ds
230
231    push    cs
232    pop     ds
233
234%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
235%if DRVPARAMS.wFlags = 0
236    mov     ax, bx
237%else
238    lea     ax, [bx+DRVPARAMS.wFlags]
239%endif
240%endif
241    mov     [g_MenuitemMasterSlaveBlockModeTransfers+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
242    mov     [g_MenuitemMasterSlaveChsTranslateMode+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
243    mov     [g_MenuitemMasterSlaveWriteCache+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
244    mov     [g_MenuitemMasterSlaveUserCHS+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
245    mov     [g_MenuitemMasterSlaveUserLBA+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
246
247    lea     ax, [bx+DRVPARAMS.wCylinders]
248    mov     [g_MenuitemMasterSlaveCylinders+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
249
250    lea     ax, [bx+DRVPARAMS.bHeads]
251    mov     [g_MenuitemMasterSlaveHeads+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
252
253    lea     ax, [bx+DRVPARAMS.bSect]
254    mov     [g_MenuitemMasterSlaveSectors+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
255
256    lea     ax, [bx+DRVPARAMS.dwMaximumLBA]
257    mov     [g_MenuitemMasterSlaveUserLbaValue+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
258
259    pop     ds
260    ret
261
262
263;--------------------------------------------------------------------
264; MasterSlaveMenu_EnterMenuOrModifyItemVisibility
265;   Parameters:
266;       SS:BP:  Menu handle
267;   Returns:
268;       Nothing
269;   Corrupts registers:
270;       All, except BP
271;--------------------------------------------------------------------
272ALIGN JUMP_ALIGN
273MasterSlaveMenu_EnterMenuOrModifyItemVisibility:
274    push    cs
275    pop     ds
276    call    .EnableOrDisableUserCHSandLBA
277    call    .EnableOrDisableCHandS
278    call    .EnableOrDisableUserLbaValue
279    mov     si, g_MenupageForMasterSlaveMenu
280    jmp     Menupage_ChangeToNewMenupageInDSSI
281
282
283;--------------------------------------------------------------------
284; .EnableOrDisableUserCHSandLBA
285;   Parameters:
286;       SS:BP:  Menu handle
287;   Returns:
288;       Nothing
289;   Corrupts registers:
290;       AX, BX
291;--------------------------------------------------------------------
292ALIGN JUMP_ALIGN
293.EnableOrDisableUserCHSandLBA:
294    mov     bx, [g_MenuitemMasterSlaveUserLBA+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
295    call    Buffers_GetRomvarsValueToAXfromOffsetInBX
296    test    al, FLG_DRVPARAMS_USERLBA
297    jnz     SHORT .DisableCHSandEnableLBA
298    test    al, FLG_DRVPARAMS_USERCHS
299    jnz     SHORT .EnableCHSandDisableLBA
300
301    ; Enable both
302    mov     bx, g_MenuitemMasterSlaveUserCHS
303    call    EnableMenuitemFromCSBX
304    mov     bx, g_MenuitemMasterSlaveUserLBA
305    jmp     SHORT .EnableMenuitemFromCSBX
306
307ALIGN JUMP_ALIGN
308.EnableCHSandDisableLBA:
309    mov     bx, g_MenuitemMasterSlaveUserCHS
310    call    EnableMenuitemFromCSBX
311    mov     bx, g_MenuitemMasterSlaveUserLBA
312    jmp     SHORT .DisableMenuitemFromCSBX
313
314ALIGN JUMP_ALIGN
315.DisableCHSandEnableLBA:
316    mov     bx, g_MenuitemMasterSlaveUserLBA
317    call    EnableMenuitemFromCSBX
318    mov     bx, g_MenuitemMasterSlaveUserCHS
319    jmp     SHORT .DisableMenuitemFromCSBX
320
321
322;--------------------------------------------------------------------
323; .EnableOrDisableCHandS
324;   Parameters:
325;       SS:BP:  Menu handle
326;   Returns:
327;       Nothing
328;   Corrupts registers:
329;       AX, BX
330;--------------------------------------------------------------------
331ALIGN JUMP_ALIGN
332.EnableOrDisableCHandS:
333    mov     bx, [g_MenuitemMasterSlaveUserCHS+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
334    call    Buffers_GetRomvarsValueToAXfromOffsetInBX
335    test    al, FLG_DRVPARAMS_USERCHS
336    jz      SHORT .DisableCHandS
337    test    al, FLG_DRVPARAMS_USERLBA
338    jnz     SHORT .DisableCHandS
339
340    mov     bx, g_MenuitemMasterSlaveCylinders
341    call    EnableMenuitemFromCSBX
342    mov     bx, g_MenuitemMasterSlaveHeads
343    call    EnableMenuitemFromCSBX
344    mov     bx, g_MenuitemMasterSlaveSectors
345    jmp     SHORT .EnableMenuitemFromCSBX
346
347ALIGN JUMP_ALIGN
348.DisableCHandS:
349    mov     bx, g_MenuitemMasterSlaveCylinders
350    call    DisableMenuitemFromCSBX
351    mov     bx, g_MenuitemMasterSlaveHeads
352    call    DisableMenuitemFromCSBX
353    mov     bx, g_MenuitemMasterSlaveSectors
354    jmp     SHORT .DisableMenuitemFromCSBX
355
356
357;--------------------------------------------------------------------
358; .EnableOrDisableUserLbaValue
359;   Parameters:
360;       SS:BP:  Menu handle
361;   Returns:
362;       Nothing
363;   Corrupts registers:
364;       AX, BX
365;--------------------------------------------------------------------
366ALIGN JUMP_ALIGN
367.EnableOrDisableUserLbaValue:
368    mov     bx, [g_MenuitemMasterSlaveUserLBA+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
369    call    Buffers_GetRomvarsValueToAXfromOffsetInBX
370    mov     bx, g_MenuitemMasterSlaveUserLbaValue
371    test    al, FLG_DRVPARAMS_USERCHS
372    jnz     SHORT .DisableMenuitemFromCSBX
373    test    al, FLG_DRVPARAMS_USERLBA
374    jz      SHORT .DisableMenuitemFromCSBX
375    ; Fall to .EnableMenuitemFromCSBX
376
377
378;--------------------------------------------------------------------
379; .EnableMenuitemFromCSBX
380; .DisableMenuitemFromCSBX
381;   Parameters:
382;       CS:BX:  Ptr to MENUITEM
383;   Returns:
384;       Nothing
385;   Corrupts registers:
386;       Nothing
387;--------------------------------------------------------------------
388ALIGN JUMP_ALIGN
389.EnableMenuitemFromCSBX:
390    jmp     EnableMenuitemFromCSBX
391
392ALIGN JUMP_ALIGN
393.DisableMenuitemFromCSBX:
394    jmp     DisableMenuitemFromCSBX
395
396
397;--------------------------------------------------------------------
398; MENUITEM value reader functions
399;   Parameters:
400;       AX:     Value from MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset
401;       DS:SI:  Ptr to MENUITEM
402;       ES:DI:  Ptr to value variable
403;   Returns:
404;       AX:     Value with possible modifications
405;   Corrupts registers:
406;       Nothing
407;--------------------------------------------------------------------
408ALIGN JUMP_ALIGN
409ValueReaderForUserLbaValue:
410    push    dx
411
412    mov     ax, 1
413    cwd                         ; DX:AX = 1
414    add     ax, [es:di]
415    adc     dx, [es:di+2]       ; User defined LBA28 limit added
416
417    xchg    ax, dx              ; SHR 16
418    eSHR_IM ax, 4               ; SHR 4 => AX = DX:AX / (1024*1024)
419
420    pop     dx
421    ret
422
423
424;--------------------------------------------------------------------
425; MENUITEM value writer functions
426;   Parameters:
427;       AX:     Value to be written to MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset
428;       DS:SI:  Ptr to MENUITEM
429;       ES:DI:  Ptr to value variable
430;   Returns:
431;       AX:     Value to be stored
432;   Corrupts registers:
433;       Nothing
434;--------------------------------------------------------------------
435ALIGN JUMP_ALIGN
436ValueWriterForUserLbaValue:
437    push    dx
438
439    xor     dx, dx
440    eSHL_IM ax, 4
441    xchg    dx, ax          ; DX:AX now holds AX * 1024 * 1024
442
443    sub     ax, BYTE 1      ; Decrement DX:AX by one
444    sbb     dx, BYTE 0      ; (necessary since maximum LBA28 sector count is 0FFF FFFFh)
445
446    mov     [es:di+2], dx   ; Store DX by ourselves
447    pop     dx
448    ret                     ; AX will be stored by our menu system
449
450;
451; No change to CHS flag, but we use this opportunity to change defaults stored in the CHS values if we are
452; changing in/out of user CHS settings (since we use these bytes in different ways with the LBA setting).
453;
454ALIGN JUMP_ALIGN
455MasterSlaveMenu_WriteCHSFlag:
456    test    BYTE [es:di], FLG_DRVPARAMS_USERCHS
457    jnz     SHORT .AlreadySet
458
459    push    ax
460    push    di
461    push    si
462
463    mov     ax, MASTERSLAVE_CYLINDERS_DEFAULT
464    mov     si, g_MenuitemMasterSlaveCylinders
465    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
466
467    mov     ax, MASTERSLAVE_HEADS_DEFAULT
468    mov     si, g_MenuitemMasterSlaveHeads
469    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
470
471    mov     ax, MASTERSLAVE_SECTORS_DEFAULT
472    mov     si, g_MenuitemMasterSlaveSectors
473    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
474
475    pop     si
476    pop     di
477    pop     ax
478
479.AlreadySet:
480    ret
481
482;
483; No change to LBA flag, but we use this opportunity to change defaults stored in the LBA value if we are
484; changing in/out of user LBA settings (since we use these bytes in different ways with the CHS setting).
485;
486ALIGN JUMP_ALIGN
487MasterSlaveMenu_WriteLBAFlag:
488    test    BYTE [es:di], FLG_DRVPARAMS_USERLBA
489    jnz     SHORT .AlreadySet
490
491    push    ax
492    push    di
493    push    si
494
495    mov     ax, MASTERSLAVE_USERLBA_DEFAULT
496    mov     si, g_MenuitemMasterSlaveUserLbaValue
497    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
498
499    pop     si
500    pop     di
501    pop     ax
502
503.AlreadySet:
504    ret
505
Note: See TracBrowser for help on using the repository browser.