Subversion Repositories Kolibri OS

Rev

Rev 3887 | Rev 3890 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3887 leency 1
; Calendar for KolibriOS
31 halyavin 2
;
3889 leency 3
; v1.3 - code update, redesign by Leency
3887 leency 4
; v1.1 - add change time support by DedOK
5
; v1.0 - written in pure assembler by Ivushkin Andrey aka Willow
6
; also - diamond, spraid, fedesco
31 halyavin 7
;
3887 leency 8
; Created: November 1, 2004
31 halyavin 9
 
10
 
135 diamond 11
use32		     ; включить 32-битный режим ассемблера
31 halyavin 12
 
135 diamond 13
  org	 0x0	     ; адресация с нуля
31 halyavin 14
 
135 diamond 15
  db	 'MENUET01'  ; 8-байтный идентификатор MenuetOS
16
  dd	 0x01	     ; версия заголовка (всегда 1)
17
  dd	 start	     ; адрес метки, с которой начинается выполнение программ
18
  dd	 I_END	     ; размер программы
19
  dd	 0x1000      ; количество памяти
20
  dd	 0x1000      ; адрес вершины стэка
21
  dd	 0x0	     ; адрес буфера для строки параметров (не используется)
22
  dd	 0x0	     ; зарезервировано
31 halyavin 23
include 'lang.inc'
485 heavyiron 24
include '..\..\..\macros.inc' ; уменьшает размер программы
3887 leency 25
include 'data.inc'
31 halyavin 26
 
27
 
485 heavyiron 28
 
3889 leency 29
macro ShowFocus field,reg
31 halyavin 30
{
31
   local  .nofocus, .exit
32
     cmp  [focus],field
33
     jne  .nofocus
34
   if reg eq
35
     mov  ecx,0x10e7c750;0x10ddeeff
36
   else
37
     mov  reg,0x10e7c750;0x10ddeeff
38
   end if
39
     jmp  .exit
40
   .nofocus:
41
   if reg eq
3889 leency 42
     mov  ecx,COL_DROPDOWN_T
31 halyavin 43
   else
3889 leency 44
     mov  reg,COL_DROPDOWN_T
31 halyavin 45
   end if
46
   .exit:
47
}
48
 
3889 leency 49
macro GetSkinHeight
50
{
51
	mov  eax,48
52
	mov  ebx,4
53
	int 0x40
54
}
31 halyavin 55
 
3887 leency 56
 
31 halyavin 57
str2int:
58
    xor  eax,eax
59
    lodsb
60
    mov  ebx,eax
61
    shr  ebx,4
62
    and  eax,0xf
63
    imul ebx,10
64
    add  al,bl
65
    ret
66
 
67
start:
68
    mcall 29
69
    mov  [datestr],eax
70
    mov  esi,datestr
71
    call str2int
72
    add  eax,1900
73
    mov  [Year],eax
74
    call str2int
75
    dec  eax
76
    mov  [Month],eax
77
    call str2int
78
    mov  [day_sel],eax
79
    test byte[esi],0
80
    jnz  .no2000
81
    add  [Year],100
82
  .no2000:
135 diamond 83
    jmp  upd		; здесь начинается выполнение программы
84
red:			; перерисовать окно
31 halyavin 85
 
3887 leency 86
    call draw_window
31 halyavin 87
 
135 diamond 88
still:			; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ
31 halyavin 89
 
3889 leency 90
    mcall 23,50     ; wait here for event
31 halyavin 91
  .evt:
92
    mov  ebp,[focus]
135 diamond 93
    cmp  eax,1		; перерисовать окно ?
94
    je	 red		; если да - на метку red
95
    cmp  eax,2		; нажата клавиша ?
96
    je	 key		; если да - на key
97
    cmp  eax,3		; нажата кнопка ?
98
    je	 button 	; если да - на button
31 halyavin 99
 
452 heavyiron 100
    call draw_clock
101
 
