Subversion Repositories Kolibri OS

Rev

Rev 135 | Rev 340 | 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)
11
WIN_Y equ (100 shl 16+300)
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'
67
include 'macros.inc' ; уменьшает размер программы
68
;include 'debug.inc'
69
 
70
 
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  '
110
     db   'M┴rz     '
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 '
141
     db   'Kes┴kuu  '
142
     db   'Hein┴kuu '
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
 
135 diamond 274
    mov  eax,10 	; функция 10 - ждать события
275
    int  0x40		; вызываем систему
31 halyavin 276
  .evt:
277
    mov  ebp,[focus]
135 diamond 278
    cmp  eax,1		; перерисовать окно ?
279
    je	 red		; если да - на метку red
280
    cmp  eax,2		; нажата клавиша ?
281
    je	 key		; если да - на key
282
    cmp  eax,3		; нажата кнопка ?
283
    je	 button 	; если да - на button
31 halyavin 284
 
135 diamond 285
    jmp  still		; если другое событие - в начало цикла
31 halyavin 286
 
135 diamond 287
  key:			; нажата клавиша на клавиатуре
288
    mov  eax,2		; функция 2 - считать код символа
289
    int  0x40		; вызов системы
31 halyavin 290
    cmp  ah,9
291
    jne  no_tab
292
  .tab:
293
    cmp  ebp,FOCUSABLE
135 diamond 294
    je	 foc_cycle
31 halyavin 295
    inc  [focus]
296
  upd:
297
    call calculate
298
    jmp  red
299
  foc_cycle:
300
    mov  [focus],2
301
    jmp  upd
302
  no_tab:
303
    push eax
304
    shr  eax,8
305
    mov  ecx,12
306
    mov  edi,Fkeys
307
    repne scasb
308
    pop  eax
309
    jnz  .noFkey
310
    sub  edi,Fkeys+1
311
    mov  [Month],edi
312
    jmp  upd
313
  .noFkey:
314
    cmp  ebp,4
315
    jne  no_spinner
316
    cmp  ah,176
135 diamond 317
    je	 year_dec
31 halyavin 318
    cmp  ah,179
135 diamond 319
    je	 year_inc
31 halyavin 320
  no_spinner:
321
    cmp  ebp,2
322
    jne  .nomonth
323
    cmp  ah,177
135 diamond 324
    je	 noclose.drop
31 halyavin 325
    jmp  still
326
  .nomonth:
327
    cmp  ebp,3
135 diamond 328
    je	 noy_up.year_evt
31 halyavin 329
    cmp  ebp,5
330
    jne  still
331
    mov  ebx,[day_sel]
135 diamond 332
    cmp  ah,176 	; left arrow
333
    jb	 still
31 halyavin 334
    cmp  ah,179
135 diamond 335
    ja	 still
31 halyavin 336
    shr  eax,8
337
    sub  eax,176
338
    movsx ecx,byte[day_bounds+eax*2]
339
    movzx eax,byte[day_bounds+eax*2+1]
340
    add  ecx,ebx
341
    test eax,eax
135 diamond 342
    jz	 .chk0
31 halyavin 343
    cmp  ecx,eax
135 diamond 344
    ja	 still
31 halyavin 345
  .ok:
346
    mov  [day_sel],ecx
347
    call draw_days
135 diamond 348
    jmp  still		; вернуться к началу цикла
31 halyavin 349
  .chk0:
350
    cmp  ecx,eax
351
    jle  still
352
    jmp  .ok
353
 
354
day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right
355
 
135 diamond 356
  button:		; нажата кнопка в окне программы
357
    mov  eax,17 	; 17 - получить идентификатор нажатой кнопки
358
    int  0x40		; вызов системы
31 halyavin 359
    movzx ebx,ah
360
    cmp  ah,200
361
    jbe  nodayselect
362
    sub  ah,200
363
    mov  byte[day_sel],ah
364
    cmp  ebp,5
365
    jne  .redraw
366
    call draw_days
367
    jmp  still
368
  .redraw:
369
    mov  [focus],5
370
    jmp  red
371
  nodayselect:
372
    cmp  ah,100
135 diamond 373
    jb	 no_list
31 halyavin 374
    sub  ah,100
