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

Last change on this file since 45 was 44, checked in by Tomi Tilli, 14 years ago

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

File size: 8.8 KB
Line 
1; File name : Dialog.asm
2; Project name : Assembly Library
3; Created date : 6.8.2010
4; Last update : 27.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, SCREEN_BACKGROUND_ATTRIBUTE
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.