135 diamond 102
    jmp  still		; если другое событие - в начало цикла
31 halyavin 103
 
3889 leency 104
  key:
105
    mcall 2		; get pressed key
31 halyavin 106
    cmp  ah,9
107
    jne  no_tab
108
  .tab:
109
    cmp  ebp,FOCUSABLE
135 diamond 110
    je	 foc_cycle
31 halyavin 111
    inc  [focus]
112
  upd:
113
    call calculate
114
    jmp  red
115
  foc_cycle:
116
    mov  [focus],2
117
    jmp  upd
118
  no_tab:
119
    push eax
120
    shr  eax,8
121
    mov  ecx,12
122
    mov  edi,Fkeys
123
    repne scasb
124
    pop  eax
125
    jnz  .noFkey
126
    sub  edi,Fkeys+1
127
    mov  [Month],edi
128
    jmp  upd
129
  .noFkey:
130
    cmp  ebp,4
131
    jne  no_spinner
132
    cmp  ah,176
135 diamond 133
    je	 year_dec
31 halyavin 134
    cmp  ah,179
135 diamond 135
    je	 year_inc
31 halyavin 136
  no_spinner:
137
    cmp  ebp,2
138
    jne  .nomonth
139
    cmp  ah,177
135 diamond 140
    je	 noclose.drop
31 halyavin 141
    jmp  still
142
  .nomonth:
143
    cmp  ebp,3
135 diamond 144
    je	 noy_up.year_evt
31 halyavin 145
    cmp  ebp,5
146
    jne  still
147
    mov  ebx,[day_sel]
135 diamond 148
    cmp  ah,176 	; left arrow
149
    jb	 still
31 halyavin 150
    cmp  ah,179
135 diamond 151
    ja	 still
31 halyavin 152
    shr  eax,8
153
    sub  eax,176
154
    movsx ecx,byte[day_bounds+eax*2]
155
    movzx eax,byte[day_bounds+eax*2+1]
156
    add  ecx,ebx
157
    test eax,eax
135 diamond 158
    jz	 .chk0
31 halyavin 159
    cmp  ecx,eax
135 diamond 160
    ja	 still
31 halyavin 161
  .ok:
162
    mov  [day_sel],ecx
163
    call draw_days
135 diamond 164
    jmp  still		; вернуться к началу цикла
31 halyavin 165
  .chk0:
166
    cmp  ecx,eax
167
    jle  still
168
    jmp  .ok
169
 
170
day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right
171
 
3889 leency 172
  button:
173
    mcall 17 	; 17 - получить идентификатор нажатой кнопки
31 halyavin 174
    movzx ebx,ah
175
    cmp  ah,200
176
    jbe  nodayselect
177
    sub  ah,200
178
    mov  byte[day_sel],ah
179
    cmp  ebp,5
180
    jne  .redraw
181
    call draw_days
182
    jmp  still
183
  .redraw:
184
    mov  [focus],5
185
    jmp  red
186
  nodayselect:
187
    cmp  ah,100
135 diamond 188
    jb	 no_list
31 halyavin 189
    sub  ah,100
190
    mov  byte[Month],ah
191
    mov  [focus],2
192
    jmp  upd
193
  no_list:
135 diamond 194
    cmp  ah,1		; идентификатор == 1 ?
195
    jne  noclose	; если нет - иди вперёд на noclose
31 halyavin 196
  close:
135 diamond 197
    or	 eax,-1 	; выход из программы
452 heavyiron 198
    mcall		; вызов системы
31 halyavin 199
 
200
  noclose:
452 heavyiron 201
 
202
    cmp  ah,72
203
    je	 plus_he
204
 
205
    cmp  ah,73
206
    je	 plus_hd
207
 
208
    cmp  ah,74
209
    je	 minus_he
210
 
211
    cmp  ah,75
212
    je	 minus_hd
213
 
214
    cmp  ah,76
215
    je	 plus_me
216
 
217
    cmp  ah,77
