Subversion Repositories Kolibri OS

Rev

Rev 4011 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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