Added sources of 'kerpack', 'MyKey', '@notify', 'spanel', 'test'.

git-svn-id: svn://kolibrios.org@1815 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Yogev Ezra 2011-01-30 15:54:21 +00:00
parent b2ba8d7766
commit 7920032ceb
23 changed files with 4179 additions and 0 deletions

View File

@ -0,0 +1,149 @@
include 'proc32.inc'
macro start_draw_window x,y,xsize,ysize,areacolor,caption,capsize
{
;pusha
mov eax, 12 ; function 12:tell os about windowdraw
mov ebx, 1 ; 1, start of draw
int 0x40
; DRAW WINDOW
mov eax, 0 ; function 0 : define and draw window
mov ebx, x*65536+xsize ; [x start] *65536 + [x size]
mov ecx, y*65536+ysize ; [y start] *65536 + [y size]
mov edx, areacolor ; color of work area RRGGBB
mov esi, 0x00334455 ; color of grab bar RRGGBB
mov edi, 0x00ddeeff ; color of frames RRGGBB
int 0x40
; 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 edx, caption ; pointer to text beginning
mov esi, capsize ; text length
int 0x40
;popa
}
macro end_draw_window
{
mov eax, 12 ; end of redraw
mov ebx, 2
int 0x40
}
macro change_window_place_size x,y,xsize,ysize
{
mov eax, 67 ; function 67 : replace and/or resize window
mov ebx, x
mov ecx, y
mov edx, xsize
mov esi, ysize
int 0x40
}
proc draw_button stdcall, x:dword, y:dword, xsize:dword, ysize:dword, \
id:dword, butcolor:dword, text:dword, textlen:byte, textcolor:dword
pusha
mov ebx, dword [x]
shl ebx, 16
add ebx, dword [xsize] ; [x start] *65536 + [x size]
mov ecx, dword [y]
shl ecx, 16
add ecx, dword [ysize] ; [y start] *65536 + [y size]
mov edx, dword [id] ; button id
mov esi, dword [butcolor] ; button color RRGGBB
mov eax, 8 ; function 8 : define and draw button
int 0x40
mov ebx, dword [x]
add ebx, 5
shl ebx, 16
mov eax, dword [ysize]
sub eax, 5
shr eax, 1
add ebx, eax
add ebx, dword [y] ;mov ebx, (x+5)*65536+y+(ysize-5)/2 ; Draw button text
mov ecx, dword [textcolor]
mov edx, dword [text]
xor eax, eax
mov al, byte [textlen]
mov esi, eax
mov eax, 4
int 0x40
popa
ret
endp
;macro outtextxy x,y,prompt,prompt_len,color
;{
proc outtextxy stdcall, x:dword, y:dword, prompt:dword, prompt_len:dword, color:dword
pusha
mov eax, 4
mov ebx, dword [x] ; draw info text with function 4
shl ebx, 16
or ebx, dword [y]
mov ecx, dword [color]
mov edx, dword [prompt]
mov esi, dword [prompt_len]
int 0x40
popa
ret
endp
;}
;proc bar x:dword, y:dword, xsize:dword, ysize:dword, color:dword
macro bar x, y, xsize, ysize, color
{
pusha
mov eax, 13
;mov ebx, [x]
;shl ebx, 16
;add ebx, [xsize]
;mov ecx, [y]
;shl ecx, 16
;add ecx, [ysize]
;mov edx, [color]
mov ebx, x*65536+xsize
mov ecx, y*65536+ysize
mov edx, color
int 0x40
popa
;ret
;endp
}
macro line x1,y1,x2,y2,color
{
pusha
mov eax, 38
mov ebx, x1*65536+x2
mov ecx, y1*65536+y2
mov edx, color
int 0x40
popa
}
macro rectangle x,y,xsize,ysize,color
{
x2=x+xsize
y2=y+ysize
line x,y,x2,y,color
line x,y,x,y2,color
line x,y2,x2,y2,color
line x2,y,x2,y2,color
}
macro putpixel x,y,color
{
mov eax, 1
mov ebx, x
mov ecx, y
mov edx, color
int 0x40
}

View File

