Subversion Repositories Kolibri OS

Rev

Rev 4011 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; Timer with three buttons ;
  2. ; %define lang "ru"
  3. ; %define lang "it"
  4. ORG 0
  5. BITS 32
  6. ; ---------------------------------------------------------------------------- ;
  7. STACK_SIZE     equ 256
  8.  
  9. BUTTON_START   equ 2
  10. BUTTON_PAUSE   equ 3
  11. BUTTON_RESET   equ 4
  12.  
  13. BORDER_SIZE   equ 5
  14. MARGIN         equ 8
  15. BUTTON_MARGIN equ 3
  16. BUTTON_PADDING equ 5
  17.  
  18. CHAR_WIDTH     equ 6
  19. CHAR2_WIDTH   equ 8
  20. CHAR_HEIGHT   equ 9
  21.  
  22. BUTTON_START_WIDTH equ (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH
  23. BUTTON_PAUSE_WIDTH equ (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH
  24. BUTTON_RESET_WIDTH equ (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH
  25.  
  26. BUTTON_HEIGHT equ (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1
  27.  
  28. WINDOW_WIDTH   equ (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH)
  29.  
  30. TIME_AREA_WIDTH equ (CHAR2_WIDTH * 8) ; HH MM SS
  31. TIME_AREA_LEFT equ (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2
  32. TIME_AREA_TOP   equ MARGIN + 1
  33.  
  34. TEXT_ON_BUTTONS_TOP equ (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1
  35.  
  36. BUTTON_START_BACK_COLOR equ 0x880000
  37. BUTTON_PAUSE_BACK_COLOR equ 0x008800
  38. BUTTON_RESET_BACK_COLOR equ 0x000088
  39. ; ---------------------------------------------------------------------------- ;
  40. MENUET01       db 'MENUET01'
  41. version        dd 1
  42. program.start  dd START
  43. program.end    dd END
  44. program.memory dd END + STACK_SIZE
  45. program.stack  dd END + STACK_SIZE
  46. program.params dd 0
  47. program.path   dd 0
  48. ; ---------------------------------------------------------------------------- ;
  49. screen:
  50. .height        dw 0
  51. .width         dw 0
  52. ; ---------------------------------------------------------------------------- ;
  53. window:
  54. .left          dd 0
  55. .top           dd 0
  56. .width         dd WINDOW_WIDTH
  57. .height        dd 0
  58. ; ---------------------------------------------------------------------------- ;
  59. sc:
  60. .frames           dd 0
  61. .grab             dd 0
  62. .work_3d_dark      dd 0
  63. .work_3d_light dd 0
  64. .grab_text        dd 0
  65. .work             dd 0
  66. .work_button      dd 0
  67. .work_button_text dd 0
  68. .work_text        dd 0
  69. .work_graph       dd 0
  70. ; ---------------------------------------------------------------------------- ;
  71. timer_ticks       dd 0
  72. last_timer_ticks  dd 0
  73. hours             dd 0
  74. minutes           dd 0
  75. seconds           dd 0
  76. timer_proc        dd EmptyProc ; at start Timer yet disabled
  77. ; ---------------------------------------------------------------------------- ;
  78. Events:
  79.         dd     On_Idle
  80.         dd     On_Redraw
  81.         dd     On_KeyPress
  82.         dd     On_ButtonPress
  83. ; ---------------------------------------------------------------------------- ;
  84. ButtonEvents:
  85.         dd     0
  86. .close  dd     On_ButtonClose
  87. .start  dd     On_ButtonStart
  88. .pause  dd     EmptyProc       ; at start Pause must not work
  89. .reset  dd     On_ButtonReset
  90. ; ---------------------------------------------------------------------------- ;
  91. %ifidn     lang, "ru"
  92.                sz_timer       db "╥рщьхЁ",0
  93.  
  94.                sz_start:      db "ёЄрЁЄ"
  95.                  .end:        db 0
  96.                sz_pause:      db "ярєчр"
  97.                  .end:        db 0
  98.                sz_reset:      db "ёсЁюё"
  99.                  .end:        db 0
  100. %elifidn   lang, "it"
  101.                sz_timer       db "Timer",0
  102.  
  103.                sz_start:      db "lancio"
  104.                  .end:        db 0
  105.                sz_pause:      db "pausa"
  106.                  .end:        db 0
  107.                sz_reset:      db "reset"
  108.                  .end:        db 0
  109. %else
  110.                sz_timer       db "Timer",0
  111.  
  112.                sz_start:      db "start"
  113.                  .end:        db 0
  114.                sz_pause:      db "pause"
  115.                  .end:        db 0
  116.                sz_reset:      db "reset"
  117.                  .end:        db 0
  118. %endif
  119. ; ---------------------------------------------------------------------------- ;
  120. START:
  121. ; get.screen.size
  122.         mov    eax, 61
  123.         mov    ebx, 1
  124.         int    64
  125.         mov    [screen], eax
  126.  
  127.         movzx  eax, word[screen.width]
  128.         sub    eax, [window.width]
  129.         shr    eax, 1
  130.         mov    [window.left], eax
  131.  
  132. ; skin.height
  133.         mov    eax, 48
  134.         mov    ebx, 4
  135.         int    64
  136.         add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
  137.         mov    [window.height], eax
  138.  
  139.         movzx  eax, word[screen.height]
  140.         sub    eax, [window.height]
  141.         shr    eax, 1
  142.         mov    [window.top], eax
  143.  
  144.         call On_Redraw
  145. ; ---------------------------------------------------------------------------- ;
  146. wait.event:
  147.         mov    eax, 23
  148.         mov    ebx, 50
  149.         int    64
  150.         call   [eax * 4 + Events]
  151.         jmp    wait.event
  152. ; ---------------------------------------------------------------------------- ;
  153. On_KeyPress:
  154.         mov    eax, 2
  155.         int    64
  156.         ret
  157. ; ---------------------------------------------------------------------------- ;
  158. On_ButtonPress:
  159.         mov    eax, 17
  160.         int    64
  161.         movzx  eax, ah
  162.         call   [eax * 4 + ButtonEvents]
  163.         ret
  164. ; ---------------------------------------------------------------------------- ;
  165. On_ButtonClose:
  166.         or     eax, -1
  167.         int    64
  168. ; ---------------------------------------------------------------------------- ;
  169. On_ButtonStart:
  170. ; get system counter
  171.         mov    eax, 26
  172.         mov    ebx, 9
  173.         int    64
  174.         sub    eax, [last_timer_ticks]
  175.         and    [last_timer_ticks], dword 0
  176.         mov    [timer_ticks], eax
  177.         mov    [timer_proc], dword TimerStarted
  178.         mov    [ButtonEvents.start], dword EmptyProc      ; disable ButtonStart
  179.         mov    [ButtonEvents.pause], dword On_ButtonPause ; enable  ButtonPause
  180.         ret
  181. ; ---------------------------------------------------------------------------- ;
  182. On_ButtonPause:
  183. ; get system counter
  184.         mov    eax, 26
  185.         mov    ebx, 9
  186.         int    64
  187.         sub    eax, [timer_ticks]
  188.         mov    [last_timer_ticks], eax
  189.         mov    [timer_proc], dword EmptyProc
  190.         mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
  191.         mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
  192.         ret
  193. ; ---------------------------------------------------------------------------- ;
  194. On_ButtonReset:
  195.         xor    eax, eax
  196.         mov    [seconds], eax
  197.         mov    [hours], eax
  198.         mov    [minutes], eax
  199.         mov    [last_timer_ticks], eax
  200.         mov    [timer_proc], dword EmptyProc
  201.         mov    [ButtonEvents.start], dword On_ButtonStart ; enable  ButtonStart
  202.         mov    [ButtonEvents.pause], dword EmptyProc      ; disable ButtonPause
  203.         ret
  204. ; ---------------------------------------------------------------------------- ;
  205. On_Redraw:
  206. ; redraw.start
  207.         mov    eax, 12
  208.         mov    ebx, 1
  209.         int    64
  210. ; get.standart.colors
  211.         mov    eax, 48
  212.         mov    ebx, 3
  213.         mov    ecx, sc
  214.         mov    edx, 40
  215.         int    64
  216. ; skin.height
  217.         mov    eax, 48
  218.         mov    ebx, 4
  219.         int    64
  220.         add    eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
  221.         mov    [window.height], eax
  222. ; draw.window
  223.         xor    eax, eax
  224.         mov    ebx, [window.left]
  225.         shl    ebx, 16
  226.         add    ebx, [window.width]
  227.         mov    ecx, [window.top]
  228.         shl    ecx, 16
  229.         add    ecx, [window.height]
  230.         mov    edx, [sc.work]
  231.         or     edx, 0x34000000
  232.         mov    edi, sz_timer
  233.         int    64
  234. ; draw.buttons:
  235.         mov    eax, 8
  236.         mov    ecx, ((MARGIN + CHAR_HEIGHT + MARGIN) << 16) | BUTTON_HEIGHT
  237.  
  238.         mov    ebx, (MARGIN << 16) | BUTTON_START_WIDTH
  239.         mov    edx, BUTTON_START
  240.         mov    esi, BUTTON_START_BACK_COLOR
  241.         int    64
  242.  
  243.         mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_PAUSE_WIDTH
  244.         mov    edx, BUTTON_PAUSE
  245.         mov    esi, BUTTON_PAUSE_BACK_COLOR
  246.         int    64
  247.  
  248.         mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_RESET_WIDTH
  249.         mov    edx, BUTTON_RESET
  250.         mov    esi, BUTTON_RESET_BACK_COLOR
  251.         int    64
  252. ;----------------------
  253. ; draw.texts:
  254.         mov    eax, 4
  255.         mov    ecx, 0x80FFFFFF
  256.  
  257.         mov    ebx, ((MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
  258.         mov    edx, sz_start
  259.         int    64
  260.  
  261.         mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
  262.         mov    edx, sz_pause
  263.         int    64
  264.  
  265.         mov    ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
  266.         mov    edx, sz_reset
  267.         int    64
  268. ;----------------------
  269.         call   On_Idle
  270. ; redraw.finish
  271.         mov    eax, 12
  272.         mov    ebx, 2
  273.         int    64
  274.         ret
  275. ; ---------------------------------------------------------------------------- ;
  276. DrawTime:
  277.         mov    ebx, (1 << 16)
  278.         mov    esi, [sc.work_text]
  279.         mov    edi, [sc.work]
  280. ; HH
  281.         mov    eax, [hours]
  282.         xor    edx, edx
  283.         mov    ebp, 10
  284.         div    ebp
  285.         mov    ebp, edx
  286.  
  287.         mov    ecx, eax ; [hours] first digit
  288.  
  289.         or     esi, 0x70000000
  290.         mov    eax, 47
  291.         mov    edx, (TIME_AREA_LEFT << 16) | TIME_AREA_TOP
  292.         int    64
  293.         and    esi, 0x30FFFFFF
  294.         mov    eax, 47
  295.         mov    edx, ((TIME_AREA_LEFT + 1) << 16) | TIME_AREA_TOP
  296.         int    64
  297.  
  298.         mov    ecx, ebp ; [hours] second digit
  299.  
  300.         or     esi, 0x70000000
  301.         mov    eax, 47
  302.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
  303.         int    64
  304.         and    esi, 0x30FFFFFF
  305.         mov    eax, 47
  306.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
  307.         int    64
  308. ; MM
  309.         mov    eax, [minutes]
  310.         xor    edx, edx
  311.         mov    ebp, 10
  312.         div    ebp
  313.         mov    ebp, edx
  314.  
  315.         mov    ecx, eax ; [minutes] first digit
  316.  
  317.         or     esi, 0x70000000
  318.         mov    eax, 47
  319.         mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) << 16) | TIME_AREA_TOP
  320.         int    64
  321.         and    esi, 0x30FFFFFF
  322.         mov    eax, 47
  323.         mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) << 16) | TIME_AREA_TOP
  324.         int    64
  325.  
  326.         mov    ecx, ebp ; [minutes] second digit
  327.  
  328.         or     esi, 0x70000000
  329.         mov    eax, 47
  330.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
  331.         int    64
  332.         and    esi, 0x30FFFFFF
  333.         mov    eax, 47
  334.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
  335.         int    64
  336. ; SS
  337.         mov    eax, [seconds]
  338.         xor    edx, edx
  339.         mov    ebp, 10
  340.         div    ebp
  341.         mov    ebp, edx
  342.  
  343.         mov    ecx, eax ; [seconds] first digit
  344.  
  345.         or     esi, 0x70000000
  346.         mov    eax, 47
  347.         mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) << 16) | TIME_AREA_TOP
  348.         int    64
  349.         and    esi, 0x30FFFFFF
  350.         mov    eax, 47
  351.         mov    edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) << 16) | TIME_AREA_TOP
  352.         int    64
  353.  
  354.         mov    ecx, ebp ; [seconds] second digit
  355.  
  356.         or     esi, 0x70000000
  357.         mov    eax, 47
  358.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
  359.         int    64
  360.         and    esi, 0x30FFFFFF
  361.         mov    eax, 47
  362.         mov    edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
  363.         int    64
  364.         ret
  365. ; ---------------------------------------------------------------------------- ;
  366. On_Idle:
  367.         call   dword [timer_proc]
  368.         call   DrawTime
  369.         ret
  370. ; ---------------------------------------------------------------------------- ;
  371. TimerStarted:
  372. ; get system counter
  373.         mov    eax, 26
  374.         mov    ebx, 9
  375.         int    64
  376.         sub    eax, [timer_ticks]
  377.         xor    edx, edx
  378.         mov    ecx, 100
  379.         div    ecx
  380.         mov    ecx, 60
  381.         xor    edx, edx
  382.         div    ecx
  383.         mov    [seconds], edx
  384.         xor    edx, edx
  385.         div    ecx
  386.         mov    [hours], eax
  387.         mov    [minutes], edx
  388.         ret
  389. ; ---------------------------------------------------------------------------- ;
  390. EmptyProc:
  391.         ret
  392. ; ---------------------------------------------------------------------------- ;
  393. END: