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