Subversion Repositories Kolibri OS

Rev

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