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

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

Changes to Assembly Library:
Added functions to clear Menu Title and Information areas.
Implemented automatic line change when writing Menu Title and Information areas.
CGA snow related functions have been moved to CgaSnow.asm.
Keyboard input functions no longer produce beep for backspace.

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   :   7.10.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
31    call    Memory_ZeroSSBPwithSizeInCX
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    push    si
294    call    MenuBorders_AdjustDisplayContextForDrawingBorders
295    pop     si
296    mov     al, SCREEN_BACKGROUND_ATTRIBUTE
297    CALL_DISPLAY_LIBRARY SetCharacterAttributeFromAL
298    mov     ax, [bp+MENUINIT.wWidthAndHeight]
299    CALL_DISPLAY_LIBRARY ClearAreaWithHeightInAHandWidthInAL
300    ; Fall to .RedrawWholeParentWindow
301
302ALIGN JUMP_ALIGN
303.RedrawWholeParentWindow:
304    push    bp
305    mov     bp, si
306    call    MenuInit_RefreshMenuWindow
307    pop     bp
308    ret
Note: See TracBrowser for help on using the repository browser.