Subversion Repositories Kolibri OS

Rev

Rev 2221 | Rev 3887 | 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+335)
  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.  
  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 if lang eq it
  163.      db   9
  164.      db   'Gennaio  '
  165.      db   'Febbraio '
  166.      db   'Marzo    '
  167.      db   'Aprile   '
  168.      db   'Maggio   '
  169.      db   'Giugno   '
  170.      db   'Luglio   '
  171.      db   'Agosto   '
  172.      db   'Settembre'
  173.      db   'Ottobre  '
  174.      db   'Novembre '
  175.      db   'Dicembre '
  176. else
  177.      db   9
  178.      db   'January  '
  179.      db   'February '
  180.      db   'March    '
  181.      db   'April    '
  182.      db   'May      '
  183.      db   'June     '
  184.      db   'July     '
  185.      db   'August   '
  186.      db   'September'
  187.      db   'October  '
  188.      db   'November '
  189.      db   'December '
  190. end if
  191. spinner db '< >'
  192. week_days:
  193. if lang eq ru
  194.      db   2
  195.      db   1
  196.      db   '­'
  197.      db   '‚â'
  198.      db   '‘à'
  199.      db   '—â'
  200.      db   'â'
  201.      db   '‘¡'
  202.      db   '‚á'
  203. else if lang eq de
  204.      db   2
  205.      db   7
  206.      db   'So'
  207.      db   'Mo'
  208.      db   'Di'
  209.      db   'Mi'
  210.      db   'Do'
  211.      db   'Fr'
  212.      db   'Sa'
  213. else if lang eq fr
  214.      db   3
  215.      db   7
  216.      db   'Dim'
  217.      db   'Lun'
  218.      db   'Mar'
  219.      db   'Mer'
  220.      db   'Jeu'
  221.      db   'Ven'
  222.      db   'Sam'
  223. else if lang eq fi
  224.      db   2
  225.      db   7
  226.      db   'Su'
  227.      db   'Ma'
  228.      db   'Ti'
  229.      db   'Ke'
  230.      db   'To'
  231.      db   'Pe'
  232.      db   'La'
  233. else if lang eq et
  234.      db   3
  235.      db   7
  236.      db   'Esm'
  237.      db   'Tei'
  238.      db   'Kol'
  239.      db   'Nel'
  240.      db   'Ree'
  241.      db   'Lau'
  242.      db   'Püh'
  243. else if lang eq it
  244.      db   3
  245.      db   7
  246.      db   'Dom'
  247.      db   'Lun'
  248.      db   'Mar'
  249.      db   'Mer'
  250.      db   'Gio'
  251.      db   'Ven'
  252.      db   'Sab'
  253. else
  254.      db   3
  255.      db   7
  256.      db   'Sun'
  257.      db   'Mon'
  258.      db   'Tue'
  259.      db   'Wen'
  260.      db   'Thi'
  261.      db   'Fri'
  262.      db   'Sat'
  263. end if
  264.  
  265. str2int:
  266.     xor  eax,eax
  267.     lodsb
  268.     mov  ebx,eax
  269.     shr  ebx,4
  270.     and  eax,0xf
  271.     imul ebx,10
  272.     add  al,bl
  273.     ret
  274.  
  275. start:
  276.     mcall 29
  277.     mov  [datestr],eax
  278.     mov  esi,datestr
  279.     call str2int
  280.     add  eax,1900
  281.     mov  [Year],eax
  282.     call str2int
  283.     dec  eax
  284.     mov  [Month],eax
  285.     call str2int
  286.     mov  [day_sel],eax
  287.     test byte[esi],0
  288.     jnz  .no2000
  289.     add  [Year],100
  290.   .no2000:
  291.     jmp  upd            ; §¤¥áì ­ ç¨­ ¥âáï ¢ë¯®«­¥­¨¥ ¯à®£à ¬¬ë
  292. red:                    ; ¯¥à¥à¨á®¢ âì ®ª­®
  293.  
  294.     call draw_window    ; ¢ë§ë¢ ¥¬ ¯à®æ¥¤ãàã ®âà¨á®¢ª¨ ®ª­ 
  295.  
  296. still:                  ; ƒ‹€‚›‰ –ˆŠ‹ Žƒ€ŒŒ›
  297.  
  298.     mov  eax,23                 ; wait here for event
  299.     mov  ebx,50
  300.     mcall
  301.   .evt:
  302.     mov  ebp,[focus]
  303.     cmp  eax,1          ; ¯¥à¥à¨á®¢ âì ®ª­® ?
  304.     je   red            ; ¥á«¨ ¤  - ­  ¬¥âªã red
  305.     cmp  eax,2          ; ­ ¦ â  ª« ¢¨è  ?
  306.     je   key            ; ¥á«¨ ¤  - ­  key
  307.     cmp  eax,3          ; ­ ¦ â  ª­®¯ª  ?
  308.     je   button         ; ¥á«¨ ¤  - ­  button
  309.  
  310.     call draw_clock
  311.  
  312.     jmp  still          ; ¥á«¨ ¤à㣮¥ ᮡë⨥ - ¢ ­ ç «® 横« 
  313.  
  314.   key:                  ; ­ ¦ â  ª« ¢¨è  ­  ª« ¢¨ âãà¥
  315.     mov  eax,2          ; äã­ªæ¨ï 2 - áç¨â âì ª®¤ ᨬ¢®« 
  316.     mcall               ; ¢ë§®¢ á¨á⥬ë
  317.     cmp  ah,9
  318.     jne  no_tab
  319.   .tab:
  320.     cmp  ebp,FOCUSABLE
  321.     je   foc_cycle
  322.     inc  [focus]
  323.   upd:
  324.     call calculate
  325.     jmp  red
  326.   foc_cycle:
  327.     mov  [focus],2
  328.     jmp  upd
  329.   no_tab:
  330.     push eax
  331.     shr  eax,8
  332.     mov  ecx,12
  333.     mov  edi,Fkeys
  334.     repne scasb
  335.     pop  eax
  336.     jnz  .noFkey
  337.     sub  edi,Fkeys+1
  338.     mov  [Month],edi
  339.     jmp  upd
  340.   .noFkey:
  341.     cmp  ebp,4
  342.     jne  no_spinner
  343.     cmp  ah,176
  344.     je   year_dec
  345.     cmp  ah,179
  346.     je   year_inc
  347.   no_spinner:
  348.     cmp  ebp,2
  349.     jne  .nomonth
  350.     cmp  ah,177
  351.     je   noclose.drop
  352.     jmp  still
  353.   .nomonth:
  354.     cmp  ebp,3
  355.     je   noy_up.year_evt
  356.     cmp  ebp,5
  357.     jne  still
  358.     mov  ebx,[day_sel]
  359.     cmp  ah,176         ; left arrow
  360.     jb   still
  361.     cmp  ah,179
  362.     ja   still
  363.     shr  eax,8
  364.     sub  eax,176
  365.     movsx ecx,byte[day_bounds+eax*2]
  366.     movzx eax,byte[day_bounds+eax*2+1]
  367.     add  ecx,ebx
  368.     test eax,eax
  369.     jz   .chk0
  370.     cmp  ecx,eax
  371.     ja   still
  372.   .ok:
  373.     mov  [day_sel],ecx
  374.     call draw_days
  375.     jmp  still          ; ¢¥à­ãâìáï ª ­ ç «ã 横« 
  376.   .chk0:
  377.     cmp  ecx,eax
  378.     jle  still
  379.     jmp  .ok
  380.  
  381. day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right
  382.  
  383.   button:               ; ­ ¦ â  ª­®¯ª  ¢ ®ª­¥ ¯à®£à ¬¬ë
  384.     mov  eax,17         ; 17 - ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  385.     mcall               ; ¢ë§®¢ á¨á⥬ë
  386.     movzx ebx,ah
  387.     cmp  ah,200
  388.     jbe  nodayselect
  389.     sub  ah,200
  390.     mov  byte[day_sel],ah
  391.     cmp  ebp,5
  392.     jne  .redraw
  393.     call draw_days
  394.     jmp  still
  395.   .redraw:
  396.     mov  [focus],5
  397.     jmp  red
  398.   nodayselect:
  399.     cmp  ah,100
  400.     jb   no_list
  401.     sub  ah,100
  402.     mov  byte[Month],ah
  403.     mov  [focus],2
  404.     jmp  upd
  405.   no_list:
  406.     cmp  ah,1           ; ¨¤¥­â¨ä¨ª â®à == 1 ?
  407.     jne  noclose        ; ¥á«¨ ­¥â - ¨¤¨ ¢¯¥àñ¤ ­  noclose
  408.   close:
  409.     or   eax,-1         ; ¢ë室 ¨§ ¯à®£à ¬¬ë
  410.     mcall               ; ¢ë§®¢ á¨á⥬ë
  411.  
  412.   noclose:
  413.  
  414.     cmp  ah,72
  415.     je   plus_he
  416.  
  417.     cmp  ah,73
  418.     je   plus_hd
  419.  
  420.     cmp  ah,74
  421.     je   minus_he
  422.  
  423.     cmp  ah,75
  424.     je   minus_hd
  425.  
  426.     cmp  ah,76
  427.     je   plus_me
  428.  
  429.     cmp  ah,77
  430.     je   plus_md
  431.  
  432.     cmp  ah,78
  433.     je   minus_me
  434.  
  435.     cmp  ah,79
  436.     je   minus_md
  437.  
  438.     cmp  ah,80
  439.     je   reset
  440.  
  441.     cmp  ah,81
  442.     je   set_date
  443.  
  444.     cmp  ah,2           ; drop down list
  445.     jne  no_dropdn
  446.   .drop:
  447.     mov  [focus],2
  448.     cmp  [dropped],al   ; ==0
  449.     jne  red
  450.     call draw_window
  451.     mov  edx,1 shl 31+231
  452.     mov  ecx,31
  453.     mov  eax,8
  454.   .bremove:
  455.     mcall
  456.     dec  edx
  457.     loop .bremove
  458.     call draw_dropdown
  459.     jmp  still
  460.   no_dropdn:
  461.     cmp  ah,3           ; year -1
  462.     jne  noy_dn
  463.   year_dec:
  464.     dec  [Year]
  465.     mov  [focus],4
  466.     jmp  upd
  467.   noy_dn:
  468.     cmp  ah,4           ; year+1
  469.     jne  noy_up
  470.   year_inc:
  471.     inc  [Year]
  472.     mov  [focus],4
  473.     jmp  upd
  474.   noy_up:
  475.     cmp  ah,5
  476.     jne  noy_click
  477.     mov  [focus],3
  478.     call draw_window
  479.   .still:
  480.     mcall 10
  481.     cmp  eax,2
  482.     jne  still.evt
  483.     mcall 2
  484.   .year_evt:
  485.     mov  ebx,10
  486.     cmp  ah,9
  487.     je   key.tab
  488.     cmp  ah,8           ; backspace
  489.     jne  .nobsp
  490.     mov  eax,[Year]
  491.     xor  edx,edx
  492.     div  ebx
  493.   .ch_year:
  494.     mov  [Year],eax
  495.     call draw_year
  496.     jmp  .still
  497.   .nobsp:
  498.     cmp  ah,13          ; enter
  499.     je   upd
  500.     cmp  ah,182
  501.     jne  .noclear       ; del
  502.     xor  eax,eax
  503.     jmp  .ch_year
  504.   .noclear:
  505.     cmp  ah,48
  506.     jb   .still
  507.     cmp  ah,57
  508.     ja   .still
  509.     cmp  [Year],1000
  510.     jae  .still
  511.     shr  eax,8
  512.     lea  ecx,[eax-48]
  513.     mov  eax,[Year]
  514.     imul eax,ebx
  515.     add  eax,ecx
  516.     jmp  .ch_year
  517.   noy_click:
  518.     cmp  ah,10
  519.     jne  start
  520.     xor  [new_style],1
  521.     jmp  upd
  522.  
  523.  
  524. reset:
  525.  
  526.     mov  eax,3
  527.     mcall
  528.     mov  ecx,eax
  529.     shl  ecx,16
  530.     shr  ecx,16
  531.     mov  eax,22
  532.     mov  ebx,0x00000000
  533.     mcall
  534.  
  535.     jmp  still
  536.  
  537. plus_hd:
  538.  
  539.     mov  eax,3
  540.     mcall
  541.     mov  ecx,eax
  542.     add  ecx,1
  543.     mov  eax,22
  544.     mov  ebx,0x00000000
  545.     mcall
  546.  
  547.     jmp  still
  548.  
  549. plus_he:
  550.  
  551.     mov  eax,3
  552.     mcall
  553.     mov  ecx,eax
  554.     add  ecx,16
  555.     mov  eax,22
  556.     mov  ebx,0x00000000
  557.     mcall
  558.  
  559.     jmp  still
  560.  
  561. minus_hd:
  562.  
  563.     mov  eax,3
  564.     mcall
  565.     mov  ecx,eax
  566.     sub  ecx,1
  567.     mov  eax,22
  568.     mov  ebx,0x00000000
  569.     mcall
  570.  
  571.     jmp  still
  572.  
  573. minus_he:
  574.  
  575.     mov  eax,3
  576.     mcall
  577.     mov  ecx,eax
  578.     sub  ecx,16
  579.     mov  eax,22
  580.     mov  ebx,0x00000000
  581.     mcall
  582.  
  583.     jmp  still
  584.  
  585. plus_md:
  586.  
  587.     mov  eax,3
  588.     mcall
  589.     mov  ecx,eax
  590.     add  ecx,256
  591.     mov  eax,22
  592.     mov  ebx,0x00000000
  593.     mcall
  594.  
  595.     jmp  still
  596.  
  597. plus_me:
  598.  
  599.     mov  eax,3
  600.     mcall
  601.     mov  ecx,eax
  602.     add  ecx,4096
  603.     mov  eax,22
  604.     mov  ebx,0x00000000
  605.     mcall
  606.  
  607.     jmp  still
  608.  
  609. minus_md:
  610.  
  611.     mov  eax,3
  612.     mcall
  613.     mov  ecx,eax
  614.     sub  ecx,256
  615.     mov  eax,22
  616.     mov  ebx,0x00000000
  617.     mcall
  618.  
  619.     jmp  still
  620.  
  621. minus_me:
  622.  
  623.     mov  eax,3
  624.     mcall
  625.     mov  ecx,eax
  626.     sub  ecx,4096
  627.     mov  eax,22
  628.     mov  ebx,0x00000000
  629.     mcall
  630.  
  631.     jmp  still
  632.  
  633. set_date:
  634.  
  635.     mov  eax,0x00000000
  636.     mov ebx,[day_sel]
  637.     call additem
  638.     shl  eax,8
  639.     mov  ebx,[Month]
  640.     add  ebx,1
  641.     call additem
  642.     shl  eax,8
  643.     mov  ebx,[Year]
  644.     call additem
  645.     mov  ecx,eax
  646.     mov  eax,22
  647.     mov  ebx,1
  648.     mcall
  649.  
  650.     jmp  still
  651.  
  652. additem:
  653.  
  654.     add  eax,1
  655.     daa
  656.     sub  ebx,1
  657.     cmp  ebx,0
  658.     jne  additem
  659.  
  660.     ret
  661.  
  662.  
  663. ;   *********************************************
  664. ;   *******  Ž…„…‹…ˆ… ˆ Ž’ˆ‘Ž‚Š€ ŽŠ€ *******
  665. ;   *********************************************
  666.  
  667. draw_clock:
  668.  
  669.     mov  eax,3
  670.     mcall
  671.     mov  ecx,eax
  672.     mov  eax,47
  673.     mov esi,0x50000000
  674.     mov  edi,0xaabbcc
  675.     mov  ebx,0x00020100
  676.     mov  edx,205*65536+280
  677.     mcall
  678.  
  679.     shr  ecx,8
  680.     add  edx,20*65536
  681.     mcall
  682.  
  683.     shr  ecx,8
  684.     add  edx,20*65536
  685.     mcall
  686.     ret
  687.  
  688. draw_window:
  689.  
  690.  
  691.     mov  eax,12                    ; äã­ªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª­ 
  692.     mov  ebx,1                     ; 1 - ­ ç¨­ ¥¬ à¨á®¢ âì
  693.     mcall
  694.                                    ; ‘Ž‡„€ðŒ ŽŠŽ
  695.     xor  eax,eax                   ; äã­ªæ¨ï 0 : ®¯à¥¤¥«¨âì ¨ ®âà¨á®¢ âì ®ª­®
  696.     mov  ebx,WIN_X
  697.   if SKIP eq 0
  698.     mov  ecx,WIN_Y
  699.   else
  700.     mov  ecx,WIN_Y-15
  701.   end if
  702.     mov  edx,0x14aabbcc            ; 梥â à ¡®ç¥© ®¡« á⨠ RRGGBB,8->color gl
  703.     mov  edi,title                 ; § £®«®¢®ª
  704.     mcall
  705.     call draw_week
  706.  
  707.     mov  eax,8
  708.     mov  ebx,205*65536+7
  709.     mov  ecx,290*65536+10
  710.     mov  esi,0x005555dd
  711.     mov  edx,72
  712.     mcall
  713.  
  714.     mov  ebx,212*65536+7
  715.     inc  edx
  716.     mcall
  717.  
  718.     mov  ebx,205*65536+7
  719.     mov  ecx,300*65536+10
  720.     inc  edx
  721.     mcall
  722.  
  723.     mov  ebx,212*65536+7
  724.     inc  edx
  725.     mcall
  726.  
  727.     mov  ebx,224*65536+7
  728.     mov  ecx,290*65536+10
  729.     inc  edx
  730.     mcall
  731.  
  732.     mov  ebx,231*65536+7
  733.     inc  edx
  734.     mcall
  735.  
  736.     mov  ebx,224*65536+7
  737.     mov  ecx,300*65536+10
  738.     inc  edx
  739.     mcall
  740.  
  741.     mov  ebx,231*65536+7
  742.     inc  edx
  743.     mcall
  744.  
  745.     mov  ebx,243*65536+14
  746.     mov  ecx,290*65536+20
  747.     mov  esi,0x00dd7777
  748.     inc  edx
  749.     mcall
  750.  
  751.     mov  ebx,10*65536+100
  752.     mov  ecx,290*65536+20
  753.     mov  esi,0x00d5d5d5
  754.     inc  edx
  755.     mcall
  756.  
  757.     mov  esi,0x05080d0
  758.   if SKIP eq 0
  759.     mov  ebx,B_DATE_X
  760.     mov  ecx,B_DATE_Y
  761.     mov  edx,eax
  762.     mcall
  763.     inc  edx
  764.     add  ebx,B_DATE_BSHIFT
  765.     mcall
  766.     inc  edx
  767.   else
  768.     mov  edx,10
  769.   end if
  770.     or   edx,1 shl 29+1 shl 30
  771.     mov  ebx,B_NS_X
  772.     mov  ecx,B_NS_Y
  773.     mcall
  774.     add  edx,1-1 shl 29
  775.     mov  ebx,B_TODAY_X+8*(today_end-today_msg)
  776.     mov  ecx,B_TODAY_Y
  777.     mcall
  778.     mov  ecx,B_Y
  779.     mov  ebx,B_MONTH_X
  780.     mov  edx,2
  781.     mcall
  782.     mov  ebx,B_SPIN_X
  783.     inc  edx
  784.     mcall
  785.     add  ebx,B_SPIN_WIDTH shl 16
  786.     inc  edx
  787.     mcall
  788.     call draw_days
  789.  
  790.     mov  eax,4                     ; äã­ªæ¨ï 4 : ­ ¯¨á âì ¢ ®ª­¥ ⥪áâ
  791.     mov  ebx,110*65536+280
  792.     mov  ecx,0x800000ff
  793.     mov  edx,sys_text
  794.     mcall
  795.  
  796.     mov  ebx,149*65536+302
  797.     mov  edx,minus
  798.     mcall
  799.  
  800.     mov  ebx,137*65536+292
  801.     mov  ecx,0x80ff0000
  802.     mov  edx,plus
  803.     mcall
  804.  
  805.     mov  ebx,15*65536+298
  806.     mov  ecx,0x00000000
  807.     mov  esi,15
  808.     mov  edx,setd
  809.     mcall
  810.  
  811.     mov  ecx,0x10ddeeff            ; èà¨äâ 1 ¨ 梥â ( 0xF0RRGGBB )
  812.  
  813.  if SKIP eq 0
  814.     mov  ebx,B_DATE
  815.     mov  edx,datebut
  816.     mov  esi,9
  817.     btc  ecx,28
  818.     mcall
  819.     add  ebx,B_DATE_SHIFT
  820.     add  edx,esi
  821.     mcall
  822.  end if
  823.     mov  edx,n_style
  824.     mov  esi,ns_end-n_style
  825.     mov  ebx,B_NS
  826.     cmp  [new_style],1
  827.     je   .high
  828.     mov  ecx,0xa0a0a0
  829.     jmp  .int
  830.   .high:
  831.     mov  ecx,0xac0000;d048c8
  832.   .int:
  833.     mcall
  834.  
  835.     mov  ecx,0xd048c8
  836.     mov  edx,today_msg
  837.     mov  ebx,B_TODAY
  838.     mov  esi,today_end-today_msg
  839.     mcall
  840.  
  841.     mov  ebx,B_SPIN
  842.     mov  edx,spinner
  843.     mov  esi,3
  844.     ShowFocus 4
  845.     mcall
  846.  
  847.     mov  edx,[Month]
  848.     movzx  esi,byte[month_name]
  849.     imul edx,esi
  850.     add  edx,month_name+1
  851.     mov  ebx,B_MONTH
  852.     ShowFocus 2
  853.     mcall
  854.  
  855.     call draw_year
  856.     mov  [dropped],0
  857.     mov  eax,12                    ; äã­ªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª­ 
  858.     mov  ebx,2                     ; 2, § ª®­ç¨«¨ à¨á®¢ âì
  859.     mcall
  860.     ret                            ; ¢ë室¨¬ ¨§ ¯à®æ¥¤ãàë
  861.  
  862. draw_year:
  863.     mcall 8,B_YEAR_X,B_Y,5,0x05080d0
  864.     ShowFocus 3,esi
  865.     mcall 47,0x40001,Year,B_YEAR
  866.     ret
  867.  
  868. draw_dropdown:
  869.     mov  [dropped],1
  870.     push [Month]
  871.     pop  [focus]
  872.     add  [focus],100
  873.     mov  ecx,12
  874.     mov  edx,100
  875.     push dword month_name+1
  876.     push dword B_DROP
  877.     push dword B_Y+16 shl 16
  878.   .ddd_loop:
  879.     mov  edi,edx
  880.     push ecx
  881.     mov  ebx,B_MONTH_X
  882.     mov  ecx,[esp+4]
  883.     mov  esi,0x6f9fef
  884.     mov  eax,8
  885.     mcall
  886.     shr  eax,1
  887.     mov  ebx,[esp+8]
  888.     xchg edx,[esp+12]
  889.     movzx esi,byte[month_name]
  890.     ShowFocus edi
  891.     mcall
  892.     add  edx,esi
  893.     xchg edx,[esp+12]
  894.     add  dword[esp+8],16
  895.     add  dword[esp+4],16 shl 16
  896.     inc  edx
  897.     pop  ecx
  898.     loop .ddd_loop
  899.     add  esp,12
  900.     ret
  901.  
  902. draw_week:
  903.     mov  eax,13
  904.     mov  ebx,B_WBAR_X
  905.     mov  ecx,B_WBAR_Y
  906.     mov  edx,0x90a0b0
  907.     mcall
  908.     movzx esi,byte[week_days]
  909.     movzx edi,byte[week_days+1]
  910.     mov  ebx,B_WEEK
  911.     mov  ecx,7
  912.     mov  edx,week_days+2
  913.     mov  eax,4
  914.   .week:
  915.     push ecx
  916.     cmp  ecx,edi
  917.     je   .holiday
  918.     mov  ecx,0x10000000
  919.     jmp  .noholiday
  920.   .holiday:
  921.     mov  ecx,0x10cc1010
  922.   .noholiday:
  923.     mcall
  924.     add  edx,esi
  925.     add  ebx,B_WX_SHIFT
  926.     pop  ecx
  927.     loop .week
  928.     ret
  929.  
  930. draw_days:
  931.     mov  eax,13
  932.     mov  ebx,B_DBAR_X
  933.     mov  ecx,B_DBAR_Y
  934.     mov  edx,0xe0e0e0
  935.     mcall
  936.     call count_days
  937.     cmp  ecx,[day_sel]
  938.     jae  .ok
  939.     mov  [day_sel],ecx
  940.   .ok:
  941.     mov  [number],0
  942.     mov  eax,47
  943.     mov  edx,B_DAYS_Y
  944.     mov  ebx,0x20001
  945.     mov  edi,[firstday]
  946.   .dayloop:
  947.     push ecx
  948.     movzx edx,dx
  949.     mov  esi,edi
  950.     shl  esi,21
  951.     lea  edx,[edx+esi+30 shl 16]
  952.     mov  ecx,edi
  953.     add  cl,[week_days+1]
  954.     cmp  ecx,7
  955.     je   .holiday
  956.     mov  esi,0x10000000
  957.     jmp  .noholiday
  958.   .holiday:
  959.     mov  esi,0x10cc1010
  960.   .noholiday:
  961.     mov  ecx,number
  962.     inc  dword[ecx]
  963.     pusha
  964.     mov  ebx,edx
  965.     mov  bx,20
  966.     sub  ebx,3 shl 16
  967.     shrd ecx,edx,16
  968.     mov  cx,20
  969.     sub  ecx,7 shl 16
  970.     mov  edx,[number]
  971.     cmp  edx,[day_sel]
  972.     je   .draw_sel
  973.     mov  esi,0xe0e0e0
  974.     jmp  .draw_but
  975.   .draw_sel:
  976.     mov  esi,0x5080d0
  977.     cmp  [focus],5
  978.     jne  .draw_but
  979.     mov  esi,0xef7840;0xe26830
  980.   .draw_but:
  981.     add  edx,200+1 shl 29
  982.     mov  eax,8
  983.     mcall
  984.     popa
  985.     mcall
  986.     pop  ecx
  987.     inc  edi
  988.     cmp  edi,7
  989.     jne  .nowrap
  990.     xor  edi,edi
  991.     add  dx,B_DAYS_SHIFT
  992.   .nowrap:
  993.     loop .eloop
  994.     jmp  .ex
  995.   .eloop:
  996.     jmp  .dayloop
  997.   .ex:
  998.     ret
  999.  
  1000. count_days:    ; ecx -days in month
  1001.     call is_leap_year
  1002.     mov  ecx,[Month]
  1003.     mov  eax,1
  1004.     movzx ecx,byte[day_count+ecx]
  1005.     add  ecx,28
  1006.     cmp  eax,[leap_year]
  1007.     jne  .noleap
  1008.     cmp  eax,[Month]
  1009.     jne  .noleap
  1010.     inc  ecx
  1011.   .noleap:
  1012.     mov  [day_bounds+3],cl
  1013.     mov  [day_bounds+7],cl
  1014.     ret
  1015.  
  1016. is_leap_year:
  1017.     mov  [leap_year],0
  1018.     mov  eax,[Year]
  1019.     mov  bl,100
  1020.     div  bl          ; ah=Year mod 100, al=Year%100
  1021.     test ah,ah
  1022.     jz  .century
  1023.     shr  ax,8        ; ax - last 2 digits
  1024.   .century:
  1025.     test al,11b
  1026.     jnz  .noleap
  1027.     inc  [leap_year]
  1028.   .noleap:
  1029.     ret
  1030.  
  1031. calculate:
  1032.     mov  ebx,[Year]
  1033.     mov  eax,[Month]
  1034.     sub  eax,2
  1035.     jge  .nojf
  1036.     dec  ebx
  1037.     add  eax,12
  1038.   .nojf:
  1039.     add  eax,4
  1040.     xor  edx,edx
  1041.     mov  ecx,153
  1042.     imul cx
  1043.     mov  ecx,5
  1044.     div  cx
  1045.     inc  eax
  1046.     mov  ecx,365
  1047.     imul ecx,ebx
  1048.     add  eax,ecx
  1049.     mov  ecx,ebx
  1050.     shr  ecx,2
  1051.     add  eax,ecx
  1052.     dec  eax
  1053.     cmp  [new_style],0
  1054.     je   .nonew
  1055.     add  eax,2
  1056.     xchg eax,ebx
  1057.     mov  ecx,100
  1058.     xor  edx,edx
  1059.     div  cx
  1060.     sub  ebx,eax
  1061.     shr  eax,2
  1062.     add  ebx,eax
  1063.   .nonew:
  1064.     add  ebx,5
  1065.     mov  eax,ebx
  1066.     xor  edx,edx
  1067.     movzx ebx,byte[week_days+1]
  1068.     sub  eax,ebx
  1069.     inc  eax
  1070.     mov  ebx,7
  1071.     div  bx
  1072.     mov  [firstday],edx
  1073.     ret
  1074.  
  1075. ; ‡¤¥áì ­ å®¤ïâáï ¤ ­­ë¥ ¯à®£à ¬¬ë:
  1076.  
  1077. ; ¨­â¥àä¥©á ¯à®£à ¬¬ë ¬­®£®ï§ëç­ë© - § ¤ ©â¥ ï§ëª ¢ lang.inc
  1078. day_count db 3,0,3,2,3,2,3,3,2,3,2,3
  1079. Fkeys     db 210,211,212,213,214,215,216,217,208,209,228,159
  1080.  
  1081. title:   ; áâப  § £®«®¢ª 
  1082. if lang eq ru
  1083.      db   'Š «¥­¤ àì',0
  1084. else if lang eq ge
  1085.      db   'Kalender',0
  1086. else if lang eq fr
  1087.      db   'Calendrier',0
  1088. else if lang eq et
  1089.      db   'Kalender',0
  1090. else if lang eq it
  1091.      db   'Calendario',0
  1092. else
  1093.      db   'Calendar',0
  1094. end if
  1095.  
  1096. if SKIP eq 0
  1097. datebut:
  1098. if lang eq ru
  1099.      db   '1-ï ¤ â  '
  1100.      db   '2-ï ¤ â  '
  1101. else if lang eq fr
  1102.      db   '1ere date'
  1103.      db   '2eme date'
  1104. else if lang eq ge
  1105.      db   ' Datum 1 '
  1106.      db   ' Datum 2 '
  1107. else if lang eq et
  1108.      db   'Kuupäev 1'
  1109.      db   'Kuupäev 2'
  1110. else if lang eq it
  1111.      db   '1a data  '
  1112.      db   '2a data  '
  1113. else
  1114.      db   '1st date '
  1115.      db   '2nd date '
  1116. end if
  1117. end if
  1118. n_style:
  1119. if lang eq ru
  1120.      db   '®¢ë© á⨫ì'
  1121. else if lang eq de
  1122.      db   'Neuer Stil'
  1123. else if lang eq fr
  1124.      db   'Nouveau'
  1125. else if lang eq et
  1126.      db   'Uus stiil'
  1127. else if lang eq it
  1128.      db   'Nuovo stile'
  1129. else
  1130.      db   'New style'
  1131. end if
  1132. ns_end:
  1133. today_msg:
  1134. if lang eq ru
  1135.      db   '‘¥£®¤­ï'
  1136. else if lang eq ge
  1137.      db   'Heute'
  1138. else if lang eq fr
  1139.      db   "Aujourd'hui"
  1140. else if lang eq et
  1141.      db   'Täna'
  1142. else if lang eq it
  1143.      db   'Oggi'
  1144. else
  1145.      db   'Today'
  1146. end if
  1147. today_end:
  1148. focus dd  3
  1149. new_style dd 1
  1150. dropped db 0
  1151.  
  1152. sys_text:
  1153. if lang eq ru
  1154.                 db  'á¨á⥬­®¥ ¢à¥¬ï',0
  1155. else if lang eq it
  1156.                 db   'Ora di sistema',0
  1157. else
  1158.                 db  'á¨á⥬­®¥ ¢à¥¬ï',0
  1159. end if
  1160. plus:
  1161. if lang eq ru
  1162.                 db  '¤®¡ ¢¨âì(+)',0
  1163. else if lang eq it
  1164.                 db   'Avanti',0
  1165. else
  1166.                 db  '¤®¡ ¢¨âì(+)',0
  1167. end if
  1168. minus:
  1169. if lang eq ru
  1170.                 db  'ã¡à âì(-)',0
  1171. else if lang eq it
  1172.                 db   'Indietro',0
  1173. else
  1174.                 db  'ã¡à âì(-)',0
  1175. end if
  1176. setd:
  1177. if lang eq ru
  1178.                 db  '“áâ ­®¢¨âì ¤ âã',0
  1179. else if lang eq it
  1180.                 db   'Impostazioni',0
  1181. else
  1182.                 db  '“áâ ­®¢¨âì ¤ âã',0
  1183. end if
  1184.  
  1185. I_END:  ; ª®­¥æ ¯à®£à ¬¬ë
  1186. firstday  dd ?
  1187. Year dd   ?
  1188. Month dd  ?
  1189. day_sel   dd ?
  1190. all_days  dd ?
  1191.  
  1192. datestr   dd  ?
  1193. leap_year dd ?
  1194. number    dd ?
  1195. year_input dd ?
  1196.