Subversion Repositories Kolibri OS

Rev

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