Rev 3586 | Rev 3889 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3887 | leency | 1 | ; Calendar for KolibriOS |
31 | halyavin | 2 | ; |
3887 | leency | 3 | ; v1.2 - code update by Leency, small design fixes |
4 | ; v1.1 - add change time support by DedOK |
||
5 | ; v1.0 - written in pure assembler by Ivushkin Andrey aka Willow |
||
6 | ; also - diamond, spraid, fedesco |
||
31 | halyavin | 7 | ; |
3887 | leency | 8 | ; Created: November 1, 2004 |
31 | halyavin | 9 | |
3887 | leency | 10 | WIN_CW equ 266 |
11 | WIN_X equ (5000 shl 16+WIN_CW+9) |
||
452 | heavyiron | 12 | WIN_Y equ (100 shl 16+335) |
31 | halyavin | 13 | |
135 | diamond | 14 | LINE1 equ 27 shl 16+16 |
3887 | leency | 15 | B_MONTH_X equ 5 shl 16+158+11 |
135 | diamond | 16 | B_Y equ LINE1 |
31 | halyavin | 17 | B_MONTH equ 63 shl 16+32 |
18 | |||
3887 | leency | 19 | B_WBAR_X equ 5 shl 16+WIN_CW |
31 | halyavin | 20 | B_WBAR_Y equ 64 shl 16+20 |
135 | diamond | 21 | B_WEEK equ 30 shl 16+70 |
31 | halyavin | 22 | B_WX_SHIFT equ 32 shl 16 |
23 | |||
24 | B_DBAR_X equ B_WBAR_X |
||
25 | B_DBAR_Y equ 85 shl 16+190 |
||
26 | |||
135 | diamond | 27 | B_DROP equ B_MONTH+16 |
31 | halyavin | 28 | B_DAYS_Y equ 100 |
29 | B_DAYS_SHIFT equ 30 |
||
30 | |||
31 | B_YEAR_X equ 173 shl 16+58 |
||
135 | diamond | 32 | B_YEAR equ 188 shl 16+32 |
31 | halyavin | 33 | |
34 | B_TODAY_X equ 25 shl 16 |
||
35 | B_TODAY_Y equ 48 shl 16+10 |
||
36 | B_TODAY equ 30 shl 16+50 |
||
37 | |||
38 | B_SPIN_WIDTH equ 13 |
||
39 | B_SPIN_X equ 234 shl 16+B_SPIN_WIDTH |
||
135 | diamond | 40 | B_SPIN equ 238 shl 16+32 |
31 | halyavin | 41 | |
135 | diamond | 42 | B_NS_X equ 185 shl 16+75 |
43 | B_NS_Y equ 48 shl 16+10 |
||
44 | B_NS equ 190 shl 16+50 |
||
31 | halyavin | 45 | |
46 | FOCUSABLE equ 5 |
||
47 | |||
3887 | leency | 48 | |
49 | |||
135 | diamond | 50 | use32 ; включить 32-битный режим ассемблера |
31 | halyavin | 51 | |
135 | diamond | 52 | org 0x0 ; адресация с нуля |
31 | halyavin | 53 | |
135 | diamond | 54 | db 'MENUET01' ; 8-байтный идентификатор MenuetOS |
55 | dd 0x01 ; версия заголовка (всегда 1) |
||
56 | dd start ; адрес метки, с которой начинается выполнение программ |
||
57 | dd I_END ; размер программы |
||
58 | dd 0x1000 ; количество памяти |
||
59 | dd 0x1000 ; адрес вершины стэка |
||
60 | dd 0x0 ; адрес буфера для строки параметров (не используется) |
||
61 | dd 0x0 ; зарезервировано |
||
31 | halyavin | 62 | include 'lang.inc' |
485 | heavyiron | 63 | include '..\..\..\macros.inc' ; уменьшает размер программы |
3887 | leency | 64 | include 'data.inc' |
31 | halyavin | 65 | |
66 | |||
485 | heavyiron | 67 | |
31 | halyavin | 68 | macro ShowFocus field,reg |
69 | { |
||
70 | local .nofocus, .exit |
||
71 | cmp [focus],field |
||
72 | jne .nofocus |
||
73 | if reg eq |
||
74 | mov ecx,0x10e7c750;0x10ddeeff |
||
75 | else |
||
76 | mov reg,0x10e7c750;0x10ddeeff |
||
77 | end if |
||
78 | jmp .exit |
||
79 | .nofocus: |
||
80 | if reg eq |
||
81 | mov ecx,0x10000000 |
||
82 | else |
||
83 | mov reg,0x10000000 |
||
84 | end if |
||
85 | .exit: |
||
86 | } |
||
87 | |||
88 | |||
3887 | leency | 89 | |
31 | halyavin | 90 | str2int: |
91 | xor eax,eax |
||
92 | lodsb |
||
93 | mov ebx,eax |
||
94 | shr ebx,4 |
||
95 | and eax,0xf |
||
96 | imul ebx,10 |
||
97 | add al,bl |
||
98 | ret |
||
99 | |||
100 | start: |
||
101 | mcall 29 |
||
102 | mov [datestr],eax |
||
103 | mov esi,datestr |
||
104 | call str2int |
||
105 | add eax,1900 |
||
106 | mov [Year],eax |
||
107 | call str2int |
||
108 | dec eax |
||
109 | mov [Month],eax |
||
110 | call str2int |
||
111 | mov [day_sel],eax |
||
112 | test byte[esi],0 |
||
113 | jnz .no2000 |
||
114 | add [Year],100 |
||
115 | .no2000: |
||
135 | diamond | 116 | jmp upd ; здесь начинается выполнение программы |
117 | red: ; перерисовать окно |
||
31 | halyavin | 118 | |
3887 | leency | 119 | call draw_window |
31 | halyavin | 120 | |
135 | diamond | 121 | still: ; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ |
31 | halyavin | 122 | |
452 | heavyiron | 123 | mov eax,23 ; wait here for event |
124 | mov ebx,50 |
||
125 | mcall |
||
31 | halyavin | 126 | .evt: |
127 | mov ebp,[focus] |
||
135 | diamond | 128 | cmp eax,1 ; перерисовать окно ? |
129 | je red ; если да - на метку red |
||
130 | cmp eax,2 ; нажата клавиша ? |
||
131 | je key ; если да - на key |
||
132 | cmp eax,3 ; нажата кнопка ? |
||
133 | je button ; если да - на button |
||
31 | halyavin | 134 | |
452 | heavyiron | 135 | call draw_clock |
136 | |||
135 | diamond | 137 | jmp still ; если другое событие - в начало цикла |
31 | halyavin | 138 | |
135 | diamond | 139 | key: ; нажата клавиша на клавиатуре |
140 | mov eax,2 ; функция 2 - считать код символа |
||
452 | heavyiron | 141 | mcall ; вызов системы |
31 | halyavin | 142 | cmp ah,9 |
143 | jne no_tab |
||
144 | .tab: |
||
145 | cmp ebp,FOCUSABLE |
||
135 | diamond | 146 | je foc_cycle |
31 | halyavin | 147 | inc [focus] |
148 | upd: |
||
149 | call calculate |
||
150 | jmp red |
||
151 | foc_cycle: |
||
152 | mov [focus],2 |
||
153 | jmp upd |
||
154 | no_tab: |
||
155 | push eax |
||
156 | shr eax,8 |
||
157 | mov ecx,12 |
||
158 | mov edi,Fkeys |
||
159 | repne scasb |
||
160 | pop eax |
||
161 | jnz .noFkey |
||
162 | sub edi,Fkeys+1 |
||
163 | mov [Month],edi |
||
164 | jmp upd |
||
165 | .noFkey: |
||
166 | cmp ebp,4 |
||
167 | jne no_spinner |
||
168 | cmp ah,176 |
||
135 | diamond | 169 | je year_dec |
31 | halyavin | 170 | cmp ah,179 |
135 | diamond | 171 | je year_inc |
31 | halyavin | 172 | no_spinner: |
173 | cmp ebp,2 |
||
174 | jne .nomonth |
||
175 | cmp ah,177 |
||
135 | diamond | 176 | je noclose.drop |
31 | halyavin | 177 | jmp still |
178 | .nomonth: |
||
179 | cmp ebp,3 |
||
135 | diamond | 180 | je noy_up.year_evt |
31 | halyavin | 181 | cmp ebp,5 |
182 | jne still |
||
183 | mov ebx,[day_sel] |
||
135 | diamond | 184 | cmp ah,176 ; left arrow |
185 | jb still |
||
31 | halyavin | 186 | cmp ah,179 |
135 | diamond | 187 | ja still |
31 | halyavin | 188 | shr eax,8 |
189 | sub eax,176 |
||
190 | movsx ecx,byte[day_bounds+eax*2] |
||
191 | movzx eax,byte[day_bounds+eax*2+1] |
||
192 | add ecx,ebx |
||
193 | test eax,eax |
||
135 | diamond | 194 | jz .chk0 |
31 | halyavin | 195 | cmp ecx,eax |
135 | diamond | 196 | ja still |
31 | halyavin | 197 | .ok: |
198 | mov [day_sel],ecx |
||
199 | call draw_days |
||
135 | diamond | 200 | jmp still ; вернуться к началу цикла |
31 | halyavin | 201 | .chk0: |
202 | cmp ecx,eax |
||
203 | jle still |
||
204 | jmp .ok |
||
205 | |||
206 | day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right |
||
207 | |||
135 | diamond | 208 | button: ; нажата кнопка в окне программы |
209 | mov eax,17 ; 17 - получить идентификатор нажатой кнопки |
||
452 | heavyiron | 210 | mcall ; вызов системы |
31 | halyavin | 211 | movzx ebx,ah |
212 | cmp ah,200 |
||
213 | jbe nodayselect |
||
214 | sub ah,200 |
||
215 | mov byte[day_sel],ah |
||
216 | cmp ebp,5 |
||
217 | jne .redraw |
||
218 | call draw_days |
||
219 | jmp still |
||
220 | .redraw: |
||
221 | mov [focus],5 |
||
222 | jmp red |
||
223 | nodayselect: |
||
224 | cmp ah,100 |
||
135 | diamond | 225 | jb no_list |
31 | halyavin | 226 | sub ah,100 |
227 | mov byte[Month],ah |
||
228 | mov [focus],2 |
||
229 | jmp upd |
||
230 | no_list: |
||
135 | diamond | 231 | cmp ah,1 ; идентификатор == 1 ? |
232 | jne noclose ; если нет - иди вперёд на noclose |
||
31 | halyavin | 233 | close: |
135 | diamond | 234 | or eax,-1 ; выход из программы |
452 | heavyiron | 235 | mcall ; вызов системы |
31 | halyavin | 236 | |
237 | noclose: |
||
452 | heavyiron | 238 | |
239 | cmp ah,72 |
||
240 | je plus_he |
||
241 | |||
242 | cmp ah,73 |
||
243 | je plus_hd |
||
244 | |||
245 | cmp ah,74 |
||
246 | je minus_he |
||
247 | |||
248 | cmp ah,75 |
||
249 | je minus_hd |
||
250 | |||
251 | cmp ah,76 |
||
252 | je plus_me |
||
253 | |||
254 | cmp ah,77 |
||
255 | je plus_md |
||
256 | |||
257 | cmp ah,78 |
||
258 | je minus_me |
||
259 | |||
260 | cmp ah,79 |
||
261 | je minus_md |
||
262 | |||
263 | cmp ah,80 |
||
264 | je reset |
||
265 | |||
485 | heavyiron | 266 | cmp ah,81 |
267 | je set_date |
||
452 | heavyiron | 268 | |
135 | diamond | 269 | cmp ah,2 ; drop down list |
31 | halyavin | 270 | jne no_dropdn |
271 | .drop: |
||
272 | mov [focus],2 |
||
135 | diamond | 273 | cmp [dropped],al ; ==0 |
31 | halyavin | 274 | jne red |
275 | call draw_window |
||
276 | mov edx,1 shl 31+231 |
||
277 | mov ecx,31 |
||
278 | mov eax,8 |
||
279 | .bremove: |
||
452 | heavyiron | 280 | mcall |
31 | halyavin | 281 | dec edx |
282 | loop .bremove |
||
283 | call draw_dropdown |
||
284 | jmp still |
||
285 | no_dropdn: |
||
135 | diamond | 286 | cmp ah,3 ; year -1 |
31 | halyavin | 287 | jne noy_dn |
288 | year_dec: |
||
289 | dec [Year] |
||
290 | mov [focus],4 |
||
291 | jmp upd |
||
292 | noy_dn: |
||
135 | diamond | 293 | cmp ah,4 ; year+1 |
31 | halyavin | 294 | jne noy_up |
295 | year_inc: |
||
296 | inc [Year] |
||
297 | mov [focus],4 |
||
298 | jmp upd |
||
299 | noy_up: |
||
300 | cmp ah,5 |
||
301 | jne noy_click |
||
302 | mov [focus],3 |
||
303 | call draw_window |
||
304 | .still: |
||
305 | mcall 10 |
||
306 | cmp eax,2 |
||
307 | jne still.evt |
||
308 | mcall 2 |
||
309 | .year_evt: |
||
310 | mov ebx,10 |
||
311 | cmp ah,9 |
||
135 | diamond | 312 | je key.tab |
313 | cmp ah,8 ; backspace |
||
31 | halyavin | 314 | jne .nobsp |
315 | mov eax,[Year] |
||
316 | xor edx,edx |
||
317 | div ebx |
||
318 | .ch_year: |
||
319 | mov [Year],eax |
||
320 | call draw_year |
||
321 | jmp .still |
||
322 | .nobsp: |
||
135 | diamond | 323 | cmp ah,13 ; enter |
324 | je upd |
||
31 | halyavin | 325 | cmp ah,182 |
135 | diamond | 326 | jne .noclear ; del |
31 | halyavin | 327 | xor eax,eax |
328 | jmp .ch_year |
||
329 | .noclear: |
||
330 | cmp ah,48 |
||
135 | diamond | 331 | jb .still |
31 | halyavin | 332 | cmp ah,57 |
135 | diamond | 333 | ja .still |
31 | halyavin | 334 | cmp [Year],1000 |
335 | jae .still |
||
336 | shr eax,8 |
||
337 | lea ecx,[eax-48] |
||
338 | mov eax,[Year] |
||
339 | imul eax,ebx |
||
340 | add eax,ecx |
||
341 | jmp .ch_year |
||
342 | noy_click: |
||
343 | cmp ah,10 |
||
344 | jne start |
||
345 | xor [new_style],1 |
||
346 | jmp upd |
||
347 | |||
348 | |||
452 | heavyiron | 349 | reset: |
350 | |||
351 | mov eax,3 |
||
352 | mcall |
||
353 | mov ecx,eax |
||
354 | shl ecx,16 |
||
355 | shr ecx,16 |
||
356 | mov eax,22 |
||
357 | mov ebx,0x00000000 |
||
358 | mcall |
||
359 | |||
360 | jmp still |
||
361 | |||
362 | plus_hd: |
||
363 | |||
364 | mov eax,3 |
||
365 | mcall |
||
366 | mov ecx,eax |
||
367 | add ecx,1 |
||
368 | mov eax,22 |
||
369 | mov ebx,0x00000000 |
||
370 | mcall |
||
371 | |||
372 | jmp still |
||
373 | |||
374 | plus_he: |
||
375 | |||
376 | mov eax,3 |
||
377 | mcall |
||
378 | mov ecx,eax |
||
379 | add ecx,16 |
||
380 | mov eax,22 |
||
381 | mov ebx,0x00000000 |
||
382 | mcall |
||
383 | |||
384 | jmp still |
||
385 | |||
386 | minus_hd: |
||
387 | |||
388 | mov eax,3 |
||
389 | mcall |
||
390 | mov ecx,eax |
||
391 | sub ecx,1 |
||
392 | mov eax,22 |
||
393 | mov ebx,0x00000000 |
||
394 | mcall |
||
395 | |||
396 | jmp still |
||
397 | |||
398 | minus_he: |
||
399 | |||
400 | mov eax,3 |
||
401 | mcall |
||
402 | mov ecx,eax |
||
403 | sub ecx,16 |
||
404 | mov eax,22 |
||
405 | mov ebx,0x00000000 |
||
406 | mcall |
||
407 | |||
408 | jmp still |
||
409 | |||
410 | plus_md: |
||
411 | |||
412 | mov eax,3 |
||
413 | mcall |
||
414 | mov ecx,eax |
||
415 | add ecx,256 |
||
416 | mov eax,22 |
||
417 | mov ebx,0x00000000 |
||
418 | mcall |
||
419 | |||
420 | jmp still |
||
421 | |||
422 | plus_me: |
||
423 | |||
3887 | leency | 424 | mcall 3 |
452 | heavyiron | 425 | mov ecx,eax |
426 | add ecx,4096 |
||
3887 | leency | 427 | mcall 22,0x00000000 |
452 | heavyiron | 428 | jmp still |
429 | |||
430 | minus_md: |
||
431 | |||
3887 | leency | 432 | mcall 3 |
452 | heavyiron | 433 | mov ecx,eax |
434 | sub ecx,256 |
||
3887 | leency | 435 | mcall 22,0x00000000 |
452 | heavyiron | 436 | jmp still |
437 | |||
438 | minus_me: |
||
439 | |||
3887 | leency | 440 | mcall 3 |
452 | heavyiron | 441 | mov ecx,eax |
442 | sub ecx,4096 |
||
3887 | leency | 443 | mcall 22,0x00000000 |
452 | heavyiron | 444 | jmp still |
445 | |||
485 | heavyiron | 446 | set_date: |
447 | |||
448 | mov eax,0x00000000 |
||
449 | mov ebx,[day_sel] |
||
450 | call additem |
||
451 | shl eax,8 |
||
452 | mov ebx,[Month] |
||
453 | add ebx,1 |
||
454 | call additem |
||
455 | shl eax,8 |
||
456 | mov ebx,[Year] |
||
457 | call additem |
||
458 | mov ecx,eax |
||
459 | mov eax,22 |
||
460 | mov ebx,1 |
||
461 | mcall |
||
462 | |||
463 | jmp still |
||
464 | |||
465 | additem: |
||
466 | |||
467 | add eax,1 |
||
468 | daa |
||
469 | sub ebx,1 |
||
470 | cmp ebx,0 |
||
471 | jne additem |
||
472 | |||
473 | ret |
||
474 | |||
475 | |||
31 | halyavin | 476 | ; ********************************************* |
477 | ; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* |
||
478 | ; ********************************************* |
||
479 | |||
452 | heavyiron | 480 | draw_clock: |
481 | |||
3887 | leency | 482 | mcall 3 |
452 | heavyiron | 483 | mov ecx,eax |
3887 | leency | 484 | mcall 47,0x00020100, ,205*65536+280,0x50000000,COL_WINDOW_BG |
452 | heavyiron | 485 | |
486 | shr ecx,8 |
||
487 | add edx,20*65536 |
||
488 | mcall |
||
489 | |||
490 | shr ecx,8 |
||
491 | add edx,20*65536 |
||
492 | mcall |
||
493 | ret |
||
494 | |||
31 | halyavin | 495 | draw_window: |
496 | |||
3887 | leency | 497 | mcall 12,1 ; функция 12: сообщить ОС об отрисовке окна |
498 | xor eax,eax ; функция 0 : определить и отрисовать окно |
||
31 | halyavin | 499 | mov ebx,WIN_X |
500 | mov ecx,WIN_Y-15 |
||
3887 | leency | 501 | mov edx,COL_WINDOW_BG ; цвет рабочей области RRGGBB,8->color gl |
485 | heavyiron | 502 | mov edi,title ; заголовок |
452 | heavyiron | 503 | mcall |
31 | halyavin | 504 | call draw_week |
505 | |||
3887 | leency | 506 | mcall 8,205*65536+7,290*65536+10,72,COL_TIME_BUTTONS |
452 | heavyiron | 507 | |
508 | mov ebx,212*65536+7 |
||
509 | inc edx |
||
510 | mcall |
||
511 | |||
512 | mov ebx,205*65536+7 |
||
513 | mov ecx,300*65536+10 |
||
514 | inc edx |
||
515 | mcall |
||
516 | |||
517 | mov ebx,212*65536+7 |
||
518 | inc edx |
||
519 | mcall |
||
520 | |||
521 | mov ebx,224*65536+7 |
||
522 | mov ecx,290*65536+10 |
||
523 | inc edx |
||
524 | mcall |
||
525 | |||
526 | mov ebx,231*65536+7 |
||
527 | inc edx |
||
528 | mcall |
||
529 | |||
530 | mov ebx,224*65536+7 |
||
531 | mov ecx,300*65536+10 |
||
532 | inc edx |
||
533 | mcall |
||
534 | |||
535 | mov ebx,231*65536+7 |
||
536 | inc edx |
||
537 | mcall |
||
538 | |||
539 | mov ebx,243*65536+14 |
||
540 | mov ecx,290*65536+20 |
||
541 | inc edx |
||
542 | mcall |
||
543 | |||
3887 | leency | 544 | mov ebx,14*65536+110 |
545 | mov ecx,285*65536+22 |
||
485 | heavyiron | 546 | mov esi,0x00d5d5d5 |
547 | inc edx |
||
548 | mcall |
||
549 | |||
3887 | leency | 550 | mov esi,COL_MONTH_YEAR_B |
31 | halyavin | 551 | mov edx,10 |
135 | diamond | 552 | or edx,1 shl 29+1 shl 30 |
31 | halyavin | 553 | mov ebx,B_NS_X |
554 | mov ecx,B_NS_Y |
||
452 | heavyiron | 555 | mcall |
31 | halyavin | 556 | add edx,1-1 shl 29 |
557 | mov ebx,B_TODAY_X+8*(today_end-today_msg) |
||
558 | mov ecx,B_TODAY_Y |
||
452 | heavyiron | 559 | mcall |
31 | halyavin | 560 | mov ecx,B_Y |
561 | mov ebx,B_MONTH_X |
||
562 | mov edx,2 |
||
452 | heavyiron | 563 | mcall |
31 | halyavin | 564 | mov ebx,B_SPIN_X |
565 | inc edx |
||
452 | heavyiron | 566 | mcall |
31 | halyavin | 567 | add ebx,B_SPIN_WIDTH shl 16 |
568 | inc edx |
||
452 | heavyiron | 569 | mcall |
31 | halyavin | 570 | call draw_days |
571 | |||
3887 | leency | 572 | ; функция 4 : написать в окне текст |
573 | mcall 4,162*65536+280,0x800000ff,sys_text |
||
574 | mcall ,180*65536+302,0x800000ff,minus |
||
575 | mcall ,180*65536+292,0x80ff0000,plus |
||
576 | mcall , 24*65536+292,0x00000000,set_date_t,15 ;set date text |
||
452 | heavyiron | 577 | |
135 | diamond | 578 | mov ecx,0x10ddeeff ; шрифт 1 и цвет ( 0xF0RRGGBB ) |
31 | halyavin | 579 | |
580 | mov edx,n_style |
||
581 | mov esi,ns_end-n_style |
||
582 | mov ebx,B_NS |
||
583 | cmp [new_style],1 |
||
135 | diamond | 584 | je .high |
31 | halyavin | 585 | mov ecx,0xa0a0a0 |
586 | jmp .int |
||
587 | .high: |
||
3887 | leency | 588 | mov ecx,COL_NEW_STYLE_T |
31 | halyavin | 589 | .int: |
452 | heavyiron | 590 | mcall |
31 | halyavin | 591 | |
3887 | leency | 592 | mov ecx,COL_GO_TODAY_T |
31 | halyavin | 593 | mov edx,today_msg |
594 | mov ebx,B_TODAY |
||
595 | mov esi,today_end-today_msg |
||
452 | heavyiron | 596 | mcall |
31 | halyavin | 597 | |
598 | mov ebx,B_SPIN |
||
599 | mov edx,spinner |
||
600 | mov esi,3 |
||
601 | ShowFocus 4 |
||
452 | heavyiron | 602 | mcall |
31 | halyavin | 603 | |
604 | mov edx,[Month] |
||
605 | movzx esi,byte[month_name] |
||
606 | imul edx,esi |
||
607 | add edx,month_name+1 |
||
608 | mov ebx,B_MONTH |
||
609 | ShowFocus 2 |
||
452 | heavyiron | 610 | mcall |
31 | halyavin | 611 | |
612 | call draw_year |
||
613 | mov [dropped],0 |
||
3887 | leency | 614 | mcall 12,2 |
135 | diamond | 615 | ret ; выходим из процедуры |
31 | halyavin | 616 | |
617 | draw_year: |
||
3887 | leency | 618 | mcall 8,B_YEAR_X,B_Y,5,COL_MONTH_YEAR_B |
31 | halyavin | 619 | ShowFocus 3,esi |
620 | mcall 47,0x40001,Year,B_YEAR |
||
621 | ret |
||
622 | |||
623 | draw_dropdown: |
||
624 | mov [dropped],1 |
||
625 | push [Month] |
||
626 | pop [focus] |
||
627 | add [focus],100 |
||
628 | mov ecx,12 |
||
629 | mov edx,100 |
||
630 | push dword month_name+1 |
||
631 | push dword B_DROP |
||
632 | push dword B_Y+16 shl 16 |
||
633 | .ddd_loop: |
||
634 | mov edi,edx |
||
635 | push ecx |
||
636 | mov ebx,B_MONTH_X |
||
637 | mov ecx,[esp+4] |
||
638 | mov esi,0x6f9fef |
||
639 | mov eax,8 |
||
452 | heavyiron | 640 | mcall |
31 | halyavin | 641 | shr eax,1 |
642 | mov ebx,[esp+8] |
||
643 | xchg edx,[esp+12] |
||
644 | movzx esi,byte[month_name] |
||
645 | ShowFocus edi |
||
452 | heavyiron | 646 | mcall |
31 | halyavin | 647 | add edx,esi |
648 | xchg edx,[esp+12] |
||
649 | add dword[esp+8],16 |
||
650 | add dword[esp+4],16 shl 16 |
||
651 | inc edx |
||
652 | pop ecx |
||
653 | loop .ddd_loop |
||
654 | add esp,12 |
||
655 | ret |
||
656 | |||
657 | draw_week: |
||
658 | mov eax,13 |
||
659 | mov ebx,B_WBAR_X |
||
660 | mov ecx,B_WBAR_Y |
||
3887 | leency | 661 | mov edx,COL_WEEKDAY_BG |
452 | heavyiron | 662 | mcall |
31 | halyavin | 663 | movzx esi,byte[week_days] |
664 | movzx edi,byte[week_days+1] |
||
665 | mov ebx,B_WEEK |
||
666 | mov ecx,7 |
||
667 | mov edx,week_days+2 |
||
668 | mov eax,4 |
||
669 | .week: |
||
670 | push ecx |
||
671 | cmp ecx,edi |
||
135 | diamond | 672 | je .holiday |
31 | halyavin | 673 | mov ecx,0x10000000 |
674 | jmp .noholiday |
||
675 | .holiday: |
||
676 | mov ecx,0x10cc1010 |
||
677 | .noholiday: |
||
452 | heavyiron | 678 | mcall |
31 | halyavin | 679 | add edx,esi |
680 | add ebx,B_WX_SHIFT |
||
681 | pop ecx |
||
682 | loop .week |
||
683 | ret |
||
684 | |||
685 | draw_days: |
||
686 | mov eax,13 |
||
687 | mov ebx,B_DBAR_X |
||
688 | mov ecx,B_DBAR_Y |
||
3887 | leency | 689 | mov edx,COL_DATES_BG |
452 | heavyiron | 690 | mcall |
31 | halyavin | 691 | call count_days |
692 | cmp ecx,[day_sel] |
||
693 | jae .ok |
||
694 | mov [day_sel],ecx |
||
695 | .ok: |
||
696 | mov [number],0 |
||
697 | mov eax,47 |
||
698 | mov edx,B_DAYS_Y |
||
699 | mov ebx,0x20001 |
||
700 | mov edi,[firstday] |
||
701 | .dayloop: |
||
702 | push ecx |
||
703 | movzx edx,dx |
||
704 | mov esi,edi |
||
705 | shl esi,21 |
||
3887 | leency | 706 | lea edx,[edx+esi+29 shl 16] |
31 | halyavin | 707 | mov ecx,edi |
708 | add cl,[week_days+1] |
||
709 | cmp ecx,7 |
||
135 | diamond | 710 | je .holiday |
31 | halyavin | 711 | mov esi,0x10000000 |
712 | jmp .noholiday |
||
713 | .holiday: |
||
714 | mov esi,0x10cc1010 |
||
715 | .noholiday: |
||
716 | mov ecx,number |
||
717 | inc dword[ecx] |
||
718 | pusha |
||
719 | mov ebx,edx |
||
3887 | leency | 720 | mov bx,31 ; width |
721 | sub ebx,8 shl 16 |
||
31 | halyavin | 722 | shrd ecx,edx,16 |
3887 | leency | 723 | mov cx,29 ; height |
724 | sub ecx,12 shl 16 |
||
31 | halyavin | 725 | mov edx,[number] |
726 | cmp edx,[day_sel] |
||
135 | diamond | 727 | je .draw_sel |
3887 | leency | 728 | mov esi,COL_DATE_BUTTONS |
31 | halyavin | 729 | jmp .draw_but |
730 | .draw_sel: |
||
3887 | leency | 731 | mov esi,COL_DATE_CURRENT |
31 | halyavin | 732 | cmp [focus],5 |
733 | jne .draw_but |
||
3887 | leency | 734 | mov esi,COL_DATE_CHANGED |
31 | halyavin | 735 | .draw_but: |
736 | add edx,200+1 shl 29 |
||
737 | mov eax,8 |
||
452 | heavyiron | 738 | mcall |
31 | halyavin | 739 | popa |
452 | heavyiron | 740 | mcall |
3887 | leency | 741 | add edx,1 shl 16 |
742 | mcall |
||
743 | sub edx,1 shl 16 |
||
31 | halyavin | 744 | pop ecx |
745 | inc edi |
||
746 | cmp edi,7 |
||
747 | jne .nowrap |
||
748 | xor edi,edi |
||
749 | add dx,B_DAYS_SHIFT |
||
750 | .nowrap: |
||
751 | loop .eloop |
||
752 | jmp .ex |
||
753 | .eloop: |
||
754 | jmp .dayloop |
||
755 | .ex: |
||
756 | ret |
||
757 | |||
758 | count_days: ; ecx -days in month |
||
759 | call is_leap_year |
||
760 | mov ecx,[Month] |
||
761 | mov eax,1 |
||
762 | movzx ecx,byte[day_count+ecx] |
||
763 | add ecx,28 |
||
764 | cmp eax,[leap_year] |
||
765 | jne .noleap |
||
766 | cmp eax,[Month] |
||
767 | jne .noleap |
||
768 | inc ecx |
||
769 | .noleap: |
||
770 | mov [day_bounds+3],cl |
||
771 | mov [day_bounds+7],cl |
||
772 | ret |
||
773 | |||
774 | is_leap_year: |
||
775 | mov [leap_year],0 |
||
776 | mov eax,[Year] |
||
777 | mov bl,100 |
||
135 | diamond | 778 | div bl ; ah=Year mod 100, al=Year%100 |
31 | halyavin | 779 | test ah,ah |
135 | diamond | 780 | jz .century |
781 | shr ax,8 ; ax - last 2 digits |
||
31 | halyavin | 782 | .century: |
783 | test al,11b |
||
784 | jnz .noleap |
||
785 | inc [leap_year] |
||
786 | .noleap: |
||
787 | ret |
||
788 | |||
789 | calculate: |
||
790 | mov ebx,[Year] |
||
791 | mov eax,[Month] |
||
792 | sub eax,2 |
||
793 | jge .nojf |
||
794 | dec ebx |
||
795 | add eax,12 |
||
796 | .nojf: |
||
797 | add eax,4 |
||
798 | xor edx,edx |
||
799 | mov ecx,153 |
||
800 | imul cx |
||
801 | mov ecx,5 |
||
802 | div cx |
||
803 | inc eax |
||
804 | mov ecx,365 |
||
805 | imul ecx,ebx |
||
806 | add eax,ecx |
||
807 | mov ecx,ebx |
||
808 | shr ecx,2 |
||
809 | add eax,ecx |
||
810 | dec eax |
||
811 | cmp [new_style],0 |
||
135 | diamond | 812 | je .nonew |
31 | halyavin | 813 | add eax,2 |
814 | xchg eax,ebx |
||
815 | mov ecx,100 |
||
816 | xor edx,edx |
||
817 | div cx |
||
818 | sub ebx,eax |
||
819 | shr eax,2 |
||
820 | add ebx,eax |
||
821 | .nonew: |
||
822 | add ebx,5 |
||
823 | mov eax,ebx |
||
824 | xor edx,edx |
||
825 | movzx ebx,byte[week_days+1] |
||
826 | sub eax,ebx |
||
827 | inc eax |
||
828 | mov ebx,7 |
||
829 | div bx |
||
830 | mov [firstday],edx |
||
831 | ret |
||
832 | |||
135 | diamond | 833 | I_END: ; конец программы |
31 | halyavin | 834 | firstday dd ? |
835 | Year dd ? |
||
836 | Month dd ? |
||
837 | day_sel dd ? |
||
838 | all_days dd ? |
||
839 | |||
840 | datestr dd ? |
||
841 | leap_year dd ? |
||
135 | diamond | 842 | number dd ? |
3586 | fedesco | 843 | year_input dd ? |