Subversion Repositories Kolibri OS

Rev

Rev 4011 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4011 Rev 6196
1
; Timer with three buttons ;
1
; Timer with three buttons ;
2
; %define lang "ru"
2
; %define lang "ru"
3
; %define lang "it"
3
; %define lang "it"
4
ORG 0
4
ORG 0
5
BITS 32
5
BITS 32
6
; ---------------------------------------------------------------------------- ;
6
; ---------------------------------------------------------------------------- ;
7
STACK_SIZE     equ 256
7
STACK_SIZE     equ 256
8
 
8
 
9
BUTTON_START   equ 2
9
BUTTON_START   equ 2
10
BUTTON_PAUSE   equ 3
10
BUTTON_PAUSE   equ 3
11
BUTTON_RESET   equ 4
11
BUTTON_RESET   equ 4
12
 
12
 
13
BORDER_SIZE    equ 5
13
BORDER_SIZE    equ 5
14
MARGIN         equ 8
14
MARGIN         equ 8
15
BUTTON_MARGIN  equ 3
15
BUTTON_MARGIN  equ 3
16
BUTTON_PADDING equ 5
16
BUTTON_PADDING equ 5
17
 
17
 
18
CHAR_WIDTH     equ 6
18
CHAR_WIDTH     equ 6
19
CHAR2_WIDTH    equ 8
19
CHAR2_WIDTH    equ 8
20
CHAR_HEIGHT    equ 9
20
CHAR_HEIGHT    equ 9
21
 
21
 
