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

Last change on this file since 49 was 48, checked in by Tomi Tilli, 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.