218
    je	 plus_md
219
 
220
    cmp  ah,78
221
    je	 minus_me
222
 
223
    cmp  ah,79
224
    je	 minus_md
225
 
226
    cmp  ah,80
227
    je	 reset
228
 
485 heavyiron 229
    cmp  ah,81
230
    je	 set_date
452 heavyiron 231
 
135 diamond 232
    cmp  ah,2		; drop down list
31 halyavin 233
    jne  no_dropdn
234
  .drop:
235
    mov  [focus],2
135 diamond 236
    cmp  [dropped],al	; ==0
31 halyavin 237
    jne  red
238
    call draw_window
239
    mov  edx,1 shl 31+231
240
    mov  ecx,31
241
    mov  eax,8
242
  .bremove:
452 heavyiron 243
    mcall
31 halyavin 244
    dec  edx
245
    loop .bremove
246
    call draw_dropdown
247
    jmp  still
248
  no_dropdn:
135 diamond 249
    cmp  ah,3		; year -1
31 halyavin 250
    jne  noy_dn
251
  year_dec:
252
    dec  [Year]
253
    mov  [focus],4
254
    jmp  upd
255
  noy_dn:
135 diamond 256
    cmp  ah,4		; year+1
31 halyavin 257
    jne  noy_up
258
  year_inc:
259
    inc  [Year]
260
    mov  [focus],4
261
    jmp  upd
262
  noy_up:
263
    cmp  ah,5
264
    jne  noy_click
265
    mov  [focus],3
266
    call draw_window
267
  .still:
268
    mcall 10
269
    cmp  eax,2
270
    jne  still.evt
271
    mcall 2
272
  .year_evt:
273
    mov  ebx,10
274
    cmp  ah,9
135 diamond 275
    je	 key.tab
276
    cmp  ah,8		; backspace
31 halyavin 277
    jne  .nobsp
278
    mov  eax,[Year]
279
    xor  edx,edx
280
    div  ebx
281
  .ch_year:
282
    mov  [Year],eax
283
    call draw_year
284
    jmp  .still
285
  .nobsp:
135 diamond 286
    cmp  ah,13		; enter
287
    je	 upd
31 halyavin 288
    cmp  ah,182
135 diamond 289
    jne  .noclear	; del
31 halyavin 290
    xor  eax,eax
291
    jmp  .ch_year
292
  .noclear:
293
    cmp  ah,48
135 diamond 294
    jb	 .still
31 halyavin 295
    cmp  ah,57
135 diamond 296
    ja	 .still
31 halyavin 297
    cmp  [Year],1000
298
    jae  .still
299
    shr  eax,8
300
    lea  ecx,[eax-48]
301
    mov  eax,[Year]
302
    imul eax,ebx
303
    add  eax,ecx
304
    jmp  .ch_year
305
  noy_click:
306
    cmp  ah,10
307
    jne  start
308
    xor  [new_style],1
309
    jmp  upd
310
 
311
 
452 heavyiron 312
reset:
313
 
314
    mov  eax,3
315
    mcall
316
    mov  ecx,eax
317
    shl  ecx,16
318
    shr  ecx,16
319
    mov  eax,22
320
    mov  ebx,0x00000000
321
    mcall
322
 
323
    jmp  still
324
 
325
plus_hd:
3889 leency 326
    mcall 3
452 heavyiron 327
    mov  ecx,eax
328
    add  ecx,1
329
    mov  eax,22
3889 leency 330
    mcall 22,0x00000000
452 heavyiron 331
    jmp  still
332
 
333
plus_he:
3889 leency 334
    mcall 3
452 heavyiron 335
    mov  ecx,eax
336
    add  ecx,16
3889 leency 337
    mcall 22,0x00000000
452 heavyiron 338
    jmp  still
339
 
340
minus_hd:
3889 leency 341
    mcall 3
452 heavyiron 342
    mov  ecx,eax
343
    sub  ecx,1
344
    mov  eax,22
