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

Last change on this file since 258 was 258, checked in by gregli@…, 12 years ago

Added floppy drive emulation over the serial connection (MODULE_SERIAL_FLOPPY). Along the way, various optimizations were made to stay within the 8K ROM size target. Also, serial code now returns the number of sectors transferred.

File size: 12.3 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   "Configure XTIDE Universal BIOS" menu structs and functions.
3
4; Section containing initialized data
5SECTION .data
6
7ALIGN WORD_ALIGN
8g_MenupageForConfigurationMenu:
9istruc MENUPAGE
10    at  MENUPAGE.fnEnter,           dw  ConfigurationMenu_EnterMenuOrModifyItemVisibility
11    at  MENUPAGE.fnBack,            dw  MainMenu_EnterMenuOrModifyItemVisibility
12    at  MENUPAGE.wMenuitems,        dw  9
13iend
14
15g_MenuitemConfigurationBackToMainMenu:
16istruc MENUITEM
17    at  MENUITEM.fnActivate,        dw  MainMenu_EnterMenuOrModifyItemVisibility
18    at  MENUITEM.szName,            dw  g_szItemCfgBackToMain
19    at  MENUITEM.szQuickInfo,       dw  g_szItemCfgBackToMain
20    at  MENUITEM.szHelp,            dw  g_szItemCfgBackToMain
21    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
22    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGEBACK
23iend
24
25g_MenuitemConfigurationPrimaryIdeController:
26istruc MENUITEM
27    at  MENUITEM.fnActivate,        dw  PrimaryIdeController
28    at  MENUITEM.szName,            dw  g_szItemCfgIde1
29    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgIde
30    at  MENUITEM.szHelp,            dw  g_szNfoCfgIde
31    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
32    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGENEXT
33iend
34
35g_MenuitemConfigurationSecondaryIdeController:
36istruc MENUITEM
37    at  MENUITEM.fnActivate,        dw  SecondaryIdeController
38    at  MENUITEM.szName,            dw  g_szItemCfgIde2
39    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgIde
40    at  MENUITEM.szHelp,            dw  g_szNfoCfgIde
41    at  MENUITEM.bFlags,            db  NULL
42    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGENEXT
43iend
44
45g_MenuitemConfigurationTertiaryIdeController:
46istruc MENUITEM
47    at  MENUITEM.fnActivate,        dw  TertiaryIdeController
48    at  MENUITEM.szName,            dw  g_szItemCfgIde3
49    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgIde
50    at  MENUITEM.szHelp,            dw  g_szNfoCfgIde
51    at  MENUITEM.bFlags,            db  NULL
52    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGENEXT
53iend
54
55g_MenuitemConfigurationQuaternaryIdeController:
56istruc MENUITEM
57    at  MENUITEM.fnActivate,        dw  QuaternaryIdeController
58    at  MENUITEM.szName,            dw  g_szItemCfgIde4
59    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgIde
60    at  MENUITEM.szHelp,            dw  g_szNfoCfgIde
61    at  MENUITEM.bFlags,            db  NULL
62    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGENEXT
63iend
64
65g_MenuitemConfigurationBootMenuSettings:
66istruc MENUITEM
67    at  MENUITEM.fnActivate,        dw  BootMenuSettingsMenu_EnterMenuOrModifyItemVisibility
68    at  MENUITEM.szName,            dw  g_szItemCfgBootMenu
69    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgBootMenu
70    at  MENUITEM.szHelp,            dw  g_szNfoCfgBootMenu
71    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
72    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGENEXT
73iend
74
75g_MenuitemConfigurationFullOperatingMode:
76istruc MENUITEM
77    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
78    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
79    at  MENUITEM.szName,            dw  g_szItemCfgFullMode
80    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgFullMode
81    at  MENUITEM.szHelp,            dw  g_szHelpCfgFullMode
82    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_FLAGVALUE
83    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
84    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  ROMVARS.wFlags
85    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgCfgFullMode
86    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceBooleanFlag
87    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForFlagBooleans
88    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  FLG_ROMVARS_FULLMODE
89iend
90
91g_MenuitemConfigurationKiBtoStealFromRAM:
92istruc MENUITEM
93    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateUnsignedInputForMenuitemInDSSI
94    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
95    at  MENUITEM.szName,            dw  g_szItemCfgStealSize
96    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgStealSize
97    at  MENUITEM.szHelp,            dw  g_szHelpCfgStealSize
98    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_BYTEVALUE
99    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
100    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  ROMVARS.bStealSize
101    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgCfgStealSize
102    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  1
103    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  255
104iend
105
106g_MenuitemConfigurationIdeControllers:
107istruc MENUITEM
108    at  MENUITEM.fnActivate,        dw  ActivateInputForNumberOfIdeControllersMenuitemInDSSI
109    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
110    at  MENUITEM.szName,            dw  g_szItemCfgIdeCnt
111    at  MENUITEM.szQuickInfo,       dw  g_szNfoCfgIdeCnt
112    at  MENUITEM.szHelp,            dw  g_szNfoCfgIdeCnt
113    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_BYTEVALUE
114    at  MENUITEM.bType,             db  TYPE_MENUITEM_UNSIGNED
115    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  ROMVARS.bIdeCnt
116    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgCfgIdeCnt
117    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  1
118    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  MAX_ALLOWED_IDE_CONTROLLERS
119iend
120
121
122; Section containing code
123SECTION .text
124
125;--------------------------------------------------------------------
126; MainMenu_EnterMenuOrModifyItemVisibility
127;   Parameters:
128;       SS:BP:  Menu handle
129;   Returns:
130;       Nothing
131;   Corrupts registers:
132;       All, except BP
133;--------------------------------------------------------------------
134ALIGN JUMP_ALIGN
135ConfigurationMenu_EnterMenuOrModifyItemVisibility:
136    push    cs
137    pop     ds
138    call    .DisableAllIdeControllerMenuitems
139    call    .EnableIdeControllerMenuitemsBasedOnConfiguration
140    call    .EnableOrDisableKiBtoStealFromRAM
141    call    LimitIdeControllersForLiteMode
142    mov     si, g_MenupageForConfigurationMenu
143    jmp     Menupage_ChangeToNewMenupageInDSSI
144
145;--------------------------------------------------------------------
146; .DisableAllIdeControllerMenuitems
147; .EnableIdeControllerMenuitemsBasedOnConfiguration
148;   Parameters:
149;       SS:BP:  Menu handle
150;   Returns:
151;       Nothing
152;   Corrupts registers:
153;       AX, BX, CX, DI, ES
154;--------------------------------------------------------------------
155ALIGN JUMP_ALIGN
156.DisableAllIdeControllerMenuitems:
157    mov     cx, MAX_ALLOWED_IDE_CONTROLLERS-1
158    mov     bx, g_MenuitemConfigurationSecondaryIdeController
159ALIGN JUMP_ALIGN
160.DisableNextIdeControllerMenuitem:
161    call    .DisableMenuitemFromCSBX
162    add     bx, BYTE MENUITEM_size
163    loop    .DisableNextIdeControllerMenuitem
164    ret
165
166ALIGN JUMP_ALIGN
167.EnableIdeControllerMenuitemsBasedOnConfiguration:
168    call    Buffers_GetIdeControllerCountToCX
169    dec     cx          ; Primary always enabled
170    jz      SHORT .PrimaryControllerAlreadyEnabled
171    mov     bx, g_MenuitemConfigurationSecondaryIdeController
172ALIGN JUMP_ALIGN
173.EnableNextIdeControllerMenuitem:
174    call    .EnableMenuitemFromCSBX
175    add     bx, BYTE MENUITEM_size
176    loop    .EnableNextIdeControllerMenuitem
177.PrimaryControllerAlreadyEnabled:
178    ret
179
180
181;--------------------------------------------------------------------
182; .EnableOrDisableKiBtoStealFromRAM
183;   Parameters:
184;       SS:BP:  Menu handle
185;   Returns:
186;       Nothing
187;   Corrupts registers:
188;       AX, BX, CX
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191.EnableOrDisableKiBtoStealFromRAM:
192    call    Buffers_GetRomvarsFlagsToAX
193    mov     bx, g_MenuitemConfigurationKiBtoStealFromRAM
194    test    ax, FLG_ROMVARS_FULLMODE
195    jz      SHORT .DisableMenuitemFromCSBX
196    ; Fall to .EnableMenuitemFromCSBX
197
198
199;--------------------------------------------------------------------
200; .EnableMenuitemFromCSBX
201; .DisableMenuitemFromCSBX
202;   Parameters:
203;       CS:BX:  Ptr to MENUITEM
204;   Returns:
205;       Nothing
206;   Corrupts registers:
207;       Nothing
208;--------------------------------------------------------------------
209ALIGN JUMP_ALIGN
210.EnableMenuitemFromCSBX:
211    or      BYTE [cs:bx+MENUITEM.bFlags], FLG_MENUITEM_VISIBLE
212    ret
213
214ALIGN JUMP_ALIGN
215.DisableMenuitemFromCSBX:
216    and     BYTE [cs:bx+MENUITEM.bFlags], ~FLG_MENUITEM_VISIBLE
217    ret
218
219
220
221;--------------------------------------------------------------------
222; MENUITEM activation functions (.fnActivate)
223;   Parameters:
224;       SS:BP:  Ptr to MENU
225;   Returns:
226;       Nothing
227;   Corrupts registers:
228;       All, except segments
229;--------------------------------------------------------------------
230ALIGN JUMP_ALIGN
231PrimaryIdeController:
232    mov     bx, ROMVARS.ideVars0
233    jmp     SHORT DisplayIdeControllerMenu
234
235ALIGN JUMP_ALIGN
236SecondaryIdeController:
237    mov     bx, ROMVARS.ideVars1
238    jmp     SHORT DisplayIdeControllerMenu
239
240ALIGN JUMP_ALIGN
241TertiaryIdeController:
242    mov     bx, ROMVARS.ideVars2
243    jmp     SHORT DisplayIdeControllerMenu
244
245ALIGN JUMP_ALIGN
246QuaternaryIdeController:
247    mov     bx, ROMVARS.ideVars3
248    ; Fall to DisplayIdeControllerMenu
249
250ALIGN JUMP_ALIGN
251DisplayIdeControllerMenu:
252    call    IdeControllerMenu_InitializeToIdevarsOffsetInBX
253    jmp     IdeControllerMenu_EnterMenuOrModifyItemVisibility
254
255
256ALIGN JUMP_ALIGN
257ActivateInputForNumberOfIdeControllersMenuitemInDSSI:
258    call    Menuitem_ActivateUnsignedInputForMenuitemInDSSI
259    ; Fall to LimitIdeControllersForLiteMode
260
261;--------------------------------------------------------------------
262; LimitIdeControllersForLiteMode
263;   Parameters:
264;       SS:BP:  Menu handle
265;   Returns:
266;       Nothing
267;   Corrupts registers:
268;       AX, CX, DI
269;--------------------------------------------------------------------
270ALIGN JUMP_ALIGN
271LimitIdeControllersForLiteMode:
272    push    es
273    call    Buffers_GetIdeControllerCountToCX
274    mov     [es:di+ROMVARS.bIdeCnt], cl
275    CALL_MENU_LIBRARY GetHighlightedItemToAX
276    CALL_MENU_LIBRARY RefreshItemFromAX
277    pop     es
278    ; Fall to ConfigurationMenu_CheckAndMoveSerialDrivesToBottom
279
280;----------------------------------------------------------------------
281; ConfigurationMenu_CheckAndMoveSerialDrivesToBottom
282;
283; Checks to ensure that serial adapters are at the end of the 
284; IDEVARS structures list, as serial floppies (if present) need to be 
285; the last drives detected by the BIOS.  If there are other controllers
286; after a serial controller, the other controllers are moved up on the list
287; and the serial controller is placed at the end of the list.
288;
289;   Parameters:
290;       SS:BP:  Menu handle
291;   Returns:
292;       Nothing
293;   Corrupts registers:
294;       All
295;----------------------------------------------------------------------     
296ConfigurationMenu_CheckAndMoveSerialDrivesToBottom:     
297    push    es
298    push    ds
299    push    di
300    push    si
301
302    call    Buffers_GetIdeControllerCountToCX   ; will also set ES:DI to point to file buffer
303    push    es
304    pop     ds
305    mov     ch, 0                       ; clearing high order of CX and notification flag 
306    mov     dx, cx                      ; (probably unncessary, CX should be less than 127, but just to be sure)
307    jcxz    .done                       ; probably unnecessary, but make sure there is at least one controller     
308
309    add     di, ROMVARS.ideVars0        ; add in offset of first idevars
310    mov     bx, di
311
312.outerLoop:
313    mov     di, bx                      ; start of idevars
314    xor     si, si                      ; first serial found
315    xor     ax, ax                      ; first non-serial found
316    mov     cl, dl                      ; idevars count
317    mov     ch, 0
318
319.loop:
320    cmp     byte [di+IDEVARS.bDevice], DEVICE_SERIAL_PORT
321    jnz     .notSerial
322
323    test    si, si                      ; record the first serial controllert that we find
324    jnz     .next   
325    mov     si, di
326    jmp     .next
327
328.notSerial:
329    mov     ax, di                      ; record the *last* non-serial controller that we find
330
331.next: 
332    add     di, IDEVARS_size
333    loop    .loop
334
335    test    si,si                       ; no serial drives, nothing to do
336    jz      .done
337    cmp     si,ax                       ; serial port is already later on the list than any other controllers
338    ja      .done                       ; (also takes care of the case where ther are no other controllers)
339
340;
341; move serial to end of list, others up
342;
343    cld
344
345    mov     ax, di                      ; save end pointer of list after scan
346
347    sub     sp, IDEVARS_size            ; copy serial to temporary space on stack
348
349    mov     di, sp
350
351    mov     cx, IDEVARS_size
352    push    ss
353    pop     es
354
355    rep movsb
356
357    mov     di, si                      ; move up all the idevars below the serial, by one slot
358    sub     di, IDEVARS_size
359
360    mov     cx, ax                      ; restore end pointer of list, subtract off end of serial idevars
361    sub     cx, si
362
363    push    ds
364    pop     es
365
366    rep movsb
367
368    mov     si, sp                      ; place serial (currently on the stack) at bottom of list
369    push    ss
370    pop     ds
371    mov     cx, IDEVARS_size
372    ; di is already at last IDEVARS position
373   
374    rep movsb
375
376    add     sp, IDEVARS_size           
377
378    push    es
379    pop     ds
380
381    mov     dh, 1                       ; set flag that we have done a relocation
382   
383    jmp     .outerLoop
384
385.done:
386    pop     si
387    pop     di
388    pop     ds
389    pop     es
390
391    test    dh, dh
392    jz      .noWorkDone
393       
394    mov     dx, g_szSerialMoved
395    call    Dialogs_DisplayNotificationFromCSDX
396
397.noWorkDone:       
398    ret
Note: See TracBrowser for help on using the repository browser.