Subversion Repositories Kolibri OS

Rev

Rev 299 | Rev 452 | 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,0x13aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
  484.     mov  edi,header              ; заголовок
  485.     int  0x40
  486.     call draw_week
  487.  
  488.     mov  eax,8
  489.     mov  esi,0x05080d0
  490.   if SKIP eq 0
  491.     mov  ebx,B_DATE_X
  492.     mov  ecx,B_DATE_Y
  493.     mov  edx,eax
  494.     int  0x40
  495.     inc  edx
  496.     add  ebx,B_DATE_BSHIFT
  497.     int  0x40
  498.     inc  edx
  499.   else
  500.     mov  edx,10
  501.   end if
  502.     or   edx,1 shl 29+1 shl 30
  503.     mov  ebx,B_NS_X
  504.     mov  ecx,B_NS_Y
  505.     int  0x40
  506.     add  edx,1-1 shl 29
  507.     mov  ebx,B_TODAY_X+8*(today_end-today_msg)
  508.     mov  ecx,B_TODAY_Y
  509.     int  0x40
  510.     mov  ecx,B_Y
  511.     mov  ebx,B_MONTH_X
  512.     mov  edx,2
  513.     int  0x40
  514.     mov  ebx,B_SPIN_X
  515.     inc  edx
  516.     int  0x40
  517.     add  ebx,B_SPIN_WIDTH shl 16
  518.     inc  edx
  519.     int  0x40
  520.     call draw_days
  521.  
  522.     mov  eax,4                     ; функция 4 : написать в окне текст
  523.     mov  ecx,0x10ddeeff            ; шрифт 1 и цвет ( 0xF0RRGGBB )
  524.  
  525.  if SKIP eq 0
  526.     mov  ebx,B_DATE
  527.     mov  edx,datebut
  528.     mov  esi,9
  529.     btc  ecx,28
  530.     int  0x40
  531.     add  ebx,B_DATE_SHIFT
  532.     add  edx,esi
  533.     int  0x40
  534.  end if
  535.     mov  edx,n_style
  536.     mov  esi,ns_end-n_style
  537.     mov  ebx,B_NS
  538.     cmp  [new_style],1
  539.     je   .high
  540.     mov  ecx,0xa0a0a0
  541.     jmp  .int
  542.   .high:
  543.     mov  ecx,0xac0000;d048c8
  544.   .int:
  545.     int  0x40
  546.  
  547.     mov  ecx,0xd048c8
  548.     mov  edx,today_msg
  549.     mov  ebx,B_TODAY
  550.     mov  esi,today_end-today_msg
  551.     int  0x40
  552.  
  553.     mov  ebx,B_SPIN
  554.     mov  edx,spinner
  555.     mov  esi,3
  556.     ShowFocus 4
  557.     int  0x40
  558.  
  559.     mov  edx,[Month]
  560.     movzx  esi,byte[month_name]
  561.     imul edx,esi
  562.     add  edx,month_name+1
  563.     mov  ebx,B_MONTH
  564.     ShowFocus 2
  565.     int  0x40
  566.  
  567.     call draw_year
  568.     mov  [dropped],0
  569.     mov  eax,12                    ; функция 12: сообщить ОС об отрисовке окна
  570.     mov  ebx,2                     ; 2, закончили рисовать
  571.     int  0x40
  572.     ret                            ; выходим из процедуры
  573.  
  574. draw_year:
  575.     mcall 8,B_YEAR_X,B_Y,5,0x05080d0
  576.     ShowFocus 3,esi
  577.     mcall 47,0x40001,Year,B_YEAR
  578.     ret
  579.  
  580. draw_dropdown:
  581.     mov  [dropped],1
  582.     push [Month]
  583.     pop  [focus]
  584.     add  [focus],100
  585.     mov  ecx,12
  586.     mov  edx,100
  587.     push dword month_name+1
  588.     push dword B_DROP
  589.     push dword B_Y+16 shl 16
  590.   .ddd_loop:
  591.     mov  edi,edx
  592.     push ecx
  593.     mov  ebx,B_MONTH_X
  594.     mov  ecx,[esp+4]
  595.     mov  esi,0x6f9fef
  596.     mov  eax,8
  597.     int  0x40
  598.     shr  eax,1
  599.     mov  ebx,[esp+8]
  600.     xchg edx,[esp+12]
  601.     movzx esi,byte[month_name]
  602.     ShowFocus edi
  603.     int  0x40
  604.     add  edx,esi
  605.     xchg edx,[esp+12]
  606.     add  dword[esp+8],16
  607.     add  dword[esp+4],16 shl 16
  608.     inc  edx
  609.     pop  ecx
  610.     loop .ddd_loop
  611.     add  esp,12
  612.     ret
  613.  
  614. draw_week:
  615.     mov  eax,13
  616.     mov  ebx,B_WBAR_X
  617.     mov  ecx,B_WBAR_Y
  618.     mov  edx,0x90a0b0
  619.     int  0x40
  620.     movzx esi,byte[week_days]
  621.     movzx edi,byte[week_days+1]
  622.     mov  ebx,B_WEEK
  623.     mov  ecx,7
  624.     mov  edx,week_days+2
  625.     mov  eax,4
  626.   .week:
  627.     push ecx
  628.     cmp  ecx,edi
  629.     je   .holiday
  630.     mov  ecx,0x10000000
  631.     jmp  .noholiday
  632.   .holiday:
  633.     mov  ecx,0x10cc1010
  634.   .noholiday:
  635.     int  0x40
  636.     add  edx,esi
  637.     add  ebx,B_WX_SHIFT
  638.     pop  ecx
  639.     loop .week
  640.     ret
  641.  
  642. draw_days:
  643.     mov  eax,13
  644.     mov  ebx,B_DBAR_X
  645.     mov  ecx,B_DBAR_Y
  646.     mov  edx,0xe0e0e0
  647.     int  0x40
  648.     call count_days
  649.     cmp  ecx,[day_sel]
  650.     jae  .ok
  651.     mov  [day_sel],ecx
  652.   .ok:
  653.     mov  [number],0
  654.     mov  eax,47
  655.     mov  edx,B_DAYS_Y
  656.     mov  ebx,0x20001
  657.     mov  edi,[firstday]
  658.   .dayloop:
  659.     push ecx
  660.     movzx edx,dx
  661.     mov  esi,edi
  662.     shl  esi,21
  663.     lea  edx,[edx+esi+30 shl 16]
  664.     mov  ecx,edi
  665.     add  cl,[week_days+1]
  666.     cmp  ecx,7
  667.     je   .holiday
  668.     mov  esi,0x10000000
  669.     jmp  .noholiday
  670.   .holiday:
  671.     mov  esi,0x10cc1010
  672.   .noholiday:
  673.     mov  ecx,number
  674.     inc  dword[ecx]
  675.     pusha
  676.     mov  ebx,edx
  677.     mov  bx,20
  678.     sub  ebx,3 shl 16
  679.     shrd ecx,edx,16
  680.     mov  cx,20
  681.     sub  ecx,7 shl 16
  682.     mov  edx,[number]
  683.     cmp  edx,[day_sel]
  684.     je   .draw_sel
  685.     mov  esi,0xe0e0e0
  686.     jmp  .draw_but
  687.   .draw_sel:
  688.     mov  esi,0x5080d0
  689.     cmp  [focus],5
  690.     jne  .draw_but
  691.     mov  esi,0xef7840;0xe26830
  692.   .draw_but:
  693.     add  edx,200+1 shl 29
  694.     mov  eax,8
  695.     int  0x40
  696.     popa
  697.     int  0x40
  698.     pop  ecx
  699.     inc  edi
  700.     cmp  edi,7
  701.     jne  .nowrap
  702.     xor  edi,edi
  703.     add  dx,B_DAYS_SHIFT
  704.   .nowrap:
  705.     loop .eloop
  706.     jmp  .ex
  707.   .eloop:
  708.     jmp  .dayloop
  709.   .ex:
  710.     ret
  711.  
  712. count_days:    ; ecx -days in month
  713.     call is_leap_year
  714.     mov  ecx,[Month]
  715.     mov  eax,1
  716.     movzx ecx,byte[day_count+ecx]
  717.     add  ecx,28
  718.     cmp  eax,[leap_year]
  719.     jne  .noleap
  720.     cmp  eax,[Month]
  721.     jne  .noleap
  722.     inc  ecx
  723.   .noleap:
  724.     mov  [day_bounds+3],cl
  725.     mov  [day_bounds+7],cl
  726.     ret
  727.  
  728. is_leap_year:
  729.     mov  [leap_year],0
  730.     mov  eax,[Year]
  731.     mov  bl,100
  732.     div  bl          ; ah=Year mod 100, al=Year%100
  733.     test ah,ah
  734.     jz  .century
  735.     shr  ax,8        ; ax - last 2 digits
  736.   .century:
  737.     test al,11b
  738.     jnz  .noleap
  739.     inc  [leap_year]
  740.   .noleap:
  741.     ret
  742.  
  743. calculate:
  744.     mov  ebx,[Year]
  745.     mov  eax,[Month]
  746.     sub  eax,2
  747.     jge  .nojf
  748.     dec  ebx
  749.     add  eax,12
  750.   .nojf:
  751.     add  eax,4
  752.     xor  edx,edx
  753.     mov  ecx,153
  754.     imul cx
  755.     mov  ecx,5
  756.     div  cx
  757.     inc  eax
  758.     mov  ecx,365
  759.     imul ecx,ebx
  760.     add  eax,ecx
  761.     mov  ecx,ebx
  762.     shr  ecx,2
  763.     add  eax,ecx
  764.     dec  eax
  765.     cmp  [new_style],0
  766.     je   .nonew
  767.     add  eax,2
  768.     xchg eax,ebx
  769.     mov  ecx,100
  770.     xor  edx,edx
  771.     div  cx
  772.     sub  ebx,eax
  773.     shr  eax,2
  774.     add  ebx,eax
  775.   .nonew:
  776.     add  ebx,5
  777.     mov  eax,ebx
  778.     xor  edx,edx
  779.     movzx ebx,byte[week_days+1]
  780.     sub  eax,ebx
  781.     inc  eax
  782.     mov  ebx,7
  783.     div  bx
  784.     mov  [firstday],edx
  785.     ret
  786.  
  787. ; Здесь находятся данные программы:
  788.  
  789. ; интерфейс программы двуязычный - задайте язык в macros.inc
  790. day_count db 3,0,3,2,3,2,3,3,2,3,2,3
  791. Fkeys     db 210,211,212,213,214,215,216,217,208,209,228,159
  792.  
  793. header:          ; строка заголовка
  794. if lang eq ru
  795.      db   'КАЛЕНДАРЬ',0
  796. else if lang eq ge
  797.      db   'KALENDER',0
  798. else if lang eq fr
  799.      db   'CALENDRIER',0
  800. else if lang eq et
  801.      db   'KALENDER',0
  802. else
  803.      db   'CALENDAR',0
  804. end if
  805.  
  806. if SKIP eq 0
  807. datebut:
  808. if lang eq ru
  809.      db   '1-я дата '
  810.      db   '2-я дата '
  811. else if lang eq fr
  812.      db   '1ere date'
  813.      db   '2eme date'
  814. else if lang eq ge
  815.      db   ' Datum 1 '
  816.      db   ' Datum 2 '
  817. else if lang eq et
  818.      db   'Kuupфev 1'
  819.      db   'Kuupфev 2'
  820. else
  821.      db   '1st date '
  822.      db   '2nd date '
  823. end if
  824. end if
  825. n_style:
  826. if lang eq ru
  827.      db   'Новый стиль'
  828. else if lang eq de
  829.      db   'Neuer Stil'
  830. else if lang eq fr
  831.      db   'Nouveau'
  832. else if lang eq et
  833.      db   'Uus stiil'
  834. else
  835.      db   'New style'
  836. end if
  837. ns_end:
  838. today_msg:
  839. if lang eq ru
  840.      db   'Сегодня'
  841. else if lang eq ge
  842.      db   'Heute'
  843. else if lang eq fr
  844.      db   "Aujourd'hui"
  845. else if lang eq et
  846.      db   'Tфna'
  847. else
  848.      db   'Today'
  849. end if
  850. today_end:
  851. focus dd  3
  852. new_style dd 1
  853. dropped db 0
  854.  
  855. I_END:  ; конец программы
  856. firstday  dd ?
  857. Year dd   ?
  858. Month dd  ?
  859. day_sel   dd ?
  860. all_days  dd ?
  861.  
  862. datestr   dd  ?
  863. leap_year dd ?
  864. number    dd ?
  865. year_input dd ?
  866.