Subversion Repositories Kolibri OS

Rev

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