From f31a95f957d25968b2bf8ab15ca2e3a3848f176c Mon Sep 17 00:00:00 2001 From: 0CodErr <0CodErr@kolibrios.org> Date: Sat, 12 Oct 2013 09:58:40 +0000 Subject: [PATCH] fix for #4009, #4010 git-svn-id: svn://kolibrios.org@4011 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/other/RDInfo/RDInfo.asm | 135 +++++++++++ programs/other/RDInfo/make.bat | 1 + programs/other/Timer/Timer.asm | 393 +++++++++++++++++++++++++++++++ programs/other/Timer/make.bat | 1 + 4 files changed, 530 insertions(+) create mode 100644 programs/other/RDInfo/RDInfo.asm create mode 100644 programs/other/RDInfo/make.bat create mode 100644 programs/other/Timer/Timer.asm create mode 100644 programs/other/Timer/make.bat diff --git a/programs/other/RDInfo/RDInfo.asm b/programs/other/RDInfo/RDInfo.asm new file mode 100644 index 0000000000..5f92e43a83 --- /dev/null +++ b/programs/other/RDInfo/RDInfo.asm @@ -0,0 +1,135 @@ +ORG 0 +BITS 32 +; ---------------------------------------------------------------------------- ; +STACK_SIZE equ 256 +; ---------------------------------------------------------------------------- ; +MENUET01 db 'MENUET01' +version dd 1 +program.start dd start_ +program.end dd end_ +program.memory dd end_ + STACK_SIZE +program.stack dd end_ + STACK_SIZE +program.params dd 0 +program.path dd 0 +; ---------------------------------------------------------------------------- ; +Partition: +.full_space dd 0 +.free_space dd 0 +; ---------------------------------------------------------------------------- ; +FS_Info: +.cluster_size dd 0 +.all_clusters dd 0 +.free_clusters dd 0 +; ---------------------------------------------------------------------------- ; +sz_caption db "RDInfo",0 +sz_all_clusters db "All clusters:",0 +sz_free_clusters db "Free clusters:",0 +sz_cluster_size db "Cluster size:",0 +sz_full_space db "Full space(kb):",0 +sz_free_space db "Free space(kb):",0 +; ---------------------------------------------------------------------------- ; +%define buffer [esp + 8] +%define disk [esp + 4] +get_file_system_info: + mov edx, esp + sub edx, 24 + mov [edx], dword 15 + mov eax, disk + mov [edx + 20], eax + mov eax, 58 + lea ebx, [edx] + int 64 + mov esi, eax + mov edx, [edx] + mov eax, buffer + mov [eax], edx + mov [eax + 4], ebx + mov [eax + 8], ecx + mov eax, esi + ret 8 +; ---------------------------------------------------------------------------- ; +start_: +; set.event: + mov eax, 40 + mov ebx, 5 ; redraw + button + int 64 +on_redraw: +; redraw.start + mov eax, 12 + mov ebx, 1 + int 64 +; draw.window + xor eax, eax + mov ebx, 200 + mov ecx, 100 + mov edx, 0x34CCDDEE + mov edi, sz_caption + int 64 +; get.info + push dword FS_Info + push dword "/rd" ; ramdisk + call get_file_system_info + + mov eax, [FS_Info.all_clusters] + mul dword [FS_Info.cluster_size] + shr eax, 10 + mov [Partition.full_space], eax + + mov eax, [FS_Info.free_clusters] + mul dword [FS_Info.cluster_size] + shr eax, 10 + mov [Partition.free_space], eax +; draw.info + mov eax, 4 + mov ecx, 0xC0000000 + mov edi, 0x00CCDDEE + + mov ebx, (10 << 16) | 10 + mov edx, sz_all_clusters + int 64 + mov ebx, (10 << 16) | 20 + mov edx, sz_free_clusters + int 64 + mov ebx, (10 << 16) | 30 + mov edx, sz_cluster_size + int 64 + mov ebx, (10 << 16) | 40 + mov edx, sz_full_space + int 64 + mov ebx, (10 << 16) | 50 + mov edx, sz_free_space + int 64 + + mov eax, 47 + mov ebx, (10 << 16) | 0x80000000 + mov esi, ecx + + mov ecx, [FS_Info.all_clusters] + mov edx, (110 << 16) | 10 + int 64 + mov ecx, [FS_Info.free_clusters] + mov edx, (110 << 16) | 20 + int 64 + mov ecx, [FS_Info.cluster_size] + mov edx, (110 << 16) | 30 + int 64 + mov ecx, [Partition.full_space] + mov edx, (110 << 16) | 40 + int 64 + mov ecx, [Partition.free_space] + mov edx, (110 << 16) | 50 + int 64 +; redraw.finish + mov eax, 12 + mov ebx, 2 + int 64 +; wait.event + mov eax, 10 + int 64 + dec eax + jz on_redraw +; program.terminate: + or eax, -1 + int 64 +; ---------------------------------------------------------------------------- ; +end_: \ No newline at end of file diff --git a/programs/other/RDInfo/make.bat b/programs/other/RDInfo/make.bat new file mode 100644 index 0000000000..c93c6c5ea5 --- /dev/null +++ b/programs/other/RDInfo/make.bat @@ -0,0 +1 @@ +nasm -f bin RDInfo.asm -o RDInfo diff --git a/programs/other/Timer/Timer.asm b/programs/other/Timer/Timer.asm new file mode 100644 index 0000000000..bf526f90f2 --- /dev/null +++ b/programs/other/Timer/Timer.asm @@ -0,0 +1,393 @@ +; Timer with three buttons ; +; %define lang "ru" +; %define lang "it" +ORG 0 +BITS 32 +; ---------------------------------------------------------------------------- ; +STACK_SIZE equ 256 + +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 equ (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH +BUTTON_PAUSE_WIDTH equ (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH +BUTTON_RESET_WIDTH equ (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH + +BUTTON_HEIGHT equ (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1 + +WINDOW_WIDTH equ (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH) + +TIME_AREA_WIDTH equ (CHAR2_WIDTH * 8) ; HH MM SS +TIME_AREA_LEFT equ (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2 +TIME_AREA_TOP equ MARGIN + 1 + +TEXT_ON_BUTTONS_TOP equ (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 +; ---------------------------------------------------------------------------- ; +MENUET01 db 'MENUET01' +version dd 1 +program.start dd START +program.end dd END +program.memory dd END + STACK_SIZE +program.stack dd END + STACK_SIZE +program.params dd 0 +program.path dd 0 +; ---------------------------------------------------------------------------- ; +screen: +.height dw 0 +.width dw 0 +; ---------------------------------------------------------------------------- ; +window: +.left dd 0 +.top dd 0 +.width dd WINDOW_WIDTH +.height dd 0 +; ---------------------------------------------------------------------------- ; +sc: +.frames dd 0 +.grab dd 0 +.grab_button dd 0 +.grab_button_text dd 0 +.grab_text dd 0 +.work dd 0 +.work_button dd 0 +.work_button_text dd 0 +.work_text dd 0 +.work_graph dd 0 +; ---------------------------------------------------------------------------- ; +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 +; ---------------------------------------------------------------------------- ; +%ifidn lang, "ru" + sz_timer db "Таймер",0 + + sz_start: db "старт" + .end: db 0 + sz_pause: db "пауза" + .end: db 0 + sz_reset: db "сброс" + .end: db 0 +%elifidn lang, "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 +%endif +; ---------------------------------------------------------------------------- ; +START: +; get.screen.size + mov eax, 61 + mov ebx, 1 + int 64 + mov [screen], eax + + movzx eax, word[screen.width] + sub eax, [window.width] + shr eax, 1 + mov [window.left], eax + +; skin.height + mov eax, 48 + mov ebx, 4 + int 64 + 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: + mov eax, 23 + mov ebx, 50 + int 64 + call [eax * 4 + Events] + jmp wait.event +; ---------------------------------------------------------------------------- ; +On_KeyPress: + mov eax, 2 + int 64 + ret +; ---------------------------------------------------------------------------- ; +On_ButtonPress: + mov eax, 17 + int 64 + movzx eax, ah + call [eax * 4 + ButtonEvents] + ret +; ---------------------------------------------------------------------------- ; +On_ButtonClose: + or eax, -1 + int 64 +; ---------------------------------------------------------------------------- ; +On_ButtonStart: +; get system counter + mov eax, 26 + mov ebx, 9 + int 64 + 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 + mov eax, 26 + mov ebx, 9 + int 64 + 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 + mov eax, 12 + mov ebx, 1 + int 64 +; get.standart.colors + mov eax, 48 + mov ebx, 3 + mov ecx, sc + mov edx, 40 + int 64 +; skin.height + mov eax, 48 + mov ebx, 4 + int 64 + add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT + mov [window.height], eax +; draw.window + xor eax, eax + 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 + int 64 +; draw.buttons: + mov eax, 8 + mov ecx, ((MARGIN + CHAR_HEIGHT + MARGIN) << 16) | BUTTON_HEIGHT + + mov ebx, (MARGIN << 16) | BUTTON_START_WIDTH + mov edx, BUTTON_START + mov esi, BUTTON_START_BACK_COLOR + int 64 + + mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_PAUSE_WIDTH + mov edx, BUTTON_PAUSE + mov esi, BUTTON_PAUSE_BACK_COLOR + int 64 + + mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_RESET_WIDTH + mov edx, BUTTON_RESET + mov esi, BUTTON_RESET_BACK_COLOR + int 64 +;---------------------- +; draw.texts: + mov eax, 4 + mov ecx, 0x80FFFFFF + + mov ebx, ((MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP + mov edx, sz_start + int 64 + + mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP + mov edx, sz_pause + int 64 + + mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP + mov edx, sz_reset + int 64 +;---------------------- + call On_Idle +; redraw.finish + mov eax, 12 + mov ebx, 2 + int 64 + ret +; ---------------------------------------------------------------------------- ; +DrawTime: + mov ebx, (1 << 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 + mov eax, 47 + mov edx, (TIME_AREA_LEFT << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1) << 16) | TIME_AREA_TOP + int 64 + + mov ecx, ebp ; [hours] second digit + + or esi, 0x70000000 + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP + int 64 +; MM + mov eax, [minutes] + xor edx, edx + mov ebp, 10 + div ebp + mov ebp, edx + + mov ecx, eax ; [minutes] first digit + + or esi, 0x70000000 + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) << 16) | TIME_AREA_TOP + int 64 + + mov ecx, ebp ; [minutes] second digit + + or esi, 0x70000000 + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP + int 64 +; SS + mov eax, [seconds] + xor edx, edx + mov ebp, 10 + div ebp + mov ebp, edx + + mov ecx, eax ; [seconds] first digit + + or esi, 0x70000000 + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) << 16) | TIME_AREA_TOP + int 64 + + mov ecx, ebp ; [seconds] second digit + + or esi, 0x70000000 + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP + int 64 + and esi, 0x30FFFFFF + mov eax, 47 + mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP + int 64 + ret +; ---------------------------------------------------------------------------- ; +On_Idle: + call dword [timer_proc] + call DrawTime + ret +; ---------------------------------------------------------------------------- ; +TimerStarted: +; get system counter + mov eax, 26 + mov ebx, 9 + int 64 + 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 +; ---------------------------------------------------------------------------- ; +END: \ No newline at end of file diff --git a/programs/other/Timer/make.bat b/programs/other/Timer/make.bat new file mode 100644 index 0000000000..99437d6616 --- /dev/null +++ b/programs/other/Timer/make.bat @@ -0,0 +1 @@ +nasm -f bin Timer.asm -o Timer