From 3d31c6abab48390b1d7d67d5e195e61c0489a17a Mon Sep 17 00:00:00 2001 From: Yogev Ezra Date: Sun, 30 Jan 2011 16:12:10 +0000 Subject: [PATCH] 'kerpack' removed (it already exists on SVN in /programs/other folder). 'MyKey' updated till ver. 0.2 git-svn-id: svn://kolibrios.org@1816 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/MyKey/trunk/ASPAPI.INC | 16 +- programs/system/MyKey/trunk/MyKey.asm | 800 +++++++++++++----- programs/system/MyKey/trunk/ReadMe.txt | 14 +- programs/system/MyKey/trunk/debug.inc | 2 + programs/system/MyKey/trunk/dll.inc | 157 ++++ programs/system/MyKey/trunk/mykey.ini | 46 + programs/system/MyKey/trunk/string.inc | 94 ++ programs/system/kerpack/trunk/calltrick2.asm | 32 - programs/system/kerpack/trunk/doexe2.asm | 68 -- programs/system/kerpack/trunk/kerpack.asm | 232 ----- programs/system/kerpack/trunk/kerpack.bat | 7 - programs/system/kerpack/trunk/loader_lzma.asm | 404 --------- programs/system/kerpack/trunk/lzmapack.lib | Bin 82830 -> 0 bytes programs/system/kerpack/trunk/memset.asm | 11 - 14 files changed, 885 insertions(+), 998 deletions(-) create mode 100644 programs/system/MyKey/trunk/dll.inc create mode 100644 programs/system/MyKey/trunk/mykey.ini create mode 100644 programs/system/MyKey/trunk/string.inc delete mode 100644 programs/system/kerpack/trunk/calltrick2.asm delete mode 100644 programs/system/kerpack/trunk/doexe2.asm delete mode 100644 programs/system/kerpack/trunk/kerpack.asm delete mode 100644 programs/system/kerpack/trunk/kerpack.bat delete mode 100644 programs/system/kerpack/trunk/loader_lzma.asm delete mode 100644 programs/system/kerpack/trunk/lzmapack.lib delete mode 100644 programs/system/kerpack/trunk/memset.asm diff --git a/programs/system/MyKey/trunk/ASPAPI.INC b/programs/system/MyKey/trunk/ASPAPI.INC index 74f9e9e29f..811503580b 100644 --- a/programs/system/MyKey/trunk/ASPAPI.INC +++ b/programs/system/MyKey/trunk/ASPAPI.INC @@ -17,7 +17,7 @@ macro start_draw_window x,y,xsize,ysize,areacolor,caption,capsize ; WINDOW LABEL mov eax, 4 ; function 4 : write text to window mov ebx, 8*65536+8 ; [x start] *65536 + [y start] - mov ecx, 0x00ffffff ; color of text RRGGBB + mov ecx, 0x0;0ffffff ; color of text RRGGBB mov edx, caption ; pointer to text beginning mov esi, capsize ; text length int 0x40 @@ -89,6 +89,10 @@ proc outtextxy stdcall, x:dword, y:dword, prompt:dword, prompt_len:dword, color: mov ecx, dword [color] mov edx, dword [prompt] mov esi, dword [prompt_len] + test esi, esi + jnz @f + or ecx, 0x80000000 + @@: int 0x40 popa ret @@ -138,6 +142,16 @@ macro rectangle x,y,xsize,ysize,color line x2,y,x2,y2,color } +macro rectangle2 x,y,xsize,ysize,color1,color2 +{ + x2=x+xsize + y2=y+ysize + line x,y,x2,y,color1 + line x,y,x,y2,color1 + line x,y2,x2,y2,color2 + line x2,y,x2,y2,color2 +} + macro putpixel x,y,color { mov eax, 1 diff --git a/programs/system/MyKey/trunk/MyKey.asm b/programs/system/MyKey/trunk/MyKey.asm index 69ae486c91..f0d079ecc2 100644 --- a/programs/system/MyKey/trunk/MyKey.asm +++ b/programs/system/MyKey/trunk/MyKey.asm @@ -1,8 +1,8 @@ ; -; MyKey. Version 0.1. +; MyKey. Version 0.2. ; ; Author: Asper -; Date of issue: 04.12.2009 +; Date of issue: 29.12.2009 ; Compiler: FASM ; Target: KolibriOS ; @@ -10,36 +10,45 @@ use32 org 0x0 - db 'MENUET00' ; 8 byte id + db 'MENUET01' ; 8 byte id dd 38 ; required os dd STARTAPP ; program start dd I_END ; program image size - dd 0x1000000 ; required amount of memory - dd 0x00000000 ; reserved=no extended header + dd 0x1000000 ; required amount of memory + dd 0x1000000 ; stack heap + dd 0x0 + dd app_path -include "aspAPI.inc" +include 'aspAPI.inc' +include 'string.inc' include 'macros.inc' include 'editbox_ex.mac' include 'load_lib.mac' +include 'dll.inc' include 'debug.inc' DEBUG equ 0;1 N_KEYCOLOR equ 0x00EEEEEE ; Normal button color C_KEYCOLOR equ 0x00CBE1E1 ; Control button color -A_KEYCOLOR equ 0x000099BB;258778 ; Active button color +A_KEYCOLOR equ 0x00FF6400;258778 ; Active button color C_TEXTCOLOR equ 0x80000000 ; Button caption color CA_TEXTCOLOR equ 0x80FFFFFF ; Active button caption color +A_TEXTCOLOR equ 0x00FFFFFF ; Active text color -WIN_X equ 265 -WIN_Y equ 50;175 -WIN_W equ 595 -WIN_H equ 415 ;570 -WIN_COLOR equ 0x04EEEEEE +WIN_X equ 265 +WIN_Y equ 50;175 +WIN_W equ 595 +WIN_H equ 415 ;570 +WIN_COLOR equ 0x040099BB;0x04EEEEEE -BUT_W equ 192;100 -BUT_H equ 23 -BUT_SPACE equ 0 +ITEM_BUTTON_W equ 192;100 +ITEM_BUTTON_H equ 23 +ITEM_BUTTON_SPACE equ 0 +FIRST_ITEM_BUTTON_ID equ 7 + +BUT_W equ 80 +BUT_H equ 20 MAX_HOTKEYS_NUM equ 15 ; Bad bounding :/. Until we have normal listbox control. PATH_MAX_CHARS equ 255 @@ -47,42 +56,66 @@ PATH_MAX_CHARS equ 255 @use_library STARTAPP: + ; Initialize memory + mcall 68, 11 + or eax,eax + jz close_app + ; Import libraries sys_load_library boxlib_name, sys_path, boxlib_name, system_dir0, err_message_found_lib, head_f_l, myimport,err_message_import, head_f_i cmp eax,-1 jz close_app - ;mcall 68,11 - ;or eax,eax - ;jz close_app + stdcall dll.Load,importTable + test eax, eax + jnz close_app + + ; Get memory for editboxes text + mcall 68, 12, MAX_HOTKEYS_NUM*PATH_MAX_CHARS + mov dword [buf_cmd_line], eax + mov dword [edit1.text], eax + mcall 68, 12, MAX_HOTKEYS_NUM*PATH_MAX_CHARS + mov dword [buf_cmd_params], eax + mov dword [edit2.text], eax + mcall 68, 12, MAX_HOTKEYS_NUM*32 + mov dword [it_buf_cmd_line], eax + mov dword [it_edit.text], eax + + call Load_HotkeyList mcall 66, 1, 1 ; Set keyboard mode to get scancodes. mcall 26, 2, 1, ascii_keymap -;get_mykey_window_slot_number: -; mcall 5, 10 ;wait -; mcall 18, 7 -; mov [mykey_window], eax +get_mykey_window_slot_number: + call draw_window + mcall 18, 7 + mov [mykey_window], eax set_event_mask: mcall 40, 39 red: -; .test_slot: -; mov eax, [mykey_window] ; Test is receiver MyKey window -; mov ecx, [it_window] -; cmp eax, ecx -; je @f;still ; if yes still. -; .activate_it_window: -; mov eax, 18 -; mov ebx, 3 -; int 0x40 -; @@: + .test_slot: + mcall 18, 7 + mov ebx, [mykey_window] + cmp eax, ebx + jne @f + + mov ecx, [it_window] + cmp ebx, ecx + je @f + .activate_it_window: + mov al, byte [it_alive] + test al, al + jz @f + mov byte [it_alive], 0 + + mcall 18, 3 ; Activate input thread window + @@: call draw_window still: call reset_modifiers - mov eax, 10 ; Wait for an event in the queue. - int 0x40 + mcall 10 ; Wait for an event in the queue. cmp al,1 ; redraw request ? jz red @@ -96,19 +129,16 @@ still: jmp still key: - mov eax, 2 - int 0x40 + mcall 2 push eax mcall 66, 3 - mov edx, eax - and edx, 0x00000FFF - mov dword [modifiers], edx + mov dword [modifiers], eax pop eax - test word [edit1.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬ + test word [edit1.flags], 10b jnz .editbox_input - test word [edit2.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬ + test word [edit2.flags], 10b jz @f .editbox_input: cmp ah, 0x80 ;if key up @@ -124,33 +154,30 @@ key: cmp ah, 69 ;Pause/Break je still -; cmp [keyUpr],0 -; jne still + mov esi, ascii_keymap + call Scan2ASCII - call Scan2ASCII + push dword edit1 + call [edit_box_key] - push dword edit1 - call [edit_box_key] - - push dword edit2 - call [edit_box_key] - jmp still - @@: + push dword edit2 + call [edit_box_key] + jmp still + @@: ;------------------------ mov cl, byte [hotkeys_num] - .test_next_hotkey: + .test_next_hotkey: dec cl mov bl, cl and ebx, 0xFF - shl ebx, 5 - mov esi, ebx + shl ebx, 2 add ebx, dword Hotkeys.codes - cmp ah, byte [ebx] + mov edx, dword [ebx] + cmp ah, dl jne @f - mov edx, dword [ebx] shr edx, 8 cmp edx, dword [modifiers] jne @f @@ -159,23 +186,22 @@ key: mov eax, PATH_MAX_CHARS mul cl mov edx, eax - add edx, dword buf_cmd_params - add eax, dword buf_cmd_line + add edx, dword [buf_cmd_params] + add eax, dword [buf_cmd_line] mov esi, eax pop eax call RunProgram jmp .end_test - @@: - or cl, cl ;cmp cl, 0 - jnz .test_next_hotkey ;jge .test_next_hotkey - .end_test: + @@: + or cl, cl + jnz .test_next_hotkey + .end_test: ;------------------------ jmp still button: - mov eax, 17 ; Get pressed button code - int 0x40 + mcall 17 ; Get pressed button code cmp ah, 1 ; Test x button je close_app @@ -184,41 +210,40 @@ button: call AddHotKey jmp red @@: + cmp ah, 5 + jne @f + call Load_HotkeyList + jmp red + @@: + cmp ah, 6 + jne @f + call WriteIni + xor edx, edx + mov esi, aRamSaver + call RunProgram + @@: - cmp ah, 5 ; Test if pressed buttons - jb still ; is a HotKey button... + cmp ah, FIRST_ITEM_BUTTON_ID ; Test if pressed buttons + jb still ; is a HotKey button... mov al, ah - sub al, 5 + sub al, FIRST_ITEM_BUTTON_ID cmp al, byte [hotkeys_num] - jnb still ; ...so, if not then still, + jnb still ; ...so, if not then still, mov byte [butt], ah ; if yes then save pressed button ID - and eax, 0xFF;shr ax, 8 - if DEBUG - dps "Button = " - dph eax - end if + and eax, 0xFF mov cl, byte PATH_MAX_CHARS mul cl - if DEBUG - dps " offset = " - dph eax - end if mov ebx, eax - add ebx, dword buf_cmd_params - add eax, dword buf_cmd_line + add ebx, dword [buf_cmd_params] + add eax, dword [buf_cmd_line] mov dword [edit1.text], eax mov dword [edit2.text], ebx mov esi, eax call strlen - if DEBUG - dps " len = " - dph ecx - newline - end if mov dword [edit1.size], ecx mov dword [edit1.pos], ecx @@ -227,70 +252,82 @@ button: mov dword [edit2.size], ecx mov dword [edit2.pos], ecx - jmp red ;still + jmp red mouse: push dword edit1 call [edit_box_mouse] - push dword edit2 call [edit_box_mouse] - ;test word [edit1.flags],10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬ - ;jne still jmp still close_app: - mov eax,-1 ; close this program - int 0x40 + mov eax,-1 ; close this program + int 0x40 draw_window: - start_draw_window WIN_X,WIN_Y,WIN_W,WIN_H,WIN_COLOR,labelt, 11;labellen-labelt + start_draw_window WIN_X,WIN_Y,WIN_W,WIN_H,WIN_COLOR,labelt, 11;labellen-labelt - push dword edit1 - call [edit_box_draw] + ;bar 5, 24, 585, 385, 0x800000 or 0x90D2 + ;rectangle2 6, 25, 585, 385, 0xFFFFFF, 0 - push dword edit2 - call [edit_box_draw] + ;bar 5, 24, BUT_W+4, 350, 0x008C00D2;0x800000 or A_KEYCOLOR + ;rectangle2 6, 25, BUT_W+4, 350, 0xFFFFFF, 0 - stdcall draw_button, 7,WIN_H-30,80,20,2,C_KEYCOLOR,AddKeyText, 0,C_TEXTCOLOR ; Add Hot key. - if 0 - stdcall draw_button, 90,WIN_H-30,80,20,3,C_KEYCOLOR,DeleteKeyText,0,C_TEXTCOLOR ; Delete Hot key. - stdcall draw_button, 173,WIN_H-30,80,20,4,C_KEYCOLOR,ManageKeyText,0,C_TEXTCOLOR ; Manage Hot key. - end if - movzx ecx, byte [hotkeys_num] - cmp ecx, MAX_HOTKEYS_NUM - jng @f - mov ecx, MAX_HOTKEYS_NUM - @@: - mov eax, 30 - mov ebx, 5 - @@: - or cl, cl - jz @f + push dword edit1 + call [edit_box_draw] + push dword edit2 + call [edit_box_draw] - mov edx, ebx - sub edx, 5 - shl edx, 5; edx=edx*32 - add edx, dword Hotkeys + stdcall draw_button, 7,WIN_H-BUT_H-10,BUT_W,BUT_H,2,0x0050D250,AddKeyText, 0,C_TEXTCOLOR ; Add Hotkey. + if 0 + stdcall draw_button, 90,WIN_H-BUT_H-10,BUT_W,BUT_H,3,C_KEYCOLOR,DeleteKeyText,0,C_TEXTCOLOR ; Delete Hotkey. + stdcall draw_button, 173,WIN_H-BUT_H-10,BUT_W,BUT_H,4,C_KEYCOLOR,ManageKeyText,0,C_TEXTCOLOR ; Manage Hotkey. + end if + stdcall draw_button, WIN_W-BUT_W*2-14,WIN_H-BUT_H-10,BUT_W,BUT_H,5,0x0050D250,ReloadKeyText, 0,C_TEXTCOLOR ; Save Hotkeys list. + stdcall draw_button, WIN_W-BUT_W-7,WIN_H-BUT_H-10,BUT_W,BUT_H,6,0x0050D250,SaveKeyText, 0,C_TEXTCOLOR ; Save Hotkeys list. - cmp bl, byte [butt] - jne .l1 - stdcall draw_button, 7,eax,BUT_W,BUT_H,ebx,A_KEYCOLOR,edx,0,CA_TEXTCOLOR ; F5 - jmp .l2 - .l1: - stdcall draw_button, 7,eax,BUT_W,BUT_H,ebx,N_KEYCOLOR,edx,0,C_TEXTCOLOR ; F5 - .l2: + movzx ecx, byte [hotkeys_num] + cmp ecx, MAX_HOTKEYS_NUM + jng @f + mov ecx, MAX_HOTKEYS_NUM + @@: + mov eax, 30 + mov ebx, FIRST_ITEM_BUTTON_ID + @@: + or cl, cl + jz @f - add eax, BUT_H+BUT_SPACE - inc ebx - dec cl - jmp @b - @@: - end_draw_window + mov edx, ebx + sub edx, FIRST_ITEM_BUTTON_ID + shl edx, 5; edx=edx*32 + add edx, dword Hotkeys + + cmp bl, byte [butt] + jne .l1 + stdcall draw_button, 7,eax,ITEM_BUTTON_W,ITEM_BUTTON_H,ebx,A_KEYCOLOR ,edx,0,CA_TEXTCOLOR + bar 220, 70, 350, 30, 0x00C8E1F0 ;0x800000 or A_KEYCOLOR + rectangle2 221, 71, 350, 30, 0xFFFFFF, 0 + mov esi, Hotkeys.code_names + sub edx, dword Hotkeys + shl edx, 1 + add esi, edx + stdcall outtextxy, 225, 80, esi, 64, C_TEXTCOLOR + jmp .l2 + .l1: + stdcall draw_button, 7,eax,ITEM_BUTTON_W,ITEM_BUTTON_H,ebx,N_KEYCOLOR,edx,0,C_TEXTCOLOR + .l2: + + add eax, ITEM_BUTTON_H+ITEM_BUTTON_SPACE + inc ebx + dec cl + jmp @b + @@: + end_draw_window ret @@ -301,14 +338,39 @@ AddHotKey: inc al mov byte [hotkeys_num], al - mov eax, 51 - mov ebx, 1 - mov ecx, start_input_thread - mov edx, dword input_thread_stack_top - mcall - + mcall 51, 1, dword start_input_thread, dword input_thread_stack_top .end: - ret +ret + + +Load_HotkeyList: + call ReadIni + + mov al, byte [butt] + mov ah, byte [hotkeys_num] + cmp al, ah + jle @f + mov al, ah + @@: + and eax, 0xFF + sub al, FIRST_ITEM_BUTTON_ID + mov cl, byte PATH_MAX_CHARS + mul cl + mov ebx, eax + add eax, dword [buf_cmd_line] + add ebx, dword [buf_cmd_params] + + + mov esi, eax + call strlen + mov dword [edit1.size], ecx + mov dword [edit1.pos], ecx + + mov esi, ebx + call strlen + mov dword [edit2.size], ecx + mov dword [edit2.pos], ecx +ret reset_modifiers: @@ -319,7 +381,8 @@ reset_modifiers: lodsd - mov cl, al ; set new hotkey + ; Set new hotkey for the main thread + mov cl, al shr eax, 8 xor edx, edx @@ -354,26 +417,19 @@ reset_modifiers: pop cx mcall 66, 4 + mov dword [it_hotkey_addr], 0 .end_set_mods: - popa + popa ret ;######################## Input Thread code start ########################## start_input_thread: - -;get_it_window_slot_number: -; mcall 5, 10 ;wait -; mcall 18, 7 -; mov [it_window], eax mov ecx, 1 ; to get scancodes. - mov eax, 66 - mov ebx, 1 ; Set keyboard mode - int 0x40 - mcall 26, 2, 1, ascii_keymap + mcall 26, 2, 1, it_ascii_keymap + mcall 66, 1 ; Set keyboard mode mov dword [it_hotkey_addr], 0 - it_set_editbox: mov al, byte [hotkeys_num] sub al, 1 @@ -386,7 +442,10 @@ it_set_editbox: call strlen mov dword [it_edit.size], ecx mov dword [it_edit.pos], ecx - +get_it_window_slot_number: + call it_draw_window + mcall 18, 7 + mov [it_window], eax it_set_event_mask: mcall 40, 39 @@ -394,26 +453,31 @@ it_red: call it_draw_window it_still: - mov eax, 10 ; Wait for an event in the queue. - int 0x40 + mcall 10 ; Wait for an event in the queue. cmp al,1 ; redraw request ? jz it_red cmp al,2 ; key in buffer ? jz it_key cmp al,3 ; button in buffer ? - jz button + jz it_button cmp al,6 jz it_mouse jmp it_still it_key: - mov eax, 2 - int 0x40 + mcall 2 mov byte [it_keycode], 0 stdcall outtextxy, 10, 100, ctrl_key_names, 35, 0 + + cmp ah, 1 ;Esc + jne @f + dec byte [hotkeys_num] + jmp close_app + @@: + cmp ah, 0x80 ;if key up ja .end cmp ah, 42 ;[Shift] (left) @@ -427,45 +491,26 @@ it_key: cmp ah, 69 ;[Pause Break] je .end - - ;------------------------ - mov cl, byte [hotkeys_num] - .test_next_hotkey: - mov bl, cl - and ebx, 0xFF - shl ebx, 5 - mov esi, ebx - add ebx, dword Hotkeys.codes - cmp ah, byte [ebx] - jne @f - - push eax - mov eax, PATH_MAX_CHARS - mul cl - add eax, dword buf_cmd_line - mov esi, eax - pop eax - mov edx, 0 ; no parametrs yet <- change it! - call RunProgram - jmp .end_test - @@: - dec cl - cmp cl, 0 - jge .test_next_hotkey - .end_test: - ;------------------------ - mov byte [it_keycode], ah + mov esi, it_ascii_keymap call Scan2ASCII - test word [it_edit.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬ + test word [it_edit.flags], 10b jz .end push dword it_edit call [edit_box_key] jmp it_still .end: + mcall 26, 2, 1, it_ascii_keymap call it_test_key_modifiers + test dl, 3 + jz @f + push edx + mcall 26, 2, 2, it_ascii_keymap + pop edx + @@: + mov al, byte [it_keycode] test al, al jz @f @@ -475,10 +520,13 @@ it_key: mov eax, dword [it_hotkey_addr] test eax, eax jnz @f + + call it_set_keycode_name + mov al, byte [hotkeys_num] - sub al, 1 + dec al and eax, 0xFF - shl eax, 5 + shl eax, 2;5 add eax, dword Hotkeys.codes mov dword [eax], edx mov dword [it_hotkey_addr], eax @@ -495,35 +543,127 @@ it_test_key_modifiers: push eax mcall 66, 3 ;get control keys state mov edx, eax - and edx, 0x00000FFF .lshift: test al, 1 ; LShift ? jz .rshift - stdcall outtextxy, 10, 100, ctrl_key_names, 6, 0x00FF0000 + stdcall outtextxy, 10, 100, ctrl_key_names, 6, A_TEXTCOLOR .rshift: test al, 2 ; RShift ? jz .lctrl - stdcall outtextxy, 184, 100, ctrl_key_names+29, 6, 0x00FF0000 + stdcall outtextxy, 184, 100, ctrl_key_names+29, 6, A_TEXTCOLOR .lctrl: test al, 4 ; LCtrl ? jz .rctrl - stdcall outtextxy, 52, 100, ctrl_key_names+7, 5, 0x00FF0000 + stdcall outtextxy, 52, 100, ctrl_key_names+7, 5, A_TEXTCOLOR .rctrl: test al, 8 ; RCtrl ? jz .lalt - stdcall outtextxy, 148, 100, ctrl_key_names+23, 5, 0x00FF0000 + stdcall outtextxy, 148, 100, ctrl_key_names+23, 5, A_TEXTCOLOR .lalt: test al, 0x10 ; LAlt ? jz .ralt - stdcall outtextxy, 88, 100, ctrl_key_names+13, 4, 0x00FF0000 + stdcall outtextxy, 88, 100, ctrl_key_names+13, 4, A_TEXTCOLOR .ralt: test al, 0x20 ; RAlt ? jz @f - stdcall outtextxy, 118, 100, ctrl_key_names+18, 4, 0x00FF0000 + stdcall outtextxy, 118, 100, ctrl_key_names+18, 4, A_TEXTCOLOR @@: pop eax ret + +it_set_keycode_name: + pusha + mov al, byte [hotkeys_num] + dec al + and eax, 0xFF + shl eax, 6 + mov edi, Hotkeys.code_names + add edi, eax + + mov ecx, 64 + xor ax, ax + call strnset + mcall 66, 3 ;get control keys state + .lshift: + test al, 1 ; LShift ? + jz .rshift + mov esi, ctrl_key_names + mov ecx, 6 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + .rshift: + test al, 2 ; RShift ? + jz .lctrl + mov esi, ctrl_key_names+29 + mov ecx, 6 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + .lctrl: + test al, 4 ; LCtrl ? + jz .rctrl + mov esi, ctrl_key_names+7 + mov ecx, 5 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + .rctrl: + test al, 8 ; RCtrl ? + jz .lalt + mov esi, ctrl_key_names+23 + mov ecx, 5 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + .lalt: + test al, 0x10 ; LAlt ? + jz .ralt + mov esi, ctrl_key_names+13 + mov ecx, 4 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + .ralt: + test al, 0x20 ; RAlt ? + jz @f + mov esi, ctrl_key_names+18 + mov ecx, 4 + call strncat + + mov esi, aPlus + mov ecx, 3 + call strncat + @@: + mov esi, it_ascii_keymap + and edx, 0xFF + add esi, edx + mov ecx, 1 + call strncat + + popa +ret + + +it_button: + mcall 17 ; Get pressed button code + cmp ah, 1 ; Test x button + jne @f + jmp close_app + @@: + jmp it_still + it_mouse: push dword it_edit @@ -532,23 +672,188 @@ it_mouse: jmp it_still it_draw_window: - start_draw_window WIN_X,WIN_Y+250,225,70,WIN_COLOR,it_labelt, 26;labellen-labelt + start_draw_window 450,WIN_Y+250,225,70,WIN_COLOR,it_labelt, 26;labellen-labelt - push dword it_edit - call [edit_box_draw] + push dword it_edit + call [edit_box_draw] - stdcall outtextxy, 10, 100, ctrl_key_names, 35, 0 - ;stdcall draw_button, 7,WIN_H-30,80,20,2,C_KEYCOLOR,AddKeyText, 0,C_TEXTCOLOR ; Add Hot key. - end_draw_window + stdcall outtextxy, 43, 50, it_hint, 0, 0x323232 + stdcall outtextxy, 10, 100, ctrl_key_names, 0, 0 + ;stdcall draw_button, 7,WIN_H-30,80,20,2,C_KEYCOLOR,AddKeyText, 0,C_TEXTCOLOR ; Add Hot key. + end_draw_window + mov byte [it_alive], 1 ret - ;######################## Input Thread code end ########################## +; Read configuration file +ReadIni: + ; Get path + mov edi, ini_path + mov esi, app_path + call strlen + + .get_path: + cmp byte [app_path+ecx-1], '/' + je @f + loop .get_path + @@: + call strncpy + mov byte [ini_path+ecx], 0 + mov esi, aIni + call strlen + call strncat + + ; Get hotkey number + invoke ini_get_int, ini_path, aMain, aKeynum, 0 + + and eax, 0xFF + test al, al + jz .end + cmp al, MAX_HOTKEYS_NUM + jle @f + mov al, MAX_HOTKEYS_NUM + @@: + mov byte [hotkeys_num], al + + mov ecx, eax + xor eax, eax + .get_next_hotkey_values: + call set_next_hotkey_section_name + ; Get hotkey name + mov edi, eax + shl edi, 5 ; edi=eax*32 + add edi, dword Hotkeys + push eax ecx + invoke ini_get_str, ini_path, aHotkey, aName, edi, 32, 0 + pop ecx eax + ; Get hotkey code + mov edi, eax + shl edi, 2 ; edi=eax*4 + add edi, dword Hotkeys.codes + push eax ecx edx + invoke ini_get_int, ini_path, aHotkey, aKeycode, 0 + mov dword [it_hotkey_addr], edi + stosd + ; set hotkey + call reset_modifiers + pop edx ecx eax + ; Get hotkey code_name + mov edi, eax + shl edi, 6 ; edi=eax*64 + add edi, dword Hotkeys.code_names + push eax ecx + invoke ini_get_str, ini_path, aHotkey, aKeycodeName, edi, 64, 0 + pop ecx eax + ; Get hotkey path and param + push eax ecx + mov cl, byte PATH_MAX_CHARS + mul cl + mov edi, eax + push edi + add edi, dword [buf_cmd_line] + invoke ini_get_str, ini_path, aHotkey, aPath, edi, 32, 0 + pop edi + add edi, dword [buf_cmd_params] + invoke ini_get_str, ini_path, aHotkey, aParam, edi, 32, 0 + pop ecx eax + + inc al + dec ecx + test ecx, ecx + jnz .get_next_hotkey_values + .end: +ret + + +; Write configuration file +WriteIni: + mov edi, ini_path + ; Set hotkey number + movzx ecx, byte [hotkeys_num] + invoke ini_set_int, ini_path, aMain, aKeynum, ecx + + xor eax, eax + .get_next_hotkey_values: + call set_next_hotkey_section_name + ; Set hotkey name + push eax ecx + mov esi, eax + shl esi, 5 ; edi=eax*32 + add esi, dword Hotkeys + call strlen + invoke ini_set_str, ini_path, aHotkey, aName, esi, ecx + pop ecx eax + ; Set hotkey code + mov esi, eax + shl esi, 2 ; edi=eax*4 + add esi, dword Hotkeys.codes + push eax ecx edx + invoke ini_set_int, ini_path, aHotkey, aKeycode, dword [esi] + pop edx ecx eax + ; Set hotkey code_name + mov esi, eax + shl esi, 6 ; edi=eax*64 + add esi, dword Hotkeys.code_names + push eax ecx + call strlen + invoke ini_set_str, ini_path, aHotkey, aKeycodeName, esi, ecx + pop ecx eax + ; Set hotkey path and param + push eax ecx + ;inc al + mov cl, byte PATH_MAX_CHARS + mul cl + mov esi, eax + push esi + add esi, dword [buf_cmd_line] + call strlen + invoke ini_set_str, ini_path, aHotkey, aPath, esi, ecx + pop esi + add esi, dword [buf_cmd_params] + call strlen + invoke ini_set_str, ini_path, aHotkey, aParam, esi, ecx + pop ecx eax + + inc al + dec ecx + test ecx, ecx + jnz .get_next_hotkey_values + .end: +ret + + +set_next_hotkey_section_name: ;(eax - num) +; this code mainly from debug.inc + push eax ecx edi + mov edi, aHotkey + add edi, 6 ; + strlen("hotkey") + mov ecx, 10 + push -'0' + .l0: + xor edx, edx + div ecx + push edx + test eax, eax + jnz .l0 + .l1: + pop eax + add al, '0' + ;call debug_outchar + stosb + jnz .l1 + pop edi ecx eax +ret + + +;**************************************** +;* input: esi = pointer to keymap * +;* ah = scan code * +;* output: ah = ascii code * +;**************************************** Scan2ASCII: push esi - mov esi, ascii_keymap shr eax, 8 add esi, eax lodsb @@ -557,22 +862,6 @@ Scan2ASCII: ret -;**************************************** -;* input: esi = pointer to string * -;* output: ecx = length of the string * -;**************************************** -strlen: - push eax - xor ecx, ecx - @@: - lodsb - or al, al - jz @f - inc ecx - jmp @b - @@: - pop eax - ret ;******************************************** ;* input: esi = pointer to the file name * @@ -588,9 +877,7 @@ RunProgram: mov dword [InfoStructure+16], 0 ; reserved mov dword [InfoStructure+20], 0 ; reserved mov dword [InfoStructure+21], esi ; pointer to the file name - mov eax, 70 - mov ebx, InfoStructure - int 0x40 + mcall 70, InfoStructure cmp eax, 0 jl .err_out .out: @@ -607,8 +894,8 @@ RunProgram: ; DATA AREA ; Application Title -labelt db 'MyKey v.0.1' -;mykey_window dd 0 ; Slot number of MyKey +labelt db 'MyKey v.0.2' +mykey_window dd 0 ; Slot number of MyKey main thread ;########### Input Thread data start ############ @@ -617,29 +904,32 @@ labelt db 'MyKey v.0.1' it_labelt db "Input hotkey and it's name" ;labellen: it_edit edit_box 180, 20, 30, 0xffffff, 0xAA80, 0x0000ff, 0x0, 0x0, 31, it_buf_cmd_line, 0, 0 -it_buf_cmd_line db MAX_HOTKEYS_NUM*32 dup(0) ; !Make it dinamyc!!! -;it_window dd 0 ; Slot number of Input thread +it_buf_cmd_line dd 0 ;db MAX_HOTKEYS_NUM*32 dup(0) ; !Make it dynamic!!! +it_window dd 0 ; Slot number of the input thread +it_alive db 0 ; Flag of the input thread existance it_keycode db 0 it_hotkey_addr dd 0 +it_hint db 'or press Esc to cancel',0 ;########### Input Thread data end ############ ;Button names -AddKeyText db 'Add',0 -DeleteKeyText db 'Delete',0 -ManageKeyText db 'Manage',0 +AddKeyText db 'Add',0 +ReloadKeyText db 'Reload',0 +SaveKeyText db 'Save',0 +;DeleteKeyText db 'Delete',0 +;ManageKeyText db 'Manage',0 hotkeys_num db 0;15 -;keyboard_mode db 0 ; Scan or ASCII keys to send ? 0 - ASCII , 1 - Scan -butt db 5 ; Pressed button ID +butt db FIRST_ITEM_BUTTON_ID ; Pressed button ID modifiers dd 0 ;Data structures for loadlib.mac and editbox_ex.mac [ edit1 edit_box 350, 220, 30, 0xffffff, 0xAA80, 0x0000ff, 0x0, 0x0, PATH_MAX_CHARS+1, buf_cmd_line, 0, 0 edit2 edit_box 350, 220, 50, 0xffffff, 0xAA80, 0x0000ff, 0x0, 0x0, PATH_MAX_CHARS+1, buf_cmd_params, 0, 0 -buf_cmd_line db MAX_HOTKEYS_NUM*PATH_MAX_CHARS dup(0) ; !Make it dinamyc!!! -buf_cmd_params db MAX_HOTKEYS_NUM*PATH_MAX_CHARS dup(0) ; !Make it dinamyc!!! +buf_cmd_line dd 0 +buf_cmd_params dd 0 sys_path: system_dir0 db '/sys/lib/' @@ -663,6 +953,28 @@ aEdit_box_key db 'edit_box_key',0 aEdit_box_mouse db 'edit_box_mouse',0 aVersion_ed db 'version_ed',0 +align 16 +importTable: +library \ + libini, 'libini.obj';, \ +; boxlib, 'boxlib.obj' \ + +;import boxlib, \ +;edit_box_draw , 'edit_box', \ +;edit_box_key , 'edit_box_key', \ +;edit_box_mouse , 'edit_box_mouse', \ +;version_ed , 'version_ed' + + +import libini, \ + ini_get_str ,'ini_get_str', \ + ini_set_str ,'ini_set_str', \ + ini_get_int ,'ini_get_int', \ + ini_set_int ,'ini_set_int';, \ +; ini_get_color,'ini_get_color', \ +; ini_set_color,'ini_set_color' + + ;] Data structures for loadlib.mac and editbox_ex.mac InfoStructure: @@ -683,15 +995,33 @@ input_thread_stack_top: ascii_keymap: db 128 dup(?) ctrl_key_names db 'LShift LCtrl LAlt RAlt RCtrl RShift',0 +aPlus db ' + ',0 +aIni db 'mykey.ini',0 +aMain db 'main',0 +aKeynum db 'keynum',0 +aHotkey db 'hotkey',0,0,0 +aName db 'name',0 +aKeycode db 'keycode',0 +aKeycodeName db 'keycode_name',0 +aPath db 'path',0 +aParam db 'param',0 +aRamSaver db '/sys/rdsave',0 -Hotkeys: ;(name = 32 b) + (modifiers = 3 b) + (keycode = 1 b) = 36 byte for 1 hotkey +app_path rb 255 +ini_path rb 255 + +Hotkeys: ;(name = 32 b) + (modifiers = 3 b) + (keycode = 1 b) + (keycode_name = 64 b) = 100 bytes for 1 hotkey .names: - db 'My Favorite 1',0 - rb 18 - db 'My Favorite 2',0 - rb 18 - db 'My Favorite 3',0 - rb 18 + db 'My1',0 + rb 28 + db 'My2',0 + rb 28 + db 'My3',0 + rb 28 rb MAX_HOTKEYS_NUM*32-3 .codes: dd MAX_HOTKEYS_NUM dup (0) + .code_names: + rb MAX_HOTKEYS_NUM*64 + +it_ascii_keymap: diff --git a/programs/system/MyKey/trunk/ReadMe.txt b/programs/system/MyKey/trunk/ReadMe.txt index ffdb0922e3..2e35c86775 100644 --- a/programs/system/MyKey/trunk/ReadMe.txt +++ b/programs/system/MyKey/trunk/ReadMe.txt @@ -12,11 +12,10 @@ â íèæíåå - ïåðåäàâàåìûå åé ïàðàìåòðû. Íåîáõîäèìî ñäåëàòü: -a. Çàãðóçêà è ñîõðàíåíèå êîíôèãóðàöèîííîãî ôàéëà. -b. Óäàëåíèå ãîðÿ÷èõ êëàâèø. -c. Èçìåíåíèå óæå óñòàíîâëåííûõ ãîðÿ÷èõ êëàâèø. +a. Óäàëåíèå ãîðÿ÷èõ êëàâèø. +b. Èçìåíåíèå óæå óñòàíîâëåííûõ ãîðÿ÷èõ êëàâèø. -Íîìåð âåðñèè: 0.1 +Íîìåð âåðñèè: 0.2 ==Àâòîð== Asper @@ -38,11 +37,10 @@ on the keyboard. in the lower text field - parametrs have to be passed to program. ToDo: -a. Load and save of configuration file will be implemented in the next version. -b. Delete hotkeys. -c. Change hotkeys that are already set. +a. Delete hotkeys. +b. Change hotkeys that are already set. -Version number: 0.1 +Version number: 0.2 ==Author== Asper diff --git a/programs/system/MyKey/trunk/debug.inc b/programs/system/MyKey/trunk/debug.inc index 8564deb889..8303039e16 100644 --- a/programs/system/MyKey/trunk/debug.inc +++ b/programs/system/MyKey/trunk/debug.inc @@ -139,10 +139,12 @@ debug_outhex: ret SysMsgBoardChar: + push eax ebx ecx mov cl, al mov eax, 63 mov ebx, 1 int 0x40 + pop ecx ebx eax ret SysMsgBoardStr: diff --git a/programs/system/MyKey/trunk/dll.inc b/programs/system/MyKey/trunk/dll.inc new file mode 100644 index 0000000000..6ceb2d514d --- /dev/null +++ b/programs/system/MyKey/trunk/dll.inc @@ -0,0 +1,157 @@ +;----------------------------------------------------------------------------- +proc mem.Alloc size ;///////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov eax,[size] + lea ecx,[eax+4+4095] + and ecx,not 4095 + mcall 68,12 + add ecx,-4 + mov [eax],ecx + add eax,4 + pop ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.ReAlloc mptr,size;/////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx esi edi eax + mov eax,[mptr] + mov ebx,[size] + or eax,eax + jz @f + lea ecx,[ebx+4+4095] + and ecx,not 4095 + add ecx,-4 + cmp ecx,[eax-4] + je .exit + @@: mov eax,ebx + call mem.Alloc + xchg eax,[esp] + or eax,eax + jz .exit + mov esi,eax + xchg eax,[esp] + mov edi,eax + mov ecx,[esi-4] + cmp ecx,[edi-4] + jbe @f + mov ecx,[edi-4] + @@: add ecx,3 + shr ecx,2 + cld + rep movsd + xchg eax,[esp] + call mem.Free + .exit: + pop eax edi esi ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.Free mptr ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + mov eax,[mptr] + or eax,eax + jz @f + push ebx ecx + lea ecx,[eax-4] + mcall 68,13 + pop ecx ebx + @@: ret +endp + + +proc dll.Load, import_table:dword + mov esi,[import_table] + .next_lib: mov edx,[esi] + or edx,edx + jz .exit + push esi + mov esi,[esi+4] + mov edi,s_libdir.fname + @@: lodsb + stosb + or al,al + jnz @b + mcall 68,19,s_libdir + or eax,eax + jz .fail + stdcall dll.Link,eax,edx + stdcall dll.Init,[eax+4] + pop esi + add esi,8 + jmp .next_lib + .exit: xor eax,eax + ret + .fail: add esp,4 + xor eax,eax + inc eax + ret +endp + +proc dll.Link, exp:dword,imp:dword + push eax + mov esi,[imp] + test esi,esi + jz .done + .next: lodsd + test eax,eax + jz .done + stdcall dll.GetProcAddress,[exp],eax + or eax,eax + jz @f + mov [esi-4],eax + jmp .next + @@: mov dword[esp],0 + .done: pop eax + ret +endp + +proc dll.Init, dllentry:dword + pushad + mov eax,mem.Alloc + mov ebx,mem.Free + mov ecx,mem.ReAlloc + mov edx,dll.Load + stdcall [dllentry] + popad + ret +endp + +proc dll.GetProcAddress, exp:dword,sz_name:dword + mov edx,[exp] + xor eax,eax + .next: or edx,edx + jz .end + cmp dword[edx],0 + jz .end + stdcall strcmp,[edx],[sz_name] + test eax,eax + jz .ok + add edx,8 + jmp .next + .ok: mov eax,[edx+4] + .end: ret +endp + +proc strcmp, str1:dword,str2:dword + push esi edi + mov esi,[str1] + mov edi,[str2] + xor eax,eax + @@: lodsb + scasb + jne .fail + or al,al + jnz @b + jmp .ok + .fail: or eax,-1 + .ok: pop edi esi + ret +endp + +s_libdir: + db '/sys/lib/' + .fname rb 32 diff --git a/programs/system/MyKey/trunk/mykey.ini b/programs/system/MyKey/trunk/mykey.ini new file mode 100644 index 0000000000..cdf6c45535 --- /dev/null +++ b/programs/system/MyKey/trunk/mykey.ini @@ -0,0 +1,46 @@ +[main] +keynum=7 + +[hotkey0] +name =FCE Ultra +keycode =1074 +keycode_name =LCtrl + m +path =/hd0/2/fce +param =/hd0/2/gd/city.nes + +[hotkey1] +name =Kolibri Packer +keycode=4143 +keycode_name=LAlt + v +path =/sys/kpack +param =mykey.bin mykey +[hotkey2] +name=kfar +keycode=4137 +keycode_name=LAlt + ` +path=file managers/kfar +param= +[hotkey3] +name=Minesweeper +keycode=1058 +keycode_name=LCtrl + g +path=games/mine +param= +[hotkey4] +name=Games directory +keycode=8226 +keycode_name=RAlt + g +path=file managers/eolite +param=/sys/games +[hotkey5] +name=KFM +keycode=1589 +keycode_name=RShift + LCtrl + ? +path=file managers/kfm +param= +[hotkey6] +name=System Message Board +keycode=4127 +keycode_name=LAlt + s +path=develop/board +param= diff --git a/programs/system/MyKey/trunk/string.inc b/programs/system/MyKey/trunk/string.inc new file mode 100644 index 0000000000..cef717338a --- /dev/null +++ b/programs/system/MyKey/trunk/string.inc @@ -0,0 +1,94 @@ +;**************************************** +;* input: esi = pointer to string * +;* output: ecx = length of the string * +;**************************************** +strlen: + push eax esi + xor ecx, ecx + @@: + lodsb + or al, al + jz @f + inc ecx + jmp @b + @@: + pop esi eax + ret + +;************************************************* +;* input: esi = pointer to the src string * +;* edi = pointer to the dest string * +;* ecx = number of bytes to copy * +;************************************************* +strncpy: + push eax ecx esi edi + @@: + lodsb + stosb + or al, al + jz @f + dec ecx + jz @f + jmp @b + @@: + pop edi esi ecx eax + ret + +;************************************************* +;* input: esi = pointer to the src string * +;* edi = pointer to the dest string * +;************************************************* +strcpy: + push esi edi + rep movsb + pop edi esi + ret + +;************************************************* +;* input: esi = pointer to the src string * +;* edi = pointer to the dest string * +;************************************************* +strcat: + push esi + call strlen + add esi, ecx + call strcpy + pop esi + ret + +;************************************************* +;* input: esi = pointer to the src string * +;* edi = pointer to the dest string * +;* ecx = number of bytes to copy * +;************************************************* +strncat: + push edi + push ecx esi + mov esi, edi + call strlen + add edi, ecx + pop esi ecx + call strncpy + pop edi + ret + +;************************************************* +;* input: edi = pointer to the dest string * +;* al = byte to set the string to * +;************************************************* +;strset: +; push edi +; rep stosb +; pop edi +; ret + +;************************************************* +;* input: edi = pointer to the dest string * +;* al = byte to set the string to * +;* ecx = number of bytes to set * +;************************************************* +strnset: + push edi ecx + rep stosb + pop ecx edi + ret diff --git a/programs/system/kerpack/trunk/calltrick2.asm b/programs/system/kerpack/trunk/calltrick2.asm deleted file mode 100644 index 36b04430ca..0000000000 --- a/programs/system/kerpack/trunk/calltrick2.asm +++ /dev/null @@ -1,32 +0,0 @@ - pop esi - push esi -loader_patch4: - mov ecx, 0 ; will be patched: number of calltrick entries -ctrloop: - lodsb -@@: - cmp al, 0xF - jnz .f - lodsb - cmp al, 80h - jb @b - cmp al, 90h - jb @f -.f: - sub al, 0E8h - cmp al, 1 - ja ctrloop -@@: - cmp byte [esi], 0 ; will be patched: code in calltrick entries -loader_patch5: - jnz ctrloop - lodsd -; "bswap eax" is not supported on i386 -; mov al,0/bswap eax = 4 bytes, following instructions = 9 bytes - shr ax, 8 - ror eax, 16 - xchg al, ah - sub eax, esi - add eax, [esp] - mov [esi-4], eax - loop ctrloop diff --git a/programs/system/kerpack/trunk/doexe2.asm b/programs/system/kerpack/trunk/doexe2.asm deleted file mode 100644 index 072f90a716..0000000000 --- a/programs/system/kerpack/trunk/doexe2.asm +++ /dev/null @@ -1,68 +0,0 @@ -filename equ 'kerpack.exe' - -virtual at 0 -file filename:3Ch,4 -load pehea dword from 0 -file filename:pehea,0F8h+28h*3 -load NumberOfSections word from 4+6 -load SizeOfOptionalHeader word from 4+14h -if NumberOfSections<>3 -error Expected three sections, .text, .bss and .reloc -end if -if SizeOfOptionalHeader<>0E0h -error Nonstandard PE header -end if -load RelocsRVA dword from 4+0A0h -load RelocsSize dword from 4+0A4h -load ImageBase dword from 4+34h -load TextRVA dword from 4+0F8h+0Ch -load TextSize dword from 4+0F8h+8 -load TextOffs dword from 4+0F8h+14h -load BSSSize dword from 4+0F8h+28h+10h -load RelocRVA dword from 4+0F8h+28h*2+0Ch -load RelocOffs dword from 4+0F8h+28h*2+14h -if BSSSize -error Second section expected to be .bss -end if -if RelocRVA<>RelocsRVA -error Third section expected to be .reloc -end if -;file 'test.exe':pehea+0F8h,28h -;load physofs dword from 4+14h -;load mem dword from 4+8 -;file 'test.exe':physofs+16,4 -;load sz dword from $-4 -end virtual - -file filename:TextOffs,TextSize - -while RelocsSize>8 -virtual at 0 -file filename:RelocOffs,8 -load CurRelocPage dword from 0 -load CurRelocChunkSize dword from 4 -end virtual -RelocsSize=RelocsSize-CurRelocChunkSize -CurRelocChunkSize = CurRelocChunkSize-8 -RelocOffs=RelocOffs+8 -while CurRelocChunkSize -virtual at 0 -file filename:RelocOffs,2 -RelocOffs=RelocOffs+2 -CurRelocChunkSize=CurRelocChunkSize-2 -load s word from 0 -end virtual -CurRelocType = s shr 12 -RelocItem = CurRelocPage + (s and 0xFFF) -if CurRelocType=0 -else if CurRelocType=3 -load z dword from RelocItem-TextRVA -store dword z-(TextRVA+ImageBase) at RelocItem-TextRVA -else -error Unexpected relocation type -end if -end while -end while - -store dword TextSize at 10h -store dword RelocRVA-TextRVA at 14h diff --git a/programs/system/kerpack/trunk/kerpack.asm b/programs/system/kerpack/trunk/kerpack.asm deleted file mode 100644 index 90568284c5..0000000000 --- a/programs/system/kerpack/trunk/kerpack.asm +++ /dev/null @@ -1,232 +0,0 @@ -; Kolibri kernel packer -; (C) copyright diamond 2006, 2007 -; -; This program is free software; you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation; either version 2 of the License, or -; (at your option) any later version. -; -; This program is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. - -; Uses LZMA compression library by Igor Pavlov -; (for more information on LZMA and 7-Zip visit http://www.7-zip.org) -; (plain-C packer is ported by diamond) - -format MS COFF - -extrn '_lzma_compress@16' as lzma_compress -extrn '_lzma_set_dict_size@4' as lzma_set_dict_size - -section '.text' code executable readable - -die_with_err: - pop esi -@@: - lodsb - test al, al - jz @f - mov cl, al - push 63 - pop eax - push 1 - pop ebx - int 40h - jmp @b -@@: - mov al, 63 - mov cl, 13 - int 40h - mov cl, 10 - int 40h - or eax, -1 - int 40h - -public _start -_start: - push 70 - pop eax - mov ebx, fn70_read - int 40h - cmp eax, 6 - jz read_ok -read_err: - call die_with_err - db 'KerPack: cannot load kernel.mnt',0 -read_ok: - push 18 - call lzma_set_dict_size -; find jump to 32-bit code - mov edi, infile - 1 -@@: - inc edi - cmp dword [edi], 0E88EE08Eh ; mov fs,ax/mov gs,ax - jnz @b - cmp dword [edi+4], 00BCD08Eh ; mov ss,ax/mov esp,00xxxxxx - jnz @b - add edi, 11 - mov [inptr], edi - sub edi, infile - mov [indelta], edi - lea eax, [ebx+0x10000] - mov [..loader_patch3+2], eax - sub ebx, edi - mov [insize], ebx - call preprocess_calltrick2 - mov al, [cti] - mov [loader_patch5-1], al - mov eax, [ctn] - mov [loader_patch4+1], eax - mov eax, [inptr] - add eax, outfile - infile + loader_size - 5 - push workmem - push [insize] - push eax - push [inptr] - call lzma_compress - add eax, loader_size-5 - mov [loader_patch1+6], eax - add eax, [indelta] - mov [outsize], eax - mov eax, [indelta] - mov ecx, dword [eax + outfile + loader_size - 4] - bswap ecx - mov [loader_patch2+4], ecx - add eax, 0x10000 - mov [loader_patch1+1], eax - mov esi, infile - mov edi, outfile - mov ecx, [indelta] - rep movsb - mov esi, loader_start - mov ecx, loader_size - rep movsb - push 70 - pop eax - mov ebx, fn70_write - int 40h - test eax, eax - jz @f - call die_with_err - db 'KerPack: cannot save kernel.mnt',0 -@@: - call die_with_err - db 'KerPack: all is OK',0 - -preprocess_calltrick2: -; input preprocessing - mov edi, ct1 - xor eax, eax - push edi - mov ecx, 256/4 - rep stosd - pop edi - mov ecx, ebx - mov esi, [inptr] - mov ebx, inbuftmp - xchg eax, edx -input_pre2: - lodsb -@@: - cmp al, 0Fh - jnz ip1 - dec ecx - jz input_pre_done2 - lodsb - cmp al, 80h - jb @b - cmp al, 90h - jb @f -ip1: - sub al, 0E8h - cmp al, 1 - ja input_pre_cont2 -@@: - cmp ecx, 5 - jb input_pre_done2 - lodsd - add eax, esi - sub eax, [inptr] - cmp eax, [insize] - jae xxx2 - cmp eax, 1000000h - jae xxx2 - sub ecx, 4 - xchg al, ah - rol eax, 16 - xchg al, ah - mov [esi-4], eax - inc edx - mov [ebx], esi - add ebx, 4 - jmp input_pre_cont2 -xxx2: sub esi, 4 - movzx eax, byte [esi] - mov byte [eax+edi], 1 -input_pre_cont2: - loop input_pre2 -input_pre_done2: - mov [ctn], edx - xor eax, eax - mov ecx, 256 - repnz scasb - jnz pack_calltrick_done - not cl - mov [cti], cl -@@: - cmp ebx, inbuftmp - jz pack_calltrick_done - sub ebx, 4 - mov eax, [ebx] - mov [eax-4], cl - jmp @b -pack_calltrick_done: - ret - -include 'loader_lzma.asm' - -section '.data' data readable writeable - db 'MENUET01' - dd 1 - dd _start - dd bss_start ; i_end - dd bss_end ; memory - dd mtstack_end ; esp - dd 0 ; params - dd 0 ; icon -fn70_read: - dd 0 - dd 0 - dd 0 - dd 200*1024 - dd infile -filename db '/rd/1/kernel.mnt',0 -fn70_write: - dd 2 - dd 0 - dd 0 -outsize dd ? - dd outfile - db 0 - dd filename -section '.bss' readable writeable -bss_start: - align 4 -inptr dd ? -indelta dd ? -insize dd ? -ct1 rb 256 -ctn dd ? -cti db ? - -align 4 -mtstack rb 1000h -mtstack_end: - -infile rb 200*1024 -inbuftmp rb 200*1024 -outfile rb 200*1024 -workmem rb 6A8000h -bss_end: diff --git a/programs/system/kerpack/trunk/kerpack.bat b/programs/system/kerpack/trunk/kerpack.bat deleted file mode 100644 index 6e887f371e..0000000000 --- a/programs/system/kerpack/trunk/kerpack.bat +++ /dev/null @@ -1,7 +0,0 @@ -del kerpack -del kerpack.obj -del kerpack.exe -fasm memset.asm -fasm kerpack.asm -"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe" /section:.bss,E /fixed:no /subsystem:native /merge:.data=.text /merge:.rdata=.text /nologo /entry:start /out:kerpack.exe /ltcg kerpack.obj /nodefaultlib lzmapack.lib memset.obj -fasm doexe2.asm kerpack diff --git a/programs/system/kerpack/trunk/loader_lzma.asm b/programs/system/kerpack/trunk/loader_lzma.asm deleted file mode 100644 index 3c4ab5b3b7..0000000000 --- a/programs/system/kerpack/trunk/loader_lzma.asm +++ /dev/null @@ -1,404 +0,0 @@ -loader_start: -; start address; this code will be injected after the init code -; (some commands below "B32" in the kernel) - mov edi, 0x280000 - lea ebx, [edi+loader_size1+16] - lea edx, [ebx+4] -loader_patch1: - mov esi, 0 ; will be patched: start address to copy - mov ecx, 0 ; will be patched: size of data to copy - push esi - rep movsb - jmp edx -loader_size1 = $ - loader_start - -loader_patch2: - dd 0x280000 + loader_size - dd 0 ; will be patched: start value for code - ; (LZMA-specific) - dd -1 - dd _RangeDecoderBitDecode_edx - loader_start + 0x280000 - dd _RangeDecoderBitDecode - loader_start + 0x280000 -RangeDecoderBitDecode equ dword [ebx] -RangeDecoderBitDecode_edx equ dword [ebx-4] -code_ equ ebx-12 -range equ ebx-8 - -rep1 equ ebx-28 -rep2 equ ebx-24 -rep3 equ ebx-20 -inptr_ldr equ ebx-16 - -pb equ 0 ; pos state bits -lp equ 0 ; literal pos state bits -lc equ 3 ; literal context bits -posStateMask equ ((1 shl pb)-1) -literalPosMask equ ((1 shl lp)-1) - -kNumPosBitsMax = 4 -kNumPosStatesMax = (1 shl kNumPosBitsMax) - -kLenNumLowBits = 3 -kLenNumLowSymbols = (1 shl kLenNumLowBits) -kLenNumMidBits = 3 -kLenNumMidSymbols = (1 shl kLenNumMidBits) -kLenNumHighBits = 8 -kLenNumHighSymbols = (1 shl kLenNumHighBits) - -LenChoice = 0 -LenChoice2 = 1 -LenLow = 2 -LenMid = (LenLow + (kNumPosStatesMax shl kLenNumLowBits)) -LenHigh = (LenMid + (kNumPosStatesMax shl kLenNumMidBits)) -kNumLenProbs = (LenHigh + kLenNumHighSymbols) - -kNumStates = 12 -kNumLitStates = 7 -kStartPosModelIndex = 4 -kEndPosModelIndex = 14 -kNumFullDistances = (1 shl (kEndPosModelIndex/2)) -kNumPosSlotBits = 6 -kNumLenToPosStates = 4 -kNumAlignBits = 4 -kAlignTableSize = (1 shl kNumAlignBits) -kMatchMinLen = 2 - -IsMatch = 0 -IsRep = 0xC0 ; (IsMatch + (kNumStates shl kNumPosBitsMax)) -IsRepG0 = 0xCC ; (IsRep + kNumStates) -IsRepG1 = 0xD8 ; (IsRepG0 + kNumStates) -IsRepG2 = 0xE4 ; (IsRepG1 + kNumStates) -IsRep0Long = 0xF0 ; (IsRepG2 + kNumStates) -PosSlot = 0x1B0 ; (IsRep0Long + (kNumStates shl kNumPosBitsMax)) -SpecPos = 0x2B0 ; (PosSlot + (kNumLenToPosStates shl kNumPosSlotBits)) -Align_ = 0x322 ; (SpecPos + kNumFullDistances - kEndPosModelIndex) -Lencoder = 0x332 ; (Align_ + kAlignTableSize) -RepLencoder = 0x534 ; (Lencoder + kNumLenProbs) -Literal = 0x736 ; (RepLencoder + kNumLenProbs) - -LZMA_BASE_SIZE = 1846 ; must be ==Literal -LZMA_LIT_SIZE = 768 - -kNumTopBits = 24 -kTopValue = (1 shl kNumTopBits) - -kNumBitModelTotalBits = 11 -kBitModelTotal = (1 shl kNumBitModelTotalBits) -kNumMoveBits = 5 - -uninit_base = 2C0000h - -p = uninit_base - -unpacker: - xor ebp, ebp - xor eax, eax - dec eax - lea edi, [rep1] - stosd - stosd - stosd - xchg eax, esi -; mov ecx, Literal + (LZMA_LIT_SIZE shl (lc+lp)) - mov ch, (Literal + (LZMA_LIT_SIZE shl (lc+lp)) + 0xFF) shr 8 - mov eax, kBitModelTotal/2 - mov edi, p - rep stosd - pop edi - push edi -.main_loop: -..loader_patch3: - cmp edi, dword 0 ; will be patched: end of data to unpack - jae .main_loop_done -if posStateMask - mov edx, edi - and edx, posStateMask -else - xor edx, edx -end if - push eax ; al = previous byte - lea eax, [ebp + ((p+IsMatch*4) shr (kNumPosBitsMax+2))] - shl eax, kNumPosBitsMax+2 -if posStateMask - call RangeDecoderBitDecode_edx -else - call RangeDecoderBitDecode -end if - pop eax - jc .1 - movzx eax, al -if literalPosMask - mov ah, dl - and ah, literalPosMask -end if -if ((LZMA_LIT_SIZE*4) and ((1 shl (8-lc)) - 1)) <> 0 - shr eax, 8-lc - imul eax, LZMA_LIT_SIZE*4 -else - and al, not ((1 shl (8-lc)) - 1) - imul eax, (LZMA_LIT_SIZE*4) shr (8-lc) -end if - add eax, p+Literal*4 - mov dl, 1 - cmp ebp, kNumLitStates - jb .literal - mov cl, [edi + esi] -.lx0: - add cl, cl - adc dh, 1 - call RangeDecoderBitDecode_edx - adc dl, dl - jc .lx1 - xor dh, dl - test dh, 1 - mov dh, 0 - jnz .lx0 -.literal: -@@: - call RangeDecoderBitDecode_edx - adc dl, dl - jnc @b -.lx1: - mov eax, ebp - cmp al, 4 - jb @f - cmp al, 10 - mov al, 3 - jb @f - mov al, 6 -@@: sub ebp, eax - xchg eax, edx -.stosb_main_loop: - stosb - jmp .main_loop -.1: - lea eax, [p + IsRep*4 + ebp*4] - call RangeDecoderBitDecode - jnc .10 - add eax, (IsRepG0 - IsRep)*4 ;lea eax, [p + IsRepG0*4 + ebp*4] - call RangeDecoderBitDecode - jc .111 - mov eax, ebp - shl eax, kNumPosBitsMax+2 - add eax, p + IsRep0Long*4 - call RangeDecoderBitDecode_edx - jc .1101 - cmp ebp, 7 - sbb ebp, ebp - lea ebp, [ebp+ebp+11] - mov al, [edi + esi] - jmp .stosb_main_loop -.111: - add eax, (IsRepG1 - IsRepG0) * 4 ;lea eax, [p + IsRepG1*4 + ebp*4] - call RangeDecoderBitDecode - xchg esi, [rep1] - jnc @f - add eax, (IsRepG2 - IsRepG1) * 4 ;lea eax, [p + IsRepG2*4 + ebp*4] - call RangeDecoderBitDecode - xchg esi, [rep2] - jnc @f - xchg esi, [rep3] -@@: -.1101: - mov eax, p + RepLencoder*4 - call LzmaLenDecode - push 8 - jmp .rmu -.10: - xchg esi, [rep1] - xchg esi, [rep2] - mov [rep3], esi - mov eax, p + Lencoder*4 - call LzmaLenDecode - push kNumLenToPosStates-1 - pop edx - cmp edx, ecx - jb @f - mov edx, ecx -@@: - push ecx - push kNumPosSlotBits - pop ecx - mov eax, p+PosSlot*4 - shl edx, cl - call RangeDecoderBitTreeDecode - mov esi, ecx - cmp ecx, kStartPosModelIndex - jb .l6 - mov edx, ecx - xor eax, eax - shr ecx, 1 - adc al, 2 - dec ecx - shl eax, cl - mov esi, eax - sub eax, edx - lea eax, [p + (SpecPos - 1)*4 + eax*4] - cmp edx, kEndPosModelIndex - jb .l59 -; call RangeDecoderDecodeDirectBits -;RangeDecoderDecodeDirectBits: - xor eax, eax -.l: - shr dword [range], 1 - add eax, eax - mov edx, [code_] - sub edx, [range] - jb @f - mov [code_], edx - add al, 1 shl kNumAlignBits -@@: - call update_decoder - dec ecx - cmp ecx, kNumAlignBits - jnz .l -; ret - add esi, eax - mov eax, p+Align_*4 -.l59: -; call RangeDecoderReverseBitTreeDecode_addesi -;_RangeDecoderReverseBitTreeDecode_addesi: -; in: eax->probs,ecx=numLevels -; out: esi+=length; destroys edx - push edi - xor edx, edx - inc edx - mov edi, edx -@@: - call RangeDecoderBitDecode_edx - jnc .591 - add esi, edi - stc -.591: - adc edx, edx - add edi, edi - loop @b - pop edi -; ret -.l6: - pop ecx - not esi - push 7 -.rmu: - cmp ebp, 7 - pop ebp - jb @f - add ebp, 3 -@@: -.repmovsb: - inc ecx - push esi - add esi, edi - rep movsb - lodsb - pop esi - jmp .stosb_main_loop -.main_loop_done: -include 'calltrick2.asm' - ret - -_RangeDecoderBitDecode: -; in: eax->prob -; out: CF=bit - push edx - mov edx, [range] - shr edx, kNumBitModelTotalBits - imul edx, [eax] - cmp [code_], edx - jae .ae - mov [range], edx - mov edx, kBitModelTotal - sub edx, [eax] - shr edx, kNumMoveBits - add [eax], edx -.n: - pushfd - call update_decoder - popfd - pop edx - ret -.ae: - sub [range], edx - sub [code_], edx - mov edx, [eax] - shr edx, kNumMoveBits - sub [eax], edx - stc - jmp .n - -update_decoder: - cmp byte [range+3], 0 ;cmp dword [range], kTopValue - jnz @f ;jae @f - shl dword [range], 8 - shl dword [code_], 8 - push eax - mov eax, [inptr_ldr] - mov al, [eax] - inc dword [inptr_ldr] - mov byte [code_], al - pop eax -@@: ret - -_RangeDecoderBitDecode_edx: - push eax - lea eax, [eax+edx*4] - call RangeDecoderBitDecode - pop eax - ret - -LzmaLenDecode: -; in: eax->prob, edx=posState -; out: ecx=len - -; LenChoice==0 -; add eax, LenChoice*4 -if kLenNumMidBits <> kLenNumLowBits -error in optimization -end if - mov cl, kLenNumMidBits - call RangeDecoderBitDecode - jnc .0 - add eax, (LenChoice2-LenChoice)*4 - call RangeDecoderBitDecode - jc @f -if (kLenNumMidBits <> 3) | (LenMid-LenChoice2 > 0x7F + kLenNumMidBits) - shl edx, cl - add edx, LenMid-LenChoice2 -else - lea edx, [ecx + edx*8 - kLenNumMidBits + LenMid-LenChoice2] -end if - push kLenNumLowSymbols - jmp RangeDecoderBitTreeDecode.1 -@@: - mov edx, LenHigh-LenChoice2 - mov cl, kLenNumHighBits - push kLenNumLowSymbols + kLenNumMidSymbols - jmp RangeDecoderBitTreeDecode.1 -.0: - shl edx, cl -if LenLow = 2 - inc edx - inc edx -else - add edx, LenLow -end if -RangeDecoderBitTreeDecode: -; in: eax+edx*4->probs,ecx=numLevels -; out: ecx=length; destroys edx - push 0 -.1: - lea eax, [eax+edx*4] - xor edx, edx - inc edx - push ecx -@@: - call RangeDecoderBitDecode_edx - adc edx, edx - loop @b - pop ecx - btc edx, ecx - pop ecx - add ecx, edx - ret - -loader_size = $ - loader_start diff --git a/programs/system/kerpack/trunk/lzmapack.lib b/programs/system/kerpack/trunk/lzmapack.lib deleted file mode 100644 index 3f2c501144040323dfb8cd8e2822fbb221353fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82830 zcmeFa2b>f|`aj&=)x9h%$u&oY1xH&QB#FbA$f$sDf_f?*F3SL`3yT{Nj3X$9Gv_m7 zygNO^8QYxGnX{*!o@cyMPftBP6Yux?RCQ1H%q-yk?)U!x@8@Orvs>L&Pp+q)s;;i8 z?z>}sOT*lqyKS3F{tOzt-N5a$gR;X0CiBDF;RC~~1G`z4)z7lJyxIA`?QgTJ)%iR0 zkCwISzY(KHHMUJ_$>+z;Z)l#CZ<(Rf5m~FOWPHADN=suyzEat4^BdbLf?Ad@HvHIkw+?epd>p4bctTiYhpw>8Wq zAwcXle^!3csKsr0>W2FSh|Uu5iTU|L2OxX2&l|b0zOku(W>cP+t%lT;=EnJL`Ic$T zquX0r^7GrKG)sw~k81>#M)HbyZbX$=pBoaA$<`*RHr_OC|X)DQWI&5D3jE3fU3tIB6 zts@2vvt~$6Yrbv9tj3168Lf?n(Lgg6)HfVFqbWasPTO2_v!J=v`nl~lJ9L<7*avn~ zXuxlFv8>y+x2!)NDvjB)%YGfJ^fwNptmLmF_hs$v|35A9|HIDye{~f3zn}$%v7m#N zSke?%)st?&eb~bu*lob{J@ZZZ`qun(3FM>Mdktuwd5~2sh{dOpl8O6G8fkhMDe1Ot z*hL!#lw|03+YK4AUC2?Vg9Z*9HVoll(BMJCH46Lm6)S9OqP<1)3A<;1y1DyRuU|Xq zx(i>qtu8(F!K1ddthKv$u~@d>0L$u)_`#n6v)I!t%=R~)15y2rUhd(5>ao6xprx9F!QB?5y#+J27 zM{uo+Be)m9_v`-Atz1O(X3dNW&Vp=@Z5`c4aIkWQfxWRQ-;%2votr+TrFl+E{k+sT z&0@%*OfC8wL-U)znm%>Is^e zw#5tbvl^SM%xtS6H@z)CZ^86~o0}SEwlq!;yN~Gy(>JH(GJ2hgq3f z=ruBv=iqPVU@J3e8cG&hnQ_glNwcz_X2#8mTy@)p4Z{ZxSO5cM_OXUonS4u2Gdkr3 z==yRCT40YhYprGKtNdWQiwnI5qZ{gF6}m36pNG9S*tKbw@$`Ri9xUR$u~TAS{l-R8sG!NVGA*I!LKsPuWw^M%G< z6S`Mlz5J@T>;Jh!Hof;b-D|&hey)`UG{8JNKKlK$OAguKp>Bs|J%9Ff$JfqXOjvjf|g|F@V#kHqY&uFac*0Zm&5`$AS-dfVdvrzj5TY^a8B0fwUFt@km%~y7_ zvKJ`(5M{S0yXWR5__4ug2@StH=v@XnyMd0|N7?h0)2y5Ys;Xzd5+d;da0!(~JwWAC zP)UJ`y*VVbB}ezsuqY&eD2bm! z-(L84E(lDD6YzQtDQIPn_1wK2 zugqraYRuki1M@>*j;F$dP;ryXkxQT9LhgpfN$Y^dIS5E&LmJb{X;iTJdRm0)^?<%3 zDq#fChe3pW%h8Pp9aA}QeNed#RCW)k90(8W@bN0N{RUcwe{TTn{XM}}BEy_gY-2$@ zwT0?$q;VH+1l+!e!lUQ*Ry1LawT()6tYx*^)*-6DL|0V1<-q4`tG&kBN$pV_yUZx5 zY>@2&7Pi%_`p;;nZn*y)YmF(4CZc)HDa}7?4v9^?eQ^h znX(**`V~^Bjv8z0GW)>vST1=d(#jRn?N zV6`kT*;z+TwynuSdd#lfWMExYx3P9jjlwf!&ns&;9W}P+dev61$nxx;-#e3?xk5rpd5Kcw+Ro%Y1$Tp#H91xIX;lme-+k)TbYC@Y;^eiaPPThY#hj0@zgm7Xs!wz;oOHyfNKwJDTunr=7u zAT%MjSow!3lVxwmEPt^I+7+(IscT*KaHy~uMCdcwPNff3>4loShUrQ!1aw@(uWx#h z3KlA4n~b{j5h~qc@&H=vy3XKbqra|(F#Y@^LB0QEdvgFu*>)@u&YFQ{CjYCt28&3S zrMMOuyMdIbo%WAX;7n`Sz434Ok;*?Bw6~b1a)&9OO8C;gSqHg$cO6OC)RJU#L-^w1V{NuoS0PMGIdYKBE6>4Fyu8D#E z@hBREqQU7tqCF~L^kvn-G6HP_4py9?vkh`BgF6Jo$fvLZyiMNFX|8{QlIjnQaJ=$Q z1dr|D0|}W&wr$WYPHxyVKyB|I8)0v!t(t|yl^|AkHO@C2<~*j8=G+nH>=&AIr^)ut z>C;6WYcO=0kUK;9XDX9robn76oE|!*SC>5t^6r8fxo1fi!e_#A=p-GT;^PrIa}$bH)gUuHvJnFoJ;m1pMRl32F-5|!@ulBU^))fI9{3~a@W(= z+ch|w{u=y-nB4@vM*jE7UJR7oXxu{xA$8qLx9Q#ei%qW7FRItB%U%NT3E(i%aHw8a zbC^_Og30zC)7;7SWd9NczrRrV6m1IZaegQ5F%|Y01bZx3nM;j5rcJi@N?#e1v8G#a zsbaGo2%*9-uy?RLY^zqE>{SqBAISep$RAwE0@G~wHKU2!br9`f$c401p>H1K8Vx^CztH%0s0q;1;kxHl;Mt@Zu+!h6g$@b!OAVMLS!2xr3DgSOIS%}IKSN*$G5a`x{EREZh1Z`E9y$50+ z7GpvNC!|7nz&L=^RUFBn8QraXA|DQ&@93n?M?&Y_q4WJJbFb0)sPsdkO*o!7da_+8 zASxj_21)vU72Ho*98ZXcR1gwqv%3b5kXSfsD4aluL8cq2K{uky_X14t zg!tHAjBFDTM+zqb7O~Mmj^Q5tU z;S>t^Y@!AVry>s=Pt(cigm_K`Pp-n?X8_KBfuf#?D;oSPV!j;5GzNdRvcb}s2pXsdiF9bfUKMmG@O=VsQt$z^(c|-W=)(ln`Gw(GmL-0xmM(?^I+diN# z0kr=nMZA|WplCUZ4Czqs%bE9vLf3E)NV|(m20H*Fj zvN}X)?+x4L6`%zhz7=Pl8vds8|3U$;L}~B_rILQ*&&<1u7>GzX%{T=f@&~^>o>i5Wl6xZtHIzoJ?f_FMFdKg;%0670+ihn(>X!9G0 z`H>3VjoVyT(2Xp5SF;UmeiQTFFR}SY#1)$t`5T*mV8~XoIhIXQtssP9%Memg47wQ* zsFlAf=vMUXkCp!qs&ETRgZHCad5?Lw62tLv-ML!19r&n~15qoVtITIA^GR4Scc3Kw zWwK%d=6#i{m^+aNLGIGY-GunJ3O=KldI9}ShOwY>AB#TMB*Ln>pLt)FRL$4Km8$tfB1!O-A%+TZl1<#|jNC@B01n6&s)q@dj3 zr*exw&7wq*R&Hq8@3d)cW!C!@YYeNaO?s71?JFWy%VF2W^JX?T(T;|mZC{EC zpbd3~*pN)Fgk1SUM>V%6DhIsqTczylK-ET_+V<}&QvGcus=&K3!n?i$h?^sbn<_&% z_ZVZ|ZK~uhQzdsqn%*Wxg*_)?r9e~CsJA4ky6DBJZy-jE91b=AxOOAwG3`dqquPz^ z2O~E3S5*Dp$_yS-);zu-mxbOjPqv+hm4#(lCO_6R9+CVQDBbi4c_Cls^v+90+82$q zFBoZ`iKKn1qO?y|miE~WrF|~xeYW#_B{5&_K+L}wG2b#`zG=k#b5!fERTT4;%3{8O z5WuYqB}RJNh!hzU)%g#@`R|7F$A5c?@}$ktfa-)6}70s z@)C9go~t_om&;Pn5nv&jbOg5jQ$;O)DAghs3%^^57Pi|_)53z4WOt)nwzY)2RCTwy zN%X_iO_hx$S4ewS_f|;JpIBVkThqb=yI>j>KK-i<$wdw#T~4@=%WMmm#E;ILvDk81x^-n*W0GK{%&M;0XXS z?n*?kR!=^5uA+ZWyOzrHo^lp#Ygyl+P9cuwsjT&h6N4eo5Jvln zvNjaDvAV0azUZ>9y)<=vYGYNK>etqOS@l=dUsoTKT9R6tIu_X{q)tlxI(2gDl+cUj75nRMPpmA2$MN6#}D=h3I88I6>b_NU_NR#NC_)2r;DtmYQ zPyWPLnX}TA{ag|NckvbGR7TlcW1jpG7_+*ZjY8SvnEVkKv$EVnk+QkAJozIqW>q9qN?-mrJLVe^|`|7P9V(Og51jSsT*W43Jlm=|sRSg5ytv=+C1 zENqzGIKQE(eO7)tHXJp#EEW~l`cHP(dV9`8c=hcqwG`H6JCL#INl8JwG zhHQ32-zlvZ^_(+gQthRkCb_VFR(`e?^!~5@^-}Yg-431C!+w94Z@h-uF`cH`(9#x> zed(|jZ(2VN{_?|`vA;U3<#neg)|H#xU(1w7&n~cUx4Np6Qcl+HHp7~VLDykc9t(~O zy{#3!7%o`mVuypd<-EaJDLWO1Mg~DFTVnvk1yTYeMv!IY(AcE_Jny8G4bYGoZZWvR zATdt6a0f%`kz!y-slD;mz#c zUE+A)WfeFeKw@{tzY}n^9@hVdSiWFMa4{Qt!J2?F9+dM#|n;Ib^rB zAXeJ>8xq(=6Iiz=2qZKO?z)L`GOjnkRolAG zK-Yux2Z7!QWmVdi8d|_;kj2oYa5{!Dg`vW#p40Ztg+|QfNc$Mu|r^SLsMhJsP@^j^DQO&0Bmbp07%T8 zRKEz0#OIo56T*1K-O@8KR>d}jjq&uxJ=5GKO(3)#>{PI=ObG|<^o|j!wkE2nBWLW3 z9o@2(29r~$EHuy>>mUWtwvpIP);P1B`xOe@Hey?YNU*(a?{MBK62~DW!cVJjnUjZ9 zg?>P&wk9xtQvKqY`4|s|4aXYq_HSrun9&yB!~kCbmqLHw;wf{zaI*wfgOSdZdTc4o zV>h~{PI(=xy2e^x9opP7%d+}bTT=+PXTE-xRp4WWfY{j2FjeGhXu!tvY1mu{`Q$0Y z+M{BAwY59*_h^m@&3I#58yQQR-RVVR*IzF0&6U=#sX_Bu=*BQ{p}g+V4a5Ec;Sr3r8U_ZgWVZp@i$JVSnq@< zH_5igOm;4ffXs3uL0eC6-B3Ssw?GvZcYNrK%k+0Mb#5l*>V@Q8Cfn8NEy9%>qv|H) zwsd{pm8?;9TpC(8!Qaviw!jLDx}ZPTS=42>!pe=VLCRe=dTI4G%SL}*ZRv8Zz_7W_ zH>g9|F{z4W1DC9|U@-nBO7f3s`j-?H1_R*{OgH5nHWN9kc zI9zyRyAGM8azk8j7}7}&h1201;8KT`GDF3T2}Z$CE^?6tv0{sXm)9;yjl?#I+%R$- z)>*Dx7zwUExbEO)hP#>VO%)c-MhTX?oTC%28cdIHgN>-Q);-u>L{j169j+h@c3@ow zBly36b|ly0$RffWT%8xfUJ6)$q?;ZN9|_kA1NJg<+1X8KuB+eC+{_IY#xCU!AH9rl zm&nnu26>e0k9O0{3hDZz++Y_GON6V-j&XyX>18RM9r>5oR2G{j%7fuV=5ikGhDESG zAe9^K`eUf)Hpl-J3cMAXjK#`9vvSHff*>wa8ksdEJ!sPBNf zpW8@l&zP!I1{4&(DU_tG=>;d$&$AKIS zgu%Y9jsWx;O-ceF5hBx^yPS2?U-*9ulscOA7HT*Pl@$#IF)UpvLR62T}+w zx8t%qSzEWC0SYVp8B*Ri#xz&&`ZHb0iqxxjgMCBws_U{1q{`)Vr1~7vV85``uF1|~ zDOb{^!K+w+jUm`4m|A+rr#(X6d_$PayS`w&s4-|4y?x2glh8}Zp62Fey1sCInNZ`4 zifUtOHX+$ph@x^cTwm0GmA8(+PiOt;&%lQt9psM7%yl!f!)EvfvLPQ1KDE+KE@hf6 z(Tm<~p<67*Bj!XqVq#Es0xGh~Tc8-s)jp$1qM0qPwgw(s*Edx0FNA5L(PQ+SB0bp` zII^v}tJ$7|R|_=~nhvH--v%};g6q!3zjuKTi|mXD)f}4RZ^%ox#{39;-a{Ue_jU4t zPCnGhM>_dfCx1s`y02}im7{yKzS#oh{Rc|ZEp8x1p$R@gX6_i*7l==BLudTVK*mFI zi11I81udbYVx!9v(*7K|(iX)$hcN34Wcf>6tcX5_xBnu|HrI$J;jDlBhLNPr8a)bc zIw3hj#+Srsuh?HkUF27UIn;$)=~eYS8YjKbm9@e_yLb|=m!>9$M877&A~%dChZ;qS zo)rTAn}CZ$KnhpD+Yl>QD27cqV~Fw%Pz>P?;kC*k#<#?17AGaeYPg=X@7O-z!hZ;} zm|TN4{_me%N_&2fY}VBeXCjz9{0UTx8W}hRSuH2Nea%M zFnw4EO4$pRHHMv|>BR6}!b%_R28Zbum@#(7dSY!lz5A&M?-2fomB2@ou@Ee7v+k8_ zh84J0`bal@RIw$6CdX-bR{Cf+7(|J}%qnF1$I+}^a7D9LBSq3xC*5>Xqm%APf@)qV*@*QLa`Z%-kHA(>!oZ z<05yS>x&3m;D%ali8OR_soN0EM*#zZ79ldyR?G%--7ezHw`R$aCCs^EYMSStN3Aow z=EVS9G(pj89HP0T6RTR{GMCk-#NpByh2Wxa3G+3J}VA z>r1Fbac6F_)B6QkTo!hE!KFsy^0C97MbafuNrF>JaCu0Ov8<#QokoDm-C()2TOFDJ z)?qKY7vZm134GM<_9o<&Zu+Y79+JyG(pQ)CkiSHxe=VzTUtG~6_Ctzff1OO%$pJd~ z6_VgG+9$Y(|N9QV*#*hc9`cW_e=|wW0C?^?ULA-l|Br6^4^d?c72Pcrd%JporLT8` zD}}{X{9hNpi3jYNBzX&oH{dGxgYNCFCypkY?CrFx1Ra&9vbVdr+enQIT>RTz|5g{0 z6ni^q2dUw=xV}K;Dd`QNvx_oOZ#NrdAT&oOa|wB)8{8l|C3+^w3VSAVQ{FQ*lE6(- z<=<#DEILb6`3C_~Yp9!TDtiYtIvClk*(MhM5A9T!4M=jHAvvEUuh3pBMhHV|GYaUj zH%S>QB-S%6U?CcuMvQk3hp^--S1S?HYC)#-Os%-c-Rb%wLK|+V6_%@5!Q~Z1;Obg7 zGA%-6q(hkv<{Bl=d=X2oEMdMFndq7Bq}GS=niq%TB6pYTi+PX04Fx$8X=sb0+NC|y zQG_z$7NJUerlZL~f@}d-=$Y;!+hcgGa@V@PG^!;rQreV^A@ZCRnrz?!;wRYRCV`fW3Y)1>XXV`WM`D0q;uu=_M zz=jXm-?fG81PS+d)nO~z5W}K}gPUOyzo7u+w>V-u@d)9Jfus&LwTw2Bj?$7kBVE~5 zXzvtJ*uk}$8t3U zGZ)hgW(y?OjX|ApaozUB4fkK#_7rTC$fjTYfYju*zz%S@M?HV`ba3QA2u@sO`2 zo=ML&nxA9RvyBDLG8Q<)@!(xt6xKx z`o_4SL}+z_2pyM89S_i%F{SBuwmK2jm~U#UkAe1Z@$2E&g#+HDE8e}+q=8P=9VWfq zq_-J|yVW?{Eym$)HsycRsdJrag4Y^{{hi7Gtx2!ZseOTQG`5VZp?#SzU0K1GE|w}O z)zP`U1FyNNg4bNpfpaXc>>L+%;2f8A;2f89=p2`JtJkin=F?o$-B>-E7$}Xp!;?@A@>3T4&gAoWIGykGMpvEK z2T1>(cNcg z;vURucGtWFa*yVbvf>!_A#I!3vNl=YJG|eg1)tZlq+EsNCa(s(p}O$qaWsI|^kfCI z@GjnyH|paM$QjlLKhYp|Eo|oKU8b}s=7IAq`PmkCm~ywKYaxU+&Wi4(Hn$Fm!{5*V>taUUt*tCT^Sy{e;E|*W4=|WA9 zJ3co_;)*QHPsMOTTFmdCgvZ)=ek!a;Z_5~-DHPc$$2Jzt%SGo&QK=it2S(*FQH`GD zJv1s0@wKg3mW|2;H_~IrC_lt8QpM%U+%_w2!zmVs%xdILC}~ye!qfC8F~AHz)2w(qvdUZ4u!=1)v29?l#4ZB3 zDDG;yDlCD}jPR*JBNQMT?;9GpJP9)Phq>P<$rw&v%}Y+7u37?*v-=%)JC zRt=Mqdq(1x_69tmvHcO(>J7Lt`KJ6FL3zy7N1e`STe|3_ni z5x?rkvi-5<2%aE6|Lc4IH(0&B|1U$Dckp4N_|J&&D}k}S|LNl_>(-6qP_aGzvAzG_ zfYuwAbpSVOW>j!uPs@6N>*ZoUt$eeZvqc<1;2?^Xqy#rFQArvGbu z|M{i4y#Btk>?`m2;icQ}+LBqiWWbKEU%dAr4XeHPzr#<~t@elfR(5(of9^wHjc+ur z=4T2w?+iJyPuXV*(?6S(&?);&;i;=hMqO_(X8S^L`m_{KIV;eJhRr2sfYe-R7cQdn+fa++Tn~uL=~Rug>A) zZ{ardewxOH+=l*wp`k`#)?YdMgUp7mHM;m=wNQ^)%)&rTq$ro*T2goy6vok@ zy|4*>(5i^=JLx5QY_dM6?1o`NnpCy`m7OY5DX*A;T9FS(0O#yk+p=PmD>O!e#wdL3 zS3VrBzk@h1;%t2N6U5BI+A!%h@K<$@+w8LF{yY@~Xfhk^@2pT(o)};EDgYzwD zhaul#8tuyzFjk-oIuMHYNXdr`!TlG?-dowXDEAI!2g<%z+4n2^0cF3Y@E*(Vc`{@R zom)N+I-;yj{#FOVqcMWp0CnPSrR?XG{fe@W2ljbonuXt+#|Pa*`6g=l7WM;~DIhZv zN?AQIUs__6(hA*E%qecg`Uo5NIE`h`3ba-%9*bfuCZ1UJL#YR3st6V#MH~5&ve5U%v(L-voYU*WOjmLRUyU z0urIwN4Ma-FMjJjG}vhxasMrW*n&~?vR_j6c@X947@f+| z|27{~o&lA@Tks}p{Vf&ZtfQUbPG#Sv?7NkHk2uDCp>I4WydG2b%_2Xno5p zgq*OJ4%f<_J^)B(0jcmei0P=?Rjn|0dVcNVE1>mod%Tn!W8SN_!b?K}jhes{gMqsb z&TJV5Evqh2_6@@LVdXrc*?;F+_yBd2>G`C#NG3G82|!;C0hyygW+9z@f92e(oIfe& zS+v1wPY6UZbVQTC_UI=-cDL(J%9bus-Km_rl%rh*?$H-MkP~9CCj>F{ijA*b)7y9_koo}h z8qj#E5O)5g?5C6sRsN}oj29x47qm6bYo8a7rpq(|cNY*ioWq3kx`9NWKFUie)mOQ7 zl&osB>UKI#jZ+RP{33?AYUwbX+g05i3dbRLc}TertExv-^`kuI)phgf= zzU?|6xz5+F)6a7dj8~LnrT*k^8Ea$rsjr&=^l=<(IXVj(&Ai)IrYLF?A`h) z)Xdg>l!HjySJ@C}5Tkv~FC^aLbIxZe_acQZY`t5RcblrdL#crEP&6Y#ak9lZIDZy3 z{Je5rR?aJ``>RU9Uv_fw;@qis?UP+~Gv&3vbM0!+-q5qhdv?$5t1ONXXSC+qX3T1A zXq&-T?9wPbKGPP?(Sjdz46b)Y2e-jooK5ts1dyI14K9x$Y{6+LBg7#*&Qlf6(|BJI zZvi{Ti>$f5-3|3wNSi8qGvzF2N8&ul7N(w~Rc#%cUY7phRq12iQ1*tdGstxwaqXvL zqW|RCwzX;eG#rflY^!i2*xJ?u_#AFie!hv2=Bu{PJ&u9ma;sn!cyf<8;vYF>GpVn}%<>hdoB6Zz;Pniq~I5cC33qwy_m54&-r4A!|bMzi6WYT!y*oWyF`ol8sHA)n<+E+h}qh7_%B{u^KIrq8{^Dg}IQf250chY{oIy{G9R$DtdAdi^~u> zbRq3DHP$gjpkfgZT&=MVS0w`yFc~2w&E}cK|@;d<9O1e(w9+b+j>RypWl2a`Y?Q8yZBY@ z8taszlpXn!dzL&HC(na(ZAO&as|?sNs^a)?~E6xRHV9 za*FGYhTlwD42u}0Fy-DR;QC|qIt1vCvO5-zt2=n=+~yVz6;@JXHC8`0TE@<3MDFS4 zVV^H~Tc$M|SA%^x;KHz&+8rfQ^Q5hr`t#+EbsH3D$uB4gBs`+8Fk2+QLFkqp?WPI- z(wO01U1OY>2-~KvG``kkrCouvKpAZ7Wqb);PkIoX1G~ogb0BA|7TqmNI)Z3`9CsAk zdIW6Yc8vJ?O>HdrPAqS!LWR$cno6|@Ut?`p{7$=zcMXc zc6aBLx_2ap%x!3^94O|i!P|z?bLh{eXJ%1JcT>N?Xs|v5X zSm@_*(`6-p-B6bJ>%t*1GOJheSA(*|Ul(>!$n3h3zXSpabXjwrAuD#x&l(G?vA`M& ztg*lv3#_rg8Vjtkz-n7y_0Kb052qHctIss#(T471r@ub2aB~!-@kaopJoJ!RD0K+v z=@Sf*d#Z*f9540Zh_>@Hk2c&1yEWekcWdsPeoM}Y!3JyjfbA}m?Gcmhk?Gf&E5|VD z4Wl@b4|_64nS36+#C&_O&L5rrON>hHugZT{nJn`;%fG7NFA5mMTBk1iH;6w5J7UMC z-_gg^6iaP>03AnpbTu1P$Kgx6S_W*}o{)P_`S`3Wv!cVb-c$UVE;gLwtFAn7@dE`h zjb6eY=;owFkwJvcy|4TaAjNp>mVH-JGBjVcNq0!9Ov|*`3&fU;6rnc zVq3w&b68!LpMsqT!J-0l>K-g8r$+o8<&*Hi*r*(cIODx8`w0s6h$FUjm2brB^AdqB zNBhx4wK%X5pNl7@$^Iv_LXlW)2RQwUI8&fMa66^{p3wiF(En4T|J2~qqW+jYsLOr< zsisk+sGzC?k-BS7{qewviyMS-U&**I-s;!k^d!An&{<@m=CLUtky&(qSR)m<9{!hF? ze5d^Hm1IQ?;yV@mM;e5D7Pl_@0}Pf&Ynz>(Xugx)6%YL6toFjc7{_XGJSnBI*=l5Z zlsnIHfX1>Ezo9;7l{5;wj5xOjn=<~2!y%{!Jkj@&LaoU(RgDntieoWNk87T;+KQezv z`WFU)8wxbd5)5PI@JqWDtlYv=xmt5o{4VfhyA5)*m&sw5P^E!lax5&W)4ML)1!N8d znMGw}O4Xs$#mFqKpbo824cAGSAy(}xQS2}tj&OLc+Vv^X5s>J}GKoqRE0O4^4kfBA zSGn&TjnfjU!M?zNg0pF=c#SvHJZ`{^jvMGxa5qRQe2@d1+& zdM!6Sdexl6^CC`4r~%hno3wt7TvTS^WaCjHQ0TZ==rg zyFl~n3x0jv%%*N;W6g5o7)vw~gqP*1VAIe&N5~1-eZt%5m`|}o9nS%->#RULxEU>S z3kbBio9P!e$BU5-lV5@)?HA8LnvmPd^|y8Fm>5&Sbvv- zSOO+eRM6oUwOY~56N(~Q=oa6fty#*XH4Bnl75UO|SFxKp#vEyx+uHSo`DG={PuBuo zozfJ^T+EsfFs?+{w3mYr48CP&4SogiVemmP__l5)6B_(VWWz>RAxRI38+@qiZ|6!@ zWbmPGFhmS4N0!xPhtaxM6LSmq9xSeN3qDOHFk&E_mIQ}}SuVuzB)6T*Bg5^&HNb!- zgFCCq?|=_Yc7i4)$A|x(vM3|V)|6!j$}6(Sf!cC~Bg9QJi&q;@wYe7fJo7tjg~iGe zI#FfG^G$D1W=z46lDkl?>&QG|h$3@M(-;DWz~Q2hj0xS4skCi8A#-spIZk8%C6=xy|&S=&Lo2{>dt7;PFwn_HJ1M?G&P z;%zD_(Ecly5MRxWb$L9vUAPT^&~Q{|H4K0c4R=F5j}P7TPUL|!H!Y(DI5*Mt zC%GoeJl0Nhg9$t>o}v{jEQqSh?m@Zk268YSwT$Q*0u+@fj`wquTwf6G0Rj}+y|aqk z4}2&x6^i`A%}fq;c>vkzy+jE+Y~>Fk4th^?3wP z>@y!F^geFz3paf34ECn}e3ojnYeE)}5iCA#4)%!}$z*Mny-b~Jt3;z`Iq(}22VptR zFw@B0L*h?>I36DMb$t=-N!~g>#+9AxCZ7gAELRW9&2TdZxS9P!<2^$y8j{B2q1~{< zb2@pR5VPXOo9mi;ZM;Sr?*%~7crOwPmauU?vhn_6 zW9^h!p~NGubs(wk>I4nEDIRoKH2o{2*x+gasnD*0(2Pv~Dj+m5U69HiL2-5`3kqMKYGU&s*fMQXT#Rh-qG~$@N7v9_5{rYI=tS zl=iQ<@DIYFmASdDFGcUN$ib=Zo%FHyfe#;B2p?;6Gc9grft#5hy4eRP#5t%mcys{v zhs;}?biI#|2kAa$(GfA9L*Cz!7c8K^WRIi<|G+&f6Ra+bMf2t@tg98OV~T{yzt}% z#fhQsr|;$PNG8=mLrW@JiT{pc8MUp zM6CNMmLbVg$5G#?hR)SDHoCFCPmYFtJcu0CuMM+34fBdRVM)JjU>GZSo|9%Z6hdU= z(HH5hjEp(JN-obGhe$XSy>lY*xu0(8Oi(Js16D79Kes!{pS=SJj%AdEZjtq2e)+?f}t~!nTIv+2Y~B z=1@{j7B9-eNeWODxkHMZfg)^;gQ`1c>%PE;tuKMCFA7auhdglaha`QOF&U2cHKx{j z4WtE&nOZbv77f~;_{#-fcXheTUH=MKvZ6;oedsY_xSSSSm%WnVWOHKfW?XO#U9iYW z*R-w>9G9#Q_th1$rOaG&Vm5b$>kFkcD8W3JcGf&R%^c>r7Uub#o4Ll#TqQ;dt|8~( zs>mq1COJn?6U!}HrEBoJs3T<^S675m-SmXrb$pP+k*=MqQXZ%dnQw;7H@TS`+{_=e z%slBg-de~O#(*SD`)FrPJ0AFG08d9<8V|RJ#5~&`36HVIG>7isqE3s)*r&HF z?aFwhefrrjhH+ltdDnlzHCbj};CVNAmVF6z>Ry+9k?z66?>TssBki9H3GkivORoR2 zn`TxN1YdH4=Omy=_u4o63MufQds3J}5io=bS(wq2Ab_JDJ!x~g#gFR98TR-5T&z98 z3!jgA+4V&PIkz5Tu86e^x5{|Q>GgN65=;)QziX9XdsE-LR|&?`>oF95!S%)7JhvXb zn6A{Rbi=r>@+|vgHNNWlua#8etFdat+|=u=1RfAk_QJA?tpnq`qFwZxQwNQMqq5v< zt}oa;Ge61p&#wPQ3EMx%*tXPV-y~a}vY);$#-M`Xb8oo50P`$icK43@*pHz4%e){ij`gW7g$gw5g#?V=M%Q%#ymk@j*!T-?# z_&R0aJVW3AjE3Wx`7|7l$*;`J-eL(lu7Mb2WWOK=578$E&(J5v-zj!NJk5{sl21r0 zC}U+nO_~~6^tdr}FP_F<8Cq){@r#YSd2)Yc;hm!JUs8CU-cR9qK7X7Gh$U1gk&J>B zR)M0$t1JcwmS0!LE9{t6P}4T7OpPP@B()`=CSO?K_X7McF^2+ykLC3jZu%2f+br~z zlu6+m*vC`p^Xb9TFOa; z{=n6=LmhvOOuWARr>k4l@XuWTbK2x&JPdY2 z<<9|7@C_}h$8UYI-%_S?4ekX7ce?3%Bv~~GVT+i>^UZeb71Fz zsQ)d-tuSURj-F3mWfAu`kzit}e^aUpkOxcQx^tGg82GT%caf#|$qUex4_*8aAISaW z`YYTtvqC}rpWNUFzYkuQp<+zQv1YPbe+!7sk=tY7>d z`0$HrFMK_Et=9KCo%{hwx|@7H*i3fx^8DVOWJR^x%L}@B5K^SB%dSPUT~E45Zy&9d$6fo;tmtCLo{Lv_MGv(^;VWF&kX8#q!gO;977zLMG2-d?3x`%p& zRU1a1TM5up4CBP0YPttKh!V};-3By%n z0lVbuI9C)Fq@-(bO&ndgHjKZQ}WxdXg1++9qDGaabc*_O%&n_I@Hht)c?sRtFmM$RagC5^IFd z0=iXh>iI(B0n&IzT5RvIh95*86y2z^iar8-DB8~(m+9+e`gmsj!lTHB)Q^#4e1%#X zkE(q9dAxslEJ;>=pLg&l$w{`nojCmqgU&6EUN~fHq%9=XubPH*+uGA~(qMMZ6br zL-Ag!#0AxvR@qD538g3}u>xNpw z1gk^s&jvB^5>+aP!kQYyjL0g*dIN;;x^oD1dz077AH?goa2;&R+Lm$B0OtLL<&KZ* z&N=Bjz(=FY!AY}TW|)^58hYqoQ33|5Bp?y_JX0|t#laukOjcM0g#IF;jWhm zxC67_L$<%Om)^-MQmLvdUON&*RQwZw?~`ScM_qOo68iup=^Z_G3_BSaV*O-@QjGaw zJNXcJxe=Z(L_Wd|XnkyGp*xMyLMHoM?2CwXcS2aYyU5+y!7_-3JllHJB+7K>;E$lx ze+SWEN6MRQ=UHY+J1^Q-xAX9YrH)2o$A5qbDjL_FtLV>wkBT0TiXQ7_Mthl&VMYHF zC6MxSoqVB_f9d2)oqVN}uXXZooqVH{Z*}q?oqVU0?{)HnPJYzMPdZtl6Ao{J$2lO@ zPf4k43yp=dwWJw3NYfKMJ|4W9e5Y`zPt-mBrw+FGfpr8$@?j~U-3aq<3*ou z#8DbnFuD}H{Q1r!<0n)_lA%9U0VcOA#qEMC33S!C@LN1S8OCPDLWHg;4W5*D?yW@Y zhWqqx9-id1n;nF>A4T;V6z1AIUm&~VhGD6P#t0sz#X_<@nOQP9*9&=w7;R*OBWUqr zJ3dBe_xy#PWJP0yb}#rv*r4&Wb0`tl0wTHAlE9=QfEg=bnO}%f-q_YA&K_kr6`wC< zh*3sAe6VDFu8`--P~mkzJ7SF`mcti&<*cM_LVzh@h=`t6`)3z<{$eV)E`^+8gbb;# zhfIHwhr!!I&lfwaZ*(aqrJteuWe+2@4FE=SZHP4VF+m9_Z^Q!atCY8#TnM-^8NO{M zz~!~Q#-dI%hb;j@-rQ^gQ0;`9;!2!wGhFzGdBJYfJe2ToO4tV_lrV+VNXQ3zd8fms z6`6=k_)SketJ|00ri}^Fu%HeFNjassL`1$f(jxZ9m58`GF8ss2^nPCYEKI%Drrg3j zI6o0hRU?lRYiV*wPR3X=ZKqeEgmckb5N!W)VqA+##ljDDN;kt!7_$^1E{@-^(!cbA zkzy{rC?ZtQM;WBpN+(+rQVX-CnHkdWijxD)4wlILGU14Nq=c8Hy6G?AkZ(T@%;b&j z{?S!pu}xc-x{bC0j3q#~GLp!Zh%T)td{GkB-8SVi>u6Ux1xqu9T9wRj%G_(FoRE&P zth8wP+WI@g-^zq@;JmsA@!9z+Vh3h zK+>A-CHBU2v~a0Xt%S8dh;$C{g6XWeB(;?-UW#l#82Euyr97SJ`jyK**<+~m5CE_} z4ke>sdBFj~sGp~OqLn@&^2zW(Jb~3cF=DVC8T?9+D!C;sQkt2#%Kn*_MZ(YtTAM2&})KeeYU61qpWjZVBg^%-sJz1TaP2cSCBsdnxw9GgX#z;sYK)&>yPlDt4 z4uQ298TTVX9mM@zJEWn*UNA#kFK7I9VbWiPx&)<)tXNX?GY&?XZt5hhRe{8LK8fNzhJK@m{2*$MV83^5AGJ zzc(O)14WqPP`gE>ZFZWj2d-n8fR5-MJjWIusPCFa1cQ2PL5lbAYC! z=v-V$ByYrpf3BAv3CUvo4??!7S|M3pwFeVoju)%1;v-tfuL&?Q0BvY_w|pM8nTKK; zV7?|L0`Mh2BSLc$HTGure4;KesD}`>Q649Yj#GU98i_5DG3662h zZ^)|Eu;{CT#>6~Z`KskMfaWgne8Foscv$VcQat|xa#;vy@wh`t<3i6DH5VBgh(~ki z1}oFYzmRkm8;m}y;0n;g$dWJR4kyctJYOp1h@ZpqBC{V-C5TM2|PBWi=sD%&EiDD%#BkkdR_=~5@F!jtKoIO2B^5s z$+*Z}?)f6nDY&6Nr;<>DS<&_(v(o?*%ry>1$G?IqoleZv6X6Vi=C1U7!8_C7tF!a7atg{rAK-0s9>v1Ka^9Ee_H+$*& zcoZuR>_Q=K1X%iDFMT?u-ADh3IiaI5NRf5wHk=1J?CNhK(0*QUFk0)6sezZ*7PkTY zkwyE5MeHh8#M(EXhGjCSyeGbyh#gD;-GVZ(y_Fy{y`Y|UEt~I2cG>#PSf!Z-XVnuv z2~x=kAFVQ*)(T8NiR!DG{<)1}>p^!oGHbJCpI&kr{dU4NnSm+h7-;D`kQdApKPq;` z#agS&-b%L$07bXDlhCDb8a=GvyOJP!1gJ*=A;{fH5Z(DCrmA8*N`~SxO?3|l7)2sS zz887ohxg&aztzLskg3PS>pjfdC5&$tXIHGpP~Q8=uEQy!Bsq!UdWap(;5-2Qj;4ri zkGGcMa9JCyE_+A3xY$c)Z}RsZarRP$*7fCjPRrJ-uikjtH3dcLQrg!#{s z?);E0rn>GTvFDJRJDXR}6YnlhgXnqq{@J@(@&ZaoP9k_n?nQ#%ZNMpu>X*I83!3<# zG5j8)y#xqW`YTA0yhi!yG?iJO{Smr*@zu%Lr@EOm)&kOFANFd78Wgj53 z*MVu`ur38*b2c8svYzzRLCat_lSWAp7O+(IK~nrPDCUIr8@Tcx^m6xm{sWw`h!|i% z6q@5r@(kJCOMP{7+2rX1uEnyV^UZ_xsB-NdPBY~t!M&lltmiHr%MM<{bTF(D*s z$Yg?uDm{}_4)aJ(wg(lb{5~S7vaZR<8c7t5P4!7Hm~1?X4`)x&EMEbaX89Vajt3D;ahRXf z`riNr#y3bz8)u!!i?q_lEqVkUx9#E2#KvT`Jc3llF7fyvyjMaZ`?TjjLruPgJh?yd z>OZ*hpVqUPc#R;{ntRsspDUT*d^VimG@SgVpC@x~e&7N6jaQ_;;- zyLkvwodhYiQ`us|mfRH((h9rb!hapD(0?iNr`{%zIsJye==m>Gg&KgdciKB1S-LZG zA5-tiR@H+=hj_t0gx8&WGzjU5vfvOYkfBKb?4QY^mqC%dP!oK?)bjuA<=*i8H$Ctw zPRIIhgw%ypUG^;!S&OtyS1i2Qn2QfW@up~GTZzB_g%oQ+F(7*48ST0b`G<_zRliLd>mrv9upUw*>+56#BxODJhB}ioT*;oWs6-e^HzMf1;R}6f zy-rD&y|L!BiB9nOK^#4^inkoAXd-2ggh?rNPrt8;%gLTTu?E1@Q8=oJ)sb|l@#2c% zl2GDuW#E!qGWHT6z3@TXiS0ewZ5eqczEQ&(S)Jh$zBE&2eBA^}ssLY?vC{8&K?7}) z9PM;4PO50VutDIvGgkVqUhqyixz!px;S)4g`rU-@YJZK4&<_y)d&w~UF1cY~^*+71 zKS})Dfz^ASFUXq{8DaXbB7b6FC3;IpE)J}uDKU?>Eg4v)Nh%(twUmG?Sv$7{09P8N zKcHIpdYUv+pU^9h()i+L93&p4i(N%*WVLk?zQV|An zgq?oS3w?GwVt?pqa8@MZ;zxuYh62XL?IU7R+9&(5hxhiZ$Z8IvO!b@fw;vM|pXf4= zmcvOL@EtCASoP#YjwJq(^mtJX9{&ls?ErwE?eYKcd_mrk$mlwSqL?K2spo$d^|tbE z&;K;mBw?O^k}W=0C+69i6!3J5^#xJ9Oiq*ocozbpVXbtnf}l$ilWvb!#Zk`)Qi!)F z9V*M)(?|fWv^{-J=|=&Im5Yx!#v6-%?9%9=gN#Xn#M@H{GBycfMm?eheWtjGZ(I_v z*pi~L&v-zHhwq9D|8rw_T|a$>|I5?;P2AdO%CtgcbL;~4{C`o&-9Um$PC$w(Dh^MO zhi@r%G(4Kbq7H^fd!Q^iJo=KHCL5H*@MsD${V%=TSDycM$?)i_lHt+6N#qx#{ofiM zeM5?Sf?`f+Po*s1c)71V|KA-AkEW4-e0cONY3zku8WEp~Egul=qceFtR&uCOJ|Oxf zL03K?+7}?;v>zcc5;{v?@D;{5NIV2r z9Ma59!dDp5G$tX6fjAnl9F&BpFr+y+2~lZC)06};Lz<{#kTVTp-NQV9PpgJa@KsgI z|G}Hq1=r2I{??ODVF9ndz_2IxndeJ4do&l$x;XUxz)o$Tf<`pFyIxDorXB@=Ru$qX@!v zV`nk%6~(Hxw=*?a{)jvIFD4y>i2x)melWWkR_xqz=hwt z%C9Av3voj-7a?6~-Cj(9@t!^$=y=#9?c(?%9#^4s8av%lhOo57B|r*XQ^(vbxn5PE z^sPCAg;@Z+)QE8zx%^i=XgMjZu3KCVU`TNVak^INy1y4|09LQ=@tQ!N4S6N-lm3c# z=)*Ulf>)u4cD|Y{oC@ArX|sr}D*5m=BvEg?_N0W@22SX|LDwo)PSGuY3oMz|{~a!J z8&>%u*6&HHatlaO@HeCu*Ajg7n&ou_Eo}yWK&Hf)>v56WsLGehzX3P2&5cAUt$g{c z%g+rTH-S>0OX}Zy%QI?O{;tn|1R9n{&$x$ z7hV$PRwe#DKrI>^4Sh4(<=#pJwLP$%IVpIFJ?;Z)u1}RObneFu1$>|qJ?$W?qW54a zYEjzazUY-o^bjaa>*DvJVh{7W%HNdNkKj69OW722A0~&)}Z2K1<{(6WIkg*RRU&Uxhq*_STar{i=d0hW_m4#C?u9;3iq{ zGd%!^=Tu&N*uTmb{O2`3G5K0B@JKoo^aT`(o4<$)zphH+-b=X7rK@}i1ux@<&q}L5i@CL!E ztBSsY9q&;`Tw%xin}kn%f~*TIDvck<{8Z~syV9rK3U2{55NHv!Uv>*t@L!Ni3%`vN z$vZmvE0Xkc6DxjHcM+}|c`Wq4d z-^71RX_T;aeZ$OGOy)Lx=;~!g=HH@34{?K+d5pP?+vS8LoLFS_%MK#V{{V=!{~gJE zSNhQPJ#(u|>*NRKzO0f@em^2p21-BS!XH$n$AQBKlgSEXkqJK#TJiZ{2%&7063QV| z+4F%yuDDC_!PG^T1WFGV{t)w+7j&yCDvQ>ll^seBRe&RhE=bMeY&4x)jXct~i}br9 zOXzpQg+H`P)T`n3;3_=5*H-y!lWKQ@IX<41J9o-NZ{XwUefz3$neD2~0X}OXFa45! z;10G+#F1JSJ*#vsC3f7<`PbHxWUD$U$wpd|k&tAUs?1JRnH{P!!$XlaCf_$oPyXz~ z+($&vLII`@MM*LLImwUm`ZDkNWL_QfUX;8j8unw}3rV>C%zMq`;c1t#C(S%PD-l)W z7R-CZ`0?osmb>7wVksXhmg01DU~Nf=r%OHEXKtDQZ^hg)|KFOqWszzd$u)H4<6W{C zQGAN?{^4mh@$NE1oIx=hfli)ZTO273SWOP`(bcxASi?0U!C?6)!Yty%5;btn>L29VvlLEt7 zxV+Tewnwf%t_o9K`WS?>QNt6nq@BB^YJMZdz=dU{7epB_aEW3x@!?7I< z84k9v$H_)yvaNR8!9b(I!g-)N15@A_W3)Ckw~ecBZA;{1%yCc*vxllu&L?U!;rtJs z+J6Tp1x~h&{(C`lE8&&q)WZS%zYP2r2LAI19-U|f_#cc$-y4m-Ga7wsG_q}UKJ(k> zO=)hO+E(9|k2ADwbZmJGQ*~N`f{lux3DBQ_mB5$iqpDreM|IJuQ)N<5r?8Q>BouTL zM2wQQjeewc@w}PMO)=GN8$D0CBs~;<-5xINvX0@iwn=LZzuw^Ih&_9Bzz?y$0zY&M z<@{_1A$vhfV*`pJ2cQsD%HAkaY<<^itDo7FpW1ksz(ty^3*@#q)s4lTK&}I_Em9)X z#!VaHZdy@FgzL%_oo!t4aA#{*JlxsJ6%V(!jKti$15OCcm1x@dnyl57pC8j4W*=tQ zY-iXEHEae)Y!I6|bT354%B&D&;#M$C4g7X7)w**;A1yi#8W{`$phC4Gv{d2<%HxbC zV~r+bj3%QDC;I(p*J@1azlXt^WUwY0tlcB|#?xxCHq?#?L|PMsRunZL!G4C;zM7Uj zEu!&@NEhtWR4$OLlx09-2e{U}`nHC-qZY&E<6`gMf!MQ3#hx8fD3Lv1u1-T` zbr2go81`6W*ri%@_ZY2`D!5gQz3OPU3!=MHN4Xw*1LsKNWQRgU-74EEs@M_=SgPUz zQ!uG{R#Nx*9q4{UsqTy5rzLU5b`Jl4D!URWDT^cA-T$%69=KUuLQt`P@z$)c9#7-7 zvcZ6IiJ(Sf)?s&ccVu@5XJ$F{#S9<_2y%IVqJV(+88ycHjN*+b-Wuw;I}L8`i| z|7&KFmwj)x=CAsyy1J{n`uO*OX)iV)XB7^}^pXRDi_U!N;9S3hvy09m%+q;V0_#~Q zfuLk9r1;~i#FzWYaFL$wndFqAsT?dOoYsyU=gUkbD3C0HjwQR&ndzZznk1`BHNtQ32ku%76m&M80#~bH z!y)r4()yz9!sy-ZTf4P{wVMmA-B`-n!@ji#ie~M7CX3=O-%~1U?<(QdorPZAQNkF8hk?=1NeiPxJr__0te8%bUTzsZ(v}2n(wH z@#(Q8_N%`nSNc(tb>zwp#NVFywdBe#$dww+7u#t*@8bj~gi0r}P2i%h17XRAH;r6W zIcnb$_qW0+=`R=64r@!NbIFXZpnkY805JRm$+w-!x1Gqh0U_UZjQR%EXE%`QRnF5c z;V~eRRl7JWtC+zuj#b|}z|njC22I5fqJuT%^}gkOOIY5!&@$(Hsv(GYu)70EG2B3>XA99@qF-rhf2r--UuZr1 zbFF88M*L5S|1scku6?BStbdZ74~c%D@y`2%|A*$=ZxMY{`)9vF^4F=I*GT_WqOXvh zmkGDoQFYCJ(NUW&`vpgBy6jD4_j$6rk?_xv-DgSujHcGp+OG8!-~=4upVT<#32Ju( zwfi{Pd4%*ICi)Py^B~C|(E8SWAjfgJSL3XEh~7qver>0LwotBHRV>8&Tdbwt-{YF|lo4N&xNH9fB) zdWELeTtN7R znlBa*|9s-lC;mL*&!u+GBl#SX&nEe~B%ej?&ZOrVMDwKgXVN=|^v)*vS)@0e=rrO_ zCA}%6*F$Tf<0 zidAU$4~{-P7D_rD)(ywj5!t4WL?+_raSlrt8Ho`p9HSDc@YMwuCm2T~{-kw;#po7hTY9PuI~?5~)tS+`(96kLl@Dw^V+2P9?VsA~hzufcXlO!RNxZ#`((+0fiW) z3=|pEu}Uy1G0k5ced8@Aa1ah0t-`@PNiS8&Y_1_P4C8%%gng`H59@A?a3?veHIaku zx}So7QYo0!k%9~yg%<&Zt)B_zQeCmb>}k}Wq8hE*WC?qxhx%LC+V6v;A055-;G(-o za3g(8g*Gbw#OP2KBe-_OitUfNXa@V~Ojn|_gy$#v<2^pvH92B&0(N;SL@>lvI~?5Q zsGW{a9ry;fq16ukcHo=-u6W$O-(k6^{c49hf7gRrGEUB;B}cB>Rn56*=G|hc?7Z{8 zjK8e`MF++=?^c&pm&4`Mfv(zd+6QQAH4q)5sWaGB2McF^R~;;zdRHAR%6_fo?tVn~ zCH$V6+ItXxcdhU4ruE%HTHo1~@E%b~_+5w&B>v7schc0}QB!LGJ^zYmf8zH83X8MY z9@@pjUaf9d)R4SdQ&B~)l&j-$Q$0++?8q#c-V%>&&@Y?q}n?)ySMU4r_KR3>{|REkza6bd>mM@ zkwM>KY|yS6o4&kOfE5>>b3iNmme;^vNHCiTRt7x8mK!X5N1WEP>aefae*pJZ*6aRP zf*jsmLSQbFUADg6;%q40D#z|OAkAArnC?upkku?f;UO% zTevTMp&jhYcE*4Bj=1<3#Pw=PZ+l;l*TVmQ!B7|NBOYI{))B6s!TB=5jE(+AHo9m& zn!Hwfg7LU}3(~Qq40^8OIl$P4yfkrXWFUj*oj|7I^jmm7QO61A2Giw4#b{@E#vE#% zjN9-mGkFWV4b8!OLWMa$^W-kl&9F1 ziV?(1n(wu|7IPHe^I~63%ycX)wkz;4)`JWlz9ZJyiN_t^ZyFmW_xB_ldl@}{UIg~{ z3CVQZf|)$q&&VoxjYMB@jL2`(UbIb%?N4nEHo7!75f`7E4TL?wU@Isu0UP8!X9p4P zV1sjcEkHsT#ttFOp$1d5?lz4~L97#NW`xyY(?o*rRjr|3My4FH4M zh?N}k$kYp{m-s%`yrA*Yuzebq47|iu1gQK|OTOW*-gilZ#EH(`In2*O8d_RtVIHhU`V$CPevDt9a z84=ULHip6n^C6lOHam`VMjD*~ycX68e~zGU_(A<3M;tbq^u`!H$|Y#p z<)@j40amc_gq>ipCO@I$K|eV=iEt+y9E~OR&G;MOEp`gwPc?YI&IY-Dnvsz$obSbK zHIuE=4c@mE%*BaDwokE|-2`_UDL5}dGSN3vk6VpiXbu3Yw=#bn)0r=!hw#UC>c$$g z9-leGj2}X`20FWuFBHGQugW%qZ74!%H-Wt?XG7uAMl((It^z&WhnVLYqZitl?BMI^ zoeAE8^jEwrtAt+nf#%zRXMXl#rmwMH`=b|Bl$03-ioVHM3C3{MoCI>58Jz|XgL?BF#u0BOutJ#1e2y;*b~xw*+B7Rx9xynTGkk1$4OTLn z1r=zPk%jw@{=p}(WwF_0Yfc;wIBYlCw#DWWeqIs0naN@M=M#Q`!Bc+V;UK_qb^+lQ z1vu4TwVFa-ml!^b1NsE&{+KNb$#9IyAm7w#NU>ZBa%>M{Z`#H0WnkrEkm1fr!n4{r z;SLv`F-G`YMLR3RD>>KlOGyqU6yC@i3BS_Ft*Cr>3_mz#AO0)Lh&?C>>UoW^SFWE0 zJ=fI4@VNTcT6I{J&|f>Rj#a&7bxvN+mNVr-d8u3_?~xD6_vJ@2KMOEctsIo=nN_~J z{Oj^>%JXstz-G%ia;}^w=Yzr`xmYfd%jAXfVtI*NE?0nw%j8Nhvqr9!>*RWQmApn? zE3cE+%Nyj4@+NtUyj9*NZ`L=vVzAN7YH$RXcf~z0PPvmFvbNQwGN^X%`&@}b^X7T;y#?MvZ;`jyTk0+IF7z()F7cLoE4<6R z%e^bSRo-gvN^h;V&Rg$o*VvNonp~f1?K5o_+qMk`gf+G$6S?}qgEntRxE{tIOmvHH zR^P+F6b9Zt;twwU7T;sGdIZ`)EPE_CF1sGuF^^IfDhl>9I DCr0lU diff --git a/programs/system/kerpack/trunk/memset.asm b/programs/system/kerpack/trunk/memset.asm deleted file mode 100644 index 1774128c90..0000000000 --- a/programs/system/kerpack/trunk/memset.asm +++ /dev/null @@ -1,11 +0,0 @@ -format MS COFF -section '.text' code readable executable -public _memset -_memset: - push edi - mov edi, [esp+8] - mov al, [esp+12] - mov ecx, [esp+16] - rep stosb - pop edi - ret