375
    mov  byte[Month],ah
376
    mov  [focus],2
377
    jmp  upd
378
  no_list:
135 diamond 379
    cmp  ah,1		; идентификатор == 1 ?
380
    jne  noclose	; если нет - иди вперёд на noclose
31 halyavin 381
  close:
135 diamond 382
    or	 eax,-1 	; выход из программы
383
    int  0x40		; вызов системы
31 halyavin 384
 
385
  noclose:
135 diamond 386
    cmp  ah,2		; drop down list
31 halyavin 387
    jne  no_dropdn
388
  .drop:
389
    mov  [focus],2
135 diamond 390
    cmp  [dropped],al	; ==0
31 halyavin 391
    jne  red
392
    call draw_window
393
    mov  edx,1 shl 31+231
394
    mov  ecx,31
395
    mov  eax,8
396
  .bremove:
397
    int  0x40
398
    dec  edx
399
    loop .bremove
400
    call draw_dropdown
401
    jmp  still
402
  no_dropdn:
135 diamond 403
    cmp  ah,3		; year -1
31 halyavin 404
    jne  noy_dn
405
  year_dec:
406
    dec  [Year]
407
    mov  [focus],4
408
    jmp  upd
409
  noy_dn:
135 diamond 410
    cmp  ah,4		; year+1
31 halyavin 411
    jne  noy_up
412
  year_inc:
413
    inc  [Year]
414
    mov  [focus],4
415
    jmp  upd
416
  noy_up:
417
    cmp  ah,5
418
    jne  noy_click
419
    mov  [focus],3
420
    call draw_window
421
  .still:
422
    mcall 10
423
    cmp  eax,2
424
    jne  still.evt
425
    mcall 2
426
  .year_evt:
427
    mov  ebx,10
428
    cmp  ah,9
135 diamond 429
    je	 key.tab
430
    cmp  ah,8		; backspace
31 halyavin 431
    jne  .nobsp
432
    mov  eax,[Year]
433
    xor  edx,edx
434
    div  ebx
435
  .ch_year:
436
    mov  [Year],eax
437
    call draw_year
438
    jmp  .still
439
  .nobsp:
135 diamond 440
    cmp  ah,13		; enter
441
    je	 upd
31 halyavin 442
    cmp  ah,182
135 diamond 443
    jne  .noclear	; del
31 halyavin 444
    xor  eax,eax
445
    jmp  .ch_year
446
  .noclear:
447
    cmp  ah,48
135 diamond 448
    jb	 .still
31 halyavin 449
    cmp  ah,57
135 diamond 450
    ja	 .still
31 halyavin 451
    cmp  [Year],1000
452
    jae  .still
453
    shr  eax,8
454
    lea  ecx,[eax-48]
455
    mov  eax,[Year]
456
    imul eax,ebx
457
    add  eax,ecx
458
    jmp  .ch_year
459
  noy_click:
460
    cmp  ah,10
461
    jne  start
462
    xor  [new_style],1
463
    jmp  upd
464
 
465
 
466
;   *********************************************
467
;   *******  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА *******
468
;   *********************************************
469
 
470
draw_window:
471
 
135 diamond 472
    mov  eax,12 		   ; функция 12: сообщить ОС об отрисовке окна
473
    mov  ebx,1			   ; 1 - начинаем рисовать
31 halyavin 474
    int  0x40
135 diamond 475
				   ; СОЗДАЁМ ОКНО
476
    xor  eax,eax		   ; функция 0 : определить и отрисовать окно
31 halyavin 477
    mov  ebx,WIN_X
478
  if SKIP eq 0
479
    mov  ecx,WIN_Y
480
  else
481
    mov  ecx,WIN_Y-15
482
  end if
135 diamond 483
    mov  edx,0x03aabbcc 	   ; цвет рабочей области  RRGGBB,8->color gl
484
    mov  esi,0x805080d0 	   ; цвет полосы заголовка RRGGBB,8->color gl
485
    mov  edi,0x005080d0 	   ; цвет рамки            RRGGBB
31 halyavin 486
    int  0x40
487
    call draw_week
488
 
489
    mov  eax,8
490
    mov  esi,0x05080d0
491
  if SKIP eq 0
492
    mov  ebx,B_DATE_X
