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

Last change on this file since 596 was 596, checked in by krille_n_, 6 years ago

Changes:

  • Made changes to HotkeyBar.asm to give the Boot Menu and Hotkey Bar a more consistent look. It will probably seem a bit strange at first to people used to the classic theme.
  • Added the missing parts of USE_NEC_V that should have been committed with the rest in r593.
  • Removed DEFINES_ALL_FEATURES from the BIOS makefile. It didn't work anymore and never really made sense anyway. Added all the official builds to 'make unused' instead which actually uncovered some unused code in the Tiny build.
  • XTIDECFG will no longer load color themes from unrecognized versions of the BIOS.
  • Other fixes in comments and some minor optimizations.
File size: 9.0 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Displays progress bar dialog and starts progress task.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
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.
12;
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
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; DialogProgress_GetStringWithIoInDSSI
26;   Parameters:
27;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
28;       SS:BP:  Ptr to parent MENU
29;   Returns:
30;       Nothing
31;   Corrupts registers:
32;       AX, BX, CX, DX, DI
33;--------------------------------------------------------------------
34ALIGN JUMP_ALIGN
35DialogProgress_StartProgressTaskWithIoInDSSIandParamInDXAX:
36    mov     bx, ProgressEventHandler
37    jmp     Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
38
39
40;--------------------------------------------------------------------
41; DialogProgress_SetProgressValueFromAX
42;   Parameters
43;       AX:     Progress bar value to set
44;       SS:BP:  Ptr to DIALOG
45;   Returns:
46;       Nothing
47;   Corrupts registers:
48;       AX, BX, CX, DX, SI, DI
49;--------------------------------------------------------------------
50ALIGN JUMP_ALIGN
51DialogProgress_SetProgressValueFromAX:
52    push    ds
53
54    lds     si, [bp+DIALOG.fpDialogIO]
55    mov     bx, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
56    cmp     ax, bx
57    jb      SHORT .AXlessThanBX
58    mov     ax, bx
59    jmp     SHORT .UpdateProgressBar
60ALIGN JUMP_ALIGN
61.AXlessThanBX:
62    mov     bx, ax
63    sub     bx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
64    cmp     bx, [si+PROGRESS_DIALOG_IO.wProgressPerCharacter]
65    jb      SHORT .ReturnWithoutUpdate
66.UpdateProgressBar:
67    mov     [si+PROGRESS_DIALOG_IO.wCurrentProgressValue], ax
68    xor     ax, ax
69    call    MenuText_RefreshItemFromAX
70    call    MenuText_RefreshInformation
71ALIGN JUMP_ALIGN
72.ReturnWithoutUpdate:
73    pop     ds
74    ret
75
76
77;--------------------------------------------------------------------
78; ProgressEventHandler
79;   Common parameters for all events:
80;       BX:         Menu event (anything from MENUEVENT struct)
81;       SS:BP:      Ptr to DIALOG
82;   Common return values for all events:
83;       CF:         Set if event processed
84;                   Cleared if event not processed
85;   Corrupts registers:
86;       All
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89ProgressEventHandler:
90    jmp     [cs:bx+.rgfnEventHandlers]
91
92
93ALIGN JUMP_ALIGN
94.InitializeMenuinitFromDSSI:
95    mov     ax, NO_ITEM_HIGHLIGHTED
96    call    Dialog_EventInitializeMenuinitFromDSSIforSingleItemWithHighlightedItemInAX
97    lds     si, [bp+DIALOG.fpDialogIO]
98    call    TimerTicks_ReadFromBdaToAX
99    mov     [si+PROGRESS_DIALOG_IO.wStartTimeTicks], ax
100
101    ; 0 = 65536 but it needs to be adjusted to 65535 to prevent division by zero
102    cmp     WORD [si+PROGRESS_DIALOG_IO.wMaxProgressValue], BYTE 0
103    jne     SHORT CalculateProgressNeededBeforeUpdatingCharacter
104    dec     WORD [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
105    jmp     SHORT CalculateProgressNeededBeforeUpdatingCharacter
106
107
108ALIGN JUMP_ALIGN
109.IdleProcessing:
110    call    MenuInit_GetUserDataToDSSI
111    les     di, [bp+DIALOG.fpDialogIO]
112    push    bp
113    call    [es:di+PROGRESS_DIALOG_IO.fnTaskWithParamInDSSI]
114    pop     bp
115    call    MenuInit_CloseMenuWindow
116    stc
117    ret
118
119
120ALIGN JUMP_ALIGN
121.RefreshItemFromCX:
122    lds     si, [bp+DIALOG.fpDialogIO]
123    call    DrawProgressBarFromDialogIoInDSSI
124    stc
125    ret
126
127
128ALIGN JUMP_ALIGN
129.RefreshInformation:
130    lds     si, [bp+DIALOG.fpDialogIO]
131    call    TimerTicks_ReadFromBdaToAX
132    sub     ax, [si+PROGRESS_DIALOG_IO.wStartTimeTicks]
133    xchg    dx, ax
134    call    DrawTimeElapsedFromDX
135    call    DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
136    stc
137    ret
138
139
140ALIGN WORD_ALIGN
141.rgfnEventHandlers:
142istruc MENUEVENT
143    at  MENUEVENT.InitializeMenuinitFromDSSI,   dw  .InitializeMenuinitFromDSSI
144    at  MENUEVENT.ExitMenu,                     dw  Dialog_EventExitMenu
145    at  MENUEVENT.IdleProcessing,               dw  .IdleProcessing
146    at  MENUEVENT.ItemHighlightedFromCX,        dw  Dialog_EventNotHandled
147    at  MENUEVENT.ItemSelectedFromCX,           dw  Dialog_EventNotHandled
148    at  MENUEVENT.KeyStrokeInAX,                dw  Dialog_EventNotHandled
149    at  MENUEVENT.RefreshTitle,                 dw  Dialog_EventRefreshTitle
150    at  MENUEVENT.RefreshInformation,           dw  .RefreshInformation
151    at  MENUEVENT.RefreshItemFromCX,            dw  .RefreshItemFromCX
152iend
153
154
155;--------------------------------------------------------------------
156; CalculateProgressNeededBeforeUpdatingCharacter
157;   Parameters:
158;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
159;       SS:BP:  Ptr to DIALOG
160;   Returns:
161;       CF:     Set since event handled
162;   Corrupts:
163;       AX, BX, DX, SI, DS
164;--------------------------------------------------------------------
165ALIGN JUMP_ALIGN
166CalculateProgressNeededBeforeUpdatingCharacter:
167    call    MenuLocation_GetMaxTextLineLengthToAX
168    call    GetProgressLengthToBXfromProgressDialogIoInDSSI
169    xchg    ax, bx
170    xor     dx, dx
171    div     bx
172    mov     [si+PROGRESS_DIALOG_IO.wProgressPerCharacter], ax
173    stc
174    ret
175
176
177;--------------------------------------------------------------------
178; DrawProgressBarFromDialogIoInDSSI
179;   Parameters:
180;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
181;       SS:BP:  Ptr to DIALOG
182;   Returns:
183;       Nothing
184;   Corrupts:
185;       AX, BX, CX, DX, DI
186;--------------------------------------------------------------------
187ALIGN JUMP_ALIGN
188DrawProgressBarFromDialogIoInDSSI:
189    ; Get full chars to CX and empty chars to DX
190    call    MenuLocation_GetMaxTextLineLengthToAX
191    mov     cx, ax
192    mul     WORD [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
193    call    GetProgressLengthToBXfromProgressDialogIoInDSSI
194    div     bx
195    xchg    cx, ax      ; AX = Text line length, CX = Number of full chars
196    sub     ax, cx
197    xchg    dx, ax      ; DX = Number of empty chars
198
199    mov     al, PROGRESS_COMPLETE_CHARACTER
200    call    .RepeatProgressCharacterCXtimesFromAL
201
202    mov     cx, dx
203    mov     al, PROGRESS_INCOMPLETE_CHARACTER
204    ; Fall to .RepeatProgressCharacterCXtimesFromAL
205
206;--------------------------------------------------------------------
207; .RepeatProgressCharacterCXtimesFromAL
208;   Parameters:
209;       AL:     Progress bar character to repeat
210;       CX:     Number of times to repeat the progress character
211;   Returns:
212;       Nothing
213;   Corrupts:
214;       AX, CX, DI
215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
217.RepeatProgressCharacterCXtimesFromAL:
218    jcxz    NothingToRepeat
219    JMP_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
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]
235NothingToRepeat:
236    ret
237
238
239;--------------------------------------------------------------------
240; DrawTimeElapsedFromDX
241;   Parameters:
242;       DX:     Ticks elapsed
243;   Returns:
244;       Nothing
245;   Corrupts:
246;       AX, BX, CX, DI
247;--------------------------------------------------------------------
248ALIGN JUMP_ALIGN
249DrawTimeElapsedFromDX:
250    push    si
251    push    dx
252
253    mov     si, g_szTimeElapsed
254    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
255    call    FormatTicksFromDX
256
257    pop     dx
258    pop     si
259    ret
260
261
262;--------------------------------------------------------------------
263; DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX
264;   Parameters:
265;       DX:     Ticks elapsed
266;       DS:SI:  Ptr to PROGRESS_DIALOG_IO
267;   Returns:
268;       Nothing
269;   Corrupts:
270;       AX, BX, CX, DX, SI, DI
271;--------------------------------------------------------------------
272ALIGN JUMP_ALIGN
273DrawTimeLeftFromProgressDialogIoInDSSIwithTimeElapsedInDX:
274    push    si
275    mov     si, g_szTimeLeft
276    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
277    pop     si
278
279    mov     cx, [si+PROGRESS_DIALOG_IO.wCurrentProgressValue]
280    mov     ax, [si+PROGRESS_DIALOG_IO.wMaxProgressValue]
281    sub     ax, cx
282    mul     dx          ; Progress left * elapsed time
283
284    sub     cx, [si+PROGRESS_DIALOG_IO.wMinProgressValue]
285    jz      SHORT .PreventDivisionByZero
286    div     cx          ; AX = Estimated ticks left
287    xchg    dx, ax
288    SKIP2B  ax
289.PreventDivisionByZero:
290    xor     dx, dx
291    ; Fall to FormatTicksFromDX
292
293
294;--------------------------------------------------------------------
295; FormatTicksFromDX
296;   Parameters:
297;       DX:     Ticks to format
298;   Returns:
299;       Nothing
300;   Corrupts:
301;       AX, CX, DX, SI, DI
302;--------------------------------------------------------------------
303ALIGN JUMP_ALIGN
304FormatTicksFromDX:
305    push    bp
306
307    mov     bp, sp
308    mov     si, g_szTimeFormat
309    call    TimerTicks_GetMinutesToAXandRemainderTicksToDXfromTicksInDX
310    push    ax
311    call    TimerTicks_GetSecondsToAXfromTicksInDX
312    push    ax
313    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
314
315    pop     bp
316    ret
Note: See TracBrowser for help on using the repository browser.