source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuTime.asm@ 48

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

Assembly Library:
CGA snow prevention now works when copying strings on formatted printing.

File size: 5.5 KB
Line 
1; File name : MenuTime.asm
2; Project name : Assembly Library
3; Created date : 25.7.2010
4; Last update : 4.10.2010
5; Author : Tomi Tilli
6; Description : Menu timeouts other time related functions.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; MenuTime_SetSelectionTimeoutValueFromAX
13; Parameters
14; AX: Selection timeout in system timer ticks
15; SS:BP: Ptr to MENU
16; Returns:
17; Nothing
18; Corrupts registers:
19; Nothing
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22MenuTime_SetSelectionTimeoutValueFromAX:
23 mov [bp+MENUINIT.wTimeoutTicks], ax
24 ret
25
26
27;--------------------------------------------------------------------
28; MenuTime_RestartSelectionTimeout
29; Parameters
30; SS:BP: Ptr to MENU
31; Returns:
32; Nothing
33; Corrupts registers:
34; AX, BX
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37MenuTime_RestartSelectionTimeout:
38 push ds
39 call PointDSBXtoTimeoutCounter
40 mov ax, [bp+MENUINIT.wTimeoutTicks]
41 call TimerTicks_InitializeTimeoutFromAX ; End time to [DS:BX]
42 pop ds
43 ret
44
45
46;--------------------------------------------------------------------
47; MenuTime_UpdateSelectionTimeout
48; Parameters
49; SS:BP: Ptr to MENU
50; Returns:
51; CF: Set if timeout
52; Cleared if time left
53; Corrupts registers:
54; AX, BX, CX, DX, SI, DI
55;--------------------------------------------------------------------
56ALIGN JUMP_ALIGN
57MenuTime_UpdateSelectionTimeout:
58 push ds
59
60 call MenuTime_DrawWithoutUpdating
61 jnc SHORT .TimeoutDisabled
62 call PointDSBXtoTimeoutCounter
63 call TimerTicks_SetCarryIfTimeoutFromDSBX
64
65ALIGN JUMP_ALIGN
66.TimeoutDisabled:
67 pop ds
68 ret
69
70;--------------------------------------------------------------------
71; MenuTime_DrawWithoutUpdating
72; Parameters
73; SS:BP: Ptr to MENU
74; Returns:
75; CF: Set if timeout enabled
76; Cleared if timeout disabled
77; Corrupts registers:
78; AX, BX, CX, DX, SI, DI
79;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
81MenuTime_DrawWithoutUpdating:
82 cmp WORD [bp+MENUINIT.wTimeoutTicks], BYTE 0
83 je SHORT .ReturnSinceTimeoutDisabled ; Clear CF
84
85 push ds
86 call GetSecondsLeftUntilTimeoutToAXandCounterToDSBX
87 call DrawTimeoutInAXoverMenuBorders
88 pop ds
89 stc
90ALIGN JUMP_ALIGN, ret
91.ReturnSinceTimeoutDisabled:
92 ret
93
94
95;--------------------------------------------------------------------
96; GetSecondsLeftUntilTimeoutToAXandCounterToDSBX
97; Parameters
98; SS:BP: Ptr to MENU
99; Returns:
100; AX: Seconds until timeout
101; DS:BX: Ptr to timeout counter
102; Corrupts registers:
103; AX, CX, DX
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106GetSecondsLeftUntilTimeoutToAXandCounterToDSBX:
107 call PointDSBXtoTimeoutCounter
108 call TimerTicks_GetElapsedToAXfromDSBX
109 neg ax ; Negate since DS:BX points to end time
110 MAX_S ax, 0 ; Set to zero if overflow
111 xchg dx, ax
112 jmp TimerTicks_GetSecondsToAXfromTicksInDX
113
114
115;--------------------------------------------------------------------
116; PointDSBXtoTimeoutCounter
117; Parameters
118; SS:BP: Ptr to MENU
119; Returns:
120; DS:BX: Ptr to timeout counter
121; Corrupts registers:
122; Nothing
123;--------------------------------------------------------------------
124ALIGN JUMP_ALIGN
125PointDSBXtoTimeoutCounter:
126 push ss
127 pop ds
128 lea bx, [bp+MENU.wTimeoutCounter]
129 ret
130
131
132;--------------------------------------------------------------------
133; DrawTimeoutInAXoverMenuBorders
134; Parameters
135; AX: Seconds to draw
136; SS:BP: Ptr to MENU
137; Returns:
138; Nothing
139; Corrupts registers:
140; AX, CX, DX, SI, DI
141;--------------------------------------------------------------------
142ALIGN JUMP_ALIGN
143DrawTimeoutInAXoverMenuBorders:
144 xchg cx, ax
145 call MenuBorders_AdjustDisplayContextForDrawingBorders
146 call MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
147 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
148 ; Fall to .PrintTimeoutStringWithSecondsInDX
149
150;--------------------------------------------------------------------
151; .PrintTimeoutStringWithSecondsInDX
152; Parameters
153; CX: Seconds to print
154; SS:BP: Ptr to MENU
155; Returns:
156; Nothing
157; Corrupts registers:
158; AX, DX, SI, DI
159;--------------------------------------------------------------------
160;ALIGN JUMP_ALIGN
161.PrintTimeoutStringWithSecondsInDX:
162 push bp
163
164 mov bp, sp
165 call .GetTimeoutAttributeToAXfromSecondsInCX
166 mov si, .szSelectionTimeout
167 push ax ; Push attribute
168 push cx ; Push seconds
169 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
170 pop bp
171
172 ; Draw right border with normal border color
173 mov al, DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
174 jmp MenuBorders_PrintSingleBorderCharacterFromAL
175.szSelectionTimeout:
176 db DOUBLE_BOTTOM_LEFT_CORNER
177 db DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL
178 db "%AAutoselection in %2u s",NULL
179
180;--------------------------------------------------------------------
181; .GetTimeoutAttributeToAXfromSecondsInCX
182; Parameters
183; CX: Seconds to print
184; Returns:
185; AX: Attribute byte for seconds
186; CX: Seconds to print
187; Corrupts registers:
188; SI, DI
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191.GetTimeoutAttributeToAXfromSecondsInCX:
192 mov si, ATTRIBUTE_CHARS.cNormalTimeout
193 cmp cx, BYTE 3
194 ja SHORT .GetAttributeToAX
195 add si, BYTE ATTRIBUTE_CHARS.cHurryTimeout - ATTRIBUTE_CHARS.cNormalTimeout
196ALIGN JUMP_ALIGN
197.GetAttributeToAX:
198 jmp MenuAttribute_GetToAXfromTypeInSI
Note: See TracBrowser for help on using the repository browser.