345
    mov  ebx,0x00000000
346
    mcall
347
 
348
    jmp  still
349
 
350
minus_he:
351
 
352
    mov  eax,3
353
    mcall
354
    mov  ecx,eax
355
    sub  ecx,16
356
    mov  eax,22
357
    mov  ebx,0x00000000
358
    mcall
359
 
360
    jmp  still
361
 
362
plus_md:
363
 
364
    mov  eax,3
365
    mcall
366
    mov  ecx,eax
367
    add  ecx,256
368
    mov  eax,22
369
    mov  ebx,0x00000000
370
    mcall
371
 
372
    jmp  still
373
 
374
plus_me:
375
 
3887 leency 376
    mcall 3
452 heavyiron 377
    mov  ecx,eax
378
    add  ecx,4096
3887 leency 379
    mcall 22,0x00000000
452 heavyiron 380
    jmp  still
381
 
382
minus_md:
383
 
3887 leency 384
    mcall 3
452 heavyiron 385
    mov  ecx,eax
386
    sub  ecx,256
3887 leency 387
    mcall 22,0x00000000
452 heavyiron 388
    jmp  still
389
 
390
minus_me:
391
 
3887 leency 392
    mcall 3
452 heavyiron 393
    mov  ecx,eax
394
    sub  ecx,4096
3887 leency 395
    mcall 22,0x00000000
452 heavyiron 396
    jmp  still
397
 
485 heavyiron 398
set_date:
399
 
400
    mov  eax,0x00000000
401
    mov ebx,[day_sel]
402
    call additem
403
    shl  eax,8
404
    mov  ebx,[Month]
405
    add  ebx,1
406
    call additem
407
    shl  eax,8
408
    mov  ebx,[Year]
409
    call additem
410
    mov  ecx,eax
411
    mov  eax,22
412
    mov  ebx,1
413
    mcall
414
 
415
    jmp  still
416
 
417
additem:
418
 
419
    add  eax,1
420
    daa
421
    sub  ebx,1
422
    cmp  ebx,0
423
    jne  additem
424
 
425
    ret
426
 
427
 
31 halyavin 428
;   *********************************************
429
;   *******  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА *******
430
;   *********************************************
431
 
452 heavyiron 432
draw_clock:
433
 
3887 leency 434
    mcall 3
452 heavyiron 435
    mov  ecx,eax
3887 leency 436
    mcall 47,0x00020100, ,205*65536+280,0x50000000,COL_WINDOW_BG
452 heavyiron 437
 
438
    shr  ecx,8
439
    add  edx,20*65536
440
    mcall
441
 
442
    shr  ecx,8
443
    add  edx,20*65536
444
    mcall
445
    ret
446
 
31 halyavin 447
draw_window:
448
 
3889 leency 449
    mcall 12,1
450
    mcall 0,WIN_X,WIN_Y-15,COL_WINDOW_BG, ,title ; define window
451
	GetSkinHeight
452
	mov ecx, eax
453
	shl ecx, 16
454
	add ecx, 43
455
	mcall 13,B_WBAR_X, ,COL_TOOLBAR_BG ; draw toolbar background
31 halyavin 456
    call draw_week
457
 
3887 leency 458
    mcall 8,205*65536+7,290*65536+10,72,COL_TIME_BUTTONS
452 heavyiron 459
 
460
    mov  ebx,212*65536+7
461
    inc  edx
462
    mcall
463
 
464
    mov  ebx,205*65536+7
465
    mov  ecx,300*65536+10
466
    inc  edx
467
    mcall
468
 
469
    mov  ebx,212*65536+7
470
    inc  edx
471
    mcall
472
 
3889 leency 473
    mov  ebx,225*65536+7
452 heavyiron 474
    mov  ecx,290*65536+10
475
    inc  edx
476
    mcall
477
 
3889 leency 478
    mov  ebx,232*65536+7
452 heavyiron 479
    inc  edx
480
    mcall