22
BUTTON_START_WIDTH equ (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH
22
BUTTON_START_WIDTH equ (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH
23
BUTTON_PAUSE_WIDTH equ (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH
23
BUTTON_PAUSE_WIDTH equ (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH
24
BUTTON_RESET_WIDTH equ (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH
24
BUTTON_RESET_WIDTH equ (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH
25
 
25
 
26
BUTTON_HEIGHT  equ (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1
26
BUTTON_HEIGHT  equ (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1
27
 
27
 
28
WINDOW_WIDTH   equ (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH)
28
WINDOW_WIDTH   equ (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH)
29
 
29
 
30
TIME_AREA_WIDTH equ (CHAR2_WIDTH * 8) ; HH MM SS
30
TIME_AREA_WIDTH equ (CHAR2_WIDTH * 8) ; HH MM SS
31
TIME_AREA_LEFT  equ (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2
31
TIME_AREA_LEFT  equ (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2
32
TIME_AREA_TOP   equ MARGIN + 1
32
TIME_AREA_TOP   equ MARGIN + 1
33
 
33
 
34
TEXT_ON_BUTTONS_TOP equ (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1
34
TEXT_ON_BUTTONS_TOP equ (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1
35
 
35
 
36
BUTTON_START_BACK_COLOR equ 0x880000
36
BUTTON_START_BACK_COLOR equ 0x880000
37
BUTTON_PAUSE_BACK_COLOR equ 0x008800
37
BUTTON_PAUSE_BACK_COLOR equ 0x008800
38
BUTTON_RESET_BACK_COLOR equ 0x000088
38
BUTTON_RESET_BACK_COLOR equ 0x000088
39
; ---------------------------------------------------------------------------- ;
39
; ---------------------------------------------------------------------------- ;
40
MENUET01       db 'MENUET01'
40
MENUET01       db 'MENUET01'
41
version        dd 1
41
version        dd 1
42
program.start  dd START
42
program.start  dd START
43
program.end    dd END
43
program.end    dd END
44
program.memory dd END + STACK_SIZE
44
program.memory dd END + STACK_SIZE
45
program.stack  dd END + STACK_SIZE
45
program.stack  dd END + STACK_SIZE
46
program.params dd 0
46
program.params dd 0
47
program.path   dd 0
47
program.path   dd 0
48
; ---------------------------------------------------------------------------- ;
48
; ---------------------------------------------------------------------------- ;
49
screen:
49
screen:
50
.height        dw 0
50
.height        dw 0
51
.width         dw 0
51
.width         dw 0
52
; ---------------------------------------------------------------------------- ;
52
; ---------------------------------------------------------------------------- ;
53
window:
53
window:
54
.left          dd 0
54
.left          dd 0
55
.top           dd 0
55
.top           dd 0
56
.width         dd WINDOW_WIDTH
56
.width         dd WINDOW_WIDTH
57
.height        dd 0
57
.height        dd 0
58
; ---------------------------------------------------------------------------- ;
58
; ---------------------------------------------------------------------------- ;
59
sc:
59
sc:
60
.frames           dd 0
60
.frames           dd 0
61
.grab             dd 0
61
.grab             dd 0
62
.grab_button      dd 0
62
.work_3d_dark      dd 0
63
.grab_button_text dd 0
63
.work_3d_light dd 0
64
.grab_text        dd 0
64
.grab_text        dd 0
65
.work             dd 0
65
.work             dd 0
66
.work_button      dd 0
66
.work_button      dd 0
67
.work_button_text dd 0
67
.work_button_text dd 0
68
.work_text        dd 0
68
.work_text        dd 0
69
.work_graph       dd 0
69
.work_graph       dd 0
70
; ---------------------------------------------------------------------------- ;
70
; ---------------------------------------------------------------------------- ;
71
timer_ticks       dd 0
71
timer_ticks       dd 0
72
last_timer_ticks  dd 0
72
last_timer_ticks  dd 0
73
hours             dd 0
73
hours             dd 0
74
minutes           dd 0
74
minutes           dd 0
75
seconds           dd 0
75
seconds           dd 0
76
timer_proc        dd EmptyProc ; at start Timer yet disabled
76
timer_proc        dd EmptyProc ; at start Timer yet disabled
77
; ---------------------------------------------------------------------------- ;
77
; ---------------------------------------------------------------------------- ;
78
Events:
78
Events:
79
        dd     On_Idle
79
        dd     On_Idle
80
        dd     On_Redraw
80
        dd     On_Redraw
81
        dd     On_KeyPress
81
        dd     On_KeyPress
82
        dd     On_ButtonPress
82
        dd     On_ButtonPress
83
; ---------------------------------------------------------------------------- ;
83
; ---------------------------------------------------------------------------- ;
84
ButtonEvents:
84
ButtonEvents:
85
        dd     0
85
        dd     0
86
.close  dd     On_ButtonClose
86
.close  dd     On_ButtonClose
87
.start  dd     On_ButtonStart
87
.start  dd     On_ButtonStart
88
.pause  dd     EmptyProc       ; at start Pause must not work
88
.pause  dd     EmptyProc       ; at start Pause must not work
89
.reset  dd     On_ButtonReset
89
.reset  dd     On_ButtonReset
90
; ---------------------------------------------------------------------------- ;
90
; ---------------------------------------------------------------------------- ;
91
%ifidn     lang, "ru"
91
%ifidn     lang, "ru"
92
               sz_timer       db "Òàéìåð",0
92
               sz_timer       db "Òàéìåð",0
93
 
93
 
94
               sz_start:      db "ñòàðò"
94
               sz_start:      db "ñòàðò"
95
                 .end:        db 0
95
                 .end:        db 0
96
               sz_pause:      db "ïàóçà"
96
               sz_pause:      db "ïàóçà"
97
                 .end:        db 0
97
                 .end:        db 0
98
               sz_reset:      db "ñáðîñ"
98
               sz_reset:      db "ñáðîñ"
99
                 .end:        db 0
99
                 .end:        db 0
100
%elifidn   lang, "it"
100
%elifidn   lang, "it"
101
               sz_timer       db "Timer",0
101
               sz_timer       db "Timer",0
102
 
102
 
103
               sz_start:      db "lancio"
103
               sz_start:      db "lancio"
104
                 .end:        db 0
104
                 .end:        db 0
105
               sz_pause:      db "pausa"
105
               sz_pause:      db "pausa"
106
                 .end:        db 0
106
                 .end:        db 0
107
               sz_reset:      db "reset"
107
               sz_reset:      db "reset"
108
                 .end:        db 0
108
                 .end:        db 0
109
%else
109
%else
110
               sz_timer       db "Timer",0
110
               sz_timer       db "Timer",0
111
 
111
 
112
               sz_start:      db "start"
112
               sz_start:      db "start"
113
                 .end:        db 0
113
                 .end:        db 0
114
               sz_pause:      db "pause"
114
               sz_pause:      db "pause"
115
                 .end:        db 0
115
                 .end:        db 0
116
               sz_reset:      db "reset"
116
               sz_reset:      db "reset"
117
                 .end:        db 0
117
                 .end:        db 0
118
%endif
118
%endif
119
; ---------------------------------------------------------------------------- ;
119
; ---------------------------------------------------------------------------- ;
120
START:
120
START:
121
; get.screen.size
121
; get.screen.size
122
        mov    eax, 61
122
        mov    eax, 61
123
        mov    ebx, 1
123
        mov    ebx, 1
124
        int    64
124
        int    64
125
        mov    [screen], eax
125
        mov    [screen], eax
126
 
126
 
127
        movzx  eax, word[screen.width]
127
        movzx  eax, word[screen.width]
128
        sub    eax, [window.width]
128
        sub    eax, [window.width]
129
        shr    eax, 1
129
        shr    eax, 1
130
        mov    [window.left], eax
130
        mov    [window.left], eax
131
 
131
 
132
; skin.height
132
; skin.height
133
        mov    eax, 48
133
        mov    eax, 48
134
        mov    ebx, 4
134
        mov    ebx, 4
135
        int    64
135
        int    64
136
        add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
136
        add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
137
        mov    [window.height], eax
137
        mov    [window.height], eax
138
 
138
 
139
        movzx  eax, word[screen.height]
139
        movzx  eax, word[screen.height]
140
        sub    eax, [window.height]
140
        sub    eax, [window.height]
141
        shr    eax, 1
141
        shr    eax, 1
142
        mov    [window.top], eax
142
        mov    [window.top], eax
143
 
143
 
144
        call On_Redraw
144
        call On_Redraw
145
; ---------------------------------------------------------------------------- ;
145
; ---------------------------------------------------------------------------- ;
146
wait.event:
146
wait.event:
147
        mov    eax, 23
147
        mov    eax, 23
148
        mov    ebx, 50
148
        mov    ebx, 50
149
        int    64
149
        int    64
150
        call   [eax * 4 + Events]
150
        call   [eax * 4 + Events]
151
        jmp    wait.event
151
        jmp    wait.event
152
; ---------------------------------------------------------------------------- ;
152
; ---------------------------------------------------------------------------- ;
153
On_KeyPress:
153
On_KeyPress:
154
        mov    eax, 2
154
        mov    eax, 2
155
        int    64
155
        int    64
156
        ret
156
        ret
157
; ---------------------------------------------------------------------------- ;
157
; ---------------------------------------------------------------------------- ;
158
On_ButtonPress:
158
On_ButtonPress:
159
        mov    eax, 17
159
        mov    eax, 17
160
        int    64
160
        int    64
161
        movzx  eax, ah
161
        movzx  eax, ah
162
        call   [eax * 4 + ButtonEvents]
162
        call   [eax * 4 + ButtonEvents]
163
        ret
163
        ret
164
; ---------------------------------------------------------------------------- ;
164
; ---------------------------------------------------------------------------- ;
165
On_ButtonClose:
165
On_ButtonClose:
166
        or     eax, -1
166
        or     eax, -1
167
        int    64
167
        int    64
168
; ---------------------------------------------------------------------------- ;
168
; ---------------------------------------------------------------------------- ;
169
On_ButtonStart:
169
On_ButtonStart:
170
; get system counter
170
; get system counter
171
        mov    eax, 26
171
        mov    eax, 26
172
        mov    ebx, 9
172
        mov    ebx, 9
173
        int    64
173
        int    64
174
        sub    eax, [last_timer_ticks]
174
        sub    eax, [last_timer_ticks]
175
        and    [last_timer_ticks], dword 0
175
        and    [last_timer_ticks], dword 0
176
        mov    [timer_ticks], eax
176
        mov    [timer_ticks], eax
177
        mov    [timer_proc], dword TimerStarted
177
        mov    [timer_proc], dword TimerStarted
178
        mov    [ButtonEvents.start], dword EmptyProc      ; disable ButtonStart
178
        mov    [ButtonEvents.start], dword EmptyProc      ; disable ButtonStart
179
        mov    [ButtonEvents.pause], dword On_ButtonPause ; enable  ButtonPause
179
        mov    [ButtonEvents.pause], dword On_ButtonPause ; enable  ButtonPause
180
        ret
180
        ret
181
; ---------------------------------------------------------------------------- ;
181
; ---------------------------------------------------------------------------- ;
182
On_ButtonPause:
182
On_ButtonPause:
183
; get system counter
183
; get system counter
184
        mov    eax, 26
184
        mov    eax, 26
185
        mov    ebx, 9
185
        mov    ebx, 9
186
        int    64
186
        int    64
187
        sub    eax, [timer_ticks]
187
        sub    eax, [timer_ticks]
188
        mov    [last_timer_ticks], eax
188
        mov    [last_timer_ticks], eax
189
        mov    [timer_proc], dword EmptyProc
189
        mov    [timer_proc], dword EmptyProc
190
        mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
190
        mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
191
        mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
191
        mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
192
        ret
192
        ret
193
; ---------------------------------------------------------------------------- ;
193
; ---------------------------------------------------------------------------- ;
194
On_ButtonReset:
194
On_ButtonReset:
195
        xor    eax, eax
195
        xor    eax, eax
196
        mov    [seconds], eax
196
        mov    [seconds], eax
197
        mov    [hours], eax
197
        mov    [hours], eax
198
        mov    [minutes], eax
198
        mov    [minutes], eax
199
        mov    [last_timer_ticks], eax
199
        mov    [last_timer_ticks], eax
200
        mov    [timer_proc], dword EmptyProc
200
        mov    [timer_proc], dword EmptyProc
201
        mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
201
        mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
202
        mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
202
        mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
203
        ret
203
        ret
204
; ---------------------------------------------------------------------------- ;
204
; ---------------------------------------------------------------------------- ;
205
On_Redraw:
205
On_Redraw:
206
; redraw.start
206
; redraw.start
207
        mov    eax, 12
207
        mov    eax, 12
208
        mov    ebx, 1
208
        mov    ebx, 1
209
        int    64
209
        int    64
210
; get.standart.colors
210
; get.standart.colors
211
        mov    eax, 48
211
        mov    eax, 48
212
        mov    ebx, 3
212
        mov    ebx, 3
213
        mov    ecx, sc
213
        mov    ecx, sc
214
        mov    edx, 40
214
        mov    edx, 40
215
        int    64
215
        int    64
216
; skin.height
216
; skin.height
217
        mov    eax, 48
217
        mov    eax, 48
218
        mov    ebx, 4
218
        mov    ebx, 4
219
        int    64
219
        int    64
220
        add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
220
        add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
221
        mov    [window.height], eax
221
        mov    [window.height], eax
222
; draw.window
222
; draw.window
223
        xor    eax, eax
223
        xor    eax, eax
224
        mov    ebx, [window.left]
224
        mov    ebx, [window.left]
225
        shl    ebx, 16
225
        shl    ebx, 16
226
        add    ebx, [window.width]
226
        add    ebx, [window.width]
227
        mov    ecx, [window.top]
227
        mov    ecx, [window.top]
228
        shl    ecx, 16
228
        shl    ecx, 16
229
        add    ecx, [window.height]
229
        add    ecx, [window.height]
230
        mov    edx, [sc.work]
230
        mov    edx, [sc.work]
231
        or     edx, 0x34000000
231
        or     edx, 0x34000000
232
        mov    edi, sz_timer
232
        mov    edi, sz_timer
233
        int    64
233
        int    64
234
; draw.buttons:
234
; draw.buttons:
235
        mov    eax, 8
235
        mov    eax, 8
236
        mov    ecx, ((MARGIN + CHAR_HEIGHT + MARGIN) << 16) | BUTTON_HEIGHT
236
        mov    ecx, ((MARGIN + CHAR_HEIGHT + MARGIN) << 16) | BUTTON_HEIGHT
237
 
237
 
238
        mov    ebx, (MARGIN << 16) | BUTTON_START_WIDTH
238
        mov    ebx, (MARGIN << 16) | BUTTON_START_WIDTH
239
        mov    edx, BUTTON_START
239
        mov    edx, BUTTON_START
240
        mov    esi, BUTTON_START_BACK_COLOR
240
        mov    esi, BUTTON_START_BACK_COLOR
241
        int    64
241
        int    64
242
 
242
 
243
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_PAUSE_WIDTH
243
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_PAUSE_WIDTH
244
        mov    edx, BUTTON_PAUSE
244
        mov    edx, BUTTON_PAUSE
245
        mov    esi, BUTTON_PAUSE_BACK_COLOR
245
        mov    esi, BUTTON_PAUSE_BACK_COLOR
246
        int    64
246
        int    64
247
 
247
 
248
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_RESET_WIDTH
248
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_RESET_WIDTH
249
        mov    edx, BUTTON_RESET
249
        mov    edx, BUTTON_RESET
250
        mov    esi, BUTTON_RESET_BACK_COLOR
250
        mov    esi, BUTTON_RESET_BACK_COLOR
251
        int    64
251
        int    64
252
;----------------------
252
;----------------------
253
; draw.texts:
253
; draw.texts:
254
        mov    eax, 4
254
        mov    eax, 4
255
        mov    ecx, 0x80FFFFFF
255
        mov    ecx, 0x80FFFFFF
256
 
256
 
257
        mov    ebx, ((MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
257
        mov    ebx, ((MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
258
        mov    edx, sz_start
258
        mov    edx, sz_start
259
        int    64
259
        int    64
260
 
260
 
261
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
261
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
262
        mov    edx, sz_pause
262
        mov    edx, sz_pause
263
        int    64
263
        int    64
264
 
264
 
265
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
265
        mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
266
        mov    edx, sz_reset
266
        mov    edx, sz_reset
267
        int    64
267
        int    64
268
;----------------------
268
;----------------------
269
        call   On_Idle
269
        call   On_Idle
270
; redraw.finish
270
; redraw.finish
271
        mov    eax, 12
271
        mov    eax, 12
272
        mov    ebx, 2
272
        mov    ebx, 2
273
        int    64
273
        int    64
274
        ret
274
        ret
275
; ---------------------------------------------------------------------------- ;
275
; ---------------------------------------------------------------------------- ;
276
DrawTime:
276
DrawTime:
277
        mov    ebx, (1 << 16)
277
        mov    ebx, (1 << 16)
278
        mov    esi, [sc.work_text]
278
        mov    esi, [sc.work_text]
279
        mov    edi, [sc.work]
279
        mov    edi, [sc.work]
280
; HH
280
; HH
281
        mov    eax, [hours]
281
        mov    eax, [hours]
282
        xor    edx, edx
282
        xor    edx, edx
283
        mov    ebp, 10
283
        mov    ebp, 10
284
        div    ebp
284
        div    ebp
285
        mov    ebp, edx
285
        mov    ebp, edx
286
 
286
 
287
        mov    ecx, eax ; [hours] first digit
287
        mov    ecx, eax ; [hours] first digit
288
 
288
 
289
        or     esi, 0x70000000
289
        or     esi, 0x70000000
290
        mov    eax, 47
290
        mov    eax, 47
291
        mov    edx, (TIME_AREA_LEFT << 16) | TIME_AREA_TOP
291
        mov    edx, (TIME_AREA_LEFT << 16) | TIME_AREA_TOP
292
        int    64
292
        int    64
293
        and    esi, 0x30FFFFFF
293
        and    esi, 0x30FFFFFF
294
        mov    eax, 47
294
        mov    eax, 47
295
        mov    edx, ((TIME_AREA_LEFT + 1) << 16) | TIME_AREA_TOP
295
        mov    edx, ((TIME_AREA_LEFT + 1) << 16) | TIME_AREA_TOP
296
        int    64
296
        int    64
297
 
297
 
298
        mov    ecx, ebp ; [hours] second digit
298
        mov    ecx, ebp ; [hours] second digit
299
 
299
 
300
        or     esi, 0x70000000
300
        or     esi, 0x70000000
301
        mov    eax, 47
301
        mov    eax, 47
302
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
302
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
303
        int    64
303
        int    64
304
        and    esi, 0x30FFFFFF
304
        and    esi, 0x30FFFFFF
305
        mov    eax, 47
305
        mov    eax, 47
306
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
306
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
307
        int    64
307
        int    64
308
; MM
308
; MM
309
        mov    eax, [minutes]
309
        mov    eax, [minutes]
310
        xor    edx, edx
310
        xor    edx, edx
311
        mov    ebp, 10
311
        mov    ebp, 10
312
        div    ebp
312
        div    ebp
313
        mov    ebp, edx
313
        mov    ebp, edx
314
 
314
 
315
        mov    ecx, eax ; [minutes] first digit
315
        mov    ecx, eax ; [minutes] first digit
316
 
316
 
317
        or     esi, 0x70000000
317
        or     esi, 0x70000000
318
        mov    eax, 47
318
        mov    eax, 47
319
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) << 16) | TIME_AREA_TOP
319
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) << 16) | TIME_AREA_TOP
320
        int    64
320
        int    64
321
        and    esi, 0x30FFFFFF
321
        and    esi, 0x30FFFFFF
322
        mov    eax, 47
322
        mov    eax, 47
323
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) << 16) | TIME_AREA_TOP
323
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) << 16) | TIME_AREA_TOP
324
        int    64
324
        int    64
325
 
325
 
326
        mov    ecx, ebp ; [minutes] second digit
326
        mov    ecx, ebp ; [minutes] second digit
327
 
327
 
328
        or     esi, 0x70000000
328
        or     esi, 0x70000000
329
        mov    eax, 47
329
        mov    eax, 47
330
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
330
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
331
        int    64
331
        int    64
332
        and    esi, 0x30FFFFFF
332
        and    esi, 0x30FFFFFF
333
        mov    eax, 47
333
        mov    eax, 47
334
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
334
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
335
        int    64
335
        int    64
336
; SS
336
; SS
337
        mov    eax, [seconds]
337
        mov    eax, [seconds]
338
        xor    edx, edx
338
        xor    edx, edx
339
        mov    ebp, 10
339
        mov    ebp, 10
340
        div    ebp
340
        div    ebp
341
        mov    ebp, edx
341
        mov    ebp, edx
342
 
342
 
343
        mov    ecx, eax ; [seconds] first digit
343
        mov    ecx, eax ; [seconds] first digit
344
 
344
 
345
        or     esi, 0x70000000
345
        or     esi, 0x70000000
346
        mov    eax, 47
346
        mov    eax, 47
347
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) << 16) | TIME_AREA_TOP
347
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) << 16) | TIME_AREA_TOP
348
        int    64
348
        int    64
349
        and    esi, 0x30FFFFFF
349
        and    esi, 0x30FFFFFF
350
        mov    eax, 47
350
        mov    eax, 47
351
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) << 16) | TIME_AREA_TOP
351
        mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) << 16) | TIME_AREA_TOP
