source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/Dialog/Dialog.asm @ 162

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

Changes to all parts of the project:

  • Size optimizations, mostly by excluding code from the BIOS.
  • Cleaned the source a bit, fixed spelling and grammar mistakes.
File size: 8.1 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Common functions for many dialogs.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
9;   Parameters:
10;       BX:     Offset to menu event handler
11;       DX:AX:  Optional user data
12;       DS:SI:  Ptr to DIALOG_INPUT
13;       SS:BP:  Ptr to parent MENU
14;   Returns:
15;       AX:     Selected item
16;   Corrupts registers:
17;       BX, CX, DX, SI, DI
18;--------------------------------------------------------------------
19ALIGN JUMP_ALIGN
20Dialog_DisplayWithDialogInputInDSSIandHandlerInBX:
21    push    es
22    push    ds
23    mov     di, bp                              ; Backup parent MENU
24    mov     cx, DIALOG_size
25    eENTER_STRUCT cx
26
27    call    Memory_ZeroSSBPwithSizeInCX
28    mov     [bp+DIALOG.fpDialogIO], si
29    mov     [bp+DIALOG.fpDialogIO+2], ds
30    mov     [bp+DIALOG.pParentMenu], di
31
32    call    MenuInit_EnterMenuWithHandlerInBXandUserDataInDXAX
33    call    Dialog_RemoveFromScreenByRedrawingParentMenu
34    call    Keyboard_RemoveAllKeystrokesFromBuffer
35
36    mov     ax, [bp+MENUINIT.wHighlightedItem]
37    eLEAVE_STRUCT DIALOG_size
38    pop     ds
39    pop     es
40    ret
41
42
43;--------------------------------------------------------------------
44; Dialog_EventNotHandled
45;   Parameters:
46;       BX:     Menu event (anything from MENUEVENT struct)
47;       SS:BP:  Ptr to DIALOG
48;   Returns:
49;       CF:     Cleared since event not processed
50;   Corrupts registers:
51;       Nothing
52;--------------------------------------------------------------------
53ALIGN JUMP_ALIGN
54Dialog_EventNotHandled:
55    clc
56    ret
57
58
59;--------------------------------------------------------------------
60; Dialog_EventAnyThatClosesDialog
61; Dialog_EventExitMenu
62;   Parameters:
63;       SS:BP:  Ptr to DIALOG
64;   Returns:
65;       CF:     Set since event processed
66;   Corrupts registers:
67;       Nothing
68;--------------------------------------------------------------------
69ALIGN JUMP_ALIGN
70Dialog_EventAnyThatClosesDialog:
71    call    MenuInit_CloseMenuWindow
72ALIGN JUMP_ALIGN
73Dialog_EventExitMenu:
74    stc
75    ret
76
77
78;--------------------------------------------------------------------
79; Dialog_EventInitializeMenuinitFromDSSIforSingleItemWithHighlightedItemInAX
80;   Parameters:
81;       AX:         Index of highlighted item
82;       DS:SI:      Ptr to MENUINIT struct to initialize
83;       SS:BP:      Ptr to DIALOG
84;   Returns:
85;       DS:SI:      Ptr to initialized MENUINIT struct
86;       CF:         Set since event processed
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89Dialog_EventInitializeMenuinitFromDSSIforSingleItemWithHighlightedItemInAX:
90    les     di, [bp+DIALOG.fpDialogIO]
91    mov     WORD [es:di+DIALOG_INPUT.fszItems], g_szSingleItem
92    mov     [es:di+DIALOG_INPUT.fszItems+2], cs
93    ; Fall to Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
94
95;--------------------------------------------------------------------
96; Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
97;   Parameters:
98;       AX:         Index of highlighted item
99;       DS:SI:      Ptr to MENUINIT struct to initialize
100;       SS:BP:      Ptr to DIALOG
101;   Returns:
102;       DS:SI:      Ptr to initialized MENUINIT struct
103;       CF:         Set since event processed
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX:
107    mov     [bp+MENUINIT.wHighlightedItem], ax
108    les     di, [bp+DIALOG.fpDialogIO]
109    call    .GetWidthBasedOnParentMenuToAL
110    mov     [bp+MENUINIT.bWidth], al
111
112    lds     si, [es:di+DIALOG_INPUT.fszTitle]
113    call    ItemLineSplitter_GetLinesToAXforStringInDSSI
114    mov     [bp+MENUINIT.bTitleLines], al
115
116    lds     si, [es:di+DIALOG_INPUT.fszItems]
117    call    ItemLineSplitter_GetLinesToAXforStringInDSSI
118    mov     [bp+MENUINIT.wItems], ax
119
120    lds     si, [es:di+DIALOG_INPUT.fszInfo]
121    call    ItemLineSplitter_GetLinesToAXforStringInDSSI
122    mov     [bp+MENUINIT.bInfoLines], al
123
124    call    .GetHeightToAH              ; Line counts are required
125    mov     [bp+MENUINIT.bHeight], ah
126    stc
127    ret
128
129;--------------------------------------------------------------------
130; .GetWidthBasedOnParentMenuToAL
131;   Parameters:
132;       SS:BP:  Ptr to DIALOG
133;   Returns:
134;       AX:     Width for dialog
135;   Corrupts registers:
136;       BX
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139.GetWidthBasedOnParentMenuToAL:
140    mov     bx, [bp+DIALOG.pParentMenu]
141    mov     al, [ss:bx+MENUINIT.bWidth]
142    sub     al, DIALOG_DELTA_WIDTH_FROM_PARENT
143    MIN_U   al, DIALOG_MAX_WIDTH
144    ret
145
146;--------------------------------------------------------------------
147; .GetHeightToAH
148;   Parameters:
149;       SS:BP:  Ptr to DIALOG
150;   Returns:
151;       AH:     Height for dialog
152;   Corrupts registers:
153;       AL, BX, DI
154;--------------------------------------------------------------------
155ALIGN JUMP_ALIGN
156.GetHeightToAH:
157    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
158    xchg    bx, ax
159    mov     ah, [bp+MENUINIT.bTitleLines]
160    add     ah, [bp+MENUINIT.wItems]
161    add     ah, [bp+MENUINIT.bInfoLines]
162    add     ah, BYTE MENU_VERTICAL_BORDER_LINES
163    MIN_U   ah, bh
164    MIN_U   ah, DIALOG_MAX_HEIGHT
165    ret
166
167
168;--------------------------------------------------------------------
169; Dialog_EventRefreshTitle
170; Dialog_EventRefreshInformation
171;   Parameters:
172;       SS:BP:      Ptr to DIALOG
173;   Returns:
174;       CF:         Set since event processed
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177Dialog_EventRefreshTitle:
178    lds     si, [bp+DIALOG.fpDialogIO]
179    lds     si, [si+DIALOG_INPUT.fszTitle]
180    jmp     SHORT PrintTitleOrInfoLine
181
182ALIGN JUMP_ALIGN
183Dialog_EventRefreshInformation:
184    lds     si, [bp+DIALOG.fpDialogIO]
185    lds     si, [si+DIALOG_INPUT.fszInfo]
186    ; Fall to PrintTitleOrInfoLine
187
188ALIGN JUMP_ALIGN
189PrintTitleOrInfoLine:
190    mov     bx, ds
191    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromBXSI
192    stc
193    ret
194
195
196;--------------------------------------------------------------------
197; Dialog_EventRefreshItemFromCX
198;   Parameters:
199;       CX:         Item to refresh
200;       SS:BP:      Ptr to DIALOG
201;   Returns:
202;       CF:         Set since event processed
203;--------------------------------------------------------------------
204ALIGN JUMP_ALIGN
205Dialog_EventRefreshItemFromCX:
206    lds     si, [bp+DIALOG.fpDialogIO]
207    lds     si, [si+DIALOG_INPUT.fszItems]
208    call    ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
209    jnc     SHORT .LineNotFound
210
211    mov     bx, ds
212    CALL_DISPLAY_LIBRARY PrintCharBufferFromBXSIwithLengthInCX
213.LineNotFound:
214    stc
215    ret
216
217
218;--------------------------------------------------------------------
219; Dialog_RemoveFromScreenByRedrawingParentMenu
220;   Parameters:
221;       SS:BP:  Ptr to DIALOG
222;   Returns:
223;       Nothing
224;   Corrupts:
225;       AX, BX, CX, DX, SI, DI
226;--------------------------------------------------------------------
227ALIGN JUMP_ALIGN
228Dialog_RemoveFromScreenByRedrawingParentMenu:
229    mov     si, [bp+DIALOG.pParentMenu] ; SS:SI points to parent MENU
230    call    .GetParentTitleBorderCoordinatesToDX
231    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
232    cmp     ah, dh      ; Dialog taller than parent?
233    jnb     SHORT .RedrawWholeParentWindow
234    ; Fall to .RedrawDialogAreaAndWholeParentWindow
235
236;--------------------------------------------------------------------
237; .RedrawDialogAreaAndWholeParentWindow
238; .RedrawWholeParentWindow
239;   Parameters:
240;       SS:SI:  Ptr to parent MENU
241;       SS:BP:  Ptr to DIALOG
242;   Returns:
243;       Nothing
244;   Corrupts:
245;       AX, BX, CX, DX, SI, DI
246;--------------------------------------------------------------------
247.RedrawDialogAreaAndWholeParentWindow:
248    push    si
249    call    MenuBorders_AdjustDisplayContextForDrawingBorders
250    pop     si
251    mov     al, SCREEN_BACKGROUND_ATTRIBUTE
252    CALL_DISPLAY_LIBRARY SetCharacterAttributeFromAL
253    mov     ax, [bp+MENUINIT.wWidthAndHeight]
254    CALL_DISPLAY_LIBRARY ClearAreaWithHeightInAHandWidthInAL
255    ; Fall to .RedrawWholeParentWindow
256
257ALIGN JUMP_ALIGN
258.RedrawWholeParentWindow:
259    push    bp
260    mov     bp, si
261    call    MenuInit_RefreshMenuWindow
262    pop     bp
263    ret
264
265;--------------------------------------------------------------------
266; .GetParentTitleBorderCoordinatesToDX
267;   Parameters:
268;       SS:SI:  Ptr to parent MENU
269;       SS:BP:  Ptr to DIALOG
270;   Returns:
271;       DL:     Parent border column (X)
272;       DH:     Parent border row (Y)
273;   Corrupts:
274;       AX
275;--------------------------------------------------------------------
276ALIGN JUMP_ALIGN
277.GetParentTitleBorderCoordinatesToDX:
278    xchg    si, bp
279    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
280    xchg    bp, si
281    xchg    dx, ax
282    ret
Note: See TracBrowser for help on using the repository browser.