481
 
3889 leency 482
    mov  ebx,225*65536+7
452 heavyiron 483
    mov  ecx,300*65536+10
484
    inc  edx
485
    mcall
486
 
3889 leency 487
    mov  ebx,232*65536+7
452 heavyiron 488
    inc  edx
489
    mcall
490
 
3889 leency 491
    mov  ebx,244*65536+14
452 heavyiron 492
    mov  ecx,290*65536+20
493
    inc  edx
494
    mcall
495
 
3887 leency 496
    mov  ebx,14*65536+110
497
    mov  ecx,285*65536+22
3889 leency 498
    mov  esi,COL_DATE_BUTTONS
485 heavyiron 499
    inc  edx
500
    mcall
501
 
3889 leency 502
    mov  esi,COL_MONTH_YEAR_B   ; new style
31 halyavin 503
    mov  edx,10
135 diamond 504
    or	 edx,1 shl 29+1 shl 30
31 halyavin 505
    mov  ebx,B_NS_X
506
    mov  ecx,B_NS_Y
452 heavyiron 507
    mcall
31 halyavin 508
    add  edx,1-1 shl 29
509
    mov  ebx,B_TODAY_X+8*(today_end-today_msg)
510
    mov  ecx,B_TODAY_Y
452 heavyiron 511
    mcall
31 halyavin 512
    mov  ecx,B_Y
513
    mov  ebx,B_MONTH_X
514
    mov  edx,2
452 heavyiron 515
    mcall
3889 leency 516
    mov  ebx,B_SPIN_X ; <
31 halyavin 517
    inc  edx
452 heavyiron 518
    mcall
3889 leency 519
    add  ebx,61 shl 16 ; >
31 halyavin 520
    inc  edx
452 heavyiron 521
    mcall
31 halyavin 522
    call draw_days
523
 
3887 leency 524
	; функция 4 : написать в окне текст
525
    mcall 4,162*65536+280,0x800000ff,sys_text
526
    mcall  ,180*65536+302,0x800000ff,minus
527
    mcall  ,180*65536+292,0x80ff0000,plus
528
    mcall  , 24*65536+292,0x00000000,set_date_t,15 ;set date text
452 heavyiron 529
 
135 diamond 530
    mov  ecx,0x10ddeeff 	   ; шрифт 1 и цвет ( 0xF0RRGGBB )
31 halyavin 531
 
532
    mov  edx,n_style
533
    mov  esi,ns_end-n_style
534
    mov  ebx,B_NS
535
    cmp  [new_style],1
135 diamond 536
    je	 .high
31 halyavin 537
    mov  ecx,0xa0a0a0
538
    jmp  .int
539
  .high:
3887 leency 540
    mov  ecx,COL_NEW_STYLE_T
31 halyavin 541
  .int:
452 heavyiron 542
    mcall
31 halyavin 543
 
3887 leency 544
    mov  ecx,COL_GO_TODAY_T
31 halyavin 545
    mov  edx,today_msg
546
    mov  ebx,B_TODAY
547
    mov  esi,today_end-today_msg
452 heavyiron 548
    mcall
31 halyavin 549
 
550
    mov  ebx,B_SPIN
551
    mov  edx,spinner
3889 leency 552
    mov  esi,12
31 halyavin 553
    ShowFocus 4
452 heavyiron 554
    mcall
31 halyavin 555
 
556
    mov  edx,[Month]
557
    movzx  esi,byte[month_name]
558
    imul edx,esi
559
    add  edx,month_name+1
560
    mov  ebx,B_MONTH
561
    ShowFocus 2
452 heavyiron 562
    mcall
31 halyavin 563
 
564
    call draw_year
565
    mov  [dropped],0
3887 leency 566
    mcall 12,2
3889 leency 567
    ret
31 halyavin 568
 
569
draw_year:
3887 leency 570
    mcall 8,B_YEAR_X,B_Y,5,COL_MONTH_YEAR_B
