2025-03-07 01:10:44 +01:00

320 lines
11 KiB
NASM
Raw Permalink Blame History

; 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: