source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/MenuEvents.asm @ 525

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

Changes:

  • Made some improvements to the stack switching in Int13h.asm.
  • Added a tail-call optimized variant of the CALL_MENU_LIBRARY macro (JMP_MENU_LIBRARY).
  • Other optimizations and fixes.
File size: 6.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Menu event handling.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 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 code
21SECTION .text
22
23;--------------------------------------------------------------------
24; MenuEvents_DisplayMenu
25;   Parameters:
26;       Nothing
27;   Returns:
28;       Nothing
29;   Corrupts registers:
30;       All, except segments
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33MenuEvents_DisplayMenu:
34    mov     bx, MenuEventHandler
35    JMP_MENU_LIBRARY DisplayWithHandlerInBXandUserDataInDXAX
36
37
38;--------------------------------------------------------------------
39; MenuEventHandler
40;   Common parameters for all events:
41;       BX:         Menu event (anything from MENUEVENT struct)
42;       SS:BP:      Menu library handle
43;   Common return values for all events:
44;       CF:         Set if event processed
45;                   Cleared if event not processed
46;   Corrupts registers:
47;       All
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
50MenuEventHandler:
51    cmp     bx, MENUEVENT.RefreshItemFromCX ; Above last supported item?
52    ja      SHORT .EventNotHandled
53    jmp     [cs:bx+.rgfnEventSpecificHandlers]
54.EventNotHandled:
55.IdleProcessing:
56    clc
57    ret
58
59ALIGN WORD_ALIGN
60.rgfnEventSpecificHandlers:
61    dw      .InitializeMenuinitFromDSSI
62    dw      .ExitMenu
63    dw      .IdleProcessing
64    dw      .ItemHighlightedFromCX
65    dw      .ItemSelectedFromCX
66    dw      .KeyStrokeInAX
67    dw      .RefreshTitle
68    dw      .RefreshInformation
69    dw      .RefreshItemFromCX
70
71
72; Parameters:
73;   DS:SI:      Ptr to MENUINIT struct to initialize
74; Returns:
75;   DS:SI:      Ptr to initialized MENUINIT struct
76ALIGN JUMP_ALIGN
77.InitializeMenuinitFromDSSI:
78    push    ds
79    push    cs
80    pop     ds
81    mov     di, g_MenupageForMainMenu
82    call    Menupage_SetActiveMenupageFromDSDI
83    call    Menupage_GetVisibleMenuitemsToAXfromDSDI
84    pop     ds
85
86    mov     WORD [si+MENUINIT.wItems], ax
87    mov     WORD [si+MENUINIT.bTitleLines], TITLE_LINES_IN_MENU
88    mov     WORD [si+MENUINIT.bInfoLines], INFO_LINES_IN_MENU
89    mov     BYTE [si+MENUINIT.bWidth], MENU_WIDTH
90    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
91    mov     [si+MENUINIT.bHeight], ah
92    call    MainMenu_EnterMenuOrModifyItemVisibility
93    stc
94    ret
95
96
97; Parameters:
98;   None
99; Returns:
100;   CF:     Set to exit menu
101;           Clear to cancel exit
102ALIGN JUMP_ALIGN
103.ExitMenu:
104    call    Menupage_GetActiveMenupageToDSDI
105    mov     si, [di+MENUPAGE.fnBack]
106    cmp     si, ExitToDosFromBackButton
107    je      SHORT .QuitProgram
108    call    si                  ; Back to previous menu
109    clc
110    ret
111
112ALIGN JUMP_ALIGN
113.QuitProgram:
114    call    Dialogs_DisplayQuitDialog
115    jz      SHORT .ExitToDOS
116    clc
117    ret
118.ExitToDOS:
119    call    Buffers_SaveChangesIfFileLoaded
120    CALL_MENU_LIBRARY Close
121    stc
122    ret
123
124
125; Parameters:
126;   CX:         Index of new highlighted item
127;   DX:         Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
128ALIGN JUMP_ALIGN
129.ItemHighlightedFromCX:
130    CALL_MENU_LIBRARY ClearInformationArea
131    CALL_MENU_LIBRARY RefreshInformation
132    stc
133    ret
134
135
136; Parameters:
137;   CX:         Index of selected item
138ALIGN JUMP_ALIGN
139.ItemSelectedFromCX:
140    call    Menupage_GetActiveMenupageToDSDI
141    call    Menupage_GetCXthVisibleMenuitemToDSSIfromDSDI
142    call    [si+MENUITEM.fnActivate]
143    stc
144    ret
145
146
147; Parameters:
148;   AL:         ASCII character for the key
149;   AH:         Keyboard library scan code for the key
150ALIGN JUMP_ALIGN
151.KeyStrokeInAX:
152    cmp     ah, KEY_DISPLAY_ITEM_HELP
153    jne     SHORT .EventNotHandled
154
155;ALIGN JUMP_ALIGN
156;.DisplayHelp:
157    call    Menupage_GetActiveMenupageToDSDI
158    CALL_MENU_LIBRARY GetHighlightedItemToAX
159    xchg    cx, ax
160    call    Menupage_GetCXthVisibleMenuitemToDSSIfromDSDI
161    call    Menuitem_DisplayHelpMessageFromDSSI
162    stc
163    ret
164
165
166; Parameters:
167;   CX:         Index of item to refresh
168;   Cursor has been positioned to the beginning of item line
169ALIGN JUMP_ALIGN
170.RefreshItemFromCX:
171    cmp     cx, NO_ITEM_HIGHLIGHTED
172    je      SHORT .NothingToRefresh
173    call    Menupage_GetActiveMenupageToDSDI
174    call    Menupage_GetCXthVisibleMenuitemToDSSIfromDSDI
175    jnc     SHORT .NothingToRefresh
176    call    MenuitemPrint_NameWithPossibleValueFromDSSI
177.NothingToRefresh:
178    stc
179    ret
180
181
182; Parameters:
183;   CX:         Index of highlighted item
184;   Cursor has been positioned to the beginning of first line
185ALIGN JUMP_ALIGN
186.RefreshInformation:
187    cmp     cx, NO_ITEM_HIGHLIGHTED
188    je      SHORT .NothingToRefresh
189    call    Menupage_GetActiveMenupageToDSDI
190    call    Menupage_GetCXthVisibleMenuitemToDSSIfromDSDI
191    call    MenuitemPrint_PrintQuickInfoFromDSSI
192    stc
193    ret
194
195
196; Parameters:
197;   CX:         Index of highlighted item
198;   Cursor has been positioned to the beginning of first line
199ALIGN JUMP_ALIGN
200.RefreshTitle:
201    call    .PrintProgramName
202    call    .PrintLoadStatus
203    call    .PrintStatusOfUnsavedChanges
204    stc
205.ReturnSinceNothingToPrint:
206    ret
207
208ALIGN JUMP_ALIGN
209.PrintProgramName:
210    mov     si, g_szProgramTitle
211    JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
212
213ALIGN JUMP_ALIGN
214.PrintLoadStatus:
215    mov     ax, [g_cfgVars+CFGVARS.wFlags]
216    test    ax, FLG_CFGVARS_FILELOADED
217    jnz     SHORT .PrintNameOfLoadedFile
218    test    ax, FLG_CFGVARS_ROMLOADED
219    mov     si, g_szEEPROM
220    jnz     SHORT .PrintNameOfLoadedFileOrEeprom
221    ; Fall to .PrintNothingLoaded
222
223.PrintNothingLoaded:
224    mov     si, g_szBiosIsNotLoaded
225    JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
226
227ALIGN JUMP_ALIGN
228.PrintNameOfLoadedFile:
229    mov     si, g_cfgVars+CFGVARS.szOpenedFile
230    ; Fall to .PrintNameOfLoadedFileOrEeprom
231
232ALIGN JUMP_ALIGN
233.PrintNameOfLoadedFileOrEeprom:
234    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
235    ; Fall to .PrintTypeOfLoadedBios
236
237.PrintTypeOfLoadedBios:
238    mov     si, g_szSourceAndTypeSeparator
239    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
240    call    Buffers_IsXtideUniversalBiosLoaded
241    jne     SHORT .PrintUnidentifiedType
242
243    call    Buffers_GetFileBufferToESDI
244    mov     bx, es
245    lea     si, [di+ROMVARS.szVersion]
246    JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromBXSI
247
248ALIGN JUMP_ALIGN
249.PrintUnidentifiedType:
250    mov     si, g_szUnidentified
251    JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
252
253ALIGN JUMP_ALIGN
254.PrintStatusOfUnsavedChanges:
255    test    WORD [g_cfgVars+CFGVARS.wFlags], FLG_CFGVARS_UNSAVED
256    jz      SHORT .ReturnSinceNothingToPrint
257    mov     si, g_szUnsaved
258    JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
Note: See TracBrowser for help on using the repository browser.