31 halyavin 571
    ShowFocus 3,esi
572
    mcall 47,0x40001,Year,B_YEAR
573
    ret
574
 
575
draw_dropdown:
576
    mov  [dropped],1
577
    push [Month]
578
    pop  [focus]
579
    add  [focus],100
580
    mov  ecx,12
581
    mov  edx,100
582
    push dword month_name+1
583
    push dword B_DROP
584
    push dword B_Y+16 shl 16
585
  .ddd_loop:
586
    mov  edi,edx
587
    push ecx
3889 leency 588
    mov  esi,COL_DROPDOWN_BG
589
    mcall 8,B_MONTH_X,[esp+4]
31 halyavin 590
    shr  eax,1
591
    mov  ebx,[esp+8]
592
    xchg edx,[esp+12]
593
    movzx esi,byte[month_name]
594
    ShowFocus edi
452 heavyiron 595
    mcall
31 halyavin 596
    add  edx,esi
597
    xchg edx,[esp+12]
598
    add  dword[esp+8],16
599
    add  dword[esp+4],16 shl 16
600
    inc  edx
601
    pop  ecx
602
    loop .ddd_loop
603
    add  esp,12
604
    ret
605
 
606
draw_week:
607
    mov  eax,13
608
    mov  ebx,B_WBAR_X
609
    mov  ecx,B_WBAR_Y
3887 leency 610
    mov  edx,COL_WEEKDAY_BG
452 heavyiron 611
    mcall
31 halyavin 612
    movzx esi,byte[week_days]
613
    movzx edi,byte[week_days+1]
614
    mov  ebx,B_WEEK
615
    mov  ecx,7
616
    mov  edx,week_days+2
617
    mov  eax,4
618
  .week:
619
    push ecx
620
    cmp  ecx,edi
135 diamond 621
    je	 .holiday
31 halyavin 622
    mov  ecx,0x10000000
623
    jmp  .noholiday
624
  .holiday:
625
    mov  ecx,0x10cc1010
626
  .noholiday:
452 heavyiron 627
    mcall
31 halyavin 628
    add  edx,esi
629
    add  ebx,B_WX_SHIFT
630
    pop  ecx
631
    loop .week
632
    ret
633
 
634
draw_days:
635
    call count_days
636
    cmp  ecx,[day_sel]
637
    jae  .ok
638
    mov  [day_sel],ecx
639
  .ok:
640
    mov  [number],0
641
    mov  eax,47
642
    mov  edx,B_DAYS_Y
3889 leency 643
    mov  ebx,0x10001
31 halyavin 644
    mov  edi,[firstday]
645
  .dayloop:
646
    push ecx
647
    movzx edx,dx
648
    mov  esi,edi
649
    shl  esi,21
3889 leency 650
    lea  edx,[edx+esi+34 shl 16]
31 halyavin 651
    mov  ecx,edi
652
    add  cl,[week_days+1]
653
    cmp  ecx,7
135 diamond 654
    je	 .holiday
3889 leency 655
    mov  esi,0x10000000 ; COL_DATE_TEXT
31 halyavin 656
    jmp  .noholiday
657
  .holiday:
658
    mov  esi,0x10cc1010
659
  .noholiday:
660
    mov  ecx,number
661
    inc  dword[ecx]
662
    pusha
663
    mov  ebx,edx
3887 leency 664
    mov  bx,31           ; width
665
    sub  ebx,8 shl 16
31 halyavin 666
    shrd ecx,edx,16
3887 leency 667
    mov  cx,29           ; height
668
    sub  ecx,12 shl 16
31 halyavin 669
    mov  edx,[number]
670
    cmp  edx,[day_sel]
135 diamond 671
    je	 .draw_sel
3887 leency 672
    mov  esi,COL_DATE_BUTTONS
31 halyavin 673
    jmp  .draw_but
674
  .draw_sel:
3887 leency 675
    mov  esi,COL_DATE_CURRENT
