0,0 → 1,699 |
; Run with OpenDialog ; |
; this source can be compiled ; |
; with FASM or NASM ; |
|
org 0 |
use32 |
|
STACK_SIZE equ 256 |
REDRAW_EVENT equ 1 |
KEY_EVENT equ 2 |
BUTTON_EVENT equ 3 |
MOUSE_EVENT equ 6 |
|
BUTTON_RUN equ 10 |
BUTTON_BROWSE equ 20 |
|
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 |
|
; ======================================================================= ; |
start_: |
; set.event |
mov eax, 40 |
mov ebx, 39 |
int 64 |
|
push sz_box_lib |
call load.library |
mov [box_lib], eax |
|
push dword[box_lib] |
push sz_edit_box |
call getprocaddress |
mov [edit_box_draw], eax |
|
push dword[box_lib] |
push sz_edit_box_key |
call getprocaddress |
mov [edit_box_key], eax |
|
push dword[box_lib] |
push sz_edit_box_mouse |
call getprocaddress |
mov [edit_box_mouse], eax |
|
push dword[box_lib] |
push sz_edit_box_set_text |
call getprocaddress |
mov [edit_box_set_text], eax |
|
push sz_proc_lib |
call load.library |
mov [proc_lib], eax |
|
push dword[proc_lib] |
push sz_OpenDialog_init |
call getprocaddress |
mov [opendialog_init], eax |
|
push dword[proc_lib] |
push sz_OpenDialog_start |
call getprocaddress |
mov [opendialog_start], eax |
|
|
; memory.allocate: |
mov eax, 68 |
mov ebx, 12 |
mov ecx, 4096 + 4096 + 4096 |
int 64 |
|
mov [od.procinfo], eax |
|
add eax, 1024 |
mov [od.filename_area], eax |
|
add eax, 4096 - 1024 |
mov [od.opendir_path], eax |
|
add eax, 4096 |
mov [od.openfile_path], eax |
|
push od |
call [opendialog_init] |
|
|
; get.screen.size |
mov eax, 61 |
mov ebx, 1 |
int 64 |
|
mov [screen], eax |
movzx eax, word[screen.width] |
shr eax, 3 |
lea eax, [eax*2 + eax] |
add eax, 72 |
mov [window.width], eax |
|
; skin.height |
mov eax, 48 |
mov ebx, 4 |
int 64 |
|
add eax, 64 |
mov [window.height], eax |
|
movzx eax, word[screen.width] |
sub eax, [window.width] |
shr eax, 1 |
mov [window.left], eax |
|
movzx eax, word[screen.height] |
sub eax, [window.height] |
sub eax, 24 |
mov [window.top], eax |
|
mov eax, [window.width] |
sub eax, 20 |
mov [edit1.width], eax |
|
mov eax, [od.openfile_path] |
mov [edit1.text], eax |
|
|
call on_redraw |
; ----------------------- ; |
.loop: |
; wait.event |
mov eax, 10 |
int 64 |
cmp eax, REDRAW_EVENT |
jne .check_key |
call on_redraw |
jmp .loop |
; ----------------------- ; |
.check_key: |
cmp eax, KEY_EVENT |
jne .check_button |
mov eax, 2 |
int 64 |
cmp ah, 13 |
jne .no_key_enter |
call on_button_run |
jmp .loop |
; ----------------------- ; |
.no_key_enter: |
push edit1 |
call [edit_box_key] |
jmp .loop |
; ----------------------- ; |
.check_button: |
cmp eax, BUTTON_EVENT |
jne .check_mouse |
; get.button.number |
mov eax, 17 |
int 64 |
cmp ah, 1 |
jne .check_button_run |
; program.terminate |
or eax, -1 |
int 64 |
; ----------------------- ; |
.check_button_run: |
cmp ah, BUTTON_RUN |
jne .check_button_browse |
call on_button_run |
jmp .loop |
; ----------------------- ; |
.check_button_browse: |
cmp ah, BUTTON_BROWSE |
jne .loop |
call on_button_browse |
jmp .loop |
; ----------------------- ; |
.check_mouse: |
cmp eax, MOUSE_EVENT |
jne .loop |
push edit1 |
call [edit_box_mouse] |
jmp .loop |
|
|
; ======================================================================= ; |
on_button_run: |
push dword[edit1.text] |
call extractrunpathandparams |
|
;file.run: |
mov eax, 70 |
mov ebx, file_info |
int 64 |
|
mov dl, byte[lastendpath] |
mov ecx, [ptrlastendpath] |
mov [ecx], dl |
|
test eax, eax |
jnge .error |
mov [runresult], dword sz_Program_run_successfully |
jmp .exit |
|
.error: |
; ----------------------- ; |
.5: |
cmp al, -5 |
jne .31 |
mov [runresult], dword sz_File_not_found |
jmp .exit |
; ----------------------- ; |
.31: |
cmp al, -31 |
jne .32 |
mov [runresult], dword sz_File_is_not_executable |
jmp .exit |
; ----------------------- ; |
.32: |
cmp al, -32 |
jne .10 |
mov [runresult], dword sz_Too_many_processes |
jmp .exit |
; ----------------------- ; |
.10: |
cmp al, -10 |
jne .30 |
mov [runresult], dword sz_Access_denied |
jmp .exit |
; ----------------------- ; |
.30: |
cmp al, -30 |
jne .unknown |
mov [runresult], dword sz_Out_of_memory |
jmp .exit |
; ----------------------- ; |
.unknown: |
mov [runresult], dword sz_Unknown_error |
; ----------------------- ; |
.exit: |
call on_redraw |
ret |
|
; ======================================================================= ; |
on_button_browse: |
push od |
call [opendialog_start] |
|
mov eax, [od.status] |
test eax, eax |
je .exit |
|
;======== if space exist in filepath, then quote filepath |
mov eax, [od.openfile_path] |
; ----------------------- ; |
.check_space: |
cmp [eax], byte 0 |
je .no_space |
cmp [eax], byte 32 ;space |
je .space |
inc eax |
jmp .check_space |
.space: |
; ----------------------- ; |
.find_end_zero: |
inc eax |
cmp [eax], byte 0 |
jne .find_end_zero |
mov [eax + 2], byte 0 |
mov [eax + 1], byte 34 ; quote |
; ----------------------- ; |
.shift_path: |
dec eax |
|
mov dl, byte [eax ] |
mov [eax + 1], dl |
|
cmp eax, [od.openfile_path] |
jne .shift_path |
mov [eax ], byte 34 ; quote |
|
.no_space: |
;================================= |
|
push dword[od.openfile_path] |
push edit1 |
call [edit_box_set_text] |
; ----------------------- ; |
.exit: |
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 |
|
mov eax, [sc.work_graph] |
mov [edit1.shift_color], eax |
|
mov eax, [sc.work_graph] |
mov [edit1.focus_border_color], eax |
|
mov eax, [sc.frames] |
mov [edit1.blur_border_color], eax |
|
mov eax, [sc.work_text] |
mov [edit1.text_color], 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, 34000000h |
mov edi, sz_run |
int 64 |
|
mov eax, [window.width] |
sub eax, 318 |
shr eax, 1 |
sub eax, 5 |
push eax |
push 5 |
push sz_Type_name_of_program |
push dword [sc.work_text] |
call draw.text |
|
; ====================| browse button |==================== |
push 20 |
push 5 |
push 38 |
push 42 |
push 17 |
call draw.button |
|
push 3 |
push 42 |
push sz_browse |
push dword [sc.work_button_text] |
call draw.text |
|
; ====================| run button |==================== |
push 10 |
mov eax, [window.width] |
sub eax, 57 |
push eax |
push 38 |
push 42 |
push 17 |
call draw.button |
|
mov eax, [window.width] |
sub eax, 56 |
push eax |
push 42 |
push sz_run |
push dword [sc.work_button_text] |
call draw.text |
; ===================================================== |
|
mov eax, 57 |
push eax |
mov eax, [window.height] |
sub eax, 44 |
push eax |
push dword[runresult] |
push dword [sc.work_text] |
call draw.text |
|
push edit1 |
call [edit_box_draw] |
|
; redraw.finish |
mov eax, 12 |
mov ebx, 2 |
int 64 |
|
ret |
|
|
; ======================================================================= ; |
extractrunpathandparams: |
xor ecx, ecx |
|
mov eax, [esp + 4] |
mov [runpath], eax |
|
movzx eax, byte [eax] |
cmp eax, 34 |
jne .start_without_quote |
|
inc ecx |
; ----------------------- ; |
.loop1: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
cmp eax, 34 |
jne .not_quote |
|
mov eax, [runpath] |
mov [eax + ecx], byte 0 |
|
mov eax, [runpath] |
add eax, ecx |
mov [ptrlastendpath], eax |
mov [lastendpath], byte 34 |
inc ecx |
; ----------------------- ; |
.skip_space1: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
cmp al, 32 |
jne .skipped1 |
inc ecx |
jmp .skip_space1 |
; ----------------------- ; |
.skipped1: |
mov eax, [runpath] |
add eax, ecx |
mov [runparams], eax |
inc dword [runpath] |
jmp .exit |
; ----------------------- ; |
.not_quote: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
|
test eax, eax |
jne .not_zero1 |
mov eax, [runpath] |
add eax, ecx |
mov [runparams], eax |
mov eax, [runpath] |
add eax, ecx |
mov [ptrlastendpath], eax |
mov [lastendpath], byte 0 |
jmp .exit |
; ----------------------- ; |
.not_zero1: |
inc ecx |
jmp .loop1 |
; ----------------------- ; |
.start_without_quote: |
; ----------------------- ; |
.loop2: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
cmp eax, 32 |
jne .not_space |
|
mov eax, [runpath] |
mov [eax + ecx], byte 0 |
|
mov eax, [runpath] |
add eax, ecx |
mov [ptrlastendpath], eax |
mov [lastendpath], byte 32 |
inc ecx |
; ----------------------- ; |
.skip_space2: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
cmp al, 32 |
jne .skipped2 |
inc ecx |
jmp .skip_space2 |
; ----------------------- ; |
.skipped2: |
mov eax, [runpath] |
add eax, ecx |
mov [runparams], eax |
jmp .exit |
; ----------------------- ; |
.not_space: |
mov eax, [runpath] |
movzx eax, byte [eax + ecx] |
|
test eax, eax |
jne .not_zero2 |
mov eax, [runpath] |
add eax, ecx |
mov [runparams], eax |
mov eax, [runpath] |
add eax, ecx |
mov [ptrlastendpath], eax |
mov [lastendpath], byte 0 |
jmp .exit |
; ----------------------- ; |
.not_zero2: |
inc ecx |
jmp .loop2 |
; ----------------------- ; |
.exit: |
ret 4 |
|
; ======================================================================= ; |
draw.button: |
mov eax, 8 |
mov ebx, [esp + 16] |
shl ebx, 16 |
add ebx, [esp + 8] |
mov ecx, [esp + 12] |
shl ecx, 16 |
add ecx, [esp + 4] |
mov edx, [esp + 20] |
mov esi, [sc.work_button] |
int 64 |
ret 20 |
; ======================================================================= ; |
draw.text: |
mov eax, 4 |
mov ebx, [esp + 16] |
shl ebx, 16 |
add ebx, [esp + 12] |
mov ecx, 2147483648 |
or ecx, [esp + 4] |
mov edx, [esp + 8] |
int 64 |
ret 16 |
; ======================================================================= ; |
load.library: |
mov eax, 68 |
mov ebx, 19 |
mov ecx, [esp + 4] |
int 64 |
ret 4 |
; ======================================================================= ; |
getprocaddress: |
mov edx, [esp + 8] ; hlib |
xor eax, eax |
test edx, edx ; If hlib = 0 then goto .end |
jz .end |
; ----------------------- ; |
.next: |
cmp [edx], dword 0 ; If end of export table then goto .end |
jz .end |
|
xor eax, eax |
mov esi, [edx] |
mov edi, [esp + 4] ; name |
; ----------------------- ; |
.next_: |
lodsb |
scasb |
jne .fail |
or al, al |
jnz .next_ |
jmp .ok |
; ----------------------- ; |
.fail: |
add edx, 8 |
jmp .next |
; ----------------------- ; |
.ok: ; return address |
mov eax, [edx + 4] |
; ----------------------- ; |
.end: |
ret 8 |
|
|
|
file_info: |
dd 7 |
dd 0 |
runparams: |
dd 0 |
dd 0 |
dd 0 |
db 0 |
runpath: |
dd 0 |
|
|
screen: |
.height dw 0 |
.width dw 0 |
|
window: |
.left dd 0 |
.top dd 0 |
.width dd 0 |
.height dd 0 |
|
box_lib dd 0 |
|
edit1: |
.width dd 0 |
.left dd 5 |
.top dd 19 |
.color dd 0ffffffffh |
.shift_color dd 0 |
.focus_border_color dd 0 |
.blur_border_color dd 0 |
.text_color dd 0 |
.max dd 4096 |
.text dd 0 |
.mouse_variable dd 0 |
.flags dd 2 |
.size dd 0 |
.pos dd 0 |
.offset dd 0 |
.cl_curs_x dd 0 |
.cl_curs_y dd 0 |
.shift dd 0 |
.shift_old dd 0 |
|
edit_box_draw dd 0 |
edit_box_key dd 0 |
edit_box_mouse dd 0 |
edit_box_set_text 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 |
|
proc_lib dd 0 |
|
od: |
.mode dd 0 |
.procinfo dd 0 |
.com_area_name dd sz_FFFFFFFF_open_dialog |
.com_area dd 0 |
.opendir_path dd 0 |
.dir_default_path dd sz_SYS |
.start_path dd sz_opendial_path |
.draw_window dd on_redraw |
.status dd 0 |
.openfile_path dd 0 |
.filename_area dd 0 |
.filter_area dd filefilter |
.x_size dw 414 |
.x_start dw 0 |
.y_size dw 414 |
.y_start dw 0 |
|
opendialog_init dd 0 |
opendialog_start dd 0 |
|
filefilter dd 0 |
runresult dd sz_empty |
|
lastendpath db 0 |
ptrlastendpath dd 0 |
|
sz_empty db 0 |
|
sz_box_lib db "/sys/lib/box_lib.obj",0 |
sz_edit_box db "edit_box",0 |
sz_edit_box_key db "edit_box_key",0 |
sz_edit_box_mouse db "edit_box_mouse",0 |
sz_edit_box_set_text db "edit_box_set_text",0 |
|
sz_proc_lib db "/sys/lib/proc_lib.obj",0 |
sz_OpenDialog_init db "OpenDialog_init",0 |
sz_OpenDialog_start db "OpenDialog_start",0 |
sz_FFFFFFFF_open_dialog db "FFFFFFFF_open_dialog",0 |
sz_SYS db "/sys",0 |
sz_opendial_path db "/sys/File managers/opendial",0 |
|
sz_Program_run_successfully db "Program run successfully",0 |
sz_File_not_found db "File not found",0 |
sz_File_is_not_executable db "File is not executable",0 |
sz_Too_many_processes db "Too many processes",0 |
sz_Access_denied db "Access denied",0 |
sz_Out_of_memory db "Out of memory",0 |
sz_Unknown_error db "Unknown error",0 |
|
sz_Type_name_of_program db "Type name of program, and Kolibri will run it for you",0 |
|
sz_run db " Run ",0 |
sz_browse db " Browse ",0 |
|
; ======================================================================= ; |
end_: |
|