mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2025-09-10 12:30:53 -04:00
320 lines
11 KiB
NASM
320 lines
11 KiB
NASM
; 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 "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",0
|
||
|
||
sz_start: db "<22><><EFBFBD><EFBFBD><EFBFBD>"
|
||
.end: db 0
|
||
sz_pause: db "<22><>㧠"
|
||
.end: db 0
|
||
sz_reset: db "<22><><EFBFBD><EFBFBD><EFBFBD>"
|
||
.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:
|