31 halyavin 676
    cmp  [focus],5
677
    jne  .draw_but
3887 leency 678
    mov  esi,COL_DATE_CHANGED
31 halyavin 679
  .draw_but:
680
    add  edx,200+1 shl 29
3889 leency 681
    mcall 8
682
	mov    eax, [number]
683
    xor    edx, edx
684
    mov    ecx, 10
685
    div    ecx
686
    mov    [remainder], edx
687
    mov    [quotient],  eax
688
	popa
689
 
690
	;first number
691
	mov ecx,quotient
692
    mcall
3887 leency 693
	add edx,1 shl 16
694
	mcall
695
	sub edx,1 shl 16
3889 leency 696
 
697
	;second number
698
	mov ecx,remainder
699
	add edx,9 shl 16
700
    mcall
701
	add edx,1 shl 16
702
	mcall
703
	sub edx,10 shl 16
704
 
705
 
31 halyavin 706
    pop  ecx
707
    inc  edi
708
    cmp  edi,7
709
    jne  .nowrap
710
    xor  edi,edi
711
    add  dx,B_DAYS_SHIFT
712
  .nowrap:
713
    loop .eloop
714
    jmp  .ex
715
  .eloop:
716
    jmp  .dayloop
717
  .ex:
718
    ret
719
 
720
count_days:    ; ecx -days in month
721
    call is_leap_year
722
    mov  ecx,[Month]
723
    mov  eax,1
724
    movzx ecx,byte[day_count+ecx]
725
    add  ecx,28
726
    cmp  eax,[leap_year]
727
    jne  .noleap
728
    cmp  eax,[Month]
729
    jne  .noleap
730
    inc  ecx
731
  .noleap:
732
    mov  [day_bounds+3],cl
733
    mov  [day_bounds+7],cl
734
    ret
735
 
736
is_leap_year:
737
    mov  [leap_year],0
738
    mov  eax,[Year]
739
    mov  bl,100
135 diamond 740
    div  bl	     ; ah=Year mod 100, al=Year%100
31 halyavin 741
    test ah,ah
135 diamond 742
    jz	.century
743
    shr  ax,8	     ; ax - last 2 digits
31 halyavin 744
  .century:
745
    test al,11b
746
    jnz  .noleap
747
    inc  [leap_year]
748
  .noleap:
749
    ret
750
 
751
calculate:
752
    mov  ebx,[Year]
753
    mov  eax,[Month]
754
    sub  eax,2
755
    jge  .nojf
756
    dec  ebx
757
    add  eax,12
758
  .nojf:
759
    add  eax,4
760
    xor  edx,edx
761
    mov  ecx,153
762
    imul cx
763
    mov  ecx,5
764
    div  cx
765
    inc  eax
766
    mov  ecx,365
767
    imul ecx,ebx
768
    add  eax,ecx
769
    mov  ecx,ebx
770
    shr  ecx,2
771
    add  eax,ecx
772
    dec  eax
773
    cmp  [new_style],0
135 diamond 774
    je	 .nonew
31 halyavin 775
    add  eax,2
776
    xchg eax,ebx
777
    mov  ecx,100
778
    xor  edx,edx
779
    div  cx
780
    sub  ebx,eax
781
    shr  eax,2
782
    add  ebx,eax
783
  .nonew:
784
    add  ebx,5
785
    mov  eax,ebx
786
    xor  edx,edx
787
    movzx ebx,byte[week_days+1]
788
    sub  eax,ebx
789
    inc  eax
790
    mov  ebx,7
791
    div  bx
792
    mov  [firstday],edx
793
    ret
794
 
3889 leency 795
I_END:
796
 
31 halyavin 797
firstday  dd ?
798
Year dd   ?
799
Month dd  ?
800
day_sel   dd ?
801
all_days  dd ?
802
 
803
datestr   dd  ?
804
leap_year dd ?
135 diamond 805
number	  dd ?
3586 fedesco 806
year_input dd ?