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

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

Changes to Assembly Library:

  • Progress Bar now displays properly.
File size: 8.8 KB
Line 
1; File name : DialogProgress.asm
2; Project name : Assembly Library
3; Created date : 15.8.2010
4; Last update : 10.12.2010
5; Author : Tomi Tilli
6; Description : Displays progress bar dialog and starts progress task.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; DialogProgress_GetStringWithIoInDSSI
13; Parameters:
14; DS:SI: Ptr to PROGRESS_DIALOG_IO
15; SS:BP: Ptr to parent MENU
16; Returns:
17; Nothing
18; Corrupts registers:
19; AX, BX, CX, DX, SI, DI
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22DialogProgress_StartProgressTaskWithIoInDSSIandParamInDXAX:
23 mov bx, ProgressEventHandler
24 jmp Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
25
26
27;--------------------------------------------------------------------
28; DialogProgress_SetProgressValueFromAX
29; Parameters
30; AX: Progress bar value to set
31; SS:BP: Ptr to DIALOG
32; Returns:
33; Nothing
34; Corrupts registers:
35; AX, BX, CX, DX, SI, DI
36;--------------------------------------------------------------------
37ALIGN JUMP_ALIGN
38DialogProgress_SetProgressValueFromAX:
39 push ds
40
41 lds si, [bp+DIALOG.fpDialogIO]
42 mov bx, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
43 MIN_U ax, bx
44 cmp ax, bx ; Make sure that last progress character is shown
45 je SHORT .UpdateProgressBar
46
47 mov bx, ax
48 sub bx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
49 cmp bx, [si+PROGRESS_DIALOG_IO.wProgressPerCharacter]
50 jb SHORT .ReturnWithoutUpdate
51.UpdateProgressBar:
52 mov [si+PROGRESS_DIALOG_IO.wCurrentProgressValue], ax
53 xor ax, ax
54 call MenuText_RefreshItemFromAX
55 call MenuText_RefreshInformation
56ALIGN JUMP_ALIGN
57.ReturnWithoutUpdate:
58 pop ds
59 ret
60
61
62;--------------------------------------------------------------------
63; ProgressEventHandler
64; Common parameters for all events:
65; BX: Menu event (anything from MENUEVENT struct)
66; SS:BP: Ptr to DIALOG
67; Common return values for all events:
68; CF: Set if event processed
69; Cleared if event not processed
70; Corrupts registers:
71; All
72;--------------------------------------------------------------------
73ALIGN JUMP_ALIGN
74ProgressEventHandler:
75 jmp [cs:bx+.rgfnEventHandlers]
76
77
78ALIGN JUMP_ALIGN
79.InitializeMenuinitFromDSSI:
80 mov ax, NO_ITEM_HIGHLIGHTED
81 call Dialog_EventInitializeMenuinitFromDSSIforSingleItemWithHighlightedItemInAX
82 lds si, [bp+DIALOG.fpDialogIO]
83 call TimerTicks_ReadFromBdaToAX
84 mov [si+PROGRESS_DIALOG_IO.wStartTimeTicks], ax
85 MAX_U WORD [si+PROGRESS_DIALOG_IO.wMaxProgressValue], 1 ; Max cannot be zero
86 jmp SHORT CalculateProgressNeededBeforeUpdatingCharacter
87
88
89ALIGN JUMP_ALIGN
90.IdleProcessing:
91 call MenuInit_GetUserDataToDSSI
92 les di, [bp+DIALOG.fpDialogIO]
93 push bp
94 call [es:di+PROGRESS_DIALOG_IO.fnTaskWithParamInDSSI]
95 pop bp
96 call MenuInit_CloseMenuWindow
97 stc
98 ret
99
100
101ALIGN JUMP_ALIGN
102.RefreshItemFromCX:
103 lds si, [bp+DIALOG.fpDialogIO]
104 call DrawProgressBarFromDialogIoInDSSI
105 stc
106 ret
107
108
109ALIGN JUMP_ALIGN
110.RefreshInformation:
111 lds si, [bp+DIALOG.fpDialogIO]
112 call TimerTicks_ReadFromBdaToAX
113 sub ax, [si+PROGRESS_DIALOG_IO.wStartTimeTicks]
114 xchg dx, ax
115 call DrawTimeElapsedFromDX
116 call DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
117 stc
118 ret
119
120
121ALIGN WORD_ALIGN
122.rgfnEventHandlers:
123istruc MENUEVENT
124 at MENUEVENT.InitializeMenuinitFromDSSI, dw .InitializeMenuinitFromDSSI
125 at MENUEVENT.ExitMenu, dw Dialog_EventExitMenu
126 at MENUEVENT.IdleProcessing, dw .IdleProcessing
127 at MENUEVENT.ItemHighlightedFromCX, dw Dialog_EventNotHandled
128 at MENUEVENT.ItemSelectedFromCX, dw Dialog_EventNotHandled
129 at MENUEVENT.KeyStrokeInAX, dw Dialog_EventNotHandled
130 at MENUEVENT.RefreshTitle, dw Dialog_EventRefreshTitle
131 at MENUEVENT.RefreshInformation, dw .RefreshInformation
132 at MENUEVENT.RefreshItemFromCX, dw .RefreshItemFromCX
133iend
134
135
136;--------------------------------------------------------------------
137; CalculateProgressNeededBeforeUpdatingCharacter
138; Parameters:
139; DS:SI: Ptr to PROGRESS_DIALOG_IO
140; SS:BP: Ptr to DIALOG
141; Returns:
142; CF: Set since event handled
143; Corrupts:
144; AX, BX, DX, SI, DS
145;--------------------------------------------------------------------
146ALIGN JUMP_ALIGN
147CalculateProgressNeededBeforeUpdatingCharacter:
148 call MenuLocation_GetMaxTextLineLengthToAX
149 call GetProgressLengthToBXfromProgressDialogIoInDSSI
150 xchg ax, bx
151 xor dx, dx
152 div bx
153 mov [si+PROGRESS_DIALOG_IO.wProgressPerCharacter], ax
154 stc
155 ret
156
157
158;--------------------------------------------------------------------
159; DrawProgressBarFromDialogIoInDSSI
160; Parameters:
161; DS:SI: Ptr to PROGRESS_DIALOG_IO
162; SS:BP: Ptr to DIALOG
163; Returns:
164; Nothing
165; Corrupts:
166; AX, BX, CX, DX, DI
167;--------------------------------------------------------------------
168ALIGN JUMP_ALIGN
169DrawProgressBarFromDialogIoInDSSI:
170 call .GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI
171
172 mov al, PROGRESS_COMPLETE_CHARACTER
173 call .RepeatProgressCharacterCXtimesFromAL
174
175 mov cx, dx
176 mov al, PROGRESS_INCOMPLETE_CHARACTER
177 jmp SHORT .RepeatProgressCharacterCXtimesFromAL
178
179;--------------------------------------------------------------------
180; .GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI
181; Parameters:
182; DS:SI: Ptr to PROGRESS_DIALOG_IO
183; SS:BP: Ptr to DIALOG
184; Returns:
185; CX: Number of full progress bar characters
186; DX: Number of empty progress bar characters
187; Corrupts:
188; AX, BX
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191.GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI:
192 call MenuLocation_GetMaxTextLineLengthToAX
193 mov cx, ax
194 mul WORD [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
195 call GetProgressLengthToBXfromProgressDialogIoInDSSI
196 div bx
197 xchg cx, ax ; AX = Text line length, CX = Number of full chars
198
199 sub ax, cx
200 xchg dx, ax ; DX = Number of empty chars
201 ret
202
203;--------------------------------------------------------------------
204; .RepeatProgressCharacterCXtimesFromAL
205; Parameters:
206; AL: Progress bar character to repeat
207; CX: Number of times to repeat the progress character
208; Returns:
209; Nothing
210; Corrupts:
211; AX, CX, DI
212;--------------------------------------------------------------------
213ALIGN JUMP_ALIGN
214.RepeatProgressCharacterCXtimesFromAL:
215 jcxz .NothingToRepeat
216 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
217ALIGN JUMP_ALIGN, ret
218.NothingToRepeat:
219 ret
220
221
222;--------------------------------------------------------------------
223; GetProgressLengthToBXfromProgressDialogIoInDSSI
224; Parameters:
225; DS:SI: Ptr to PROGRESS_DIALOG_IO
226; Returns:
227; BX: Progress length
228; Corrupts:
229; Nothing
230;--------------------------------------------------------------------
231ALIGN JUMP_ALIGN
232GetProgressLengthToBXfromProgressDialogIoInDSSI:
233 mov bx, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
234 sub bx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
235 ret
236
237
238;--------------------------------------------------------------------
239; DrawTimeElapsedFromDX
240; Parameters:
241; DX: Ticks elapsed
242; Returns:
243; Nothing
244; Corrupts:
245; AX, BX, CX, DI
246;--------------------------------------------------------------------
247ALIGN JUMP_ALIGN
248DrawTimeElapsedFromDX:
249 push si
250 push dx
251
252 mov si, g_szTimeElapsed
253 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
254 call FormatTicksFromDX
255
256 pop dx
257 pop si
258 ret
259
260
261;--------------------------------------------------------------------
262; DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
263; Parameters:
264; DX: Ticks elapsed
265; DS:SI: Ptr to PROGRESS_DIALOG_IO
266; Returns:
267; Nothing
268; Corrupts:
269; AX, BX, CX, DX, SI, DI
270;--------------------------------------------------------------------
271ALIGN JUMP_ALIGN
272DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX:
273 push si
274 mov si, g_szTimeLeft
275 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
276 pop si
277
278 mov cx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
279 mov ax, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
280 sub ax, cx
281 mul dx ; Progress left * elapsed time
282
283 sub cx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
284 jcxz .PreventDivisionByZero
285 div cx ; AX = Estimated ticks left
286 xchg dx, ax
287 jmp SHORT FormatTicksFromDX
288.PreventDivisionByZero:
289 xor dx, dx
290 ; Fall to FormatTicksFromDX
291
292
293;--------------------------------------------------------------------
294; FormatTicksFromDX
295; Parameters:
296; DX: Ticks to format
297; Returns:
298; Nothing
299; Corrupts:
300; AX, CX, DX, SI, DI
301;--------------------------------------------------------------------
302ALIGN JUMP_ALIGN
303FormatTicksFromDX:
304 push bp
305
306 mov bp, sp
307 mov si, g_szTimeFormat
308 call TimerTicks_GetMinutesToAXfromTicksInDX
309 push ax
310 call TimerTicks_GetSecondsToAXfromTicksInDX
311 push ax
312 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
313
314 pop bp
315 ret
Note: See TracBrowser for help on using the repository browser.