493
    mov  ecx,B_DATE_Y
494
    mov  edx,eax
495
    int  0x40
496
    inc  edx
497
    add  ebx,B_DATE_BSHIFT
498
    int  0x40
499
    inc  edx
500
  else
501
    mov  edx,10
502
  end if
135 diamond 503
    or	 edx,1 shl 29+1 shl 30
31 halyavin 504
    mov  ebx,B_NS_X
505
    mov  ecx,B_NS_Y
506
    int  0x40
507
    add  edx,1-1 shl 29
508
    mov  ebx,B_TODAY_X+8*(today_end-today_msg)
509
    mov  ecx,B_TODAY_Y
510
    int  0x40
511
    mov  ecx,B_Y
512
    mov  ebx,B_MONTH_X
513
    mov  edx,2
514
    int  0x40
515
    mov  ebx,B_SPIN_X
516
    inc  edx
517
    int  0x40
518
    add  ebx,B_SPIN_WIDTH shl 16
519
    inc  edx
520
    int  0x40
521
    call draw_days
522
 
135 diamond 523
				   ; ЗАГОЛОВОК ОКНА
524
    mov  eax,4			   ; функция 4 : написать в окне текст
525
    mov  ebx,8*65536+8		   ; [x] *65536 + [y]
526
    mov  ecx,0x10ddeeff 	   ; шрифт 1 и цвет ( 0xF0RRGGBB )
527
    mov  edx,zagolovok		   ; адрес строки
31 halyavin 528
    mov  esi,zag_konets-zagolovok  ; и её длина
529
    int  0x40
530
 
531
 if SKIP eq 0
532
    mov  ebx,B_DATE
533
    mov  edx,datebut
534
    mov  esi,9
535
    btc  ecx,28
536
    int  0x40
537
    add  ebx,B_DATE_SHIFT
538
    add  edx,esi
539
    int  0x40
540
 end if
541
    mov  edx,n_style
542
    mov  esi,ns_end-n_style
543
    mov  ebx,B_NS
544
    cmp  [new_style],1
135 diamond 545
    je	 .high
31 halyavin 546
    mov  ecx,0xa0a0a0
547
    jmp  .int
548
  .high:
549
    mov  ecx,0xac0000;d048c8
550
  .int:
551
    int  0x40
552
 
553
    mov  ecx,0xd048c8
554
    mov  edx,today_msg
555
    mov  ebx,B_TODAY
556
    mov  esi,today_end-today_msg
557
    int  0x40
558
 
559
    mov  ebx,B_SPIN
560
    mov  edx,spinner
561
    mov  esi,3
562
    ShowFocus 4
563
    int  0x40
564
 
565
    mov  edx,[Month]
566
    movzx  esi,byte[month_name]
567
    imul edx,esi
568
    add  edx,month_name+1
569
    mov  ebx,B_MONTH
570
    ShowFocus 2
571
    int  0x40
572
 
573
    call draw_year
574
    mov  [dropped],0
135 diamond 575
    mov  eax,12 		   ; функция 12: сообщить ОС об отрисовке окна
576
    mov  ebx,2			   ; 2, закончили рисовать
31 halyavin 577
    int  0x40
135 diamond 578
    ret 			   ; выходим из процедуры
31 halyavin 579
 
580
draw_year:
581
    mcall 8,B_YEAR_X,B_Y,5,0x05080d0
582
    ShowFocus 3,esi
583
    mcall 47,0x40001,Year,B_YEAR
584
    ret
585
 
586
draw_dropdown:
587
    mov  [dropped],1
588
    push [Month]
589
    pop  [focus]
590
    add  [focus],100
591
    mov  ecx,12
592
    mov  edx,100
593
    push dword month_name+1
594
    push dword B_DROP
595
    push dword B_Y+16 shl 16
596
  .ddd_loop:
597
    mov  edi,edx
598
    push ecx
599
    mov  ebx,B_MONTH_X
600
    mov  ecx,[esp+4]
601
    mov  esi,0x6f9fef
602
    mov  eax,8
603
    int  0x40
604
    shr  eax,1
605
    mov  ebx,[esp+8]
606
    xchg edx,[esp+12]
607
    movzx esi,byte[month_name]
