source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/ConfigurationMenu.asm@ 625

Last change on this file since 625 was 625, checked in by Krister Nordvall, 22 months ago

Changes:

  • Added a configuration option to let the BIOS store RamVars to an UMB when Full operating mode is enabled. This is primarily for XT class machines with RAM in the UMA (which apparently is a common thing these days).
  • Added two new builds specifically for IBM PS/2 machines. This is for support of the new McIDE adapter from the guys at zzxio.com. Note that the additional hardware specific code (under the USE_PS2 define) is for the PS/2 machines themselves and not for the McIDE adapters, so any controller in an IBM PS/2 machine can be used with the USE_PS2 define.
  • Moved pColorTheme out of the range of ROMVARS being copied over when doing "Load old settings from EEPROM" in XTIDECFG. This fixed a serious bug from r592 where loading a BIOS from file and then loading the old settings from ROM would corrupt 7 bytes of code somewhere in the loaded BIOS.
  • Optimizations (speed and size) to the library. Browsing the menus in XTIDECFG should now feel a little less sluggish.
  • Hopefully fixed a problem with the PostCommitHook script where it sometimes wouldn't find the CommitInProgress file. I say hopefully because testing this is a nightmare.
File size: 19.9 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : "Configure XTIDE Universal BIOS" menu structs and functions.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2023 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_MenupageForConfigurationMenu:
25istruc MENUPAGE
26 at MENUPAGE.fnEnter, dw ConfigurationMenu_EnterMenuOrModifyItemVisibility
27 at MENUPAGE.fnBack, dw MainMenu_EnterMenuOrModifyItemVisibility
28 at MENUPAGE.wMenuitems, dw 12
29iend
30
31g_MenuitemConfigurationBackToMainMenu:
32istruc MENUITEM
33 at MENUITEM.fnActivate, dw MainMenu_EnterMenuOrModifyItemVisibility
34 at MENUITEM.szName, dw g_szItemCfgBackToMain
35 at MENUITEM.szQuickInfo, dw g_szItemCfgBackToMain
36 at MENUITEM.szHelp, dw g_szItemCfgBackToMain
37 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE
38 at MENUITEM.bType, db TYPE_MENUITEM_PAGEBACK
39iend
40
41g_MenuitemConfigurationPrimaryIdeController:
42istruc MENUITEM
43 at MENUITEM.fnActivate, dw PrimaryIdeController
44 at MENUITEM.szName, dw g_szItemCfgIde1
45 at MENUITEM.szQuickInfo, dw g_szNfoCfgIde
46 at MENUITEM.szHelp, dw g_szNfoCfgIde
47 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE
48 at MENUITEM.bType, db TYPE_MENUITEM_PAGENEXT
49iend
50
51g_MenuitemConfigurationSecondaryIdeController:
52istruc MENUITEM
53 at MENUITEM.fnActivate, dw SecondaryIdeController
54 at MENUITEM.szName, dw g_szItemCfgIde2
55 at MENUITEM.szQuickInfo, dw g_szNfoCfgIde
56 at MENUITEM.szHelp, dw g_szNfoCfgIde
57 at MENUITEM.bFlags, db NULL
58 at MENUITEM.bType, db TYPE_MENUITEM_PAGENEXT
59iend
60
61g_MenuitemConfigurationTertiaryIdeController:
62istruc MENUITEM
63 at MENUITEM.fnActivate, dw TertiaryIdeController
64 at MENUITEM.szName, dw g_szItemCfgIde3
65 at MENUITEM.szQuickInfo, dw g_szNfoCfgIde
66 at MENUITEM.szHelp, dw g_szNfoCfgIde
67 at MENUITEM.bFlags, db NULL
68 at MENUITEM.bType, db TYPE_MENUITEM_PAGENEXT
69iend
70
71g_MenuitemConfigurationQuaternaryIdeController:
72istruc MENUITEM
73 at MENUITEM.fnActivate, dw QuaternaryIdeController
74 at MENUITEM.szName, dw g_szItemCfgIde4
75 at MENUITEM.szQuickInfo, dw g_szNfoCfgIde
76 at MENUITEM.szHelp, dw g_szNfoCfgIde
77 at MENUITEM.bFlags, db NULL
78 at MENUITEM.bType, db TYPE_MENUITEM_PAGENEXT
79iend
80
81g_MenuitemConfigurationBootMenuSettings:
82istruc MENUITEM
83 at MENUITEM.fnActivate, dw BootMenuSettingsMenu_EnterMenuOrModifyItemVisibility
84 at MENUITEM.szName, dw g_szItemCfgBootMenu
85 at MENUITEM.szQuickInfo, dw g_szNfoCfgBootMenu
86 at MENUITEM.szHelp, dw g_szNfoCfgBootMenu
87 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE
88 at MENUITEM.bType, db TYPE_MENUITEM_PAGENEXT
89iend
90
91g_MenuitemAutoConfigure:
92istruc MENUITEM
93 at MENUITEM.fnActivate, dw AutoConfigure_ForThisSystem
94 at MENUITEM.szName, dw g_szItemAutoConfigure
95 at MENUITEM.szQuickInfo, dw g_szNfoAutoConfigure
96 at MENUITEM.szHelp, dw g_szNfoAutoConfigure
97 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU
98 at MENUITEM.bType, db TYPE_MENUITEM_ACTION
99iend
100
101g_MenuitemConfigurationFullOperatingMode:
102istruc MENUITEM
103 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
104 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
105 at MENUITEM.szName, dw g_szItemCfgFullMode
106 at MENUITEM.szQuickInfo, dw g_szNfoCfgFullMode
107 at MENUITEM.szHelp, dw g_szHelpCfgFullMode
108 at MENUITEM.bFlags, db FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_FLAGVALUE
109 at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE
110 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw ROMVARS.wFlags
111 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgCfgFullMode
112 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoiceBooleanFlag
113 at MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup, dw g_rgszValueToStringLookupForFlagBooleans
114 at MENUITEM.itemValue + ITEM_VALUE.wValueBitmask, dw FLG_ROMVARS_FULLMODE
115 at MENUITEM.itemValue + ITEM_VALUE.fnValueWriter, dw WriteFullOperatingMode
116iend
117
118g_MenuitemConfigurationRamVars:
119istruc MENUITEM
120 at MENUITEM.fnActivate, dw Menuitem_ActivateHexInputForMenuitemInDSSI
121 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
122 at MENUITEM.szName, dw g_szItemCfgRamVars
123 at MENUITEM.szQuickInfo, dw g_szNfoCfgRamVars
124 at MENUITEM.szHelp, dw g_szHelpCfgRamVars
125 at MENUITEM.bFlags, db FLG_MENUITEM_MODIFY_MENU
126 at MENUITEM.bType, db TYPE_MENUITEM_HEX
127 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw ROMVARS.wRamVars
128 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgCfgRamVars
129 at MENUITEM.itemValue + ITEM_VALUE.wMinValue, dw 0A000h
130 at MENUITEM.itemValue + ITEM_VALUE.wMaxValue, dw 0FFFFh ; Disables use of UMB
131 at MENUITEM.itemValue + ITEM_VALUE.fnValueReader, dw ReadRamVars
132 at MENUITEM.itemValue + ITEM_VALUE.fnValueWriter, dw WriteRamVars
133iend
134
135g_MenuitemConfigurationKiBtoStealFromRAM:
136istruc MENUITEM
137 at MENUITEM.fnActivate, dw Menuitem_ActivateUnsignedInputForMenuitemInDSSI
138 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
139 at MENUITEM.szName, dw g_szItemCfgStealSize
140 at MENUITEM.szQuickInfo, dw g_szNfoCfgStealSize
141 at MENUITEM.szHelp, dw g_szHelpCfgStealSize
142 at MENUITEM.bFlags, db FLG_MENUITEM_BYTEVALUE
143 at MENUITEM.bType, db TYPE_MENUITEM_UNSIGNED
144 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw ROMVARS.bStealSize
145 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgCfgStealSize
146 at MENUITEM.itemValue + ITEM_VALUE.wMinValue, dw 1
147 at MENUITEM.itemValue + ITEM_VALUE.wMaxValue, dw 255
148iend
149
150g_MenuitemConfigurationIdeControllers:
151istruc MENUITEM
152 at MENUITEM.fnActivate, dw ActivateInputForNumberOfIdeControllersMenuitemInDSSI
153 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
154 at MENUITEM.szName, dw g_szItemCfgIdeCnt
155 at MENUITEM.szQuickInfo, dw g_szNfoCfgIdeCnt
156 at MENUITEM.szHelp, dw g_szNfoCfgIdeCnt
157 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_BYTEVALUE
158 at MENUITEM.bType, db TYPE_MENUITEM_UNSIGNED
159 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw ROMVARS.bIdeCnt
160 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgCfgIdeCnt
161 at MENUITEM.itemValue + ITEM_VALUE.wMinValue, dw 1
162 at MENUITEM.itemValue + ITEM_VALUE.wMaxValue, dw MAX_ALLOWED_IDE_CONTROLLERS
163iend
164
165g_MenuitemConfigurationIdleTimeout:
166istruc MENUITEM
167 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
168 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromRawItemInDSSI
169 at MENUITEM.szName, dw g_szItemCfgIdleTimeout
170 at MENUITEM.szQuickInfo, dw g_szNfoCfgIdleTimeout
171 at MENUITEM.szHelp, dw g_szHelpCfgIdleTimeout
172 at MENUITEM.bFlags, db FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_CHOICESTRINGS
173 at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE
174 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw ROMVARS.bIdleTimeout
175 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgCfgIdleTimeout
176 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoiceIdleTimeout
177 at MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup, dw g_rgwChoiceToValueLookupForIdleTimeout
178 at MENUITEM.itemValue + ITEM_VALUE.rgszChoiceToStringLookup, dw g_rgszChoiceToStringLookupForIdleTimeout
179iend
180
181g_rgwChoiceToValueLookupForIdleTimeout:
182 %assign i -12
183 %rep 21
184 %assign i i+12
185 dw i ; i / 12 = 0 (disabled) or 1...20 minutes
186 %endrep
187 %rep 4
188 %assign i i+1
189 dw i ; 241...244 = (i - 240) * 30 minutes
190 %endrep
191g_rgszChoiceToStringLookupForIdleTimeout:
192 %assign i 0
193 %rep 25
194 dw g_szIdleTimeoutChoice%[i]
195 %assign i i+1
196 %endrep
197 dw NULL
198
199
200; Section containing code
201SECTION .text
202
203;--------------------------------------------------------------------
204; MainMenu_EnterMenuOrModifyItemVisibility
205; Parameters:
206; SS:BP: Menu handle
207; Returns:
208; Nothing
209; Corrupts registers:
210; All, except BP
211;--------------------------------------------------------------------
212ALIGN JUMP_ALIGN
213ConfigurationMenu_EnterMenuOrModifyItemVisibility:
214 push cs
215 pop ds
216 call .DisableAllIdeControllerMenuitems
217 call .EnableIdeControllerMenuitemsBasedOnConfiguration
218 call .EnableOrDisableOperatingModeSelection
219 call Buffers_GetRomvarsFlagsToAX
220 call .EnableOrDisableRamVarsSegmentSelection
221 call .EnableOrDisableKiBtoStealFromRAM
222 call .EnableOrDisableIdleTimeout
223 call LimitIdeControllersForLiteMode
224 mov si, g_MenupageForConfigurationMenu
225 jmp Menupage_ChangeToNewMenupageInDSSI
226
227;--------------------------------------------------------------------
228; .DisableAllIdeControllerMenuitems
229; .EnableIdeControllerMenuitemsBasedOnConfiguration
230; Parameters:
231; SS:BP: Menu handle
232; Returns:
233; Nothing
234; Corrupts registers:
235; AX, BX, CX, DI, ES
236;--------------------------------------------------------------------
237ALIGN JUMP_ALIGN
238.DisableAllIdeControllerMenuitems:
239 mov cx, MAX_ALLOWED_IDE_CONTROLLERS-1
240 mov ax, DisableMenuitemFromCSBX
241 jmp SHORT .Go
242
243ALIGN JUMP_ALIGN
244.EnableIdeControllerMenuitemsBasedOnConfiguration:
245 call Buffers_GetIdeControllerCountToCX
246 dec cx ; Primary always enabled
247 jz SHORT .PrimaryControllerAlreadyEnabled
248 mov ax, EnableMenuitemFromCSBX
249.Go:
250 mov bx, g_MenuitemConfigurationSecondaryIdeController
251ALIGN JUMP_ALIGN
252.EnableOrDisableNextIdeControllerMenuitem:
253 call ax
254 add bx, BYTE MENUITEM_size
255 loop .EnableOrDisableNextIdeControllerMenuitem
256.PrimaryControllerAlreadyEnabled:
257 ret
258
259
260;--------------------------------------------------------------------
261; .EnableOrDisableOperatingModeSelection
262; Parameters:
263; SS:BP: Menu handle
264; Returns:
265; Nothing
266; Corrupts registers:
267; BX
268;--------------------------------------------------------------------
269ALIGN JUMP_ALIGN
270.EnableOrDisableOperatingModeSelection:
271 mov bx, g_MenuitemConfigurationFullOperatingMode
272 call Buffers_IsXTbuildLoaded
273 jz SHORT .EnableMenuitemFromCSBX
274 jmp SHORT .DisableMenuitemFromCSBX
275
276
277;--------------------------------------------------------------------
278; .EnableOrDisableRamVarsSegmentSelection
279; Parameters:
280; AX: ROMVARS.wFlags
281; SS:BP: Menu handle
282; Returns:
283; Nothing
284; Corrupts registers:
285; BX
286;--------------------------------------------------------------------
287ALIGN JUMP_ALIGN
288.EnableOrDisableRamVarsSegmentSelection:
289 mov bx, g_MenuitemConfigurationRamVars
290 test al, FLG_ROMVARS_FULLMODE
291 jz SHORT .DisableMenuitemFromCSBX
292 jmp SHORT .EnableMenuitemFromCSBX
293
294
295;--------------------------------------------------------------------
296; .EnableOrDisableKiBtoStealFromRAM
297; Parameters:
298; SS:BP: Menu handle
299; Returns:
300; Nothing
301; Corrupts registers:
302; BX
303;--------------------------------------------------------------------
304ALIGN JUMP_ALIGN
305.EnableOrDisableKiBtoStealFromRAM:
306 mov bx, g_MenuitemConfigurationKiBtoStealFromRAM
307 cmp WORD [es:ROMVARS.wRamVars], 0
308 jne SHORT .DisableMenuitemFromCSBX
309 jmp SHORT .EnableMenuitemFromCSBX
310
311
312;--------------------------------------------------------------------
313; .EnableOrDisableIdleTimeout
314; Parameters:
315; AX: ROMVARS.wFlags
316; SS:BP: Menu handle
317; Returns:
318; Nothing
319; Corrupts registers:
320; BX
321;--------------------------------------------------------------------
322ALIGN JUMP_ALIGN
323.EnableOrDisableIdleTimeout:
324 mov bx, g_MenuitemConfigurationIdleTimeout
325 test al, FLG_ROMVARS_MODULE_POWER_MANAGEMENT
326 jz SHORT .DisableMenuitemFromCSBX
327 ; Fall to .EnableMenuitemFromCSBX
328
329
330;--------------------------------------------------------------------
331; .EnableMenuitemFromCSBX
332; .DisableMenuitemFromCSBX
333; Parameters:
334; CS:BX: Ptr to MENUITEM
335; Returns:
336; Nothing
337; Corrupts registers:
338; Nothing
339;--------------------------------------------------------------------
340ALIGN JUMP_ALIGN
341.EnableMenuitemFromCSBX:
342 jmp EnableMenuitemFromCSBX
343
344ALIGN JUMP_ALIGN
345.DisableMenuitemFromCSBX:
346 jmp DisableMenuitemFromCSBX
347
348
349;--------------------------------------------------------------------
350; WriteFullOperatingMode
351; Parameters:
352; AX: Value that the MENUITEM system was interacting with
353; ES:DI: ROMVARS location where the value is to be stored
354; DS:SI: MENUITEM pointer
355; Returns:
356; AX: Value to actually write to ROMVARS
357; Corrupts registers:
358; BX
359;--------------------------------------------------------------------
360ALIGN JUMP_ALIGN
361WriteFullOperatingMode:
362 test ax, ax ; FOM disabled?
363 mov bx, LITE_MODE_RAMVARS_SEGMENT
364 jz SHORT .WriteDefaultValueToRamVars ; Yes, Lite mode it is
365 xor bx, bx ; No, use Conventional memory
366.WriteDefaultValueToRamVars:
367 mov [es:ROMVARS.wRamVars], bx
368 ret
369
370
371;--------------------------------------------------------------------
372; ReadRamVars
373; Parameters:
374; AX: Value read from the ROMVARS location
375; ES:DI: ROMVARS location where the value was just read from
376; DS:SI: MENUITEM pointer
377; Returns:
378; AX: Value that the MENUITEM system will interact with and display
379; Corrupts registers:
380; Nothing
381;--------------------------------------------------------------------
382ALIGN JUMP_ALIGN
383ReadRamVars:
384 test ax, ax
385 jz SHORT .PrintNoInsteadOfValue
386 cmp ax, LITE_MODE_RAMVARS_SEGMENT
387 jne SHORT WriteRamVars.Return
388
389.PrintNoInsteadOfValue:
390 push si
391 mov si, g_szNo
392 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
393 pop si
394; This is a humongous hack. The menu system should not be (ab)used like this.
395 pop ax ; Return from ReadRamVars to Menuitem_GetValueToAXfromMenuitemInDSSI
396 pop bx ; Restore registers
397 pop di
398 pop es
399 pop ax ; Return from Menuitem_GetValueToAXfromMenuitemInDSSI to MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
400 jmp MenuitemPrint_FinishPrintingUnsignedOrHexValue
401
402
403;--------------------------------------------------------------------
404; WriteRamVars
405; Parameters:
406; AX: Value that the MENUITEM system was interacting with
407; ES:DI: ROMVARS location where the value is to be stored
408; DS:SI: MENUITEM pointer
409; Returns:
410; AX: Value to actually write to ROMVARS
411; Corrupts registers:
412; Nothing
413;--------------------------------------------------------------------
414ALIGN JUMP_ALIGN
415WriteRamVars:
416 inc ax ; FFFF -> 0000 = Disable UMB usage
417 jz SHORT .Return
418 dec ax
419.Return:
420 ret
421
422
423;--------------------------------------------------------------------
424; MENUITEM activation functions (.fnActivate)
425; Parameters:
426; SS:BP: Ptr to MENU
427; Returns:
428; Nothing
429; Corrupts registers:
430; All, except segments
431;--------------------------------------------------------------------
432%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
433%if (ROMVARS.ideVars0 | ROMVARS.ideVars1 | ROMVARS.ideVars2 | ROMVARS.ideVars3) & 0FF00h = 0
434PrimaryIdeController:
435 mov bl, ROMVARS.ideVars0 & 0FFh
436 SKIP2B f
437SecondaryIdeController:
438 mov bl, ROMVARS.ideVars1 & 0FFh
439 SKIP2B f
440TertiaryIdeController:
441 mov bl, ROMVARS.ideVars2 & 0FFh
442 SKIP2B f
443QuaternaryIdeController:
444 mov bl, ROMVARS.ideVars3 & 0FFh
445 xor bh, bh
446 ; Fall to DisplayIdeControllerMenu
447%else
448ALIGN JUMP_ALIGN
449PrimaryIdeController:
450 mov bx, ROMVARS.ideVars0
451 jmp SHORT DisplayIdeControllerMenu
452
453ALIGN JUMP_ALIGN
454SecondaryIdeController:
455 mov bx, ROMVARS.ideVars1
456 jmp SHORT DisplayIdeControllerMenu
457
458ALIGN JUMP_ALIGN
459TertiaryIdeController:
460 mov bx, ROMVARS.ideVars2
461 jmp SHORT DisplayIdeControllerMenu
462
463ALIGN JUMP_ALIGN
464QuaternaryIdeController:
465 mov bx, ROMVARS.ideVars3
466 ; Fall to DisplayIdeControllerMenu
467%endif
468%endif
469
470ALIGN JUMP_ALIGN
471DisplayIdeControllerMenu:
472 call IdeControllerMenu_InitializeToIdevarsOffsetInBX
473 jmp IdeControllerMenu_EnterMenuOrModifyItemVisibility
474
475
476ALIGN JUMP_ALIGN
477ActivateInputForNumberOfIdeControllersMenuitemInDSSI:
478 call Menuitem_ActivateUnsignedInputForMenuitemInDSSI
479 ; Fall to LimitIdeControllersForLiteMode
480
481;--------------------------------------------------------------------
482; LimitIdeControllersForLiteMode
483; Parameters:
484; SS:BP: Menu handle
485; Returns:
486; Nothing
487; Corrupts registers:
488; AX, CX, DI
489;--------------------------------------------------------------------
490ALIGN JUMP_ALIGN
491LimitIdeControllersForLiteMode:
492 push es
493 call Buffers_GetIdeControllerCountToCX
494 mov [es:di+ROMVARS.bIdeCnt], cl
495 CALL_MENU_LIBRARY GetHighlightedItemToAX
496 CALL_MENU_LIBRARY RefreshItemFromAX
497 pop es
498 ; Fall to ConfigurationMenu_CheckAndMoveSerialDrivesToBottom
499
500;----------------------------------------------------------------------
501; ConfigurationMenu_CheckAndMoveSerialDrivesToBottom
502;
503; Checks to ensure that serial adapters are at the end of the
504; IDEVARS structures list, as serial floppies (if present) need to be
505; the last drives detected by the BIOS. If there are other controllers
506; after a serial controller, the other controllers are moved up on the list
507; and the serial controller is placed at the end of the list.
508;
509; Parameters:
510; SS:BP: Menu handle
511; Returns:
512; Nothing
513; Corrupts registers:
514; AX, BX, CX, DX
515;----------------------------------------------------------------------
516ConfigurationMenu_CheckAndMoveSerialDrivesToBottom:
517 push es
518 push ds
519 push di
520 push si
521
522 call Buffers_GetIdeControllerCountToCX ; will also set ES:DI to point to file buffer
523 push es
524 pop ds
525 mov dx, cx ; Controller count to DL (will always be at least 1) while also clearing notification flag in DH
526
527 lea bx, [di+ROMVARS.ideVars0] ; add in offset of first idevars
528
529.outerLoop:
530 mov di, bx ; start of idevars
531 xor si, si ; first serial found
532 xor ax, ax ; first non-serial found
533 mov cl, dl ; idevars count
534
535.loop:
536 cmp BYTE [di+IDEVARS.bDevice], DEVICE_SERIAL_PORT
537 jne SHORT .notSerial
538
539 test si, si ; record the first serial controller that we find
540 jnz SHORT .next
541 mov si, di
542 SKIP2B f
543
544.notSerial:
545 mov ax, di ; record the *last* non-serial controller that we find
546
547.next:
548 add di, IDEVARS_size
549 loop .loop
550
551 test si, si ; no serial drives, nothing to do
552 jz SHORT .done
553 cmp si, ax ; serial port is already later on the list than any other controllers
554 ja SHORT .done ; (also takes care of the case where there are no other controllers)
555
556;
557; move serial to end of list, others up
558;
559%ifdef CLD_NEEDED
560 cld
561%endif
562 mov ax, di ; save end pointer of list after scan
563 sub sp, IDEVARS_size ; copy serial to temporary space on stack
564 mov di, sp
565
566 push ss
567 pop es
568
569%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
570%if IDEVARS_size & 1
571 mov cl, IDEVARS_size
572 rep movsb
573%else
574 mov cl, IDEVARS_size / 2
575 rep movsw
576%endif
577%endif
578
579 lea di, [si-IDEVARS_size] ; move up all the idevars below the serial, by one slot
580 mov cx, ax ; restore end pointer of list, subtract off end of serial idevars
581 sub cx, si
582
583 push ds
584 pop es
585
586 rep movsb
587
588 mov si, sp ; place serial (currently on the stack) at bottom of list
589 push ss
590 pop ds
591 ; di is already at last IDEVARS position
592
593%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
594%if IDEVARS_size & 1
595 mov cl, IDEVARS_size
596 rep movsb
597%else
598 mov cl, IDEVARS_size / 2
599 rep movsw
600%endif
601%endif
602
603 add sp, IDEVARS_size
604
605 push es
606 pop ds
607
608 mov dh, 1 ; set flag that we have done a relocation
609 jmp SHORT .outerLoop
610
611.done:
612 pop si
613 pop di
614 pop ds
615 pop es
616
617 test dh, dh
618 jz SHORT .noWorkDone
619
620 mov dx, g_szSerialMoved
621 call Dialogs_DisplayNotificationFromCSDX
622
623.noWorkDone:
624 ret
Note: See TracBrowser for help on using the repository browser.