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

Last change on this file since 64 was 64, checked in by aitotat, 12 years ago

Changes to Assembly Library:

  • Progress dialog now prevents max progress value from being zero.
File size: 8.4 KB
Line 
1; File name     :   DialogProgress.asm
2; Project name  :   Assembly Library
3; Created date  :   15.8.2010
4; Last update   :   5.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], 0FFFFh  ; 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    jcxz    .DrawEmptyCharsOnly
172
173    mov     al, PROGRESS_COMPLETE_CHARACTER
174    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
175
176.DrawEmptyCharsOnly:
177    mov     cx, dx
178    jcxz    .NothingLeftToDraw
179    mov     al, PROGRESS_INCOMPLETE_CHARACTER
180    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
181
182.NothingLeftToDraw:
183    ret
184
185;--------------------------------------------------------------------
186; .GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI
187;   Parameters:
188;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
189;       SS:BP:  Ptr to DIALOG
190;   Returns:
191;       CX:     Number of full progress bar characters
192;       DX:     Number of empty progress bar characters
193;   Corrupts:
194;       AX, BX
195;--------------------------------------------------------------------
196ALIGN JUMP_ALIGN
197.GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI:
198    call    MenuLocation_GetMaxTextLineLengthToAX
199    mov     cx, ax
200    mul     WORD [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
201    call    GetProgressLengthToBXfromProgressDialogIoInDSSI
202    div     bx
203    xchg    cx, ax      ; AX = Text line length, CX = Number of full chars
204
205    sub     ax, cx
206    xchg    dx, ax      ; DX = Number of empty chars
207    ret
208
209
210;--------------------------------------------------------------------
211; GetProgressLengthToBXfromProgressDialogIoInDSSI
212;   Parameters:
213;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
214;   Returns:
215;       BX:     Progress length
216;   Corrupts:
217;       Nothing
218;--------------------------------------------------------------------
219ALIGN JUMP_ALIGN
220GetProgressLengthToBXfromProgressDialogIoInDSSI:
221    mov     bx, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
222    sub     bx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
223    ret
224
225   
226;--------------------------------------------------------------------
227; DrawTimeElapsedFromDX
228;   Parameters:
229;       DX:     Ticks elapsed
230;   Returns:
231;       Nothing
232;   Corrupts:
233;       AX, BX, CX, DI
234;--------------------------------------------------------------------
235ALIGN JUMP_ALIGN
236DrawTimeElapsedFromDX:
237    push    si
238    push    dx
239
240    mov     si, g_szTimeElapsed
241    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
242    call    FormatTicksFromDX
243
244    pop     dx
245    pop     si
246    ret
247
248
249;--------------------------------------------------------------------
250; DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
251;   Parameters:
252;       DX:     Ticks elapsed
253;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
254;   Returns:
255;       Nothing
256;   Corrupts:
257;       AX, BX, CX, DX, SI, DI
258;--------------------------------------------------------------------
259ALIGN JUMP_ALIGN
260DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX:
261    push    si
262    mov     si, g_szTimeLeft
263    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
264    pop     si
265
266    mov     cx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
267    mov     ax, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
268    sub     ax, cx
269    mul     dx          ; Progress left * elapsed time
270
271    sub     cx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
272    jcxz    .PreventDivisionByZero
273    div     cx          ; AX = Estimated ticks left
274    xchg    dx, ax
275    jmp     SHORT FormatTicksFromDX
276.PreventDivisionByZero:
277    xor     dx, dx
278    ; Fall to FormatTicksFromDX
279
280
281;--------------------------------------------------------------------
282; FormatTicksFromDX
283;   Parameters:
284;       DX:     Ticks to format
285;   Returns:
286;       Nothing
287;   Corrupts:
288;       AX, CX, DX, SI, DI
289;--------------------------------------------------------------------
290ALIGN JUMP_ALIGN
291FormatTicksFromDX:
292    push    bp
293
294    mov     bp, sp
295    mov     si, g_szTimeFormat
296    call    TimerTicks_GetMinutesToAXfromTicksInDX
297    push    ax
298    call    TimerTicks_GetSecondsToAXfromTicksInDX
299    push    ax
300    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
301
302    pop     bp
303    ret
Note: See TracBrowser for help on using the repository browser.