Files
kolibrios/programs/other/Timer/Timer.asm
T

320 lines
11 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; Timer with three buttons ;
; %define lang "ru_RU"
; %define lang "it_IT"
use32
org 0
db 'MENUET01'
version dd 1
dd program.start
dd program.end
dd program.memory
dd program.stack
dd 0,0
include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
include 'lang.inc'
; ---------------------------------------------------------------------------- ;
BUTTON_START equ 2
BUTTON_PAUSE equ 3
BUTTON_RESET equ 4
BORDER_SIZE equ 5
MARGIN equ 8
BUTTON_MARGIN equ 3
BUTTON_PADDING equ 5
CHAR_WIDTH equ 6
CHAR2_WIDTH equ 8
CHAR_HEIGHT equ 9
BUTTON_START_WIDTH = (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH
BUTTON_PAUSE_WIDTH = (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH
BUTTON_RESET_WIDTH = (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH
BUTTON_HEIGHT = (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1
WINDOW_WIDTH = (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH)
TIME_AREA_WIDTH = (CHAR2_WIDTH * 8) ; HH MM SS
TIME_AREA_LEFT = (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2
TIME_AREA_TOP = MARGIN + 1
TEXT_ON_BUTTONS_TOP = (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1
BUTTON_START_BACK_COLOR equ 0x880000
BUTTON_PAUSE_BACK_COLOR equ 0x008800
BUTTON_RESET_BACK_COLOR equ 0x000088
; ---------------------------------------------------------------------------- ;
screen:
.height dw 0
.width dw 0
; ---------------------------------------------------------------------------- ;
window:
.left dd 0
.top dd 0
.width dd WINDOW_WIDTH
.height dd 0
; ---------------------------------------------------------------------------- ;
sc system_colors
; ---------------------------------------------------------------------------- ;
timer_ticks dd 0
last_timer_ticks dd 0
hours dd 0
minutes dd 0
seconds dd 0
timer_proc dd EmptyProc ; at start Timer yet disabled
; ---------------------------------------------------------------------------- ;
Events:
dd On_Idle
dd On_Redraw
dd On_KeyPress
dd On_ButtonPress
; ---------------------------------------------------------------------------- ;
ButtonEvents:
dd 0
.close dd On_ButtonClose
.start dd On_ButtonStart
.pause dd EmptyProc ; at start Pause must not work
.reset dd On_ButtonReset
; ---------------------------------------------------------------------------- ;
if lang eq ru_RU
sz_timer db " ©¬¥à",0
sz_start: db "áâ àâ"
.end: db 0
sz_pause: db "¯ ã§ "
.end: db 0
sz_reset: db "á¡à®á"
.end: db 0
else if lang eq it_IT
sz_timer db "Timer",0
sz_start: db "lancio"
.end: db 0
sz_pause: db "pausa"
.end: db 0
sz_reset: db "reset"
.end: db 0
else
sz_timer db "Timer",0
sz_start: db "start"
.end: db 0
sz_pause: db "pause"
.end: db 0
sz_reset: db "reset"
.end: db 0
end if
; ---------------------------------------------------------------------------- ;
align 4
program.start:
; get.screen.size
mcall SF_GET_GRAPHICAL_PARAMS,SSF_SCREEN_SIZE
mov [screen], eax
movzx eax, word[screen.width]
sub eax, [window.width]
shr eax, 1
mov [window.left], eax
; skin.height
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
mov [window.height], eax
movzx eax, word[screen.height]
sub eax, [window.height]
shr eax, 1
mov [window.top], eax
call On_Redraw
; ---------------------------------------------------------------------------- ;
wait.event:
mcall SF_WAIT_EVENT_TIMEOUT, 50
call dword[eax * 4 + Events]
jmp wait.event
; ---------------------------------------------------------------------------- ;
On_KeyPress:
mcall SF_GET_KEY
ret
; ---------------------------------------------------------------------------- ;
On_ButtonPress:
mcall SF_GET_BUTTON
movzx eax, ah
call dword[eax * 4 + ButtonEvents]
ret
; ---------------------------------------------------------------------------- ;
On_ButtonClose:
mcall SF_TERMINATE_PROCESS
; ---------------------------------------------------------------------------- ;
On_ButtonStart:
; get system counter
mcall SF_SYSTEM_GET,SSF_TIME_COUNT
sub eax, [last_timer_ticks]
and [last_timer_ticks], dword 0
mov [timer_ticks], eax
mov [timer_proc], dword TimerStarted
mov [ButtonEvents.start], dword EmptyProc ; disable ButtonStart
mov [ButtonEvents.pause], dword On_ButtonPause ; enable ButtonPause
ret
; ---------------------------------------------------------------------------- ;
On_ButtonPause:
; get system counter
mcall SF_SYSTEM_GET,SSF_TIME_COUNT
sub eax, [timer_ticks]
mov [last_timer_ticks], eax
mov [timer_proc], dword EmptyProc
mov [ButtonEvents.start], dword On_ButtonStart ; enable ButtonStart
mov [ButtonEvents.pause], dword EmptyProc ; disable ButtonPause
ret
; ---------------------------------------------------------------------------- ;
On_ButtonReset:
xor eax, eax
mov [seconds], eax
mov [hours], eax
mov [minutes], eax
mov [last_timer_ticks], eax
mov [timer_proc], dword EmptyProc
mov [ButtonEvents.start], dword On_ButtonStart ; enable ButtonStart
mov [ButtonEvents.pause], dword EmptyProc ; disable ButtonPause
ret
; ---------------------------------------------------------------------------- ;
On_Redraw:
; redraw.start
mcall SF_REDRAW,SSF_BEGIN_DRAW
; get.standart.colors
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
; skin.height
mcall ,SSF_GET_SKIN_HEIGHT
add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
mov [window.height], eax
; draw.window
mov ebx, [window.left]
shl ebx, 16
add ebx, [window.width]
mov ecx, [window.top]
shl ecx, 16
add ecx, [window.height]
mov edx, [sc.work]
or edx, 0x34000000
mov edi, sz_timer
mcall SF_CREATE_WINDOW
; draw.buttons:
mcall SF_DEFINE_BUTTON, (MARGIN shl 16) or BUTTON_START_WIDTH, ((MARGIN + CHAR_HEIGHT + MARGIN) shl 16) or BUTTON_HEIGHT, BUTTON_START, BUTTON_START_BACK_COLOR
mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) shl 16) or BUTTON_PAUSE_WIDTH,, BUTTON_PAUSE, BUTTON_PAUSE_BACK_COLOR
mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) shl 16) or BUTTON_RESET_WIDTH,, BUTTON_RESET, BUTTON_RESET_BACK_COLOR
;----------------------
; draw.texts:
mcall SF_DRAW_TEXT, ((MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP, 0x80FFFFFF, sz_start
mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP,, sz_pause
mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP,, sz_reset
;----------------------
call On_Idle
; redraw.finish
mcall SF_REDRAW,SSF_END_DRAW
ret
; ---------------------------------------------------------------------------- ;
DrawTime:
mov ebx, (1 shl 16)
mov esi, [sc.work_text]
mov edi, [sc.work]
; HH
mov eax, [hours]
xor edx, edx
mov ebp, 10
div ebp
mov ebp, edx
mov ecx, eax ; [hours] first digit
or esi, 0x70000000
mcall SF_DRAW_NUMBER,,, (TIME_AREA_LEFT shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + 1) shl 16) or TIME_AREA_TOP
mov ecx, ebp ; [hours] second digit
or esi, 0x70000000
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
; MM
mov eax, [minutes]
xor edx, edx
mov ebp, 10
div ebp
mov ebp, edx
mov ecx, eax ; [minutes] first digit
or esi, 0x70000000
mcall SF_DRAW_NUMBER,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) shl 16) or TIME_AREA_TOP
mov ecx, ebp ; [minutes] second digit
or esi, 0x70000000
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
; SS
mov eax, [seconds]
xor edx, edx
mov ebp, 10
div ebp
mov ebp, edx
mov ecx, eax ; [seconds] first digit
or esi, 0x70000000
mcall SF_DRAW_NUMBER,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) shl 16) or TIME_AREA_TOP
mov ecx, ebp ; [seconds] second digit
or esi, 0x70000000
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
and esi, 0x30FFFFFF
mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
ret
; ---------------------------------------------------------------------------- ;
On_Idle:
call dword [timer_proc]
call DrawTime
ret
; ---------------------------------------------------------------------------- ;
TimerStarted:
; get system counter
mcall SF_SYSTEM_GET,SSF_TIME_COUNT
sub eax, [timer_ticks]
xor edx, edx
mov ecx, 100
div ecx
mov ecx, 60
xor edx, edx
div ecx
mov [seconds], edx
xor edx, edx
div ecx
mov [hours], eax
mov [minutes], edx
ret
; ---------------------------------------------------------------------------- ;
EmptyProc:
ret
; ---------------------------------------------------------------------------- ;
align 4
program.end:
rb 512
align 16
program.stack:
program.memory: