0,0 → 1,441 |
; program to generate files ; |
; path to folder in edit1 ; |
; count of files in edit2 ; |
; to compile: nasm -f bin GenFiles.asm -o GenFiles ; |
ORG 0 |
BITS 32 |
; ------------------------------------- ; |
STACK_SIZE equ 256 |
; ------------------------------------- ; |
EM_REDRAW equ 0b1 |
EM_KEY equ 0b10 |
EM_BUTTON equ 0b100 |
EM_MOUSE equ 0b100000 |
; ------------------------------------- ; |
BUTTON_START equ 2 |
; ------------------------------------- ; |
ED_DISABLED equ 0b100000000000 |
; ------------------------------------- ; |
EDIT1_MAX_LENGTH equ 1024 |
EDIT2_MAX_LENGTH equ 10 |
FILE_NAME_LENGTH equ 256 |
; ------------------------------------- ; |
text_buffer1 equ END + STACK_SIZE |
text_buffer2 equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) |
file_name equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2) |
; ------------------------------------- ; |
MENUET01 db 'MENUET01' |
version dd 1 |
program.start dd START |
program.end dd END |
program.memory dd END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2) + FILE_NAME_LENGTH |
program.stack dd END + STACK_SIZE |
program.params dd 0 |
program.path dd 0 |
; ------------------------------------- ; |
align 4 |
Events: |
.0: dd On_Idle |
.1: dd On_Redraw |
.2: dd On_Key |
.3: dd On_Button |
.4: dd 0 |
.5: dd 0 |
.6: dd On_Mouse |
; ------------------------------------- ; |
ButtonEvents: |
.0: dd 0 |
.1: dd On_ButtonClose |
.2: dd On_ButtonStart |
; ------------------------------------- ; |
count dd 0 |
; ------------------------------------- ; |
pb: |
.value dd 0 |
.left dd 8 |
.top dd 25 |
.width dd 269 |
.height dd 10 |
.style dd 0 |
.min dd 0 |
.max dd 0 |
.back_color dd 0x00C8D0D4 |
.progress_color dd 0x8072B7EB |
.frame_color dd 0x00406175 |
; ------------------------------------- ; |
edit1: |
.width dd 100 |
.left dd 48 |
.top dd 8 |
.color dd 0X00FFFFFF |
.shift_color dd 0 |
.focus_border_color dd 0 |
.blur_border_color dd 0 |
.text_color dd 0 |
.max dd EDIT1_MAX_LENGTH |
.text dd text_buffer1 |
.mouse_variable dd 0 |
.flags dd 10b ; active |
.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 |
; ------------------------------------- ; |
edit2: |
.width dd 60 |
.left dd 216 |
.top dd 8 |
.color dd 0X00FFFFFF |
.shift_color dd 0 |
.focus_border_color dd 0 |
.blur_border_color dd 0 |
.text_color dd 0 |
.max dd EDIT2_MAX_LENGTH |
.text dd text_buffer2 |
.mouse_variable dd 0 |
.flags dd 1000000000000000b ; only numbers |
.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 |
; ------------------------------------- ; |
progressbar_progress dd 0 |
progressbar_draw dd 0 |
; ------------------------------------- ; |
edit_box_draw dd 0 |
edit_box_key dd 0 |
edit_box_mouse dd 0 |
edit_box_set_text dd 0 |
; ------------------------------------- ; |
status_string dd sz_empty |
; ------------------------------------- ; |
box_lib dd 0 |
; ------------------------------------- ; |
sz_box_lib db "/sys/lib/box_lib.obj",0 |
; ------------------------------------- ; |
sz_progressbar_draw db 'progressbar_draw', 0 |
sz_progressbar_progress db 'progressbar_progress', 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_path db "Path:",0 |
sz_count db "Count:",0 |
sz_start db "Start",0 |
sz_caption db "Generate files",0 |
; ------------------------------------- ; |
sz_empty db "",0 |
sz_doing db "doing",0 |
sz_done db "done ",0 |
sz_error db "error",0 |
; ------------------------------------- ; |
digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
; ------------------------------------- ; |
START: |
; LoadLibrary: |
mov eax, 68 |
mov ebx, 19 |
mov ecx, sz_box_lib |
int 64 |
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 dword[box_lib] |
push sz_progressbar_draw |
call GetProcAddress |
mov [progressbar_draw], eax |
|
push dword[box_lib] |
push sz_progressbar_progress |
call GetProcAddress |
mov [progressbar_progress], eax |
; ------------------------------------- ; |
; SetEventMask |
mov eax, 40 |
mov ebx, EM_REDRAW | EM_KEY | EM_BUTTON | EM_MOUSE |
int 64 |
; ------------------------------------- ; |
align 4 |
WaitEvent: |
mov eax, 10 |
int 64 |
call [eax * 4 + Events] |
jmp WaitEvent |
; ------------------------------------- ; |
%macro CreateNextFile 0 |
; Base36(count) |
mov eax, [count] |
mov ecx, 36 ; because our base is 36 |
mov esi, file_name |
mov edi, esi |
add esi, 7 ; base36(0xFFFFFFFF) = 1Z141Z3 : 7 simbols |
mov [esi], byte 0 |
%%next: |
xor edx, edx |
div ecx |
dec esi |
mov dl, [edx + digits] |
mov [esi], dl |
test eax, eax |
jnz %%next |
mov eax, esi |
sub eax, edi |
mov ecx, 7 + 1 |
sub ecx, eax |
rep movsb |
; ------------------------------------- ; |
push dword file_name |
dec esp |
mov [esp], byte 0 |
push dword 0 |
push dword 0 |
push dword 0 |
push dword 0 |
push dword 2 ; SubFunction #2 Create/Rewrite file |
mov ebx, esp |
mov eax, 70 ; Function #70 |
int 64 |
add esp, 25 ; restore stack |
%endmacro |
; ------------------------------------- ; |
align 4 |
DoAction: |
; convert text in edit2 to number |
mov edx, [edit2.text] |
xor eax, eax |
xor ecx, ecx |
.convert: |
mov al, [edx] |
test al, al |
jz .converted |
lea ecx, [ecx + ecx * 4] |
lea ecx, [eax + ecx * 2 - 48] |
inc edx |
jmp .convert |
.converted: |
mov [count], ecx |
; ------------------------------------- ; |
mov [pb.max], ecx |
mov [pb.value], dword 0 |
; draw progressbar |
push pb |
call [progressbar_draw] |
; ------------------------------------- ; |
cmp [count], dword 0 |
jz .done |
; SetCurrentDirectory |
mov eax, 30 |
mov ebx, 1 |
mov ecx, [edit1.text] |
int 64 |
; |
mov [status_string], dword sz_doing |
call DrawStatus |
.do: |
CreateNextFile |
test eax, eax |
jnz .error |
; increase progress |
push pb |
call [progressbar_progress] |
; CheckEvent |
mov eax, 11 |
int 64 |
call [eax * 4 + Events] |
dec dword [count] |
jnz .do |
.done: |
mov [status_string], dword sz_done |
call DrawStatus |
ret |
.error: |
mov [status_string], dword sz_error |
call DrawStatus |
ret |
; ------------------------------------- ; |
DrawStatus: |
mov eax, 4 |
mov ecx, 0xC0000000 |
mov ebx, (168 << 16) | 38 |
mov edx, [status_string] |
mov edi, 0x00FFFFFF |
int 64 |
ret |
; ------------------------------------- ; |
align 4 |
On_Idle: |
ret |
; ------------------------------------- ; |
align 4 |
On_Redraw: |
; RedrawStart |
mov eax, 12 |
mov ebx, 1 |
int 64 |
; DrawWindow |
xor eax, eax |
mov ebx, 360 |
mov ecx, 74 |
mov edx, 0x34FFFFFF |
mov edi, sz_caption |
xor esi, esi |
int 64 |
; draw progressbar |
push pb |
call [progressbar_draw] |
; draw edit1 |
push edit1 |
call [edit_box_draw] |
; draw edit2 |
push edit2 |
call [edit_box_draw] |
; DrawButton |
mov eax, 8 |
mov ecx, (8 << 16) | 26 |
mov ebx, (288 << 16) | 53 |
mov edx, BUTTON_START |
mov esi, 0x00DDDDDD |
int 64 |
; DrawTexts |
mov eax, 4 |
mov ecx, 0x80000000 |
; Path: |
mov ebx, (8 << 16) | 11 |
mov edx, sz_path |
int 64 |
; Count: |
mov ebx, (176 << 16) | 11 |
mov edx, sz_count |
int 64 |
; Start: |
mov ebx, (302 << 16) | 18 |
mov edx, sz_start |
int 64 |
; draw status |
mov ebx, (168 << 16) | 38 |
mov edx, [status_string] |
int 64 |
; RedrawFinish |
mov eax, 12 |
mov ebx, 2 |
int 64 |
ret |
; ------------------------------------- ; |
align 4 |
On_Key: |
; GetKeyCode |
mov eax, 2 |
int 64 |
; notify edit1 about key event |
push edit1 |
call [edit_box_key] |
; notify edit2 about key event |
push edit2 |
call [edit_box_key] |
ret |
; ------------------------------------- ; |
align 4 |
On_Button: |
; GetButtonNumber |
mov eax, 17 |
int 64 |
movzx eax, ah |
call [eax * 4 + ButtonEvents] |
ret |
; ------------------------------------- ; |
align 4 |
On_ButtonClose: |
; Terminate |
or eax, -1 |
int 64 |
; ret is not needed here because we are not back after terminate |
; ------------------------------------- ; |
align 4 |
On_ButtonStart: |
mov [ButtonEvents.2], dword On_Idle ; disable ButtonStart | because |
or [edit1.flags], dword ED_DISABLED ; disable edit1 | we will |
or [edit2.flags], dword ED_DISABLED ; disable edit2 | in Action |
; redraw edit1 after change flag |
push edit1 |
call [edit_box_draw] |
; redraw edit2 after change flag |
push edit2 |
call [edit_box_draw] |
call DoAction |
mov [ButtonEvents.2], dword On_ButtonStart ; enable ButtonStart |
and [edit1.flags], dword ~ED_DISABLED ; enable edit1 |
and [edit2.flags], dword ~ED_DISABLED ; enable edit2 |
; redraw edit1 after change flag |
push edit1 |
call [edit_box_draw] |
; redraw edit2 after change flag |
push edit2 |
call [edit_box_draw] |
ret |
; ------------------------------------- ; |
align 4 |
On_Mouse: |
; notify edit1 about mouse event |
push edit1 |
call [edit_box_mouse] |
; notify edit2 about mouse event |
push edit2 |
call [edit_box_mouse] |
ret |
; ------------------------------------- ; |
align 4 |
GetProcAddress: |
mov edx, [esp + 8] |
xor eax, eax |
test edx, edx |
jz .end |
.next: |
xor eax, eax |
cmp [edx], dword 0 |
jz .end |
mov esi, [edx] |
mov edi, [esp + 4] |
.next_: |
lodsb |
scasb |
jne .fail |
test al, al |
jnz .next_ |
jmp .ok |
.fail: |
add edx, 8 |
jmp .next |
.ok: |
mov eax, [edx + 4] |
.end: |
ret 8 |
; ------------------------------------- ; |
align 4 |
END: |