608
    ShowFocus edi
609
    int  0x40
610
    add  edx,esi
611
    xchg edx,[esp+12]
612
    add  dword[esp+8],16
613
    add  dword[esp+4],16 shl 16
614
    inc  edx
615
    pop  ecx
616
    loop .ddd_loop
617
    add  esp,12
618
    ret
619
 
620
draw_week:
621
    mov  eax,13
622
    mov  ebx,B_WBAR_X
623
    mov  ecx,B_WBAR_Y
624
    mov  edx,0x90a0b0
625
    int  0x40
626
    movzx esi,byte[week_days]
627
    movzx edi,byte[week_days+1]
628
    mov  ebx,B_WEEK
629
    mov  ecx,7
630
    mov  edx,week_days+2
631
    mov  eax,4
632
  .week:
633
    push ecx
634
    cmp  ecx,edi
135 diamond 635
    je	 .holiday
31 halyavin 636
    mov  ecx,0x10000000
637
    jmp  .noholiday
638
  .holiday:
639
    mov  ecx,0x10cc1010
640
  .noholiday:
641
    int  0x40
642
    add  edx,esi
643
    add  ebx,B_WX_SHIFT
644
    pop  ecx
645
    loop .week
646
    ret
647
 
648
draw_days:
649
    mov  eax,13
650
    mov  ebx,B_DBAR_X
651
    mov  ecx,B_DBAR_Y
652
    mov  edx,0xe0e0e0
653
    int  0x40
654
    call count_days
655
    cmp  ecx,[day_sel]
656
    jae  .ok
657
    mov  [day_sel],ecx
658
  .ok:
659
    mov  [number],0
660
    mov  eax,47
661
    mov  edx,B_DAYS_Y
662
    mov  ebx,0x20001
663
    mov  edi,[firstday]
664
  .dayloop:
665
    push ecx
666
    movzx edx,dx
667
    mov  esi,edi
668
    shl  esi,21
669
    lea  edx,[edx+esi+30 shl 16]
670
    mov  ecx,edi
671
    add  cl,[week_days+1]
672
    cmp  ecx,7
135 diamond 673
    je	 .holiday
31 halyavin 674
    mov  esi,0x10000000
675
    jmp  .noholiday
676
  .holiday:
677
    mov  esi,0x10cc1010
678
  .noholiday:
679
    mov  ecx,number
680
    inc  dword[ecx]
681
    pusha
682
    mov  ebx,edx
683
    mov  bx,20
684
    sub  ebx,3 shl 16
685
    shrd ecx,edx,16
686
    mov  cx,20
687
    sub  ecx,7 shl 16
688
    mov  edx,[number]
689
    cmp  edx,[day_sel]
135 diamond 690
    je	 .draw_sel
31 halyavin 691
    mov  esi,0xe0e0e0
692
    jmp  .draw_but
693
  .draw_sel:
694
    mov  esi,0x5080d0
695
    cmp  [focus],5
696
    jne  .draw_but
697
    mov  esi,0xef7840;0xe26830
698
  .draw_but:
699
    add  edx,200+1 shl 29
700
    mov  eax,8
701
    int  0x40
702
    popa
703
    int  0x40
704
    pop  ecx
705
    inc  edi
706
    cmp  edi,7
707
    jne  .nowrap
708
    xor  edi,edi
709
    add  dx,B_DAYS_SHIFT
710
  .nowrap:
711
    loop .eloop
712
    jmp  .ex
713
  .eloop:
714
    jmp  .dayloop
715
  .ex:
716
    ret
717
 
718
count_days:    ; ecx -days in month
719
    call is_leap_year
720
    mov  ecx,[Month]
721
    mov  eax,1
722
    movzx ecx,byte[day_count+ecx]
723
    add  ecx,28
724
    cmp  eax,[leap_year]
725
    jne  .noleap
726
    cmp  eax,[Month]
727
    jne  .noleap
728
    inc  ecx
729
  .noleap:
730
    mov  [day_bounds+3],cl
731
    mov  [day_bounds+7],cl
732
    ret
733
 
734
is_leap_year:
735
    mov  [leap_year],0
736
    mov  eax,[Year]
737
    mov  bl,100
