Subversion Repositories Kolibri OS

Rev

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