Subversion Repositories Kolibri OS

Rev

Blame | 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 ge
  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
  149.      db   9
  150.      db   'January  '
  151.      db   'February '
  152.      db   'March    '
  153.      db   'April    '
  154.      db   'May      '
  155.      db   'June     '
  156.      db   'July     '
  157.      db   'August   '
  158.      db   'September'
  159.      db   'October  '
  160.      db   'November '
  161.      db   'December '
  162. end if
  163. spinner db '< >'
  164. week_days:
  165. if lang eq ru
  166.      db   2
  167.      db   1
  168.      db   'Пн'
  169.      db   'Вт'
  170.      db   'Ср'
  171.      db   'Чт'
  172.      db   'Пт'
  173.      db   'Сб'
  174.      db   'Вс'
  175. else if lang eq ge
  176.      db   2
  177.      db   7
  178.      db   'So'
  179.      db   'Mo'
  180.      db   'Di'
  181.      db   'Mi'
  182.      db   'Do'
  183.      db   'Fr'
  184.      db   'Sa'
  185. else if lang eq fr
  186.      db   3
  187.      db   7
  188.      db   'Dim'
  189.      db   'Lun'
  190.      db   'Mar'
  191.      db   'Mer'
  192.      db   'Jeu'
  193.      db   'Ven'
  194.      db   'Sam'
  195. else if lang eq fi
  196.      db   2
  197.      db   7
  198.      db   'Su'
  199.      db   'Ma'
  200.      db   'Ti'
  201.      db   'Ke'
  202.      db   'To'
  203.      db   'Pe'
  204.      db   'La'
  205. else
  206.      db   3
  207.      db   7
  208.      db   'Sun'
  209.      db   'Mon'
  210.      db   'Tue'
  211.      db   'Wen'
  212.      db   'Thi'
  213.      db   'Fri'
  214.      db   'Sat'
  215. end if
  216.  
  217. str2int:
  218.     xor  eax,eax
  219.     lodsb
  220.     mov  ebx,eax
  221.     shr  ebx,4
  222.     and  eax,0xf
  223.     imul ebx,10
  224.     add  al,bl
  225.     ret
  226.  
  227. start:
  228.     mcall 29
  229.     mov  [datestr],eax
  230.     mov  esi,datestr
  231.     call str2int
  232.     add  eax,1900
  233.     mov  [Year],eax
  234.     call str2int
  235.     dec  eax
  236.     mov  [Month],eax
  237.     call str2int
  238.     mov  [day_sel],eax
  239.     test byte[esi],0
  240.     jnz  .no2000
  241.     add  [Year],100
  242.   .no2000:
  243.     jmp  upd            ; здесь начинается выполнение программы
  244. red:                    ; перерисовать окно
  245.  
  246.     call draw_window    ; вызываем процедуру отрисовки окна
  247.  
  248. still:                  ; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ
  249.  
  250.     mov  eax,10         ; функция 10 - ждать события
  251.     int  0x40           ; вызываем систему
  252.   .evt:
  253.     mov  ebp,[focus]
  254.     cmp  eax,1          ; перерисовать окно ?
  255.     je   red            ; если да - на метку red
  256.     cmp  eax,2          ; нажата клавиша ?
  257.     je   key            ; если да - на key
  258.     cmp  eax,3          ; нажата кнопка ?
  259.     je   button         ; если да - на button
  260.  
  261.     jmp  still          ; если другое событие - в начало цикла
  262.  
  263.   key:                  ; нажата клавиша на клавиатуре
  264.     mov  eax,2          ; функция 2 - считать код символа
  265.     int  0x40           ; вызов системы
  266.     cmp  ah,9
  267.     jne  no_tab
  268.   .tab:
  269.     cmp  ebp,FOCUSABLE
  270.     je   foc_cycle
  271.     inc  [focus]
  272.   upd:
  273.     call calculate
  274.     jmp  red
  275.   foc_cycle:
  276.     mov  [focus],2
  277.     jmp  upd
  278.   no_tab:
  279.     push eax
  280.     shr  eax,8
  281.     mov  ecx,12
  282.     mov  edi,Fkeys
  283.     repne scasb
  284.     pop  eax
  285.     jnz  .noFkey
  286.     sub  edi,Fkeys+1
  287.     mov  [Month],edi
  288.     jmp  upd
  289.   .noFkey:
  290.     cmp  ebp,4
  291.     jne  no_spinner
  292.     cmp  ah,176
  293.     je   year_dec
  294.     cmp  ah,179
  295.     je   year_inc
  296.   no_spinner:
  297.     cmp  ebp,2
  298.     jne  .nomonth
  299.     cmp  ah,177
  300.     je   noclose.drop
  301.     jmp  still
  302.   .nomonth:
  303.     cmp  ebp,3
  304.     je   noy_up.year_evt
  305.     cmp  ebp,5
  306.     jne  still
  307.     mov  ebx,[day_sel]
  308.     cmp  ah,176         ; left arrow
  309.     jb   still
  310.     cmp  ah,179
  311.     ja   still
  312.     shr  eax,8
  313.     sub  eax,176
  314.     movsx ecx,byte[day_bounds+eax*2]
  315.     movzx eax,byte[day_bounds+eax*2+1]
  316.     add  ecx,ebx
  317.     test eax,eax
  318.     jz   .chk0
  319.     cmp  ecx,eax
  320.     ja   still
  321.   .ok:
  322.     mov  [day_sel],ecx
  323.     call draw_days
  324.     jmp  still          ; вернуться к началу цикла
  325.   .chk0:
  326.     cmp  ecx,eax
  327.     jle  still
  328.     jmp  .ok
  329.  
  330. day_bounds db -1,0,7,0,-7,0,1,0 ; left,down,up,right
  331.  
  332.   button:               ; нажата кнопка в окне программы
  333.     mov  eax,17         ; 17 - получить идентификатор нажатой кнопки
  334.     int  0x40           ; вызов системы
  335.     movzx ebx,ah
  336.     cmp  ah,200
  337.     jbe  nodayselect
  338.     sub  ah,200
  339.     mov  byte[day_sel],ah
  340.     cmp  ebp,5
  341.     jne  .redraw
  342.     call draw_days
  343.     jmp  still
  344.   .redraw:
  345.     mov  [focus],5
  346.     jmp  red
  347.   nodayselect:
  348.     cmp  ah,100
  349.     jb   no_list
  350.     sub  ah,100
  351.     mov  byte[Month],ah
  352.     mov  [focus],2
  353.     jmp  upd
  354.   no_list:
  355.     cmp  ah,1           ; идентификатор == 1 ?
  356.     jne  noclose        ; если нет - иди вперёд на noclose
  357.   close:
  358.     or   eax,-1         ; выход из программы
  359.     int  0x40           ; вызов системы
  360.  
  361.   noclose:
  362.     cmp  ah,2           ; drop down list
  363.     jne  no_dropdn
  364.   .drop:
  365.     mov  [focus],2
  366.     cmp  [dropped],al   ; ==0
  367.     jne  red
  368.     call draw_window
  369.     mov  edx,1 shl 31+231
  370.     mov  ecx,31
  371.     mov  eax,8
  372.   .bremove:
  373.     int  0x40
  374.     dec  edx
  375.     loop .bremove
  376.     call draw_dropdown
  377.     jmp  still
  378.   no_dropdn:
  379.     cmp  ah,3           ; year -1
  380.     jne  noy_dn
  381.   year_dec:
  382.     dec  [Year]
  383.     mov  [focus],4
  384.     jmp  upd
  385.   noy_dn:
  386.     cmp  ah,4           ; year+1
  387.     jne  noy_up
  388.   year_inc:
  389.     inc  [Year]
  390.     mov  [focus],4
  391.     jmp  upd
  392.   noy_up:
  393.     cmp  ah,5
  394.     jne  noy_click
  395.     mov  [focus],3
  396.     call draw_window
  397.   .still:
  398.     mcall 10
  399.     cmp  eax,2
  400.     jne  still.evt
  401.     mcall 2
  402.   .year_evt:
  403.     mov  ebx,10
  404.     cmp  ah,9
  405.     je   key.tab
  406.     cmp  ah,8           ; backspace
  407.     jne  .nobsp
  408.     mov  eax,[Year]
  409.     xor  edx,edx
  410.     div  ebx
  411.   .ch_year:
  412.     mov  [Year],eax
  413.     call draw_year
  414.     jmp  .still
  415.   .nobsp:
  416.     cmp  ah,13          ; enter
  417.     je   upd
  418.     cmp  ah,182
  419.     jne  .noclear       ; del
  420.     xor  eax,eax
  421.     jmp  .ch_year
  422.   .noclear:
  423.     cmp  ah,48
  424.     jb   .still
  425.     cmp  ah,57
  426.     ja   .still
  427.     cmp  [Year],1000
  428.     jae  .still
  429.     shr  eax,8
  430.     lea  ecx,[eax-48]
  431.     mov  eax,[Year]
  432.     imul eax,ebx
  433.     add  eax,ecx
  434.     jmp  .ch_year
  435.   noy_click:
  436.     cmp  ah,10
  437.     jne  start
  438.     xor  [new_style],1
  439.     jmp  upd
  440.  
  441.  
  442. ;   *********************************************
  443. ;   *******  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА *******
  444. ;   *********************************************
  445.  
  446. draw_window:
  447.  
  448.     mov  eax,12                    ; функция 12: сообщить ОС об отрисовке окна
  449.     mov  ebx,1                     ; 1 - начинаем рисовать
  450.     int  0x40
  451.                                    ; СОЗДАЁМ ОКНО
  452.     xor  eax,eax                   ; функция 0 : определить и отрисовать окно
  453.     mov  ebx,WIN_X
  454.   if SKIP eq 0
  455.     mov  ecx,WIN_Y
  456.   else
  457.     mov  ecx,WIN_Y-15
  458.   end if
  459.     mov  edx,0x03aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
  460.     mov  esi,0x805080d0            ; цвет полосы заголовка RRGGBB,8->color gl
  461.     mov  edi,0x005080d0            ; цвет рамки            RRGGBB
  462.     int  0x40
  463.     call draw_week
  464.  
  465.     mov  eax,8
  466.     mov  esi,0x05080d0
  467.   if SKIP eq 0
  468.     mov  ebx,B_DATE_X
  469.     mov  ecx,B_DATE_Y
  470.     mov  edx,eax
  471.     int  0x40
  472.     inc  edx
  473.     add  ebx,B_DATE_BSHIFT
  474.     int  0x40
  475.     inc  edx
  476.   else
  477.     mov  edx,10
  478.   end if
  479.     or   edx,1 shl 29+1 shl 30
  480.     mov  ebx,B_NS_X
  481.     mov  ecx,B_NS_Y
  482.     int  0x40
  483.     add  edx,1-1 shl 29
  484.     mov  ebx,B_TODAY_X+8*(today_end-today_msg)
  485.     mov  ecx,B_TODAY_Y
  486.     int  0x40
  487.     mov  ecx,B_Y
  488.     mov  ebx,B_MONTH_X
  489.     mov  edx,2
  490.     int  0x40
  491.     mov  ebx,B_SPIN_X
  492.     inc  edx
  493.     int  0x40
  494.     add  ebx,B_SPIN_WIDTH shl 16
  495.     inc  edx
  496.     int  0x40
  497.     call draw_days
  498.  
  499.                                    ; ЗАГОЛОВОК ОКНА
  500.     mov  eax,4                     ; функция 4 : написать в окне текст
  501.     mov  ebx,8*65536+8             ; [x] *65536 + [y]
  502.     mov  ecx,0x10ddeeff            ; шрифт 1 и цвет ( 0xF0RRGGBB )
  503.     mov  edx,zagolovok             ; адрес строки
  504.     mov  esi,zag_konets-zagolovok  ; и её длина
  505.     int  0x40
  506.  
  507.  if SKIP eq 0
  508.     mov  ebx,B_DATE
  509.     mov  edx,datebut
  510.     mov  esi,9
  511.     btc  ecx,28
  512.     int  0x40
  513.     add  ebx,B_DATE_SHIFT
  514.     add  edx,esi
  515.     int  0x40
  516.  end if
  517.     mov  edx,n_style
  518.     mov  esi,ns_end-n_style
  519.     mov  ebx,B_NS
  520.     cmp  [new_style],1
  521.     je   .high
  522.     mov  ecx,0xa0a0a0
  523.     jmp  .int
  524.   .high:
  525.     mov  ecx,0xac0000;d048c8
  526.   .int:
  527.     int  0x40
  528.  
  529.     mov  ecx,0xd048c8
  530.     mov  edx,today_msg
  531.     mov  ebx,B_TODAY
  532.     mov  esi,today_end-today_msg
  533.     int  0x40
  534.  
  535.     mov  ebx,B_SPIN
  536.     mov  edx,spinner
  537.     mov  esi,3
  538.     ShowFocus 4
  539.     int  0x40
  540.  
  541.     mov  edx,[Month]
  542.     movzx  esi,byte[month_name]
  543.     imul edx,esi
  544.     add  edx,month_name+1
  545.     mov  ebx,B_MONTH
  546.     ShowFocus 2
  547.     int  0x40
  548.  
  549.     call draw_year
  550.     mov  [dropped],0
  551.     mov  eax,12                    ; функция 12: сообщить ОС об отрисовке окна
  552.     mov  ebx,2                     ; 2, закончили рисовать
  553.     int  0x40
  554.     ret                            ; выходим из процедуры
  555.  
  556. draw_year:
  557.     mcall 8,B_YEAR_X,B_Y,5,0x05080d0
  558.     ShowFocus 3,esi
  559.     mcall 47,0x40001,Year,B_YEAR
  560.     ret
  561.  
  562. draw_dropdown:
  563.     mov  [dropped],1
  564.     push [Month]
  565.     pop  [focus]
  566.     add  [focus],100
  567.     mov  ecx,12
  568.     mov  edx,100
  569.     push dword month_name+1
  570.     push dword B_DROP
  571.     push dword B_Y+16 shl 16
  572.   .ddd_loop:
  573.     mov  edi,edx
  574.     push ecx
  575.     mov  ebx,B_MONTH_X
  576.     mov  ecx,[esp+4]
  577.     mov  esi,0x6f9fef
  578.     mov  eax,8
  579.     int  0x40
  580.     shr  eax,1
  581.     mov  ebx,[esp+8]
  582.     xchg edx,[esp+12]
  583.     movzx esi,byte[month_name]
  584.     ShowFocus edi
  585.     int  0x40
  586.     add  edx,esi
  587.     xchg edx,[esp+12]
  588.     add  dword[esp+8],16
  589.     add  dword[esp+4],16 shl 16
  590.     inc  edx
  591.     pop  ecx
  592.     loop .ddd_loop
  593.     add  esp,12
  594.     ret
  595.  
  596. draw_week:
  597.     mov  eax,13
  598.     mov  ebx,B_WBAR_X
  599.     mov  ecx,B_WBAR_Y
  600.     mov  edx,0x90a0b0
  601.     int  0x40
  602.     movzx esi,byte[week_days]
  603.     movzx edi,byte[week_days+1]
  604.     mov  ebx,B_WEEK
  605.     mov  ecx,7
  606.     mov  edx,week_days+2
  607.     mov  eax,4
  608.   .week:
  609.     push ecx
  610.     cmp  ecx,edi
  611.     je   .holiday
  612.     mov  ecx,0x10000000
  613.     jmp  .noholiday
  614.   .holiday:
  615.     mov  ecx,0x10cc1010
  616.   .noholiday:
  617.     int  0x40
  618.     add  edx,esi
  619.     add  ebx,B_WX_SHIFT
  620.     pop  ecx
  621.     loop .week
  622.     ret
  623.  
  624. draw_days:
  625.     mov  eax,13
  626.     mov  ebx,B_DBAR_X
  627.     mov  ecx,B_DBAR_Y
  628.     mov  edx,0xe0e0e0
  629.     int  0x40
  630.     call count_days
  631.     cmp  ecx,[day_sel]
  632.     jae  .ok
  633.     mov  [day_sel],ecx
  634.   .ok:
  635.     mov  [number],0
  636.     mov  eax,47
  637.     mov  edx,B_DAYS_Y
  638.     mov  ebx,0x20001
  639.     mov  edi,[firstday]
  640.   .dayloop:
  641.     push ecx
  642.     movzx edx,dx
  643.     mov  esi,edi
  644.     shl  esi,21
  645.     lea  edx,[edx+esi+30 shl 16]
  646.     mov  ecx,edi
  647.     add  cl,[week_days+1]
  648.     cmp  ecx,7
  649.     je   .holiday
  650.     mov  esi,0x10000000
  651.     jmp  .noholiday
  652.   .holiday:
  653.     mov  esi,0x10cc1010
  654.   .noholiday:
  655.     mov  ecx,number
  656.     inc  dword[ecx]
  657.     pusha
  658.     mov  ebx,edx
  659.     mov  bx,20
  660.     sub  ebx,3 shl 16
  661.     shrd ecx,edx,16
  662.     mov  cx,20
  663.     sub  ecx,7 shl 16
  664.     mov  edx,[number]
  665.     cmp  edx,[day_sel]
  666.     je   .draw_sel
  667.     mov  esi,0xe0e0e0
  668.     jmp  .draw_but
  669.   .draw_sel:
  670.     mov  esi,0x5080d0
  671.     cmp  [focus],5
  672.     jne  .draw_but
  673.     mov  esi,0xef7840;0xe26830
  674.   .draw_but:
  675.     add  edx,200+1 shl 29
  676.     mov  eax,8
  677.     int  0x40
  678.     popa
  679.     int  0x40
  680.     pop  ecx
  681.     inc  edi
  682.     cmp  edi,7
  683.     jne  .nowrap
  684.     xor  edi,edi
  685.     add  dx,B_DAYS_SHIFT
  686.   .nowrap:
  687.     loop .eloop
  688.     jmp  .ex
  689.   .eloop:
  690.     jmp  .dayloop
  691.   .ex:
  692.     ret
  693.  
  694. count_days:    ; ecx -days in month
  695.     call is_leap_year
  696.     mov  ecx,[Month]
  697.     mov  eax,1
  698.     movzx ecx,byte[day_count+ecx]
  699.     add  ecx,28
  700.     cmp  eax,[leap_year]
  701.     jne  .noleap
  702.     cmp  eax,[Month]
  703.     jne  .noleap
  704.     inc  ecx
  705.   .noleap:
  706.     mov  [day_bounds+3],cl
  707.     mov  [day_bounds+7],cl
  708.     ret
  709.  
  710. is_leap_year:
  711.     mov  [leap_year],0
  712.     mov  eax,[Year]
  713.     mov  bl,100
  714.     div  bl          ; ah=Year mod 100, al=Year%100
  715.     test ah,ah
  716.     jz  .century
  717.     shr  ax,8        ; ax - last 2 digits
  718.   .century:
  719.     test al,11b
  720.     jnz  .noleap
  721.     inc  [leap_year]
  722.   .noleap:
  723.     ret
  724.  
  725. calculate:
  726.     mov  ebx,[Year]
  727.     mov  eax,[Month]
  728.     sub  eax,2
  729.     jge  .nojf
  730.     dec  ebx
  731.     add  eax,12
  732.   .nojf:
  733.     add  eax,4
  734.     xor  edx,edx
  735.     mov  ecx,153
  736.     imul cx
  737.     mov  ecx,5
  738.     div  cx
  739.     inc  eax
  740.     mov  ecx,365
  741.     imul ecx,ebx
  742.     add  eax,ecx
  743.     mov  ecx,ebx
  744.     shr  ecx,2
  745.     add  eax,ecx
  746.     dec  eax
  747.     cmp  [new_style],0
  748.     je   .nonew
  749.     add  eax,2
  750.     xchg eax,ebx
  751.     mov  ecx,100
  752.     xor  edx,edx
  753.     div  cx
  754.     sub  ebx,eax
  755.     shr  eax,2
  756.     add  ebx,eax
  757.   .nonew:
  758.     add  ebx,5
  759.     mov  eax,ebx
  760.     xor  edx,edx
  761.     movzx ebx,byte[week_days+1]
  762.     sub  eax,ebx
  763.     inc  eax
  764.     mov  ebx,7
  765.     div  bx
  766.     mov  [firstday],edx
  767.     ret
  768.  
  769. ; Здесь находятся данные программы:
  770.  
  771. ; интерфейс программы двуязычный - задайте язык в macros.inc
  772. day_count db 3,0,3,2,3,2,3,3,2,3,2,3
  773. Fkeys     db 210,211,212,213,214,215,216,217,208,209,228,159
  774.  
  775. zagolovok:               ; строка заголовка
  776. if lang eq ru
  777.      db   'КАЛЕНДАРЬ'
  778. else if lang eq ge
  779.      db   'KALENDER'
  780. else if lang eq fr
  781.      db   'CALENDRIER'
  782. else
  783.      db   'CALENDAR'
  784. end if
  785. zag_konets:              ; и её конец
  786. if SKIP eq 0
  787. datebut:
  788. if lang eq ru
  789.      db   '1-я дата '
  790.      db   '2-я дата '
  791. else if lang eq fr
  792.      db   '1ere date'
  793.      db   '2eme date'
  794. else if lang eq ge
  795.      db   ' Datum 1 '
  796.      db   ' Datum 2 '
  797. else
  798.      db   '1st date '
  799.      db   '2nd date '
  800. end if
  801. end if
  802. n_style:
  803. if lang eq ru
  804.      db   'Новый стиль'
  805. else if lang eq ge
  806.      db   'Neustil'
  807. else if lang eq fr
  808.      db   'Nouveau'
  809. else
  810.      db   'New style'
  811. end if
  812. ns_end:
  813. today_msg:
  814. if lang eq ru
  815.      db   'Сегодня'
  816. else if lang eq ge
  817.      db   'Heute'
  818. else if lang eq fr
  819.      db   "Aujourd'hui"
  820. else
  821.      db   'Today'
  822. end if
  823. today_end:
  824. focus dd  3
  825. new_style dd 1
  826. dropped db 0
  827.  
  828. I_END:  ; конец программы
  829. firstday  dd ?
  830. Year dd   ?
  831. Month dd  ?
  832. day_sel   dd ?
  833. all_days  dd ?
  834.  
  835. datestr   dd  ?
  836. leap_year dd ?
  837. number    dd ?
  838. year_input dd ?
  839.