135 diamond 738
    div  bl	     ; ah=Year mod 100, al=Year%100
31 halyavin 739
    test ah,ah
135 diamond 740
    jz	.century
741
    shr  ax,8	     ; ax - last 2 digits
31 halyavin 742
  .century:
743
    test al,11b
744
    jnz  .noleap
745
    inc  [leap_year]
746
  .noleap:
747
    ret
748
 
749
calculate:
750
    mov  ebx,[Year]
751
    mov  eax,[Month]
752
    sub  eax,2
753
    jge  .nojf
754
    dec  ebx
755
    add  eax,12
756
  .nojf:
757
    add  eax,4
758
    xor  edx,edx
759
    mov  ecx,153
760
    imul cx
761
    mov  ecx,5
762
    div  cx
763
    inc  eax
764
    mov  ecx,365
765
    imul ecx,ebx
766
    add  eax,ecx
767
    mov  ecx,ebx
768
    shr  ecx,2
769
    add  eax,ecx
770
    dec  eax
771
    cmp  [new_style],0
135 diamond 772
    je	 .nonew
31 halyavin 773
    add  eax,2
774
    xchg eax,ebx
775
    mov  ecx,100
776
    xor  edx,edx
777
    div  cx
778
    sub  ebx,eax
779
    shr  eax,2
780
    add  ebx,eax
781
  .nonew:
782
    add  ebx,5
783
    mov  eax,ebx
784
    xor  edx,edx
785
    movzx ebx,byte[week_days+1]
786
    sub  eax,ebx
787
    inc  eax
788
    mov  ebx,7
789
    div  bx
790
    mov  [firstday],edx
791
    ret
792
 
793
; Здесь находятся данные программы:
794
 
795
; интерфейс программы двуязычный - задайте язык в macros.inc
796
day_count db 3,0,3,2,3,2,3,3,2,3,2,3
135 diamond 797
Fkeys	  db 210,211,212,213,214,215,216,217,208,209,228,159
31 halyavin 798
 
135 diamond 799
zagolovok:		 ; строка заголовка
31 halyavin 800
if lang eq ru
801
     db   'КАЛЕНДАРЬ'
802
else if lang eq ge
803
     db   'KALENDER'
804
else if lang eq fr
805
     db   'CALENDRIER'
299 kaitz 806
else if lang eq et
807
     db   'KALENDER'
31 halyavin 808
else
809
     db   'CALENDAR'
810
end if
135 diamond 811
zag_konets:		 ; и её конец
31 halyavin 812
if SKIP eq 0
813
datebut:
814
if lang eq ru
815
     db   '1-я дата '
816
     db   '2-я дата '
817
else if lang eq fr
818
     db   '1ere date'
819
     db   '2eme date'
820
else if lang eq ge
821
     db   ' Datum 1 '
822
     db   ' Datum 2 '
299 kaitz 823
else if lang eq et
824
     db   'Kuupфev 1'
825
     db   'Kuupфev 2'
31 halyavin 826
else
827
     db   '1st date '
828
     db   '2nd date '
829
end if
830
end if
831
n_style:
832
if lang eq ru
833
     db   'Новый стиль'
135 diamond 834
else if lang eq de
835
     db   'Neuer Stil'
31 halyavin 836
else if lang eq fr
837
     db   'Nouveau'
299 kaitz 838
else if lang eq et
839
     db   'Uus stiil'
31 halyavin 840
else
841
     db   'New style'
842
end if
843
ns_end:
844
today_msg:
845
if lang eq ru
846
     db   'Сегодня'
847
else if lang eq ge
848
     db   'Heute'
849
else if lang eq fr
850
     db   "Aujourd'hui"
299 kaitz 851
else if lang eq et
852
     db   'Tфna'
31 halyavin 853
else
854
     db   'Today'
855
end if
856
today_end:
857
focus dd  3
858
new_style dd 1
859
dropped db 0
860
 
135 diamond 861
I_END:	; конец программы
31 halyavin 862
firstday  dd ?
863
Year dd   ?
864
Month dd  ?
865
day_sel   dd ?
866
all_days  dd ?
867
 
868
datestr   dd  ?
869
leap_year dd ?
135 diamond 870
number	  dd ?
31 halyavin 871
year_input dd ?