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

Last change on this file since 41 was 41, checked in by aitotat, 14 years ago

Initial commit for Assembly Library.

File size: 8.7 KB
Line 
1; File name     :   Dialog.asm
2; Project name  :   Assembly Library
3; Created date  :   6.8.2010
4; Last update   :   16.9.2010
5; Author        :   Tomi Tilli
6; Description   :   Common functions for many dialogs.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
13;   Parameters:
14;       BX:     Offset to menu event handler
15;       DX:AX:  Optional user data
16;       DS:SI:  Ptr to DIALOG_INPUT
17;       SS:BP:  Ptr to parent MENU
18;   Returns:
19;       AX:     Selected item
20;   Corrupts registers:
21;       BX, CX, DX, SI, DI
22;--------------------------------------------------------------------
23ALIGN JUMP_ALIGN
24Dialog_DisplayWithDialogInputInDSSIandHandlerInBX:
25    push    es
26    push    ds
27    mov     di, bp                              ; Backup parent MENU
28    eENTER_STRUCT DIALOG_size
29
30    mov     cx, DIALOG_size / 2
31    call    Memory_ZeroSSBPbyWordsInCX
32    mov     [bp+DIALOG.fpDialogIO], si
33    mov     [bp+DIALOG.fpDialogIO+2], ds
34    mov     [bp+DIALOG.pParentMenu], di
35
36    call    MenuInit_EnterMenuWithHandlerInBXandUserDataInDXAX
37    call    Dialog_RemoveFromScreenByRedrawingParentMenu
38    call    Keyboard_RemoveAllKeystrokesFromBuffer
39
40    mov     ax, [bp+MENU.wHighlightedItem]
41    eLEAVE_STRUCT DIALOG_size
42    pop     ds
43    pop     es
44    ret
45
46
47;--------------------------------------------------------------------
48; Dialog_EventNotHandled
49;   Parameters:
50;       BX:     Menu event (anything from MENUEVENT struct)
51;       SS:BP:  Ptr to DIALOG
52;   Returns:
53;       CF:     Cleared since event not processed
54;   Corrupts registers:
55;       Nothing
56;--------------------------------------------------------------------
57ALIGN JUMP_ALIGN
58Dialog_EventNotHandled:
59    clc
60    ret
61
62
63;--------------------------------------------------------------------
64; Dialog_EventAnyThatClosesDialog
65;   Parameters:
66;       SS:BP:  Ptr to DIALOG
67;   Returns:
68;       CF:     Set since event processed
69;   Corrupts registers:
70;       Nothing
71;--------------------------------------------------------------------
72ALIGN JUMP_ALIGN
73Dialog_EventAnyThatClosesDialog:
74    call    MenuInit_CloseMenuWindow
75    stc
76    ret
77
78
79;--------------------------------------------------------------------
80; Dialog_EventInitializeMenuinitFromDSSIforSingleItem
81;   Parameters:
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_EventInitializeMenuinitFromDSSIforSingleItem:
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_EventInitializeMenuinitFromDSSI
94
95;--------------------------------------------------------------------
96; Dialog_EventInitializeMenuinitFromDSSI
97;   Parameters:
98;       DS:SI:      Ptr to MENUINIT struct to initialize
99;       SS:BP:      Ptr to DIALOG
100;   Returns:
101;       DS:SI:      Ptr to initialized MENUINIT struct
102;       CF:         Set since event processed
103;--------------------------------------------------------------------
104ALIGN JUMP_ALIGN
105Dialog_EventInitializeMenuinitFromDSSI:
106    les     di, [bp+DIALOG.fpDialogIO]
107    call    .GetWidthBasedOnParentMenuToAL
108    mov     [bp+MENUINIT.bWidth], al
109
110    call    MenuLocation_GetMaxTextLineLengthToAX
111    mov     bx, ax
112    lds     si, [es:di+DIALOG_INPUT.fszTitle]
113    call    LineSplitter_SplitStringFromDSSIwithMaxLineLengthInAXandGetLineCountToAX
114    mov     [bp+MENUINIT.bTitleLines], al
115
116    mov     ax, bx
117    lds     si, [es:di+DIALOG_INPUT.fszItems]
118    call    LineSplitter_SplitStringFromDSSIwithMaxLineLengthInAXandGetLineCountToAX
119    mov     [bp+MENUINIT.wItems], ax
120
121    xchg    ax, bx
122    lds     si, [es:di+DIALOG_INPUT.fszInfo]
123    call    LineSplitter_SplitStringFromDSSIwithMaxLineLengthInAXandGetLineCountToAX
124    mov     [bp+MENUINIT.bInfoLines], al
125
126    call    .GetHeightToAH              ; Line counts are required
127    mov     [bp+MENUINIT.bHeight], ah
128    stc
129    ret
130
131;--------------------------------------------------------------------
132; .GetWidthBasedOnParentMenuToAL
133;   Parameters:
134;       SS:BP:  Ptr to DIALOG
135;   Returns:
136;       AX:     Width for dialog
137;   Corrupts registers:
138;       BX
139;--------------------------------------------------------------------
140ALIGN JUMP_ALIGN
141.GetWidthBasedOnParentMenuToAL:
142    mov     bx, [bp+DIALOG.pParentMenu]
143    mov     al, [ss:bx+MENUINIT.bWidth]
144    sub     al, DIALOG_DELTA_WIDTH_FROM_PARENT
145    MIN_U   al, DIALOG_MAX_WIDTH
146    ret
147
148;--------------------------------------------------------------------
149; .GetHeightToAH
150;   Parameters:
151;       SS:BP:  Ptr to DIALOG
152;   Returns:
153;       AH:     Height for dialog
154;   Corrupts registers:
155;       AL, BX, DI
156;--------------------------------------------------------------------
157ALIGN JUMP_ALIGN
158.GetHeightToAH:
159    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
160    xchg    bx, ax
161    mov     ah, [bp+MENUINIT.bTitleLines]
162    add     ah, [bp+MENUINIT.wItems]
163    add     ah, [bp+MENUINIT.bInfoLines]
164    add     ah, BYTE MENU_VERTICAL_BORDER_LINES
165    MIN_U   ah, bh
166    MIN_U   ah, DIALOG_MAX_HEIGHT
167    ret
168
169
170;--------------------------------------------------------------------
171; Dialog_EventRefreshTitle
172; Dialog_EventRefreshInformation
173;   Parameters:
174;       SS:BP:      Ptr to DIALOG
175;   Returns:
176;       CF:         Set since event processed
177;--------------------------------------------------------------------
178ALIGN JUMP_ALIGN
179Dialog_EventRefreshTitle:
180    mov     dl, [bp+MENUINIT.bTitleLines]
181    lds     si, [bp+DIALOG.fpDialogIO]
182    les     di, [si+DIALOG_INPUT.fszTitle]
183    jmp     SHORT PrintDLlinesFromESDI
184
185ALIGN JUMP_ALIGN
186Dialog_EventRefreshInformation:
187    mov     dl, [bp+MENUINIT.bInfoLines]
188    lds     si, [bp+DIALOG.fpDialogIO]
189    les     di, [si+DIALOG_INPUT.fszInfo]
190    ; Fall to PrintDLlinesFromESDI
191
192ALIGN JUMP_ALIGN
193PrintDLlinesFromESDI:
194    xor     cx, cx              ; Start from line zero
195    mov     dh, cl              ; Line count now in DX
196ALIGN JUMP_ALIGN
197.PrintNextLine:
198    call    LineSplitter_PrintLineInCXfromStringInESDI
199    push    di
200    CALL_DISPLAY_LIBRARY PrintNewlineCharacters
201    pop     di
202    inc     cx
203    dec     dx
204    jnz     SHORT .PrintNextLine
205    stc
206    ret
207
208
209;--------------------------------------------------------------------
210; Dialog_EventRefreshItemFromCX
211;   Parameters:
212;       CX:         Item to refresh
213;       SS:BP:      Ptr to DIALOG
214;   Returns:
215;       CF:         Set since event processed
216;--------------------------------------------------------------------
217ALIGN JUMP_ALIGN
218Dialog_EventRefreshItemFromCX:
219    lds     si, [bp+DIALOG.fpDialogIO]
220    les     di, [si+DIALOG_INPUT.fszItems]
221    call    LineSplitter_PrintLineInCXfromStringInESDI
222    stc
223    ret
224
225
226;--------------------------------------------------------------------
227; Dialog_RemoveFromScreenByRedrawingParentMenu
228;   Parameters:
229;       SS:BP:  Ptr to DIALOG
230;   Returns:
231;       Nothing
232;   Corrupts:
233;       AX, BX, CX, DX, SI, DI
234;--------------------------------------------------------------------
235ALIGN JUMP_ALIGN
236Dialog_RemoveFromScreenByRedrawingParentMenu:
237    mov     si, [bp+DIALOG.pParentMenu] ; SS:SI points to parent MENU
238    call    .ResetSelectionTimeoutFromParentMenuInSSSI
239    call    .GetParentTitleBorderCoordinatesToDX
240    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
241    cmp     ah, dh      ; Dialog taller than parent?
242    jb      SHORT .RedrawDialogAreaAndWholeParentWindow
243    jmp     SHORT .RedrawWholeParentWindow
244
245;--------------------------------------------------------------------
246; .ResetSelectionTimeoutFromParentMenuInSSSI
247;   Parameters:
248;       SS:SI:  Ptr to parent MENU
249;   Returns:
250;       Nothing
251;   Corrupts:
252;       AX, BX
253;--------------------------------------------------------------------
254ALIGN JUMP_ALIGN
255.ResetSelectionTimeoutFromParentMenuInSSSI:
256    xchg    bp, si
257    call    MenuTime_RestartSelectionTimeout    ; Restart timeout for parent MENU
258    xchg    si, bp
259    ret
260
261;--------------------------------------------------------------------
262; .GetParentTitleBorderCoordinatesToDX
263;   Parameters:
264;       SS:SI:  Ptr to parent MENU
265;       SS:BP:  Ptr to DIALOG
266;   Returns:
267;       DL:     Parent border column (X)
268;       DH:     Parent border row (Y)
269;   Corrupts:
270;       AX
271;--------------------------------------------------------------------
272ALIGN JUMP_ALIGN
273.GetParentTitleBorderCoordinatesToDX:
274    xchg    si, bp
275    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
276    xchg    bp, si
277    xchg    dx, ax
278    ret
279
280;--------------------------------------------------------------------
281; .RedrawDialogAreaAndWholeParentWindow
282; .RedrawWholeParentWindow
283;   Parameters:
284;       SS:SI:  Ptr to parent MENU
285;       SS:BP:  Ptr to DIALOG
286;   Returns:
287;       Nothing
288;   Corrupts:
289;       AX, BX, CX, DX, SI, DI
290;--------------------------------------------------------------------
291ALIGN JUMP_ALIGN
292.RedrawDialogAreaAndWholeParentWindow:
293    mov     al, MONO_NORMAL
294    CALL_DISPLAY_LIBRARY SetCharacterAttributeFromAL
295    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
296    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
297    mov     ax, [bp+MENUINIT.wWidthAndHeight]
298    CALL_DISPLAY_LIBRARY ClearAreaWithHeightInAHandWidthInAL
299    ; Fall to .RedrawWholeParentWindow
300
301ALIGN JUMP_ALIGN
302.RedrawWholeParentWindow:
303    push    bp
304    mov     bp, si
305    call    MenuInit_RefreshMenuWindow
306    pop     bp
307    ret
Note: See TracBrowser for help on using the repository browser.