Subversion Repositories Kolibri OS

Rev

Rev 452 | Rev 496 | 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  '
485 heavyiron 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 '
485 heavyiron 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
340 heavyiron 678
    mov  edx,0x13aabbcc 	   ; цвет рабочей области  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
340 heavyiron 1059
     db   'КАЛЕНДАРЬ',0
31 halyavin 1060
else if lang eq ge
340 heavyiron 1061
     db   'KALENDER',0
31 halyavin 1062
else if lang eq fr
340 heavyiron 1063
     db   'CALENDRIER',0
299 kaitz 1064
else if lang eq et
340 heavyiron 1065
     db   'KALENDER',0
31 halyavin 1066
else
340 heavyiron 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 ?