Rev 551 | Rev 3887 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; CALENDAR FOR MENUET v1.0 |
2 | ; Written in pure assembler by Ivushkin Andrey aka Willow |
||
3 | ; |
||
4 | ; |
||
5 | ; Created: November 1, 2004 |
||
6 | ; Last changed: January 13, 2005 |
||
7 | ; |
||
8 | ; COMPILE WITH FASM |
||
9 | |||
10 | WIN_X equ (150 shl 16+270) |
||
452 | heavyiron | 11 | WIN_Y equ (100 shl 16+335) |
31 | halyavin | 12 | |
135 | diamond | 13 | LINE1 equ 27 shl 16+16 |
31 | halyavin | 14 | B_MONTH_X equ 10 shl 16+158 |
135 | diamond | 15 | B_Y equ LINE1 |
31 | halyavin | 16 | B_MONTH equ 63 shl 16+32 |
17 | |||
18 | B_WBAR_X equ 10 shl 16+250 |
||
19 | B_WBAR_Y equ 64 shl 16+20 |
||
135 | diamond | 20 | B_WEEK equ 30 shl 16+70 |
31 | halyavin | 21 | B_WX_SHIFT equ 32 shl 16 |
22 | |||
23 | B_DBAR_X equ B_WBAR_X |
||
24 | B_DBAR_Y equ 85 shl 16+190 |
||
25 | |||
135 | diamond | 26 | B_DROP equ B_MONTH+16 |
31 | halyavin | 27 | B_DAYS_Y equ 100 |
28 | B_DAYS_SHIFT equ 30 |
||
29 | |||
30 | B_YEAR_X equ 173 shl 16+58 |
||
135 | diamond | 31 | B_YEAR equ 188 shl 16+32 |
31 | halyavin | 32 | |
33 | B_TODAY_X equ 25 shl 16 |
||
34 | B_TODAY_Y equ 48 shl 16+10 |
||
35 | B_TODAY equ 30 shl 16+50 |
||
36 | |||
37 | B_SPIN_WIDTH equ 13 |
||
38 | B_SPIN_X equ 234 shl 16+B_SPIN_WIDTH |
||
135 | diamond | 39 | B_SPIN equ 238 shl 16+32 |
31 | halyavin | 40 | |
41 | B_DATE_X equ 26 shl 16+60 |
||
42 | B_DATE_Y equ 275 shl 16+16 |
||
43 | B_DATE_BSHIFT equ 80 shl 16 |
||
135 | diamond | 44 | B_DATE equ 32 shl 16+280 |
31 | halyavin | 45 | B_DATE_SHIFT equ 80 shl 16 |
46 | |||
135 | diamond | 47 | B_NS_X equ 185 shl 16+75 |
48 | B_NS_Y equ 48 shl 16+10 |
||
49 | B_NS equ 190 shl 16+50 |
||
31 | halyavin | 50 | |
51 | FOCUSABLE equ 5 |
||
135 | diamond | 52 | SKIP equ 1 |
31 | halyavin | 53 | |
135 | diamond | 54 | use32 ; включить 32-битный режим ассемблера |
31 | halyavin | 55 | |
135 | diamond | 56 | org 0x0 ; адресация с нуля |
31 | halyavin | 57 | |
135 | diamond | 58 | db 'MENUET01' ; 8-байтный идентификатор MenuetOS |
59 | dd 0x01 ; версия заголовка (всегда 1) |
||
60 | dd start ; адрес метки, с которой начинается выполнение программ |
||
61 | dd I_END ; размер программы |
||
62 | dd 0x1000 ; количество памяти |
||
63 | dd 0x1000 ; адрес вершины стэка |
||
64 | dd 0x0 ; адрес буфера для строки параметров (не используется) |
||
65 | dd 0x0 ; зарезервировано |
||
31 | halyavin | 66 | include 'lang.inc' |
485 | heavyiron | 67 | include '..\..\..\macros.inc' ; уменьшает размер программы |
31 | halyavin | 68 | |
69 | |||
485 | heavyiron | 70 | |
31 | halyavin | 71 | macro ShowFocus field,reg |
72 | { |
||
73 | local .nofocus, .exit |
||
74 | cmp [focus],field |
||
75 | jne .nofocus |
||
76 | if reg eq |
||
77 | mov ecx,0x10e7c750;0x10ddeeff |
||
78 | else |
||
79 | mov reg,0x10e7c750;0x10ddeeff |
||
80 | end if |
||
81 | jmp .exit |
||
82 | .nofocus: |
||
83 | if reg eq |
||
84 | mov ecx,0x10000000 |
||
85 | else |
||
86 | mov reg,0x10000000 |
||
87 | end if |
||
88 | .exit: |
||
89 | } |
||
90 | |||
91 | month_name: |
||
92 | if lang eq ru |
||
93 | db 8 |
||
94 | db 'Январь ' |
||
95 | db 'Февраль ' |
||
96 | db 'Март ' |
||
97 | db 'Апрель ' |
||
98 | db 'Май ' |
||
99 | db 'Июнь ' |
||
100 | db 'Июль ' |
||
101 | db 'Август ' |
||
102 | db 'Сентябрь' |
||
103 | db 'Октябрь ' |
||
104 | db 'Ноябрь ' |
||
105 | db 'Декабрь ' |
||
135 | diamond | 106 | else if lang eq de |
31 | halyavin | 107 | db 9 |
108 | db 'Januar ' |
||
109 | db 'Februar ' |
||
496 | diamond | 110 | db 'M┴rz ' |
31 | halyavin | 111 | db 'April ' |
112 | db 'Mai ' |
||
113 | db 'Juni ' |
||
114 | db 'Juli ' |
||
115 | db 'August ' |
||
116 | db 'September' |
||
117 | db 'Oktober ' |
||
118 | db 'November ' |
||
119 | db 'Dezember ' |
||
120 | else if lang eq fr |
||
121 | db 9 |
||
122 | db 'Janvier ' |
||
123 | db 'Fevrier ' |
||
124 | db 'Mars ' |
||
125 | db 'Avril ' |
||
126 | db 'Mai ' |
||
127 | db 'Juin ' |
||
128 | db 'Juliet ' |
||
129 | db 'Aout ' |
||
130 | db 'Septembre' |
||
131 | db 'Octobre ' |
||
132 | db 'Novembre ' |
||
133 | db 'Decembre ' |
||
134 | else if lang eq fi |
||
135 | db 9 |
||
136 | db 'Tammikuu ' |
||
137 | db 'Helmikuu ' |
||
138 | db 'Maaliskuu' |
||
139 | db 'Huhtikuu ' |
||
140 | db 'Toukokuu ' |
||
496 | diamond | 141 | db 'Kes┴kuu ' |
142 | db 'Hein┴kuu ' |
||
31 | halyavin | 143 | db 'Elokuu ' |
144 | db 'Syyskuu ' |
||
145 | db 'Lokakuu ' |
||
146 | db 'Marraskuu' |
||
147 | db 'Joulukuu ' |
||
299 | kaitz | 148 | else if lang eq et |
149 | db 9 |
||
150 | db 'Jaanuar ' |
||
151 | db 'Veebruar ' |
||
152 | db 'Mфrts ' |
||
153 | db 'Aprill ' |
||
154 | db 'Mai ' |
||
155 | db 'Juuni ' |
||
156 | db 'Juuli ' |
||
157 | db 'August ' |
||
158 | db 'September' |
||
159 | db 'Oktoober ' |
||
160 | db 'November ' |
||
161 | db 'Detsember' |
||
31 | halyavin | 162 | else |
163 | db 9 |
||
164 | db 'January ' |
||
165 | db 'February ' |
||
166 | db 'March ' |
||
167 | db 'April ' |
||
168 | db 'May ' |
||
169 | db 'June ' |
||
170 | db 'July ' |
||
171 | db 'August ' |
||
172 | db 'September' |
||
173 | db 'October ' |
||
174 | db 'November ' |
||
175 | db 'December ' |
||
176 | end if |
||
177 | spinner db '< >' |
||
178 | week_days: |
||
179 | if lang eq ru |
||
180 | db 2 |
||
181 | db 1 |
||
182 | db 'Пн' |
||
183 | db 'Вт' |
||
184 | db 'Ср' |
||
185 | db 'Чт' |
||
186 | db 'Пт' |
||
187 | db 'Сб' |
||
188 | db 'Вс' |
||
135 | diamond | 189 | else if lang eq de |
31 | halyavin | 190 | db 2 |
191 | db 7 |
||
192 | db 'So' |
||
193 | db 'Mo' |
||
194 | db 'Di' |
||
195 | db 'Mi' |
||
196 | db 'Do' |
||
197 | db 'Fr' |
||
198 | db 'Sa' |
||
199 | else if lang eq fr |
||
200 | db 3 |
||
201 | db 7 |
||
202 | db 'Dim' |
||
203 | db 'Lun' |
||
204 | db 'Mar' |
||
205 | db 'Mer' |
||
206 | db 'Jeu' |
||
207 | db 'Ven' |
||
208 | db 'Sam' |
||
209 | else if lang eq fi |
||
210 | db 2 |
||
211 | db 7 |
||
212 | db 'Su' |
||
213 | db 'Ma' |
||
214 | db 'Ti' |
||
215 | db 'Ke' |
||
216 | db 'To' |
||
217 | db 'Pe' |
||
218 | db 'La' |
||
299 | kaitz | 219 | else if lang eq et |
220 | db 3 |
||
221 | db 7 |
||
222 | db 'Esm' |
||
223 | db 'Tei' |
||
224 | db 'Kol' |
||
225 | db 'Nel' |
||
226 | db 'Ree' |
||
227 | db 'Lau' |
||
228 | db 'P№h' |
||
31 | halyavin | 229 | else |
230 | db 3 |
||
231 | db 7 |
||
232 | db 'Sun' |
||
233 | db 'Mon' |
||
234 | db 'Tue' |
||
235 | db 'Wen' |
||
236 | db 'Thi' |
||
237 | db 'Fri' |
||
238 | db 'Sat' |
||
239 | end if |
||
240 | |||
241 | str2int: |
||
242 | xor eax,eax |
||
243 | lodsb |
||
244 | mov ebx,eax |
||
245 | shr ebx,4 |
||
246 | and eax,0xf |
||
247 | imul ebx,10 |
||
248 | add al,bl |
||
249 | ret |
||
250 | |||
251 | start: |
||
252 | mcall 29 |
||
253 | mov [datestr],eax |
||
254 | mov esi,datestr |
||
255 | call str2int |
||
256 | add eax,1900 |
||
257 | mov [Year],eax |
||
258 | call str2int |
||
259 | dec eax |
||
260 | mov [Month],eax |
||
261 | call str2int |
||
262 | mov [day_sel],eax |
||
263 | test byte[esi],0 |
||
264 | jnz .no2000 |
||
265 | add [Year],100 |
||
266 | .no2000: |
||
135 | diamond | 267 | jmp upd ; здесь начинается выполнение программы |
268 | red: ; перерисовать окно |
||
31 | halyavin | 269 | |
135 | diamond | 270 | call draw_window ; вызываем процедуру отрисовки окна |
31 | halyavin | 271 | |
135 | diamond | 272 | still: ; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ |
31 | halyavin | 273 | |
452 | heavyiron | 274 | mov eax,23 ; wait here for event |
275 | mov ebx,50 |
||
276 | mcall |
||
31 | halyavin | 277 | .evt: |
278 | mov ebp,[focus] |
||
135 | diamond | 279 | cmp eax,1 ; перерисовать окно ? |
280 | je red ; если да - на метку red |
||
281 | cmp eax,2 ; нажата клавиша ? |
||
282 | je key ; если да - на key |
||
283 | cmp eax,3 ; нажата кнопка ? |
||
284 | je button ; если да - на button |
||
31 | halyavin | 285 | |
452 | heavyiron | 286 | call draw_clock |
287 | |||
135 | diamond | 288 | jmp still ; если другое событие - в начало цикла |
31 | halyavin | 289 | |
135 | diamond | 290 | key: ; нажата клавиша на клавиатуре |
291 | mov eax,2 ; функция 2 - считать код символа |
||
452 | heavyiron | 292 | mcall ; вызов системы |
31 | halyavin | 293 | cmp ah,9 |
294 | jne no_tab |
||
295 | .tab: |
||
296 | cmp ebp,FOCUSABLE |
||
135 | diamond | 297 | je foc_cycle |
31 | halyavin | 298 | inc [focus] |
299 | upd: |
||
300 | call calculate |
||
301 | jmp red |
||
302 | foc_cycle: |
||
303 | mov [focus],2 |
||
304 | jmp upd |
||
305 | no_tab: |
||
306 | push eax |
||
307 | shr eax,8 |
||
308 | mov ecx,12 |
||
309 | mov edi,Fkeys |
||
310 | repne scasb |
||
311 | pop eax |
||
312 | jnz .noFkey |
||
313 | sub edi,Fkeys+1 |
||
314 | mov [Month],edi |
||
315 | jmp upd |
||
316 | .noFkey: |
||
317 | cmp ebp,4 |
||
318 | jne no_spinner |
||
319 | cmp ah,176 |
||
135 | diamond | 320 | je year_dec |
31 | halyavin | 321 | cmp ah,179 |
135 | diamond | 322 | je year_inc |
31 | halyavin | 323 | no_spinner: |
324 | cmp ebp,2 |
||
325 | jne .nomonth |
||
326 | cmp ah,177 |
||
135 | diamond | 327 | je noclose.drop |
31 | halyavin | 328 | jmp still |
329 | .nomonth: |
||
330 | cmp ebp,3 |
||
135 | diamond | 331 | je noy_up.year_evt |
31 | halyavin | 332 | cmp ebp,5 |
333 | jne still |
||
334 | mov ebx,[day_sel] |
||
135 | diamond | 335 | cmp ah,176 ; left arrow |
336 | jb still |
||
31 | halyavin | 337 | cmp ah,179 |
135 | diamond | 338 | ja still |
31 | halyavin | 339 | shr eax,8 |
340 | sub eax,176 |
||
341 | movsx ecx,byte[day_bounds+eax*2] |
||
342 | movzx eax,byte[day_bounds+eax*2+1] |
||
343 | add ecx,ebx |
||
344 | test eax,eax |
||
135 | diamond | 345 | jz .chk0 |
31 | halyavin | 346 | cmp ecx,eax |
135 | diamond | 347 | ja still |
31 | halyavin | 348 | .ok: |
349 | mov [day_sel],ecx |
||
350 | call draw_days |
||
135 | diamond | 351 | jmp still ; вернуться к началу цикла |
31 | halyavin | 352 | .chk0: |
353 | cmp ecx,eax |
||
354 | jle still |
||
355 | jmp .ok |
||
356 | |||
357 | day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right |
||
358 | |||
135 | diamond | 359 | button: ; нажата кнопка в окне программы |
360 | mov eax,17 ; 17 - получить идентификатор нажатой кнопки |
||
452 | heavyiron | 361 | mcall ; вызов системы |
31 | halyavin | 362 | movzx ebx,ah |
363 | cmp ah,200 |
||
364 | jbe nodayselect |
||
365 | sub ah,200 |
||
366 | mov byte[day_sel],ah |
||
367 | cmp ebp,5 |
||
368 | jne .redraw |
||
369 | call draw_days |
||
370 | jmp still |
||
371 | .redraw: |
||
372 | mov [focus],5 |
||
373 | jmp red |
||
374 | nodayselect: |
||
375 | cmp ah,100 |
||
135 | diamond | 376 | jb no_list |
31 | halyavin | 377 | sub ah,100 |
378 | mov byte[Month],ah |
||
379 | mov [focus],2 |
||
380 | jmp upd |
||
381 | no_list: |
||
135 | diamond | 382 | cmp ah,1 ; идентификатор == 1 ? |
383 | jne noclose ; если нет - иди вперёд на noclose |
||
31 | halyavin | 384 | close: |
135 | diamond | 385 | or eax,-1 ; выход из программы |
452 | heavyiron | 386 | mcall ; вызов системы |
31 | halyavin | 387 | |
388 | noclose: |
||
452 | heavyiron | 389 | |
390 | cmp ah,72 |
||
391 | je plus_he |
||
392 | |||
393 | cmp ah,73 |
||
394 | je plus_hd |
||
395 | |||
396 | cmp ah,74 |
||
397 | je minus_he |
||
398 | |||
399 | cmp ah,75 |
||
400 | je minus_hd |
||
401 | |||
402 | cmp ah,76 |
||
403 | je plus_me |
||
404 | |||
405 | cmp ah,77 |
||
406 | je plus_md |
||
407 | |||
408 | cmp ah,78 |
||
409 | je minus_me |
||
410 | |||
411 | cmp ah,79 |
||
412 | je minus_md |
||
413 | |||
414 | cmp ah,80 |
||
415 | je reset |
||
416 | |||
485 | heavyiron | 417 | cmp ah,81 |
418 | je set_date |
||
452 | heavyiron | 419 | |
135 | diamond | 420 | cmp ah,2 ; drop down list |
31 | halyavin | 421 | jne no_dropdn |
422 | .drop: |
||
423 | mov [focus],2 |
||
135 | diamond | 424 | cmp [dropped],al ; ==0 |
31 | halyavin | 425 | jne red |
426 | call draw_window |
||
427 | mov edx,1 shl 31+231 |
||
428 | mov ecx,31 |
||
429 | mov eax,8 |
||
430 | .bremove: |
||
452 | heavyiron | 431 | mcall |
31 | halyavin | 432 | dec edx |
433 | loop .bremove |
||
434 | call draw_dropdown |
||
435 | jmp still |
||
436 | no_dropdn: |
||
135 | diamond | 437 | cmp ah,3 ; year -1 |
31 | halyavin | 438 | jne noy_dn |
439 | year_dec: |
||
440 | dec [Year] |
||
441 | mov [focus],4 |
||
442 | jmp upd |
||
443 | noy_dn: |
||
135 | diamond | 444 | cmp ah,4 ; year+1 |
31 | halyavin | 445 | jne noy_up |
446 | year_inc: |
||
447 | inc [Year] |
||
448 | mov [focus],4 |
||
449 | jmp upd |
||
450 | noy_up: |
||
451 | cmp ah,5 |
||
452 | jne noy_click |
||
453 | mov [focus],3 |
||
454 | call draw_window |
||
455 | .still: |
||
456 | mcall 10 |
||
457 | cmp eax,2 |
||
458 | jne still.evt |
||
459 | mcall 2 |
||
460 | .year_evt: |
||
461 | mov ebx,10 |
||
462 | cmp ah,9 |
||
135 | diamond | 463 | je key.tab |
464 | cmp ah,8 ; backspace |
||
31 | halyavin | 465 | jne .nobsp |
466 | mov eax,[Year] |
||
467 | xor edx,edx |
||
468 | div ebx |
||
469 | .ch_year: |
||
470 | mov [Year],eax |
||
471 | call draw_year |
||
472 | jmp .still |
||
473 | .nobsp: |
||
135 | diamond | 474 | cmp ah,13 ; enter |
475 | je upd |
||
31 | halyavin | 476 | cmp ah,182 |
135 | diamond | 477 | jne .noclear ; del |
31 | halyavin | 478 | xor eax,eax |
479 | jmp .ch_year |
||
480 | .noclear: |
||
481 | cmp ah,48 |
||
135 | diamond | 482 | jb .still |
31 | halyavin | 483 | cmp ah,57 |
135 | diamond | 484 | ja .still |
31 | halyavin | 485 | cmp [Year],1000 |
486 | jae .still |
||
487 | shr eax,8 |
||
488 | lea ecx,[eax-48] |
||
489 | mov eax,[Year] |
||
490 | imul eax,ebx |
||
491 | add eax,ecx |
||
492 | jmp .ch_year |
||
493 | noy_click: |
||
494 | cmp ah,10 |
||
495 | jne start |
||
496 | xor [new_style],1 |
||
497 | jmp upd |
||
498 | |||
499 | |||
452 | heavyiron | 500 | reset: |
501 | |||
502 | mov eax,3 |
||
503 | mcall |
||
504 | mov ecx,eax |
||
505 | shl ecx,16 |
||
506 | shr ecx,16 |
||
507 | mov eax,22 |
||
508 | mov ebx,0x00000000 |
||
509 | mcall |
||
510 | |||
511 | jmp still |
||
512 | |||
513 | plus_hd: |
||
514 | |||
515 | mov eax,3 |
||
516 | mcall |
||
517 | mov ecx,eax |
||
518 | add ecx,1 |
||
519 | mov eax,22 |
||
520 | mov ebx,0x00000000 |
||
521 | mcall |
||
522 | |||
523 | jmp still |
||
524 | |||
525 | plus_he: |
||
526 | |||
527 | mov eax,3 |
||
528 | mcall |
||
529 | mov ecx,eax |
||
530 | add ecx,16 |
||
531 | mov eax,22 |
||
532 | mov ebx,0x00000000 |
||
533 | mcall |
||
534 | |||
535 | jmp still |
||
536 | |||
537 | minus_hd: |
||
538 | |||
539 | mov eax,3 |
||
540 | mcall |
||
541 | mov ecx,eax |
||
542 | sub ecx,1 |
||
543 | mov eax,22 |
||
544 | mov ebx,0x00000000 |
||
545 | mcall |
||
546 | |||
547 | jmp still |
||
548 | |||
549 | minus_he: |
||
550 | |||
551 | mov eax,3 |
||
552 | mcall |
||
553 | mov ecx,eax |
||
554 | sub ecx,16 |
||
555 | mov eax,22 |
||
556 | mov ebx,0x00000000 |
||
557 | mcall |
||
558 | |||
559 | jmp still |
||
560 | |||
561 | plus_md: |
||
562 | |||
563 | mov eax,3 |
||
564 | mcall |
||
565 | mov ecx,eax |
||
566 | add ecx,256 |
||
567 | mov eax,22 |
||
568 | mov ebx,0x00000000 |
||
569 | mcall |
||
570 | |||
571 | jmp still |
||
572 | |||
573 | plus_me: |
||
574 | |||
575 | mov eax,3 |
||
576 | mcall |
||
577 | mov ecx,eax |
||
578 | add ecx,4096 |
||
579 | mov eax,22 |
||
580 | mov ebx,0x00000000 |
||
581 | mcall |
||
582 | |||
583 | jmp still |
||
584 | |||
585 | minus_md: |
||
586 | |||
587 | mov eax,3 |
||
588 | mcall |
||
589 | mov ecx,eax |
||
590 | sub ecx,256 |
||
591 | mov eax,22 |
||
592 | mov ebx,0x00000000 |
||
593 | mcall |
||
594 | |||
595 | jmp still |
||
596 | |||
597 | minus_me: |
||
598 | |||
599 | mov eax,3 |
||
600 | mcall |
||
601 | mov ecx,eax |
||
602 | sub ecx,4096 |
||
603 | mov eax,22 |
||
604 | mov ebx,0x00000000 |
||
605 | mcall |
||
606 | |||
607 | jmp still |
||
608 | |||
485 | heavyiron | 609 | set_date: |
610 | |||
611 | mov eax,0x00000000 |
||
612 | mov ebx,[day_sel] |
||
613 | call additem |
||
614 | shl eax,8 |
||
615 | mov ebx,[Month] |
||
616 | add ebx,1 |
||
617 | call additem |
||
618 | shl eax,8 |
||
619 | mov ebx,[Year] |
||
620 | call additem |
||
621 | mov ecx,eax |
||
622 | mov eax,22 |
||
623 | mov ebx,1 |
||
624 | mcall |
||
625 | |||
626 | jmp still |
||
627 | |||
628 | additem: |
||
629 | |||
630 | add eax,1 |
||
631 | daa |
||
632 | sub ebx,1 |
||
633 | cmp ebx,0 |
||
634 | jne additem |
||
635 | |||
636 | ret |
||
637 | |||
638 | |||
31 | halyavin | 639 | ; ********************************************* |
640 | ; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* |
||
641 | ; ********************************************* |
||
642 | |||
452 | heavyiron | 643 | draw_clock: |
644 | |||
645 | mov eax,3 |
||
646 | mcall |
||
647 | mov ecx,eax |
||
648 | mov eax,47 |
||
649 | mov esi,0x50000000 |
||
650 | mov edi,0xaabbcc |
||
651 | mov ebx,0x00020100 |
||
652 | mov edx,205*65536+280 |
||
653 | mcall |
||
654 | |||
655 | shr ecx,8 |
||
656 | add edx,20*65536 |
||
657 | mcall |
||
658 | |||
659 | shr ecx,8 |
||
660 | add edx,20*65536 |
||
661 | mcall |
||
662 | ret |
||
663 | |||
31 | halyavin | 664 | draw_window: |
665 | |||
452 | heavyiron | 666 | |
135 | diamond | 667 | mov eax,12 ; функция 12: сообщить ОС об отрисовке окна |
668 | mov ebx,1 ; 1 - начинаем рисовать |
||
452 | heavyiron | 669 | mcall |
135 | diamond | 670 | ; СОЗДАЁМ ОКНО |
671 | xor eax,eax ; функция 0 : определить и отрисовать окно |
||
31 | halyavin | 672 | mov ebx,WIN_X |
673 | if SKIP eq 0 |
||
674 | mov ecx,WIN_Y |
||
675 | else |
||
676 | mov ecx,WIN_Y-15 |
||
677 | end if |
||
551 | spraid | 678 | mov edx,0x14aabbcc ; цвет рабочей области RRGGBB,8->color gl |
485 | heavyiron | 679 | mov edi,title ; заголовок |
452 | heavyiron | 680 | mcall |
31 | halyavin | 681 | call draw_week |
682 | |||
683 | mov eax,8 |
||
452 | heavyiron | 684 | mov ebx,205*65536+7 |
685 | mov ecx,290*65536+10 |
||
686 | mov esi,0x005555dd |
||
687 | mov edx,72 |
||
688 | mcall |
||
689 | |||
690 | mov ebx,212*65536+7 |
||
691 | inc edx |
||
692 | mcall |
||
693 | |||
694 | mov ebx,205*65536+7 |
||
695 | mov ecx,300*65536+10 |
||
696 | inc edx |
||
697 | mcall |
||
698 | |||
699 | mov ebx,212*65536+7 |
||
700 | inc edx |
||
701 | mcall |
||
702 | |||
703 | mov ebx,224*65536+7 |
||
704 | mov ecx,290*65536+10 |
||
705 | inc edx |
||
706 | mcall |
||
707 | |||
708 | mov ebx,231*65536+7 |
||
709 | inc edx |
||
710 | mcall |
||
711 | |||
712 | mov ebx,224*65536+7 |
||
713 | mov ecx,300*65536+10 |
||
714 | inc edx |
||
715 | mcall |
||
716 | |||
717 | mov ebx,231*65536+7 |
||
718 | inc edx |
||
719 | mcall |
||
720 | |||
721 | mov ebx,243*65536+14 |
||
722 | mov ecx,290*65536+20 |
||
723 | mov esi,0x00dd7777 |
||
724 | inc edx |
||
725 | mcall |
||
726 | |||
485 | heavyiron | 727 | mov ebx,10*65536+100 |
728 | mov ecx,290*65536+20 |
||
729 | mov esi,0x00d5d5d5 |
||
730 | inc edx |
||
731 | mcall |
||
732 | |||
31 | halyavin | 733 | mov esi,0x05080d0 |
734 | if SKIP eq 0 |
||
735 | mov ebx,B_DATE_X |
||
736 | mov ecx,B_DATE_Y |
||
737 | mov edx,eax |
||
452 | heavyiron | 738 | mcall |
31 | halyavin | 739 | inc edx |
740 | add ebx,B_DATE_BSHIFT |
||
452 | heavyiron | 741 | mcall |
31 | halyavin | 742 | inc edx |
743 | else |
||
744 | mov edx,10 |
||
745 | end if |
||
135 | diamond | 746 | or edx,1 shl 29+1 shl 30 |
31 | halyavin | 747 | mov ebx,B_NS_X |
748 | mov ecx,B_NS_Y |
||
452 | heavyiron | 749 | mcall |
31 | halyavin | 750 | add edx,1-1 shl 29 |
751 | mov ebx,B_TODAY_X+8*(today_end-today_msg) |
||
752 | mov ecx,B_TODAY_Y |
||
452 | heavyiron | 753 | mcall |
31 | halyavin | 754 | mov ecx,B_Y |
755 | mov ebx,B_MONTH_X |
||
756 | mov edx,2 |
||
452 | heavyiron | 757 | mcall |
31 | halyavin | 758 | mov ebx,B_SPIN_X |
759 | inc edx |
||
452 | heavyiron | 760 | mcall |
31 | halyavin | 761 | add ebx,B_SPIN_WIDTH shl 16 |
762 | inc edx |
||
452 | heavyiron | 763 | mcall |
31 | halyavin | 764 | call draw_days |
765 | |||
135 | diamond | 766 | mov eax,4 ; функция 4 : написать в окне текст |
452 | heavyiron | 767 | mov ebx,110*65536+280 |
768 | mov ecx,0x800000ff |
||
769 | mov edx,sys_text |
||
770 | mcall |
||
771 | |||
772 | mov ebx,149*65536+302 |
||
773 | mov edx,minus |
||
774 | mcall |
||
775 | |||
776 | mov ebx,137*65536+292 |
||
777 | mov ecx,0x80ff0000 |
||
778 | mov edx,plus |
||
779 | mcall |
||
780 | |||
485 | heavyiron | 781 | mov ebx,15*65536+298 |
782 | mov ecx,0x00000000 |
||
783 | mov esi,15 |
||
784 | mov edx,setd |
||
785 | mcall |
||
452 | heavyiron | 786 | |
135 | diamond | 787 | mov ecx,0x10ddeeff ; шрифт 1 и цвет ( 0xF0RRGGBB ) |
31 | halyavin | 788 | |
789 | if SKIP eq 0 |
||
790 | mov ebx,B_DATE |
||
791 | mov edx,datebut |
||
792 | mov esi,9 |
||
793 | btc ecx,28 |
||
452 | heavyiron | 794 | mcall |
31 | halyavin | 795 | add ebx,B_DATE_SHIFT |
796 | add edx,esi |
||
452 | heavyiron | 797 | mcall |
31 | halyavin | 798 | end if |
799 | mov edx,n_style |
||
800 | mov esi,ns_end-n_style |
||
801 | mov ebx,B_NS |
||
802 | cmp [new_style],1 |
||
135 | diamond | 803 | je .high |
31 | halyavin | 804 | mov ecx,0xa0a0a0 |
805 | jmp .int |
||
806 | .high: |
||
807 | mov ecx,0xac0000;d048c8 |
||
808 | .int: |
||
452 | heavyiron | 809 | mcall |
31 | halyavin | 810 | |
811 | mov ecx,0xd048c8 |
||
812 | mov edx,today_msg |
||
813 | mov ebx,B_TODAY |
||
814 | mov esi,today_end-today_msg |
||
452 | heavyiron | 815 | mcall |
31 | halyavin | 816 | |
817 | mov ebx,B_SPIN |
||
818 | mov edx,spinner |
||
819 | mov esi,3 |
||
820 | ShowFocus 4 |
||
452 | heavyiron | 821 | mcall |
31 | halyavin | 822 | |
823 | mov edx,[Month] |
||
824 | movzx esi,byte[month_name] |
||
825 | imul edx,esi |
||
826 | add edx,month_name+1 |
||
827 | mov ebx,B_MONTH |
||
828 | ShowFocus 2 |
||
452 | heavyiron | 829 | mcall |
31 | halyavin | 830 | |
831 | call draw_year |
||
832 | mov [dropped],0 |
||
135 | diamond | 833 | mov eax,12 ; функция 12: сообщить ОС об отрисовке окна |
834 | mov ebx,2 ; 2, закончили рисовать |
||
452 | heavyiron | 835 | mcall |
135 | diamond | 836 | ret ; выходим из процедуры |
31 | halyavin | 837 | |
838 | draw_year: |
||
839 | mcall 8,B_YEAR_X,B_Y,5,0x05080d0 |
||
840 | ShowFocus 3,esi |
||
841 | mcall 47,0x40001,Year,B_YEAR |
||
842 | ret |
||
843 | |||
844 | draw_dropdown: |
||
845 | mov [dropped],1 |
||
846 | push [Month] |
||
847 | pop [focus] |
||
848 | add [focus],100 |
||
849 | mov ecx,12 |
||
850 | mov edx,100 |
||
851 | push dword month_name+1 |
||
852 | push dword B_DROP |
||
853 | push dword B_Y+16 shl 16 |
||
854 | .ddd_loop: |
||
855 | mov edi,edx |
||
856 | push ecx |
||
857 | mov ebx,B_MONTH_X |
||
858 | mov ecx,[esp+4] |
||
859 | mov esi,0x6f9fef |
||
860 | mov eax,8 |
||
452 | heavyiron | 861 | mcall |
31 | halyavin | 862 | shr eax,1 |
863 | mov ebx,[esp+8] |
||
864 | xchg edx,[esp+12] |
||
865 | movzx esi,byte[month_name] |
||
866 | ShowFocus edi |
||
452 | heavyiron | 867 | mcall |
31 | halyavin | 868 | add edx,esi |
869 | xchg edx,[esp+12] |
||
870 | add dword[esp+8],16 |
||
871 | add dword[esp+4],16 shl 16 |
||
872 | inc edx |
||
873 | pop ecx |
||
874 | loop .ddd_loop |
||
875 | add esp,12 |
||
876 | ret |
||
877 | |||
878 | draw_week: |
||
879 | mov eax,13 |
||
880 | mov ebx,B_WBAR_X |
||
881 | mov ecx,B_WBAR_Y |
||
882 | mov edx,0x90a0b0 |
||
452 | heavyiron | 883 | mcall |
31 | halyavin | 884 | movzx esi,byte[week_days] |
885 | movzx edi,byte[week_days+1] |
||
886 | mov ebx,B_WEEK |
||
887 | mov ecx,7 |
||
888 | mov edx,week_days+2 |
||
889 | mov eax,4 |
||
890 | .week: |
||
891 | push ecx |
||
892 | cmp ecx,edi |
||
135 | diamond | 893 | je .holiday |
31 | halyavin | 894 | mov ecx,0x10000000 |
895 | jmp .noholiday |
||
896 | .holiday: |
||
897 | mov ecx,0x10cc1010 |
||
898 | .noholiday: |
||
452 | heavyiron | 899 | mcall |
31 | halyavin | 900 | add edx,esi |
901 | add ebx,B_WX_SHIFT |
||
902 | pop ecx |
||
903 | loop .week |
||
904 | ret |
||
905 | |||
906 | draw_days: |
||
907 | mov eax,13 |
||
908 | mov ebx,B_DBAR_X |
||
909 | mov ecx,B_DBAR_Y |
||
910 | mov edx,0xe0e0e0 |
||
452 | heavyiron | 911 | mcall |
31 | halyavin | 912 | call count_days |
913 | cmp ecx,[day_sel] |
||
914 | jae .ok |
||
915 | mov [day_sel],ecx |
||
916 | .ok: |
||
917 | mov [number],0 |
||
918 | mov eax,47 |
||
919 | mov edx,B_DAYS_Y |
||
920 | mov ebx,0x20001 |
||
921 | mov edi,[firstday] |
||
922 | .dayloop: |
||
923 | push ecx |
||
924 | movzx edx,dx |
||
925 | mov esi,edi |
||
926 | shl esi,21 |
||
927 | lea edx,[edx+esi+30 shl 16] |
||
928 | mov ecx,edi |
||
929 | add cl,[week_days+1] |
||
930 | cmp ecx,7 |
||
135 | diamond | 931 | je .holiday |
31 | halyavin | 932 | mov esi,0x10000000 |
933 | jmp .noholiday |
||
934 | .holiday: |
||
935 | mov esi,0x10cc1010 |
||
936 | .noholiday: |
||
937 | mov ecx,number |
||
938 | inc dword[ecx] |
||
939 | pusha |
||
940 | mov ebx,edx |
||
941 | mov bx,20 |
||
942 | sub ebx,3 shl 16 |
||
943 | shrd ecx,edx,16 |
||
944 | mov cx,20 |
||
945 | sub ecx,7 shl 16 |
||
946 | mov edx,[number] |
||
947 | cmp edx,[day_sel] |
||
135 | diamond | 948 | je .draw_sel |
31 | halyavin | 949 | mov esi,0xe0e0e0 |
950 | jmp .draw_but |
||
951 | .draw_sel: |
||
952 | mov esi,0x5080d0 |
||
953 | cmp [focus],5 |
||
954 | jne .draw_but |
||
955 | mov esi,0xef7840;0xe26830 |
||
956 | .draw_but: |
||
957 | add edx,200+1 shl 29 |
||
958 | mov eax,8 |
||
452 | heavyiron | 959 | mcall |
31 | halyavin | 960 | popa |
452 | heavyiron | 961 | mcall |
31 | halyavin | 962 | pop ecx |
963 | inc edi |
||
964 | cmp edi,7 |
||
965 | jne .nowrap |
||
966 | xor edi,edi |
||
967 | add dx,B_DAYS_SHIFT |
||
968 | .nowrap: |
||
969 | loop .eloop |
||
970 | jmp .ex |
||
971 | .eloop: |
||
972 | jmp .dayloop |
||
973 | .ex: |
||
974 | ret |
||
975 | |||
976 | count_days: ; ecx -days in month |
||
977 | call is_leap_year |
||
978 | mov ecx,[Month] |
||
979 | mov eax,1 |
||
980 | movzx ecx,byte[day_count+ecx] |
||
981 | add ecx,28 |
||
982 | cmp eax,[leap_year] |
||
983 | jne .noleap |
||
984 | cmp eax,[Month] |
||
985 | jne .noleap |
||
986 | inc ecx |
||
987 | .noleap: |
||
988 | mov [day_bounds+3],cl |
||
989 | mov [day_bounds+7],cl |
||
990 | ret |
||
991 | |||
992 | is_leap_year: |
||
993 | mov [leap_year],0 |
||
994 | mov eax,[Year] |
||
995 | mov bl,100 |
||
135 | diamond | 996 | div bl ; ah=Year mod 100, al=Year%100 |
31 | halyavin | 997 | test ah,ah |
135 | diamond | 998 | jz .century |
999 | shr ax,8 ; ax - last 2 digits |
||
31 | halyavin | 1000 | .century: |
1001 | test al,11b |
||
1002 | jnz .noleap |
||
1003 | inc [leap_year] |
||
1004 | .noleap: |
||
1005 | ret |
||
1006 | |||
1007 | calculate: |
||
1008 | mov ebx,[Year] |
||
1009 | mov eax,[Month] |
||
1010 | sub eax,2 |
||
1011 | jge .nojf |
||
1012 | dec ebx |
||
1013 | add eax,12 |
||
1014 | .nojf: |
||
1015 | add eax,4 |
||
1016 | xor edx,edx |
||
1017 | mov ecx,153 |
||
1018 | imul cx |
||
1019 | mov ecx,5 |
||
1020 | div cx |
||
1021 | inc eax |
||
1022 | mov ecx,365 |
||
1023 | imul ecx,ebx |
||
1024 | add eax,ecx |
||
1025 | mov ecx,ebx |
||
1026 | shr ecx,2 |
||
1027 | add eax,ecx |
||
1028 | dec eax |
||
1029 | cmp [new_style],0 |
||
135 | diamond | 1030 | je .nonew |
31 | halyavin | 1031 | add eax,2 |
1032 | xchg eax,ebx |
||
1033 | mov ecx,100 |
||
1034 | xor edx,edx |
||
1035 | div cx |
||
1036 | sub ebx,eax |
||
1037 | shr eax,2 |
||
1038 | add ebx,eax |
||
1039 | .nonew: |
||
1040 | add ebx,5 |
||
1041 | mov eax,ebx |
||
1042 | xor edx,edx |
||
1043 | movzx ebx,byte[week_days+1] |
||
1044 | sub eax,ebx |
||
1045 | inc eax |
||
1046 | mov ebx,7 |
||
1047 | div bx |
||
1048 | mov [firstday],edx |
||
1049 | ret |
||
1050 | |||
1051 | ; Здесь находятся данные программы: |
||
1052 | |||
452 | heavyiron | 1053 | ; интерфейс программы многоязычный - задайте язык в lang.inc |
31 | halyavin | 1054 | day_count db 3,0,3,2,3,2,3,3,2,3,2,3 |
135 | diamond | 1055 | Fkeys db 210,211,212,213,214,215,216,217,208,209,228,159 |
31 | halyavin | 1056 | |
485 | heavyiron | 1057 | title: ; строка заголовка |
31 | halyavin | 1058 | if lang eq ru |
2221 | leency | 1059 | db 'Календарь',0 |
31 | halyavin | 1060 | else if lang eq ge |
2221 | leency | 1061 | db 'Kalender',0 |
31 | halyavin | 1062 | else if lang eq fr |
2221 | leency | 1063 | db 'Calendrier',0 |
299 | kaitz | 1064 | else if lang eq et |
2221 | leency | 1065 | db 'Kalender',0 |
31 | halyavin | 1066 | else |
2221 | leency | 1067 | db 'Calendar',0 |
31 | halyavin | 1068 | end if |
340 | heavyiron | 1069 | |
31 | halyavin | 1070 | if SKIP eq 0 |
1071 | datebut: |
||
1072 | if lang eq ru |
||
1073 | db '1-я дата ' |
||
1074 | db '2-я дата ' |
||
1075 | else if lang eq fr |
||
1076 | db '1ere date' |
||
1077 | db '2eme date' |
||
1078 | else if lang eq ge |
||
1079 | db ' Datum 1 ' |
||
1080 | db ' Datum 2 ' |
||
299 | kaitz | 1081 | else if lang eq et |
1082 | db 'Kuupфev 1' |
||
1083 | db 'Kuupфev 2' |
||
31 | halyavin | 1084 | else |
1085 | db '1st date ' |
||
1086 | db '2nd date ' |
||
1087 | end if |
||
1088 | end if |
||
1089 | n_style: |
||
1090 | if lang eq ru |
||
1091 | db 'Новый стиль' |
||
135 | diamond | 1092 | else if lang eq de |
1093 | db 'Neuer Stil' |
||
31 | halyavin | 1094 | else if lang eq fr |
1095 | db 'Nouveau' |
||
299 | kaitz | 1096 | else if lang eq et |
1097 | db 'Uus stiil' |
||
31 | halyavin | 1098 | else |
1099 | db 'New style' |
||
1100 | end if |
||
1101 | ns_end: |
||
1102 | today_msg: |
||
1103 | if lang eq ru |
||
1104 | db 'Сегодня' |
||
1105 | else if lang eq ge |
||
1106 | db 'Heute' |
||
1107 | else if lang eq fr |
||
1108 | db "Aujourd'hui" |
||
299 | kaitz | 1109 | else if lang eq et |
1110 | db 'Tфna' |
||
31 | halyavin | 1111 | else |
1112 | db 'Today' |
||
1113 | end if |
||
1114 | today_end: |
||
1115 | focus dd 3 |
||
1116 | new_style dd 1 |
||
1117 | dropped db 0 |
||
1118 | |||
452 | heavyiron | 1119 | sys_text: db 'системное время',0 |
1120 | plus: db 'добавить(+)',0 |
||
1121 | minus: db 'убрать(-)',0 |
||
485 | heavyiron | 1122 | setd: db 'Установить дату',0 |
452 | heavyiron | 1123 | |
135 | diamond | 1124 | I_END: ; конец программы |
31 | halyavin | 1125 | firstday dd ? |
1126 | Year dd ? |
||
1127 | Month dd ? |
||
1128 | day_sel dd ? |
||
1129 | all_days dd ? |
||
1130 | |||
1131 | datestr dd ? |
||
1132 | leap_year dd ? |
||
135 | diamond | 1133 | number dd ? |
485 | heavyiron | 1134 | year_input dd ?> |