@ -0,0 +1,697 @@
;
; MyKey. Version 0.1.
;
; Author: Asper
; Date of issue: 04.12.2009
; Compiler: FASM
; Target: KolibriOS
;
use32
org 0x0
db 'MENUET00' ; 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
include "aspAPI.inc"
include 'macros.inc'
include 'editbox_ex.mac'
include 'load_lib.mac'
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
C_TEXTCOLOR equ 0x80000000 ; Button caption color
CA_TEXTCOLOR equ 0x80FFFFFF ; Active button caption color
WIN_X equ 265
WIN_Y equ 50;175
WIN_W equ 595
WIN_H equ 415 ;570
WIN_COLOR equ 0x04EEEEEE
BUT_W equ 192;100
BUT_H equ 23
BUT_SPACE equ 0
MAX_HOTKEYS_NUM equ 15 ; Bad bounding :/. Until we have normal listbox control.
PATH_MAX_CHARS equ 255
@use_library
STARTAPP:
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
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
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
; @@:
call draw_window
still:
call reset_modifiers
mov eax, 10 ; Wait for an event in the queue.
int 0x40
cmp al,1 ; redraw request ?
jz red
cmp al,2 ; key in buffer ?
jz key
cmp al,3 ; button in buffer ?
jz button
cmp al,6
jz mouse
jmp still
key:
mov eax, 2
int 0x40
push eax
mcall 66, 3
mov edx, eax
and edx, 0x00000FFF
mov dword [modifiers], edx
pop eax
test word [edit1.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬
jnz .editbox_input
test word [edit2.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬
jz @f
.editbox_input:
cmp ah, 0x80 ;if key up
ja still
cmp ah, 42 ;LShift
je still
cmp ah, 54 ;RShift
je still
cmp ah, 56 ;Alt
je still
cmp ah, 29 ;Ctrl
je still
cmp ah, 69 ;Pause/Break
je still
; cmp [keyUpr],0
; jne still
call Scan2ASCII
push dword edit1
call [edit_box_key]
push dword edit2
call [edit_box_key]
jmp still
@@:
;------------------------
mov cl, byte [hotkeys_num]
.test_next_hotkey:
dec cl
mov bl, cl
and ebx, 0xFF
shl ebx, 5
mov esi, ebx
add ebx, dword Hotkeys.codes
cmp ah, byte [ebx]
jne @f
mov edx, dword [ebx]
shr edx, 8
cmp edx, dword [modifiers]
jne @f
push eax
mov eax, PATH_MAX_CHARS
mul cl
mov edx, eax
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:
;------------------------
jmp still
button:
mov eax, 17 ; Get pressed button code
int 0x40
cmp ah, 1 ; Test x button
je close_app
cmp ah, 2
jne @f
call AddHotKey
jmp red
@@:
cmp ah, 5 ; Test if pressed buttons
jb still ; is a HotKey button...
mov al, ah
sub al, 5
cmp al, byte [hotkeys_num]
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
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
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
mov esi, ebx
call strlen
mov dword [edit2.size], ecx
mov dword [edit2.pos], ecx
jmp red ;still
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
draw_window:
start_draw_window WIN_X,WIN_Y,WIN_W,WIN_H,WIN_COLOR,labelt, 11;labellen-labelt
push dword edit1
call [edit_box_draw]
push dword edit2
call [edit_box_draw]
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
mov edx, ebx
sub edx, 5
shl edx, 5; edx=edx*32
add edx, dword Hotkeys
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:
add eax, BUT_H+BUT_SPACE
inc ebx
dec cl
jmp @b
@@:
end_draw_window
ret
AddHotKey:
mov al, byte [hotkeys_num]
cmp al, MAX_HOTKEYS_NUM
jge .end
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
.end:
ret
reset_modifiers:
pusha
mov esi, dword [it_hotkey_addr]
test esi, esi
jz .end_set_mods
lodsd
mov cl, al ; set new hotkey
shr eax, 8
xor edx, edx
push cx
mov cl, 3
.next_pair:
shl edx, 4
mov bl, al
and bl, 3
or bl, bl
jz .l1
cmp bl, 3 ; both?
jne @f
or dl, 2
jmp .l1
@@:
add bl, 2
or dl, bl
.l1:
shr eax, 2
dec cl
test cl, cl
jnz .next_pair
mov bx, dx
and bx, 0xF0F
xchg bl, bh
and dx, 0x0F0
or dx, bx
pop cx
mcall 66, 4
.end_set_mods:
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
mov dword [it_hotkey_addr], 0
it_set_editbox:
mov al, byte [hotkeys_num]
sub al, 1
and eax, 0xFF
shl eax, 5
add eax, dword Hotkeys.names
mov dword [it_edit.text], eax
mov esi, eax
call strlen
mov dword [it_edit.size], ecx
mov dword [it_edit.pos], ecx
it_set_event_mask:
mcall 40, 39
it_red:
call it_draw_window
it_still:
mov eax, 10 ; Wait for an event in the queue.
int 0x40
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
cmp al,6
jz it_mouse
jmp it_still
it_key:
mov eax, 2
int 0x40
mov byte [it_keycode], 0
stdcall outtextxy, 10, 100, ctrl_key_names, 35, 0
cmp ah, 0x80 ;if key up
ja .end
cmp ah, 42 ;[Shift] (left)
je .end
cmp ah, 54 ;[Shift] (right)
je .end
cmp ah, 56 ;[Alt]
je .end
cmp ah, 29 ;[Ctrl]
je .end
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
call Scan2ASCII
test word [it_edit.flags], 10b;ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬
jz .end
push dword it_edit
call [edit_box_key]
jmp it_still
.end:
call it_test_key_modifiers
mov al, byte [it_keycode]
test al, al
jz @f
shl edx, 8
mov dl, al
mov eax, dword [it_hotkey_addr]
test eax, eax
jnz @f
mov al, byte [hotkeys_num]
sub al, 1
and eax, 0xFF
shl eax, 5
add eax, dword Hotkeys.codes
mov dword [eax], edx
mov dword [it_hotkey_addr], eax
mov cl, dl ; finally set hotkey
shr edx, 8
mcall 66, 4
@@:
jmp it_still
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
.rshift:
test al, 2 ; RShift ?
jz .lctrl
stdcall outtextxy, 184, 100, ctrl_key_names+29, 6, 0x00FF0000
.lctrl:
test al, 4 ; LCtrl ?
jz .rctrl
stdcall outtextxy, 52, 100, ctrl_key_names+7, 5, 0x00FF0000
.rctrl:
test al, 8 ; RCtrl ?
jz .lalt
stdcall outtextxy, 148, 100, ctrl_key_names+23, 5, 0x00FF0000
.lalt:
test al, 0x10 ; LAlt ?
jz .ralt
stdcall outtextxy, 88, 100, ctrl_key_names+13, 4, 0x00FF0000
.ralt:
test al, 0x20 ; RAlt ?
jz @f
stdcall outtextxy, 118, 100, ctrl_key_names+18, 4, 0x00FF0000
@@:
pop eax
ret
it_mouse:
push dword it_edit
call [edit_box_mouse]
jmp it_still
it_draw_window:
start_draw_window WIN_X,WIN_Y+250,225,70,WIN_COLOR,it_labelt, 26;labellen-labelt
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
ret
;######################## Input Thread code end ##########################
Scan2ASCII:
push esi
mov esi, ascii_keymap
shr eax, 8
add esi, eax
lodsb
shl eax, 8
pop esi
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 *
;* edx = pointer to the parametrs *
;********************************************
RunProgram:
pusha
mov dword [InfoStructure], 7 ; run program
mov dword [InfoStructure+4], 0 ; flags
mov dword [InfoStructure+8], edx ; pointer to the parametrs
mov dword [InfoStructure+12], 0 ; reserved
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
cmp eax, 0
jl .err_out
.out:
popa
clc
ret
.err_out:
print "Can't load program"
popa
stc
ret
; DATA AREA
; Application Title
labelt db 'MyKey v.0.1'
;mykey_window dd 0 ; Slot number of MyKey
;########### Input Thread data start ############
; Input Thread Title
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_keycode db 0
it_hotkey_addr dd 0
;########### Input Thread data end ############
;Button names
AddKeyText db 'Add',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
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!!!
sys_path:
system_dir0 db '/sys/lib/'
boxlib_name db 'box_lib.obj',0
err_message_found_lib db "Can't find box_lib.obj",0
head_f_i:
head_f_l db 'System error',0
err_message_import db 'Error on import box_lib.obj',0
align 4
myimport:
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
version_ed dd aVersion_ed
dd 0,0
aEdit_box_draw db 'edit_box',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
aVersion_ed db 'version_ed',0
;] Data structures for loadlib.mac and editbox_ex.mac
InfoStructure:
dd 0x0 ; subfunction number
dd 0x0 ; position in the file in bytes
dd 0x0 ; upper part of the position address
dd 0x0 ; number of bytes to read
dd 0x0 ; pointer to the buffer to write data
db 0
dd 0 ; pointer to the filename
I_END: ; End of application code and data marker
rb 300 ;input thread stack size
input_thread_stack_top:
ascii_keymap:
db 128 dup(?)
ctrl_key_names db 'LShift LCtrl LAlt RAlt RCtrl RShift',0
Hotkeys: ;(name = 32 b) + (modifiers = 3 b) + (keycode = 1 b) = 36 byte 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
rb MAX_HOTKEYS_NUM*32-3
.codes:
dd MAX_HOTKEYS_NUM dup (0)

View File

@ -0,0 +1,51 @@
==Î ïðîãðàììå MyKey==
MyKey - ïðåäíàçíà÷åíà äëÿ áûñòðîãî çàïóñêà ïðîãðàìì íàæàòèåì ñî÷åòàíèé êëàâèø íà êëàâèàòóðå.
Äëÿ òîãî ÷òîáû äîáàâèòü íîâóþ ãîðÿ÷óþ êëàâèøó:
1. Íàæìèòå êíîïêó "Add"
2.  ïîÿâèâøåìñÿ äèàëîãîâîì îêíå ââåäèòå êëàâèøó èëè ñî÷åòàíèå êëàâèøè
ñ ìîäèôèêàòîðàìè Ctrl, Alt, Shift.
3. Ââåäèòå íàçâàíèå êëàâèøè.
4. Ïîñëå ýòîãî çàêðîéòå äèàëîãîâîå îêíî è â îñíîâíîì îêíå âûäåëèòå
äîáàâëåííóþ êíîïêó.
5. Â âåðõíåå òåêñòîâîå ïîëå ââåäèòå ïóòü è èìÿ ïðîãðàììû,
â íèæíåå - ïåðåäàâàåìûå åé ïàðàìåòðû.
Íåîáõîäèìî ñäåëàòü:
a. Çàãðóçêà è ñîõðàíåíèå êîíôèãóðàöèîííîãî ôàéëà.
b. Óäàëåíèå ãîðÿ÷èõ êëàâèø.
c. Èçìåíåíèå óæå óñòàíîâëåííûõ ãîðÿ÷èõ êëàâèø.
Íîìåð âåðñèè: 0.1
==Àâòîð==
Asper
==About program MyKey==
MyKey - is intended to fast load applications by pressing key combinations
on the keyboard.
To add a new hotkey:
1. Press "Add" button.
2. In the appeared dialog window input a new key or a key combination
with Ctrl, Alt, Shift modifiers.
3. Input key name.
4. After that close the dialog window and in the main window select
added button.
5. In the upper text field input path and name of the program to be executed,
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.
Version number: 0.1
==Author==
Asper
mailto: asper.85@mail.ru

View File

@ -0,0 +1 @@
__CPU_type fix p5

View File

@ -0,0 +1,162 @@
;include 'kinc/imports.inc'
macro debug_print str
{
local ..string, ..label
jmp ..label
..string db str,0
..label:
pushf
pushad
;mov edx,..string
mov esi, ..string
;call debug_outstr
call SysMsgBoardStr
popad
popf
}
dps fix debug_print
macro debug_print_dec arg
{
pushf
pushad
if ~arg eq eax
mov eax,arg
end if
call debug_outdec
popad
popf
}
dpd fix debug_print_dec
;---------------------------------
debug_outdec: ;(eax - num, edi-str)
push 10 ;2
pop ecx ;1
push -'0' ;2
.l0:
xor edx,edx ;2
div ecx ;2
push edx ;1
test eax,eax ;2
jnz .l0 ;2
.l1:
pop eax ;1
add al,'0' ;2
call debug_outchar ; stosb
jnz .l1 ;2
ret ;1
;---------------------------------
debug_outchar: ; al - char
pushf
pushad
;mov cl,al
;mov eax,63
;mov ebx,1
;int 0x40
mov bl, al
mov eax, 1
call SysMsgBoardChar
popad
popf
ret
;debug_outstr:
; mov eax,63
; mov ebx,1
; @@:
; mov cl,[edx]
; test cl,cl
; jz @f
; int 40h
; inc edx
; jmp @b
; @@:
; ret
macro newline
{
dps <13,10>
}
macro print message
{
dps message
newline
}
macro pregs
{
dps "EAX: "
dpd eax
dps " EBX: "
dpd ebx
newline
dps "ECX: "
dpd ecx
dps " EDX: "
dpd edx
newline
}
macro debug_print_hex arg
{
pushf
pushad
if ~arg eq eax
mov eax, arg
end if
call debug_outhex
popad
popf
}
dph fix debug_print_hex
debug_outhex:
; eax - number
pushf
pushad
mov edx, 8
.new_char:
rol eax, 4
movzx ecx, al
and cl, 0x0f
mov cl, [__hexdigits + ecx]
pushad
mcall 63, 1
popad
dec edx
jnz .new_char
popad
popf
ret
SysMsgBoardChar:
mov cl, al
mov eax, 63
mov ebx, 1
int 0x40
ret
SysMsgBoardStr:
push eax
@@:
lodsb
or al, al
jz @f
call SysMsgBoardChar
jmp @b
@@:
pop eax
ret
__hexdigits:
db '0123456789ABCDEF'

View File

@ -0,0 +1,79 @@
ed_struc_size=72
struc edit_box width,left,top,color,shift_color,focus_border_color,\
blur_border_color,text_color,max,text,mouse_variable,flags,size,pos
{
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Bit mask from editbox
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ed_figure_only= 1000000000000000b ;®¤­¨ ᨬ¢®«ë
ed_always_focus= 100000000000000b
ed_focus= 10b ;䮪ãá ¯à¨«®¦¥­¨ï
ed_shift_on= 1000b ;¥á«¨ ­¥ ãáâ ­®¢«¥­ -§­ ç¨â ¢¯¥à¢ë¥ ­ ¦ â shift,¥á«¨ ¡ë« ãáâ ­®¢«¥­, §­ ç¨â ¬ë 㦥 çâ® - â® ¤¥« «¨ 㤥ন¢ ï shift
ed_shift_on_off=1111111111110111b
ed_shift= 100b ;¢ª«îç ¥âáï ¯à¨ ­ ¦ â¨¨ ­  shift â.¥. ¥á«¨ ­ ¦¨¬ î
ed_shift_off= 1111111111111011b
ed_shift_bac= 10000b ;¡¨â ¤«ï ®ç¨á⪨ ¢ë¤¥«¥­®£® shift â.¥. ¯à¨ ãáâ ­®¢ª¥ £®¢®à¨â çâ® ¥áâì ¢ë¤¥«¥­¨¥
ed_shift_bac_cl=1111111111101111b ;®ç¨á⪠ ¯à¨ 㤠«¥­¨¨ ¢ë¤¥«¥­¨ï
ed_shift_cl= 1111111111100011b
ed_shift_mcl= 1111111111111011b
ed_left_fl= 100000b
ed_right_fl= 1111111111011111b
ed_offset_fl= 1000000b
ed_offset_cl= 1111111110111111b
ed_insert= 10000000b
ed_insert_cl= 1111111101111111b
ed_mouse_on = 100000000b
ed_mous_adn_b= 100011000b
ed_mouse_on_off=1111111011111111b
ed_height=14 ; ¢ëá®â 
.width dd width
.left dd left
.top dd top
.color dd color
.shift_color dd shift_color
.focus_border_color dd focus_border_color
.blur_border_color dd blur_border_color
.text_color dd text_color
.max dd max
.text dd text
.mouse_variable dd mouse_variable
.flags dd flags+0
.size dd size+0
.pos dd pos+0
.offset dd 0
.cl_curs_x dd 0
.cl_curs_y dd 0
.shift dd 0
.shift_old dd 0
}
struc check_box left,top,ch_text_margin,ch_size,color,border_color,text_color,text,ch_text_length,flags
{ ;áâàãªâãà  ¯ à ¬¥â஢ ¤«ï 祪 ¡®ªá 
ch_flag_en=10b
.left: dw left ;+0 ;¯®«®¦¥­¨¥ ¯® å
.top: dw top ;¯®«®¦¥­¨¥ ¯® ã
.ch_text_margin: dd ch_text_margin ;à ááâ®ï­¨¥ ®â ¯àאַ㣮«ì­¨ª  祪 ¡®ªá  ¤® ­ ¤¯¨á¨
.ch_size: dd ch_size ;à §¬¥à ª¢ ¤à â  祪 ¡®ªá , ¤«ï ¯à¨¬¥à  12
.color: dd color ;梥⠢­ãâਠ祪¡®ªá 
.border_color: dd border_color ;梥â à ¬ª¨
.text_color: dd text_color ;梥⠭ ¤¯¨á¨
.text: dd text ; ¤à¥á ¢ ª®¤¥ ¯à®£à ¬¬ë £¤¥ à á¯®«®¦¥­ ⥪áâ
.ch_text_length: dd ch_text_length ;¤«¨­­  áâப¨ á ᨬ¢®« ¬¨
.flags: dd flags+0 ; ä« £¨
}
struc option_box point_gr,left,top,op_text_margin,op_size,color,border_color,text_color,text,op_text_length,flags
{ ;áâàãªâãà  ¯ à ¬¥â஢ ¤«ï 祪 ¡®ªá 
op_flag_en=10b
.option_group: dd point_gr
.left: dw left ;+0 ;¯®«®¦¥­¨¥ ¯® å
.top: dw top ;¯®«®¦¥­¨¥ ¯® ã
.ch_text_margin: dd op_text_margin ;à ááâ®ï­¨¥ ®â ¯àאַ㣮«ì­¨ª  祪 ¡®ªá  ¤® ­ ¤¯¨á¨
.ch_size: dd op_size ;à §¬¥à ª¢ ¤à â  祪 ¡®ªá , ¤«ï ¯à¨¬¥à  12
.color: dd color ;梥⠢­ãâਠ祪¡®ªá 
.border_color: dd border_color ;梥â à ¬ª¨
.text_color: dd text_color ;梥⠭ ¤¯¨á¨
.text: dd text ; ¤à¥á ¢ ª®¤¥ ¯à®£à ¬¬ë £¤¥ à á¯®«®¦¥­ ⥪áâ
.ch_text_length: dd op_text_length ;¤«¨­­  áâப¨ á ᨬ¢®« ¬¨
.flags: dd flags+0 ; ä« £¨
}

View File

@ -0,0 +1,634 @@
;08.05.2009 - bugfix
;14.04.2009 - a macros for code load library the box_lib.obj from '/sys/lib/' or current dirrectory.
; The macros for load any library/libraries:
; Copyright (c) 2009, <Lrz>
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; * Neither the name of the <organization> nor the
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
; This macros based on source code:
; <Lrz> - Alexey Teplov / Àëåêñåé Òåïëîâ
; Mario79, Mario - Marat Zakiyanov / Ìàðàò Çàêèÿíîâ
; Diamondz - Evgeny Grechnikov / Åâãåíèé Ãðå÷íèêîâ
;------------------------
; DESCRIPTION
; Macro load_library
; Logick of work.
; A first time we must to check system path, where I belive find a system library. System path is "/sys/lib/".
; If I cannot found my library, i must to check second way. Second way is current dirrectory.
; If we cannot load library, we must show the error message:
; "I'm sorry,the programm cannot found system library box_lib.obj."
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
;
;
;---------------------------------------------------------------------
; Macro sys_load_library
; A first time we must to check own path in current dirrectory the program, where I belive find a system library.
; If I cannot found my library, i must to check second way. Second way is system path a "/sys/lib/".
; If we cannot load library, we must show the error message:
; "I'm sorry,the programm cannot found system library box_lib.obj."
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
;
;---------------------------------------------------------------------
; How can I use it?
;---------------------------------------------------------------------
;-Example using single load library
;-universal load library/librarys
;load_library library_name__, cur_dir_path__, library_path__, system_path__, \
;err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__
;-if return code =-1 then exit, else normally work
; cmp eax,-1
; jz exit
;- Well, if you get
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA äàííûå
;Âñåãäà ñîáëþäàòü ïîñëåäîâàòåëüíîñòü â èìåíè.
;system_path__ db '/sys/lib/'
;library_name__ db 'box_lib.obj',0
; Åñëè åñòü æåëàíèå ðàçúåäèíèòü, òî íóæíî èñïîëüçîâàòü ñëåäóþùèþ êîíñòðóêöèþ
;system_path__ db '/sys/lib/box_lib.obj',0
;... ëþáàÿ ïîñëåäîâàòåëüíîñòü äðóãèõ êîìàíä è îïðåäåëåíèé.
;library_name__ db 'box_lib.obj',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;err_message_found_lib__ db 'Sorry I cannot found library box_lib.obj',0
;head_f_i__:
;head_f_l__ db 'System error',0
;err_message_import__ db 'Error on load import library box_lib.obj',0
;myimport:
;
;edit_box_draw dd aEdit_box_draw
;edit_box_key dd aEdit_box_key
;edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
;
;check_box_draw dd aCheck_box_draw
;check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
;
;option_box_draw dd aOption_box_draw
;option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
; dd 0
; dd 0
;
;aEdit_box_draw db 'edit_box',0
;aEdit_box_key db 'edit_box_key',0
;aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
;aCheck_box_draw db 'check_box_draw',0
;aCheck_box_mouse db 'check_box_mouse',0
;aVersion_ch db 'version_ch',0
;aOption_box_draw db 'option_box_draw',0
;aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
;---------------------------------------------------------------------
macro @use_library
{
local __sc
local lp
local lp1
local correction
;local end_tr
local exit_
;/equ
err_message1 equ dword [esp+8]
head1 equ dword [esp+4]
__sc.frame equ dword [__sc+0]
__sc.grab equ dword [__sc+4]
__sc.grab_button equ dword [__sc+8]
__sc.grab_button_text equ dword [__sc+12]
__sc.grab_text equ dword [__sc+16]
__sc.work equ dword [__sc+20]
__sc.work_button equ dword [__sc+24]
__sc.work_button_text equ dword [__sc+28]
__sc.work_text equ dword [__sc+32]
__sc.work_graph equ dword [__sc+36]
;;;;;;;;;;;CALC WIDTH & HIGHT WINDOW & CENTER MONITOR POSITION;;;;;;;;;;
show_err_:
;check memory
push dword [arrea_xx]
pop eax
test eax,eax
jnz @f
mcall 68,11
mcall 68,12,4096
push eax
pop dword [arrea_xx]
push head1
pop dword[eax]
push 0x0
pop dword[eax+4]
@@:
mov eax,48 ;get system color
mov ebx,3
mov ecx,__sc
mov edx,sizeof.system_colors
mcall
;-----------------------------------
xor eax,eax
mov esi,err_message1
mov ecx,30
align 4
lp: add ecx,7
lodsb
test eax,eax
jnz lp
push dword [arrea_xx]
pop ebp
align 4
@@: add ebp,4
mov eax,dword [ebp]
test eax,eax
jnz @b
push err_message1
pop dword[ebp]
mov dword [ebp+4],eax
mcall 48,5 ;get system window
cmp word[on_x],cx
jae @f; íå íóæíî îáíîâëÿòü
sub eax,ecx
shl eax,15
mov ax,cx
mov dword [on_x],eax
@@:
add word [on_y],12
sub bx,word [on_y]
shl ebx,15
mov bx,word [on_y]
mov dword [on_y],ebx
ret
;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;;
align 4
start__:
mcall 40,0x5 ;set mask on events rewraw window and get id button.
.red_win:
;draw_window:
mcall 12,1
xor eax,eax
mov ebp,dword [arrea_xx] ; set point
mov ebx,dword [on_x]
mov ecx,dword [on_y]
mov edx,__sc.work
or edx,0x33000000
mov esi,__sc.grab_text
xor edi,edi
mov edi,dword [ebp] ;head1
mcall
mov ebx,(10*65536+25-12)
add ebp,4 ;inc index
@@:
mov eax,4
add bx,12
mov ecx,__sc.grab_text
or ecx,0x90000000
mov edx,dword [ebp] ;err_message1
mcall
add ebp,4 ;inc index
mov eax,dword [ebp]
test eax,eax
jnz @b
mcall 12,2
align 4
.still: ;main loop
mcall 10 ;wait event
dec eax
jz .red_win
sub eax,2
jnz .still ;go to main loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.button:
mcall 17 ;get id button
test ah,ah ;if in ah 0, then go to still
jz .still
mcall -1
ret
align 4
__sc system_colors
on_x dd 0x0
on_y dd 0x0000004E
arrea_xx dd 0x0
rb 0x50
end_tr:
;---------------------------------------------------------------------
@library_name equ dword [esp+12]
@cur_dir_path equ dword [esp+8]
@library_path equ dword [esp+4]
align 4
@copy_path:
mov ebx,@library_name
mov esi,@cur_dir_path
mov edi,@library_path
xor eax,eax
cld
.lp1:
lodsb
stosb
test eax,eax
jnz .lp1
mov esi,edi
std
.lp2:
lodsb
cmp al,'/'
jnz .lp2
mov edi,esi
mov esi,ebx
add edi,2
cld
.lp3:
lodsb
stosb
test eax,eax
jnz .lp3
;---------------------------------------------------------------------
ret
}
macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__
{
local end_steep
local exit
;---------------------------------------------------------------------
; loading Box_Lib library
mcall 68,19,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path__ ; load of alternative
test eax,eax
jnz end_steep
show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp exit
align 4
end_steep:
import_boxlib myimport, err_message_import__, head_f_i__ ;import
exit:
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
@@:
;---------------------------------------------------------------------
}
macro load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__
{
local end_steep
local exit
;---------------------------------------------------------------------
; loading Box_Lib library
copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path__ ; load of alternative
test eax,eax
jnz end_steep
mcall 68,19,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp exit
align 4
end_steep:
import_boxlib myimport, err_message_import__, head_f_i__ ;import
exit:
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
@@:
;---------------------------------------------------------------------
}
macro sys_load_libraries _start,_end
{
local exit_lp2
local lp2
local lp
local end_steep
local next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name__ equ [ebp]
cur_dir_path__ equ [ebp+4]
library_path__ equ [ebp+8]
system_path__ equ [ebp+12]
err_message_found_lib__ equ [ebp+16]
head_f_l__ equ [ebp+20]
my_import equ [ebp+24]
err_message_import__ equ [ebp+28]
head_f_i__ equ [ebp+32]
adr_load_lib equ dword [ebp+36]
status_lib equ dword [ebp+40]
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp: push ecx
mcall 68,19,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path__ ; load of alternative
test eax,eax
jnz end_steep
or status_lib,0x1 ; status of code - enable error - not found library
show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp next
align 4
end_steep:
mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import, err_message_import__, head_f_i__ ;import
test eax,eax
jz next
or status_lib,0x2 ; status of code - enable error - import error
next:
pop ecx
add ebp,ll_struc_size
dec ecx
jnz lp
;----------------------------------
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp2:
mov eax,status_lib
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
jmp exit_lp2
@@:
add ebp,ll_struc_size
dec ecx
jnz lp2
exit_lp2:
}
macro load_libraries _start,_end
{
local lp2
local exit_lp2
local lp
local end_steep
local next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name__ equ [ebp]
cur_dir_path__ equ [ebp+4]
library_path__ equ [ebp+8]
system_path__ equ [ebp+12]
err_message_found_lib__ equ [ebp+16]
head_f_l__ equ [ebp+20]
my_import equ [ebp+24]
err_message_import__ equ [ebp+28]
head_f_i__ equ [ebp+32]
adr_load_lib equ dword [ebp+36]
status_lib equ dword [ebp+40]
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp: push ecx
copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path__ ; load of alternative
test eax,eax
jnz end_steep
mcall 68,19,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
or status_lib,0x1 ; status of code - enable error - not found library
show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp next
align 4
end_steep:
mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import, err_message_import__, head_f_i__ ;import
test eax,eax
jz next
or status_lib,0x2 ; status of code - enable error - import error
next:
pop ecx
add ebp,ll_struc_size
dec ecx
jnz lp
;-----------------------------------------------
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp2:
mov eax,status_lib
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
jmp exit_lp2
@@:
add ebp,ll_struc_size
dec ecx
jnz lp2
exit_lp2:
}
macro copy_path lib_name,dir_path,lib_path
{
pushad ;save all registers
push dword lib_name
push dword dir_path
push dword lib_path
call @copy_path
add esp,12
popad ;restore all registers
}
macro show_error_window err_message, head
{ pushad ;save all registers
push dword err_message
push dword head
call show_err_
add esp,8
popad ;restore all registers
or eax,-1 ;óâû
}
macro import_boxlib myimport, err_message_import__, head_f_i__
{
local import_loop
local import_find
local lp
local import_find_next
local import_found
local import_done
local exit
local e.exit
local import_not_found
; initialize import
mov edx, eax
mov esi,myimport
import_loop:
lodsd
test eax, eax
jz import_done
push edx
import_find:
mov ebx, [ds:edx]
test ebx, ebx
jz import_not_found
push eax
lp:
mov cl, [ds:eax]
cmp cl, [ds:ebx]
jnz import_find_next
test cl, cl
jz import_found
inc eax
inc ebx
jmp lp
import_find_next:
pop eax
add edx, 8
jmp import_find
import_found:
pop eax
mov eax, [ds:edx+4]
mov [esi-4], eax
pop edx
jmp import_loop
import_not_found:
add esp,4
show_error_window err_message_import__, head_f_i__ ;show error message /create window
jmp e.exit
import_done:
xor eax,eax
e.exit:
;---------------------------------------------------------------------
}
ll_struc_size = 44;($-library_name__) ; constant size of struct
struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, my_import, err_message_import__, head_f_i__; struct for loading libraries
{
.library_name__ dd library_name__ ; èìÿ çàãðóæàåìîé áèáëèîòåêè
.cur_dir_path__ dd cur_dir_path__ ; óêàçàòåëü íà áóôåð â êîòîðîì ñîäåðæèòüñÿ ïóòü îò êóäà áûëà çàïóùåíà ïðîãðàììà
.library_path__ dd library_path__ ; óêàçàòåëü íà áóôåð â êîòîðîì áóäåò ñîôîðèìèðîâàí ïóòü ê áèáëèîòåêè, åñëè íóæíî âû÷èñëèòü ïóòü äî ëèáû ñ ìåñòà çàïóñêà ïðîãðàììû, îáû÷íî íóæíî, â ñëó÷àÿõ, åñëè ëèáà ðàñïîëîæåíà â òîé æå ïàïêå
.complete_path dd system_path__ ; ïóòü êîòîðûé ÷åòêî ñîäåðæèò ïóòü
.err_message_found_lib__ dd err_message_found_lib__
.head_f_l__ dd head_f_l__
.my_import dd my_import
.err_message_import__ dd err_message_import__
.head_f_i__ dd head_f_i__
.adr_load_lib dd 0x0
.status_lib dd 0x0 ;status of load library
;
}

View File

@ -0,0 +1,543 @@
@^ fix macro comment {
^@ fix }
; -------------------------
macro library [lname,fname]
{
forward
dd __#lname#_library_table__,__#lname#_library_name__
common
dd 0
forward
align 4
__#lname#_library_name__ db fname,0
}
macro import lname,[name,sname]
{
common
align 4
__#lname#_library_table__:
forward
if used name
name dd __#name#_import_name__
end if
common
dd 0
forward
if used name
align 4
__#name#_import_name__ db sname,0
end if
}
macro export [name,sname]
{
forward
dd __#name#_export_name__,name
common
dd 0
forward
align 4
__#name#_export_name__ db sname,0
}
; -------------------------
macro m2m dest,src {
push src
pop dest
}
macro iglobal {
IGlobals equ IGlobals,
macro __IGlobalBlock { }
macro uglobal {
UGlobals equ UGlobals,
macro __UGlobalBlock { }
endg fix } ; Use endg for ending iglobal and uglobal blocks.
macro IncludeIGlobals{
macro IGlobals dummy,[n] \{ __IGlobalBlock
purge __IGlobalBlock \}
match I, IGlobals \{ I \} }
macro IncludeUGlobals{
macro UGlobals dummy,[n] \{
\common
\local begin, size
begin = $
virtual at $
\forward
__UGlobalBlock
purge __UGlobalBlock
\common
size = $ - begin
end virtual
rb size
\}
match U, UGlobals \{ U \} }
uglobal
endg
iglobal
endg
; new application structure
macro meos_app_start
{
use32
org 0x0
db 'MENUET01'
dd 0x01
dd __start
dd __end
dd __memory
dd __stack
if used __params & ~defined __params
dd __params
else
dd 0x0
end if
dd 0x0
}
MEOS_APP_START fix meos_app_start
macro code
{
__start:
}
CODE fix code
macro data
{
__data:
IncludeIGlobals
}
DATA fix data
macro udata
{
if used __params & ~defined __params
__params:
db 0
__end:
rb 255
else
__end:
end if
__udata:
IncludeUGlobals
}
UDATA fix udata
macro meos_app_end
{
align 32
rb 2048
__stack:
__memory:
}
MEOS_APP_END fix meos_app_end
; macro for defining multiline text data
struc mstr [sstring]
{
forward
local ssize
virtual at 0
db sstring
ssize = $
end virtual
dd ssize
db sstring
common
dd -1
}
; macro for defining multiline text data
struc mls [sstring]
{
forward
local ssize
virtual at 0
db sstring ; mod
ssize = $
end virtual
db ssize
db sstring
common
db -1 ; mod
}
; strings
macro sz name,[data] { ; from MFAR [mike.dld]
common
if used name
name db data
.size = $-name
end if
}
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
common
if used name
label name
forward
if lang eq lng
db data
end if
common
.size = $-name
end if
}
macro szc name,elsz,[data] { ; from MFAR [mike.dld]
common
local s,m
m = 0
if used name
label name
forward
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
common
.size = $-name
.maxl = m
end if
}
macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld]
common
local s,m,c
m = 0
c = 0
if used name
label name
forward
if lang eq lng
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
c = c+1
end if
common
.size = $-name
.maxl = m
.count = c
end if
}
; easy system call macro
macro mpack dest, hsrc, lsrc
{
if (hsrc eqtype 0) & (lsrc eqtype 0)
mov dest, (hsrc) shl 16 + lsrc
else
if (hsrc eqtype 0) & (~lsrc eqtype 0)
mov dest, (hsrc) shl 16
add dest, lsrc
else
mov dest, hsrc
shl dest, 16
add dest, lsrc
end if
end if
}
macro __mov reg,a,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b eq)
mov reg,a
end if
}
include 'config.inc'
;__CPU_type equ p5
SYSENTER_VAR equ 0
macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls
local ..ret_point
__mov eax,a
__mov ebx,b
__mov ecx,c
__mov edx,d
__mov esi,e
__mov edi,f
if __CPU_type eq p5
int 0x40
else
if __CPU_type eq p6
push ebp
mov ebp, esp
push ..ret_point ; it may be 2 or 5 byte
sysenter
..ret_point:
pop edx
pop ecx
else
if __CPU_type eq k6
push ecx
syscall
pop ecx
else
display 'ERROR : unknown CPU type (set to p5)', 10, 13
__CPU_type equ p5
int 0x40
end if
end if
end if
}
; -------------------------
macro header a,[b] {
common
use32
org 0
db 'MENUET',a
forward
if b eq
dd 0
else
dd b
end if }
macro section name { align 16
label name }
macro func name {
if ~used name
display 'FUNC NOT USED: ',`name,13,10
else
align 4
name:
;diff16 `name,0,name
;pushad
;pushfd
;dps `name
;newline
;mcall 5,1
;popfd
;popad
}
macro endf { end if }
macro diff16 title,l1,l2
{
local s,d
s = l2-l1
display title,': 0x'
repeat 8
d = '0' + s shr ((8-%) shl 2) and $0F
if d > '9'
d = d + 'A'-'9'-1
end if
display d
end repeat
display 13,10
}
macro diff10 title,l1,l2
{
local s,d,z,m
s = l2-l1
z = 0
m = 1000000000
display title,': '
repeat 10
d = '0' + s / m
s = s - (s/m)*m
m = m / 10
if d <> '0'
z = 1
end if
if z <> 0
display d
end if
end repeat
display 13,10
}
; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
macro add arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
inc arg1
else
add arg1,arg2
end if
else
add arg1,arg2
end if
}
macro sub arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
dec arg1
else
sub arg1,arg2
end if
else
sub arg1,arg2
end if
}
macro mov arg1,arg2
{
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
if (arg2) = 0
xor arg1,arg1
else if (arg2) = 1
xor arg1,arg1
inc arg1
else if (arg2) = -1
or arg1,-1
else if (arg2) > -128 & (arg2) < 128
push arg2
pop arg1
else
mov arg1,arg2
end if
else
mov arg1,arg2
end if
}
macro RGB [a] {
common
match (r=,g=,b),a \{
\dd ((r) shl 16) or ((g) shl 8) or (b)
\}
}
struc POINT _t,_dx,_dy {
.x _t _dx
.y _t _dy
}
; structure definition helper
include 'struct.inc'
struct RECT
left dd ?
top dd ?
right dd ?
bottom dd ?
ends
struct BOX
left dd ?
top dd ?
width dd ?
height dd ?
ends
; structures used in MeOS
struct process_information
cpu_usage dd ? ; +0
window_stack_position dw ? ; +4
window_stack_value dw ? ; +6
dw ? ; +8
process_name rb 12 ; +10
memory_start dd ? ; +22
used_memory dd ? ; +26
PID dd ? ; +30
box BOX ; +34
slot_state dw ? ; +50
dw ? ; +52
client_box BOX ; +54
wnd_state db ? ; +70
rb (1024-71)
ends
struct system_colors
frame dd ?
grab dd ?
grab_button dd ?
grab_button_text dd ?
grab_text dd ?
work dd ?
work_button dd ?
work_button_text dd ?
work_text dd ?
work_graph dd ?
ends
struct FILEDATE
Second db ?
Minute db ?
Hour db ?
db ?
Day db ?
Month db ?
Year dw ?
ends
struct FILEINFO
Attributes dd ?
IsUnicode db ?
db 3 dup(?)
DateCreate FILEDATE
DateAccess FILEDATE
DateModify FILEDATE
Size dq ?
ends
; constants
; events
EV_IDLE = 0
EV_TIMER = 0
EV_REDRAW = 1
EV_KEY = 2
EV_BUTTON = 3
EV_EXIT = 4
EV_BACKGROUND = 5
EV_MOUSE = 6
EV_IPC = 7
EV_STACK = 8
; event mask bits for function 40
EVM_REDRAW = 1b
EVM_KEY = 10b
EVM_BUTTON = 100b
EVM_EXIT = 1000b
EVM_BACKGROUND = 10000b
EVM_MOUSE = 100000b
EVM_IPC = 1000000b
EVM_STACK = 10000000b

View File

@ -0,0 +1,268 @@
; Macroinstructions for defining and calling procedures
macro stdcall proc,[arg] ; directly call STDCALL procedure
{ common
if ~ arg eq
reverse
pushd arg
common
end if
call proc }
macro invoke proc,[arg] ; indirectly call STDCALL procedure
{ common
if ~ arg eq
reverse
pushd arg
common
end if
call [proc] }
macro ccall proc,[arg] ; directly call CDECL procedure
{ common
size@ccall = 0
if ~ arg eq
reverse
pushd arg
size@ccall = size@ccall+4
common
end if
call proc
if size@ccall
add esp,size@ccall
end if }
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
{ common
size@ccall = 0
if ~ arg eq
reverse
pushd arg
size@ccall = size@ccall+4
common
end if
call [proc]
if size@ccall
add esp,size@ccall
end if }
macro proc [args] ; define procedure
{ common
match name params, args>
\{ define@proc name,<params \} }
prologue@proc equ prologuedef
macro prologuedef procname,flag,parmbytes,localbytes,reglist
{ if parmbytes | localbytes
push ebp
mov ebp,esp
if localbytes
sub esp,localbytes
end if
end if
irps reg, reglist \{ push reg \} }
epilogue@proc equ epiloguedef
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
{ irps reg, reglist \{ reverse pop reg \}
if parmbytes | localbytes
leave
end if
if flag and 10000b
retn
else
retn parmbytes
end if }
macro define@proc name,statement
{ local params,flag,regs,parmbytes,localbytes,current
if used name
name:
match =stdcall args, statement \{ params equ args
flag = 11b \}
match =stdcall, statement \{ params equ
flag = 11b \}
match =c args, statement \{ params equ args
flag = 10001b \}
match =c, statement \{ params equ
flag = 10001b \}
match =params, params \{ params equ statement
flag = 0 \}
virtual at ebp+8
match =uses reglist=,args, params \{ regs equ reglist
params equ args \}
match =regs =uses reglist, regs params \{ regs equ reglist
params equ \}
match =regs, regs \{ regs equ \}
match =,args, params \{ defargs@proc args \}
match =args@proc args, args@proc params \{ defargs@proc args \}
parmbytes = $ - (ebp+8)
end virtual
name # % = parmbytes/4
all@vars equ
current = 0
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
macro locals
\{ virtual at ebp-localbytes+current
macro label . \\{ deflocal@proc .,:, \\}
struc db [val] \\{ \common deflocal@proc .,db,val \\}
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
macro endl
\{ purge label
restruc db,dw,dp,dd,dt,dq
restruc rb,rw,rp,rd,rt,rq
restruc byte,word,dword,pword,tword,qword
current = $-(ebp-localbytes)
end virtual \}
macro ret operand
\{ match any, operand \\{ retn operand \\}
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
end if \} }
macro defargs@proc [arg]
{ common
if ~ arg eq
forward
local ..arg,current@arg
match argname:type, arg
\{ current@arg equ argname
label ..arg type
argname equ ..arg
if dqword eq type
dd ?,?,?,?
else if tbyte eq type
dd ?,?,?
else if qword eq type | pword eq type
dd ?,?
else
dd ?
end if \}
match =current@arg,current@arg
\{ current@arg equ arg
arg equ ..arg
..arg dd ? \}
common
args@proc equ current@arg
forward
restore current@arg
common
end if }
macro deflocal@proc name,def,[val]
{ common
match vars, all@vars \{ all@vars equ all@vars, \}
all@vars equ all@vars name
forward
local ..var,..tmp
..var def val
match =?, val \{ ..tmp equ \}
match any =dup (=?), val \{ ..tmp equ \}
match tmp : value, ..tmp : val
\{ tmp: end virtual
initlocal@proc ..var,def value
virtual at tmp\}
common
match first rest, ..var, \{ name equ first \} }
macro initlocal@proc name,def
{ virtual at name
def
size@initlocal = $ - name
end virtual
position@initlocal = 0
while size@initlocal > position@initlocal
virtual at name
def
if size@initlocal - position@initlocal < 2
current@initlocal = 1
load byte@initlocal byte from name+position@initlocal
else if size@initlocal - position@initlocal < 4
current@initlocal = 2
load word@initlocal word from name+position@initlocal
else
current@initlocal = 4
load dword@initlocal dword from name+position@initlocal
end if
end virtual
if current@initlocal = 1
mov byte [name+position@initlocal],byte@initlocal
else if current@initlocal = 2
mov word [name+position@initlocal],word@initlocal
else
mov dword [name+position@initlocal],dword@initlocal
end if
position@initlocal = position@initlocal + current@initlocal
end while }
macro endp
{ purge ret,locals,endl
finish@proc
purge finish@proc
restore regs@proc
match all,args@proc \{ restore all \}
restore args@proc
match all,all@vars \{ restore all \} }
macro local [var]
{ common
locals
forward done@local equ
match varname[count]:vartype, var
\{ match =BYTE, vartype \\{ varname rb count
restore done@local \\}
match =WORD, vartype \\{ varname rw count
restore done@local \\}
match =DWORD, vartype \\{ varname rd count
restore done@local \\}
match =PWORD, vartype \\{ varname rp count
restore done@local \\}
match =QWORD, vartype \\{ varname rq count
restore done@local \\}
match =TBYTE, vartype \\{ varname rt count
restore done@local \\}
match =DQWORD, vartype \\{ label varname dqword
rq count+count
restore done@local \\}
match , done@local \\{ virtual
varname vartype
end virtual
rb count*sizeof.\#vartype
restore done@local \\} \}
match :varname:vartype, done@local:var
\{ match =BYTE, vartype \\{ varname db ?
restore done@local \\}
match =WORD, vartype \\{ varname dw ?
restore done@local \\}
match =DWORD, vartype \\{ varname dd ?
restore done@local \\}
match =PWORD, vartype \\{ varname dp ?
restore done@local \\}
match =QWORD, vartype \\{ varname dq ?
restore done@local \\}
match =TBYTE, vartype \\{ varname dt ?
restore done@local \\}
match =DQWORD, vartype \\{ label varname dqword
dq ?,?
restore done@local \\}
match , done@local \\{ varname vartype
restore done@local \\} \}
match ,done@local
\{ var
restore done@local \}
common
endl }

View File

@ -0,0 +1,180 @@
; Macroinstructions for defining data structures
macro struct name
{ fields@struct equ name
match child parent, name \{ fields@struct equ child,fields@\#parent \}
sub@struct equ
struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
macro db [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,db,<val> \}
macro dw [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dw,<val> \}
macro du [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,du,<val> \}
macro dd [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dd,<val> \}
macro dp [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dp,<val> \}
macro dq [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dq,<val> \}
macro dt [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dt,<val> \}
macro rb count \{ \local anonymous
fields@struct equ fields@struct,anonymous,db,count dup (?) \}
macro rw count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
macro rd count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
macro rp count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
macro rq count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
macro rt count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
macro union \{ fields@struct equ fields@struct,,union,<
sub@struct equ union \}
macro struct \{ fields@struct equ fields@struct,,substruct,<
sub@struct equ substruct \}
virtual at 0 }
macro ends
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
restruc rb,rw,rd,rp,rq,rt
purge db,dw,du,dd,dp,dq,dt
purge rb,rw,rd,rp,rq,rt
purge union,struct
match name=,fields,fields@struct \\{ fields@struct equ
make@struct name,fields
fields@\\#name equ fields \\}
end virtual \}
match any, sub@struct \{ fields@struct equ fields@struct> \}
restore sub@struct }
macro make@struct name,[field,type,def]
{ common
if $
display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
err
end if
local define
define equ name
forward
local sub
match , field \{ make@substruct type,name,sub def
define equ define,.,sub, \}
match any, field \{ define equ define,.#field,type,<def> \}
common
match fields, define \{ define@struct fields \} }
macro define@struct name,[field,type,def]
{ common
local list
list equ
forward
if ~ field eq .
name#field type def
sizeof.#name#field = $ - name#field
else
rb sizeof.#type
end if
local value
match any, list \{ list equ list, \}
list equ list <value>
common
sizeof.#name = $
restruc name
match values, list \{
struc name value \\{
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
match , fields@struct \\\{ label .
forward
match , value \\\\{ field type def \\\\}
match any, value \\\\{ field type value
if ~ field eq .
rb sizeof.#name#field - ($-field)
end if \\\\}
common \\\} \\} \} }
macro enable@substruct
{ macro make@substruct substruct,parent,name,[field,type,def]
\{ \common
\local define
define equ parent,name
\forward
\local sub
match , field \\{ match any, type \\\{ enable@substruct
make@substruct type,name,sub def
purge make@substruct
define equ define,.,sub, \\\} \\}
match any, field \\{ define equ define,.\#field,type,<def> \\}
\common
match fields, define \\{ define@\#substruct fields \\} \} }
enable@substruct
macro define@union parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
virtual at 0
parent#field type def
sizeof.#parent#field = $ - parent#field
end virtual
if sizeof.#parent#field > $
rb sizeof.#parent#field - $
end if
else if sizeof.#type > $
rb sizeof.#type - $
end if
common
sizeof.#name = $
end virtual
struc name [value] \{ \common
label .\#name
last@union equ
forward
match any, last@union \\{ virtual at .\#name
field type def
end virtual \\}
match , last@union \\{ match , value \\\{ field type def \\\}
match any, value \\\{ field type value \\\} \\}
last@union equ field
common rb sizeof.#name - ($ - .\#name) \} }
macro define@substruct parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
parent#field type def
sizeof.#parent#field = $ - parent#field
else
rb sizeof.#type
end if
local value
common
sizeof.#name = $
end virtual
struc name value \{
label .\#name
forward
match , value \\{ field type def \\}
match any, value \\{ field type value
if ~ field eq .
rb sizeof.#parent#field - ($-field)
end if \\}
common \} }

View File

@ -0,0 +1,32 @@
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

View File

@ -0,0 +1,68 @@
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

View File

@ -0,0 +1,232 @@
; 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:

View File

@ -0,0 +1,7 @@
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

View File

@ -0,0 +1,404 @@
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

Binary file not shown.

View File

@ -0,0 +1,11 @@
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

View File

@ -0,0 +1,149 @@
;
; @notify, pop-up windows
; by Sourcerer, 20.01.2011
;
;---------------------------------------------------------------------
use32 ; включить 32-битный режим ассемблера
org 0x0 ; адресация с нуля
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка
dd I_PARAM ; адрес буфера для параметров
dd 0x0 ; зарезервировано
include 'macros.inc' ;
;---------------------------------------------------------------------
;--- НАЧАЛО ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
START:
red: ; перерисовать окно
call draw_window ; вызываем процедуру отрисовки окна
;---------------------------------------------------------------------
;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ----------------------------------------
;---------------------------------------------------------------------
still: ; main cycle
mov eax, 23
mov ebx, 500
mcall
cmp eax, 0
je exit
cmp eax, 1
je red
cmp eax, 2
je key
cmp eax, 3
je button
button: ; button event handler
mov al, 17 ; get button identifier
mcall
cmp ah, 1
jne still ; return if button id != 1
or eax, -1 ; exit application
mcall
key: ; key event handler
mov al, 2 ; get key code
mcall
jmp still
exit:
mcall -1
;---------------------------------------------------------------------
;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ----------------------------------
;---------------------------------------------------------------------
draw_window:
mcall 12, 1 ; функция 12: сообщить ОС об отрисовке окна
mov eax,14 ;получим ширину экрана
mov ebx, 4
mcall
shr eax, 16
and eax,0x0000FFFF
sub eax,300 ;отнимем от нее 300
shl eax, 16 ;и превратим в координаты окна по оси X
add eax,300
mov ebx, eax
mov eax, 0 ;и выведем это окно
mov ecx, 30 ;высотой 25 пикс
mov edx, 0x41000000 ;черного цвета и без заголовка
mov esi, 0x01000000
mcall
;вывод сеточки
mov eax, 1 ;функция вывода точки
mov edx, 0 ;черного цвета
mov ecx, 30 ;высота окна - 30 пкс
mov esi, 0 ;счетчик сдвига сетки
drawx: ;рисование линии
sub ecx, 1 ;уменьшаем счетчик линий
cmp ecx, 0 ;закончились линии?
je fin ;значит, хватит рисовать
mov ebx, 300 ;иначе - у нас ширина сетки 300 пкс
cmp esi,1 ;имелся ли сдвиг сетки в прошлой линии?
je sw;если да, то перейдем к sw
mov esi,1 ;иначе - сдвиг был выключен, включим сдвиг
jmp drawy ;перейдем к рисованию
sw:
mov esi,0 ;выключаем сдвиг сетки
drawy: ;рисование
sub ebx, 2 ;ставить точки будем через одну
cmp ebx, 0 ;дорисовали ли мы линию?
je drawx ;если да, то переходим к новой
sub ebx, esi ;применяем сдвиг
mcall ;рисуем
add ebx, esi ;возвращаем счетчик на место
jmp drawy ;рисуем новую точку
fin: ;дорисовали
mcall 4, <3, 12>, 0x80000000, I_PARAM, 0 ;тень за текстом
mcall 4, <5, 12>, 0x80000000, I_PARAM, 0 ;
mcall 4, <4, 11>, 0x80000000, I_PARAM, 0 ;
mcall 4, <4, 13>, 0x80000000, I_PARAM, 0 ;
mcall 4, <4, 12>, 0x80EFEFEF, I_PARAM, 0 ;текст
mcall 12, 2 ; конец рисования
ret ; выходим из процедуры
;---------------------------------------------------------------------
;--- ДАННЫЕ ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
I_PARAM rb 256
I_END: ; метка конца программы

View File

@ -0,0 +1,45 @@
#include "..\lib\kolibri.h--"
#include "..\lib\memory.h--"
// Kolibri Notify Daemon. v0.1 by SoUrcerer
dword id;
void main()
{
word key;
id=GetScreenWidth();
loop()
{
switch(WaitEvent())
{
case evButton:
id=GetButtonID();
ExitProcess();
break;
case evKey:
key = GetKey();
ExitProcess();
break;
case evReDraw:
draw_window();
break;
}
Pause (500);
ExitProcess();
}
}
void draw_window()
{
WindowRedrawStatus(1);
DefineAndDrawWindow(id-300,0,300,44,0x30000000,0x1012141F,0,0,"Kolibri Notify");
// DefineButton(0,300,0,96,0x30000001,0x0) ;
WriteText(7,7,0x80,0xFFFFFF,"Kolibri Notify",0);
WriteText(7,25,0x80,0xEFEFEF,I_Param,0);
WindowRedrawStatus(2);
}
stop:

View File

@ -0,0 +1 @@
fasm spanel.asm spanel

View File

@ -0,0 +1,265 @@
;
; PANEL SETUP
;
; Compile with FASM for Menuet
;
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x8000 ; memory for app
dd 0x8000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
include '..\..\macros.inc'
START: ; start of execution
call draw_window
still:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
je red
cmp eax,2 ; key in buffer ?
je key
cmp eax,3 ; button in buffer ?
je button
jmp still
red: ; redraw
call draw_window
jmp still
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
shr eax,8
cmp eax,'0'
jb still
cmp eax,'9'
jg still
mov edi,[ent]
add edi,text
mov esi,edi
inc esi
mov ecx,3
cld
rep movsb
mov [edi],al
call draw_window
jmp still
button: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose
mov eax,-1 ; close this program
int 0x40
noclose:
cmp ah,10
jne no_apply
mov esi,text+17
mov edi,I_END+10
mov ecx,12
newfe:
mov ebx,[esi]
mov [edi],ebx
mov [edi+4],byte ';'
add edi,5
add esi,55
loop newfe
mov [edi],byte 'x'
mov eax,70
mov ebx,dat_write
int 0x40
mov esi,1
newread:
inc esi
mov eax,9
mov ebx,I_END
mov ecx,esi
int 0x40
cmp esi,eax
jg all_terminated
mov eax,[ebx+10]
and eax,not 0x20202000
cmp eax,'@PAN'
jne newread
mov eax,[ebx+14]
and eax,not 0x2020
cmp eax,'EL '
jne newread
mov eax,18
mov ebx,2
mov ecx,esi
int 0x40
mov eax,5
mov ebx,5
int 0x40
mov esi,1
jmp newread
all_terminated:
mov eax,5
mov ebx,25
int 0x40
mov eax, 70
mov ebx, panel_start
int 0x40
no_apply:
cmp ah,11
jb no_entry
shr eax,8
sub eax,11
imul eax,55
add eax,17
mov [ent],eax
mov [text+eax],dword '0000'
call draw_window
jmp still
no_entry:
jmp still
ent dd 17
panel_start:
dd 7
dd 0
dd 0
dd 0
dd 0
db '/RD/1/@PANEL',0
dat_write:
dd 2
dq 0
dd 5*12+1
dd I_END+10
db 'PANEL.DAT',0
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,100*65536+385 ; [x start] *65536 + [x size]
mov ecx,100*65536+190 ; [y start] *65536 + [y size]
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl
mov edi,0x005080d0 ; color of frames RRGGBB
int 0x40
; WINDOW LABEL
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x10ddeeff ; color of text RRGGBB
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
mov eax,8
mov ebx,25*65536+335 ;160
mov ecx,162*65536+12
mov edx,10
mov esi,0x80a0c0 ;0x6677cc
int 0x40
mov eax,8
mov ebx,340*65536+20
mov ecx,34*65536+10
mov edx,11
newb:
int 0x40
add ecx,10*65536
inc edx
cmp edx,23
jb newb
mov ebx,25*65536+35 ; draw info text with function 4
mov ecx,0x224466
mov edx,text
mov esi,55
newline:
mov eax,4
int 0x40
add ebx,10
add edx,55
cmp [edx],byte 'x'
jne newline
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
; DATA AREA
text:
db 'width 0000 : 0 for full screen width <'
db 'buttons 0000 : 0 no frames , 1 frames <'
db 'soften_up 0001 : 0 no , 1 yes <'
db 'soften_down 0001 : 0 no , 1 yes <'
db 'minimize_left 0001 : 0 no , 1 yes <'
db 'minimize_right 0001 : 0 no , 1 yes <'
db 'icons_position 0100 : position in pixels <'
db 'menu_enable 0001 : 0 no , 1 yes <'
db 'setup_enable 0001 : 0 no , 1 yes <'
db 'graph_text 0001 : 0 graphics , 1 text <'
db 'soften_middle 0001 : 0 no , 1 yes <'
db 'icons 0001 : 0 start , 1 activate <'
db ' '
db ' APPLY '
db 'x'
labelt:
db 'PANEL SETUP'
labellen:
I_END:

View File

@ -0,0 +1 @@
fasm test.asm test

View File

@ -0,0 +1,200 @@
;
; PROTECTION TEST
;
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x10000 ; memory for app
dd 0xfff0 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
include '..\..\macros.inc'
START: ; start of execution
call draw_window ; at first, draw the window
still:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
jz red
cmp eax,2 ; key in buffer ?
jz key
cmp eax,3 ; button in buffer ?
jz button
jmp still
red: ; redraw
call draw_window
jmp still
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp still
button: ; button
mov eax,17
int 0x40
cmp ah,1 ; button id=1 ?
jnz noclose
mov eax,0xffffffff ; close this program
int 0x40
noclose:
cmp ah,2
jnz notest2
cli
notest2:
cmp ah,3
jnz notest3
sti
notest3:
cmp ah,4
jnz notest4
mov [0x10000],byte 1
notest4:
cmp ah,5
jnz notest5
jmp dword 0x10000
notest5:
cmp ah,6
jnz notest6
mov esp,0
push eax
notest6:
cmp ah,7
jnz notest7
in al,0x60
notest7:
cmp ah,8
jnz notest8
out 0x60,al
notest8:
jmp still
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,100*65536+300 ; [x start] *65536 + [x size]
mov ecx,100*65536+240 ; [y start] *65536 + [y size]
mov edx,0x02ffffff ; color of work area RRGGBB
mov esi,0x80597799 ; color of grab bar RRGGBB,8->color glide
mov edi,0x00597799 ; color of frames RRGGBB
int 0x40
; 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 edx,tlabel ; pointer to text beginning
mov esi,labellen-tlabel ; text length
int 0x40
; CLOSE BUTTON
mov eax,8 ; function 8 : define and draw button
mov ebx,(300-19)*65536+12 ; [x start] *65536 + [x size]
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,1 ; button id
mov esi,0x5977bb ; button color RRGGBB
int 0x40
mov eax,8 ; function 8 : define and draw button
mov ebx,25*65536+9 ; [x start] *65536 + [x size]
mov ecx,74*65536+9 ; [y start] *65536 + [y size]
mov edx,2 ; button id
mov esi,0x5977bb ; button color RRGGBB
newb:
int 0x40
add ecx,20*65536
inc edx
cmp edx,9
jb newb
cld
mov ebx,25*65536+36 ; draw info text with function 4
mov ecx,0x000000
mov edx,text
mov esi,40
newline:
mov eax,4
int 0x40
add ebx,10
add edx,40
cmp [edx],byte 'x'
jnz newline
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
; DATA AREA
text:
db 'APPLICATION USES 0x10000 BYTES OF MEMORY'
db ' '
db 'OPEN DEBUG BOARD FOR PARAMETERS '
db ' '
db ' CLI '
db ' '
db ' STI '
db ' '
db ' MOV [0x10000],BYTE 1 '
db ' '
db ' JMP DWORD 0x10000 '
db ' '
db ' MOV ESP,0 & PUSH EAX '
db ' '
db ' IN Al,0x60 '
db ' '
db ' OUT 0x60,AL '
db 'x '
tlabel:
db 'MENUET PROTECTION TEST'
labellen:
I_END: