Subversion Repositories Kolibri OS

Rev

Rev 135 | Rev 340 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.  
  13. LINE1     equ 27 shl 16+16
  14. B_MONTH_X equ 10 shl 16+158
  15. B_Y       equ LINE1
  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
  20. B_WEEK    equ 30 shl 16+70
  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.  
  26. B_DROP    equ B_MONTH+16
  27. B_DAYS_Y  equ 100
  28. B_DAYS_SHIFT equ 30
  29.  
  30. B_YEAR_X  equ 173 shl 16+58
  31. B_YEAR    equ 188 shl 16+32
  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
  39. B_SPIN    equ 238 shl 16+32
  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
  44. B_DATE    equ 32 shl 16+280
  45. B_DATE_SHIFT equ 80 shl 16
  46.  
  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
  50.  
  51. FOCUSABLE equ 5
  52. SKIP      equ 1
  53.  
  54. use32                ; ¢ª«îç¨âì 32-¡¨â­ë© ०¨¬  áᥬ¡«¥à 
  55.  
  56.   org    0x0         ;  ¤à¥á æ¨ï á ­ã«ï
  57.  
  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         ; § à¥§¥à¢¨à®¢ ­®
  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   '„¥ª ¡àì '
  106. else if lang eq de
  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 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'
  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   '‚á'
  189. else if lang eq de
  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'
  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'
  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:
  267.     jmp  upd            ; §¤¥áì ­ ç¨­ ¥âáï ¢ë¯®«­¥­¨¥ ¯à®£à ¬¬ë
  268. red:                    ; ¯¥à¥à¨á®¢ âì ®ª­®
  269.  
  270.     call draw_window    ; ¢ë§ë¢ ¥¬ ¯à®æ¥¤ãàã ®âà¨á®¢ª¨ ®ª­ 
  271.  
  272. still:                  ; ƒ‹€‚›‰ –ˆŠ‹ Žƒ€ŒŒ›
  273.  
  274.     mov  eax,10         ; äã­ªæ¨ï 10 - ¦¤ âì ᮡëâ¨ï
  275.     int  0x40           ; ¢ë§ë¢ ¥¬ á¨á⥬ã
  276.   .evt:
  277.     mov  ebp,[focus]
  278.     cmp  eax,1          ; ¯¥à¥à¨á®¢ âì ®ª­® ?
  279.     je   red            ; ¥á«¨ ¤  - ­  ¬¥âªã red
  280.     cmp  eax,2          ; ­ ¦ â  ª« ¢¨è  ?
  281.     je   key            ; ¥á«¨ ¤  - ­  key
  282.     cmp  eax,3          ; ­ ¦ â  ª­®¯ª  ?
  283.     je   button         ; ¥á«¨ ¤  - ­  button
  284.  
  285.     jmp  still          ; ¥á«¨ ¤à㣮¥ ᮡë⨥ - ¢ ­ ç «® 横« 
  286.  
  287.   key:                  ; ­ ¦ â  ª« ¢¨è  ­  ª« ¢¨ âãà¥
  288.     mov  eax,2          ; äã­ªæ¨ï 2 - áç¨â âì ª®¤ ᨬ¢®« 
  289.     int  0x40           ; ¢ë§®¢ á¨á⥬ë
  290.     cmp  ah,9
  291.     jne  no_tab
  292.   .tab:
  293.     cmp  ebp,FOCUSABLE
  294.     je   foc_cycle
  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
  317.     je   year_dec
  318.     cmp  ah,179
  319.     je   year_inc
  320.   no_spinner:
  321.     cmp  ebp,2
  322.     jne  .nomonth
  323.     cmp  ah,177
  324.     je   noclose.drop
  325.     jmp  still
  326.   .nomonth:
  327.     cmp  ebp,3
  328.     je   noy_up.year_evt
  329.     cmp  ebp,5
  330.     jne  still
  331.     mov  ebx,[day_sel]
  332.     cmp  ah,176         ; left arrow
  333.     jb   still
  334.     cmp  ah,179
  335.     ja   still
  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
  342.     jz   .chk0
  343.     cmp  ecx,eax
  344.     ja   still
  345.   .ok:
  346.     mov  [day_sel],ecx
  347.     call draw_days
  348.     jmp  still          ; ¢¥à­ãâìáï ª ­ ç «ã 横« 
  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.  
  356.   button:               ; ­ ¦ â  ª­®¯ª  ¢ ®ª­¥ ¯à®£à ¬¬ë
  357.     mov  eax,17         ; 17 - ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  358.     int  0x40           ; ¢ë§®¢ á¨á⥬ë
  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
  373.     jb   no_list
  374.     sub  ah,100
  375.     mov  byte[Month],ah
  376.     mov  [focus],2
  377.     jmp  upd
  378.   no_list:
  379.     cmp  ah,1           ; ¨¤¥­â¨ä¨ª â®à == 1 ?
  380.     jne  noclose        ; ¥á«¨ ­¥â - ¨¤¨ ¢¯¥àñ¤ ­  noclose
  381.   close:
  382.     or   eax,-1         ; ¢ë室 ¨§ ¯à®£à ¬¬ë
  383.     int  0x40           ; ¢ë§®¢ á¨á⥬ë
  384.  
  385.   noclose:
  386.     cmp  ah,2           ; drop down list
  387.     jne  no_dropdn
  388.   .drop:
  389.     mov  [focus],2
  390.     cmp  [dropped],al   ; ==0
  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:
  403.     cmp  ah,3           ; year -1
  404.     jne  noy_dn
  405.   year_dec:
  406.     dec  [Year]
  407.     mov  [focus],4
  408.     jmp  upd
  409.   noy_dn:
  410.     cmp  ah,4           ; year+1
  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
  429.     je   key.tab
  430.     cmp  ah,8           ; backspace
  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:
  440.     cmp  ah,13          ; enter
  441.     je   upd
  442.     cmp  ah,182
  443.     jne  .noclear       ; del
  444.     xor  eax,eax
  445.     jmp  .ch_year
  446.   .noclear:
  447.     cmp  ah,48
  448.     jb   .still
  449.     cmp  ah,57
  450.     ja   .still
  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.  
  472.     mov  eax,12                    ; äã­ªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª­ 
  473.     mov  ebx,1                     ; 1 - ­ ç¨­ ¥¬ à¨á®¢ âì
  474.     int  0x40
  475.                                    ; ‘Ž‡„€ðŒ ŽŠŽ
  476.     xor  eax,eax                   ; äã­ªæ¨ï 0 : ®¯à¥¤¥«¨âì ¨ ®âà¨á®¢ âì ®ª­®
  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
  483.     mov  edx,0x03aabbcc            ; 梥â à ¡®ç¥© ®¡« á⨠ RRGGBB,8->color gl
  484.     mov  esi,0x805080d0            ; 梥⠯®«®áë § £®«®¢ª  RRGGBB,8->color gl
  485.     mov  edi,0x005080d0            ; 梥â à ¬ª¨            RRGGBB
  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
  503.     or   edx,1 shl 29+1 shl 30
  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.  
  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             ;  ¤à¥á áâப¨
  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
  545.     je   .high
  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
  575.     mov  eax,12                    ; äã­ªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª­ 
  576.     mov  ebx,2                     ; 2, § ª®­ç¨«¨ à¨á®¢ âì
  577.     int  0x40
  578.     ret                            ; ¢ë室¨¬ ¨§ ¯à®æ¥¤ãàë
  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
  635.     je   .holiday
  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
  673.     je   .holiday
  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]
  690.     je   .draw_sel
  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
  738.     div  bl          ; ah=Year mod 100, al=Year%100
  739.     test ah,ah
  740.     jz  .century
  741.     shr  ax,8        ; ax - last 2 digits
  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
  772.     je   .nonew
  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
  797. Fkeys     db 210,211,212,213,214,215,216,217,208,209,228,159
  798.  
  799. zagolovok:               ; áâப  § £®«®¢ª 
  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'
  806. else if lang eq et
  807.      db   'KALENDER'
  808. else
  809.      db   'CALENDAR'
  810. end if
  811. zag_konets:              ; ¨ ¥ñ ª®­¥æ
  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 '
  823. else if lang eq et
  824.      db   'Kuupäev 1'
  825.      db   'Kuupäev 2'
  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   '®¢ë© á⨫ì'
  834. else if lang eq de
  835.      db   'Neuer Stil'
  836. else if lang eq fr
  837.      db   'Nouveau'
  838. else if lang eq et
  839.      db   'Uus stiil'
  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"
  851. else if lang eq et
  852.      db   'Täna'
  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.  
  861. I_END:  ; ª®­¥æ ¯à®£à ¬¬ë
  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 ?
  870. number    dd ?
  871. year_input dd ?
  872.