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

Last change on this file since 624 was 593, checked in by Tomi Tilli, 6 years ago

Flashing now works again.
Hack to get Windows 95 to work properly (MODULE_WIN95_CMOS_HACK included for 386 builds by default).
Edited makefile to produce large 386 build.
Fixed recovery time for QDI Vision VLB-IDE controllers.
No more warnings with Nasm 2.13.xx and later.
File dialog now properly restores default drive when file selection is cancelled.

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