source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/Dialog/DialogProgress.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.2 KB
Line 
1; File name     :   DialogProgress.asm
2; Project name  :   Assembly Library
3; Created date  :   15.8.2010
4; Last update   :   28.9.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    call    Dialog_EventInitializeMenuinitFromDSSIforSingleItem
81    lds     si, [bp+DIALOG.fpDialogIO]
82    call    TimerTicks_ReadFromBdaToAX
83    mov     [si+PROGRESS_DIALOG_IO.wStartTimeTicks], ax
84    jmp     SHORT CalculateProgressNeededBeforeUpdatingCharacter
85
86
87ALIGN JUMP_ALIGN
88.IdleProcessing:
89    call    MenuInit_GetUserDataToDSSI
90    les     di, [bp+DIALOG.fpDialogIO]
91    call    [es:di+PROGRESS_DIALOG_IO.fnTaskWithParamInDSSI]
92    call    MenuInit_CloseMenuWindow
93    stc
94    ret
95
96
97ALIGN JUMP_ALIGN
98.RefreshItemFromCX:
99    lds     si, [bp+DIALOG.fpDialogIO]
100    call    DrawProgressBarFromDialogIoInDSSI
101    stc
102    ret
103
104
105ALIGN JUMP_ALIGN
106.RefreshInformation:
107    lds     si, [bp+DIALOG.fpDialogIO]
108    call    TimerTicks_ReadFromBdaToAX
109    sub     ax, [si+PROGRESS_DIALOG_IO.wStartTimeTicks]
110    xchg    dx, ax
111    call    DrawTimeElapsedFromDX
112    call    DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
113    stc
114    ret
115
116
117ALIGN WORD_ALIGN
118.rgfnEventHandlers:
119istruc MENUEVENT
120    at  MENUEVENT.InitializeMenuinitFromDSSI,   dw  .InitializeMenuinitFromDSSI
121    at  MENUEVENT.ExitMenu,                     dw  Dialog_EventNotHandled
122    at  MENUEVENT.IdleProcessing,               dw  .IdleProcessing
123    at  MENUEVENT.ItemHighlightedFromCX,        dw  Dialog_EventNotHandled
124    at  MENUEVENT.ItemSelectedFromCX,           dw  Dialog_EventNotHandled
125    at  MENUEVENT.KeyStrokeInAX,                dw  Dialog_EventNotHandled
126    at  MENUEVENT.RefreshTitle,                 dw  Dialog_EventRefreshTitle
127    at  MENUEVENT.RefreshInformation,           dw  .RefreshInformation
128    at  MENUEVENT.RefreshItemFromCX,            dw  .RefreshItemFromCX
129iend
130
131
132;--------------------------------------------------------------------
133; CalculateProgressNeededBeforeUpdatingCharacter
134;   Parameters:
135;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
136;       SS:BP:  Ptr to DIALOG
137;   Returns:
138;       CF:     Set since event handled
139;   Corrupts:
140;       AX, BX, DX, SI, DS
141;--------------------------------------------------------------------
142ALIGN JUMP_ALIGN
143CalculateProgressNeededBeforeUpdatingCharacter:
144    call    MenuLocation_GetMaxTextLineLengthToAX
145    call    GetProgressLengthToBXfromProgressDialogIoInDSSI
146    xchg    ax, bx
147    xor     dx, dx
148    div     bx
149    mov     [si+PROGRESS_DIALOG_IO.wProgressPerCharacter], ax
150    stc
151    ret
152
153
154;--------------------------------------------------------------------
155; DrawProgressBarFromDialogIoInDSSI
156;   Parameters:
157;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
158;       SS:BP:  Ptr to DIALOG
159;   Returns:
160;       Nothing
161;   Corrupts:
162;       AX, BX, CX, DX, DI
163;--------------------------------------------------------------------
164ALIGN JUMP_ALIGN
165DrawProgressBarFromDialogIoInDSSI:
166    call    .GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI
167    jcxz    .DrawEmptyCharsOnly
168
169    mov     al, PROGRESS_COMPLETE_CHARACTER
170    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
171
172.DrawEmptyCharsOnly:
173    mov     cx, dx
174    jcxz    .NothingLeftToDraw
175    mov     al, PROGRESS_INCOMPLETE_CHARACTER
176    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
177
178.NothingLeftToDraw:
179    ret
180
181;--------------------------------------------------------------------
182; .GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI
183;   Parameters:
184;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
185;       SS:BP:  Ptr to DIALOG
186;   Returns:
187;       CX:     Number of full progress bar characters
188;       DX:     Number of empty progress bar characters
189;   Corrupts:
190;       AX, BX
191;--------------------------------------------------------------------
192ALIGN JUMP_ALIGN
193.GetFullCharsToCXandEmptyCharsToDXwithDialogIoInDSSI:
194    call    MenuLocation_GetMaxTextLineLengthToAX
195    mov     cx, ax
196    mul     WORD [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
197    call    GetProgressLengthToBXfromProgressDialogIoInDSSI
198    div     bx
199    xchg    cx, ax      ; AX = Text line length, CX = Number of full chars
200
201    sub     ax, cx
202    xchg    dx, ax      ; DX = Number of empty chars
203    ret
204
205
206;--------------------------------------------------------------------
207; GetProgressLengthToBXfromProgressDialogIoInDSSI
208;   Parameters:
209;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
210;   Returns:
211;       BX:     Progress length
212;   Corrupts:
213;       Nothing
214;--------------------------------------------------------------------
215ALIGN JUMP_ALIGN
216GetProgressLengthToBXfromProgressDialogIoInDSSI:
217    mov     bx, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
218    sub     bx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
219    ret
220
221   
222;--------------------------------------------------------------------
223; DrawTimeElapsedFromDX
224;   Parameters:
225;       DX:     Ticks elapsed
226;   Returns:
227;       Nothing
228;   Corrupts:
229;       AX, BX, CX, DI
230;--------------------------------------------------------------------
231ALIGN JUMP_ALIGN
232DrawTimeElapsedFromDX:
233    push    si
234    push    dx
235
236    mov     si, g_szTimeElapsed
237    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
238    call    FormatTicksFromDX
239
240    pop     dx
241    pop     si
242    ret
243
244
245;--------------------------------------------------------------------
246; DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
247;   Parameters:
248;       DX:     Ticks elapsed
249;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
250;   Returns:
251;       Nothing
252;   Corrupts:
253;       AX, BX, CX, DX, SI, DI
254;--------------------------------------------------------------------
255ALIGN JUMP_ALIGN
256DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX:
257    push    si
258    mov     si, g_szTimeLeft
259    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
260    pop     si
261
262    mov     cx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
263    mov     ax, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
264    sub     ax, cx
265    mul     dx          ; Progress left * elapsed time
266
267    sub     cx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
268    jcxz    .PreventDivisionByZero
269    div     cx          ; AX = Estimated ticks left
270    xchg    dx, ax
271    jmp     SHORT FormatTicksFromDX
272.PreventDivisionByZero:
273    xor     dx, dx
274    ; Fall to FormatTicksFromDX
275
276
277;--------------------------------------------------------------------
278; FormatTicksFromDX
279;   Parameters:
280;       DX:     Ticks to format
281;   Returns:
282;       Nothing
283;   Corrupts:
284;       AX, CX, DX, SI, DI
285;--------------------------------------------------------------------
286ALIGN JUMP_ALIGN
287FormatTicksFromDX:
288    push    bp
289
290    mov     bp, sp
291    mov     si, g_szTimeFormat
292    call    TimerTicks_GetMinutesToAXfromTicksInDX
293    push    ax
294    call    TimerTicks_GetSecondsToAXfromTicksInDX
295    push    ax
296    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
297
298    pop     bp
299    ret
Note: See TracBrowser for help on using the repository browser.