352
        int    64
352
        int    64
353
 
353
 
354
        mov    ecx, ebp ; [seconds] second digit
354
        mov    ecx, ebp ; [seconds] second digit
355
 
355
 
356
        or     esi, 0x70000000
356
        or     esi, 0x70000000
357
        mov    eax, 47
357
        mov    eax, 47
358
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
358
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
359
        int    64
359
        int    64
360
        and    esi, 0x30FFFFFF
360
        and    esi, 0x30FFFFFF
361
        mov    eax, 47
361
        mov    eax, 47
362
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
362
        mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
363
        int    64
363
        int    64
364
        ret
364
        ret
365
; ---------------------------------------------------------------------------- ;
365
; ---------------------------------------------------------------------------- ;
366
On_Idle:
366
On_Idle:
367
        call   dword [timer_proc]
367
        call   dword [timer_proc]
368
        call   DrawTime
368
        call   DrawTime
369
        ret
369
        ret
370
; ---------------------------------------------------------------------------- ;
370
; ---------------------------------------------------------------------------- ;
371
TimerStarted:
371
TimerStarted:
372
; get system counter
372
; get system counter
373
        mov    eax, 26
373
        mov    eax, 26
374
        mov    ebx, 9
374
        mov    ebx, 9
375
        int    64
375
        int    64
376
        sub    eax, [timer_ticks]
376
        sub    eax, [timer_ticks]
377
        xor    edx, edx
377
        xor    edx, edx
378
        mov    ecx, 100
378
        mov    ecx, 100
379
        div    ecx
379
        div    ecx
380
        mov    ecx, 60
380
        mov    ecx, 60
381
        xor    edx, edx
381
        xor    edx, edx
382
        div    ecx
382
        div    ecx
383
        mov    [seconds], edx
383
        mov    [seconds], edx
384
        xor    edx, edx
384
        xor    edx, edx
385
        div    ecx
385
        div    ecx
386
        mov    [hours], eax
386
        mov    [hours], eax
387
        mov    [minutes], edx
387
        mov    [minutes], edx
388
        ret
388
        ret
389
; ---------------------------------------------------------------------------- ;
389
; ---------------------------------------------------------------------------- ;
390
EmptyProc:
390
EmptyProc:
391
        ret
391
        ret
392
; ---------------------------------------------------------------------------- ;
392
; ---------------------------------------------------------------------------- ;
393
END:
393
END: