0,0 → 1,1706 |
; |
; Show Mini Sample by Pavlushin Evgeni for ASCL |
; www.waptap@mail.ru |
; |
|
;bits brushes(right mouse button)! |
;resize pucture(cross buttons)! |
;Open BMP MIA MHI grafic files! |
;Save as MIA MHI(zip from MHC -70% size)! |
;Support full files 800*600 |
;Open and save dialogs is work! |
|
; 27Ver Gif load support |
; 28Ver Dialogs is work |
|
;****************************************************************************** |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd IM_END ; size of image |
dd I_END ; memory for app |
dd I_END ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
|
;****************************************************************************** |
include 'lang.inc' |
include 'macros.inc' |
include 'ascl.inc' |
include 'ascgl.inc' |
|
hashtable equ MHC_END |
ifile equ MHC_END+65536*8 ;4 |
ofile equ (MHC_END+65536*8)+2000000 ;1000000 |
|
gif_hash_offset = ofile |
|
START: ; start of execution |
mov eax,40 |
mov ebx,0100111b |
int 0x40 |
|
; clear picture color White |
mov ecx,1024*768*3 |
mov eax,0xffffffff |
mov edi,image_area |
cld |
rep stosb |
|
call draw_window |
call setbrush |
|
rstill: |
mov eax,37 |
mov ebx,1 |
int 0x40 |
mov ebx,eax |
shr eax,16 ;x |
and ebx,0xffff ;y |
sub eax,5+6 |
sub ebx,22+30+6 |
|
cmp eax,640 ;for detect out of screen |
ja still |
cmp ebx,480 |
ja still |
mov [xt],ebx |
mov [yt],eax |
|
still: |
mov eax,40 |
mov ebx,0100111b |
int 0x40 |
|
wtevent red,key,button |
|
mov ebx,2 |
mov eax,37 |
int 0x40 |
cmp eax,1 |
je tescor ;if left button not pressed! |
cmp eax,2 |
je cbr ;if right button pressed! |
jmp rstill |
; jmp still |
|
cbr: |
cmp dword [brush],9 ;9 brush matrix |
jnae nocr |
mov [brush],-1 ;0 |
nocr: |
inc [brush] |
call setbrush |
jmp still |
|
;Set brush |
setbrush: |
mov eax,[brush] |
mov ebx,4*32 |
mul ebx |
|
mov ecx,4*32 |
mov esi,brushtable |
add esi,eax |
mov edi,matrix |
cld |
rep movsb |
|
delay 10 |
ret |
|
tescor: |
mov eax,37 |
mov ebx,1 |
int 0x40 |
mov ebx,eax |
shr eax,16 ;x |
and ebx,0xffff ;y |
|
sub eax,5+6 |
sub ebx,22+30+6 |
|
push eax |
push ebx |
|
mov ecx,eax ;[yt] |
mov edx,ebx ;[xt] |
|
mov eax,[xt] |
mov ebx,[yt] |
pop [xt] |
pop [yt] |
|
call line |
|
; mov [yt],eax |
; mov [xt],ebx |
call out_image |
|
jmp still |
|
red: |
call draw_window |
jmp still |
|
key: ; key |
int 0x40 ; read (eax=2) |
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 |
jb no_palbut |
cmp ah,10+32;64 |
ja no_palbut |
mov ecx,0 |
mov cl,ah |
sub cl,10 |
shl ecx,2 |
mov ebx,[colortable+ecx] |
mov [color],ebx |
|
;Update color boxes |
drawfbox 20,32,20,15,[backcolor] |
drawfbox 12,28,20,15,[color] |
|
jmp still |
no_palbut: |
|
cmp ah,6 |
jne no_left |
|
mov esi,0 |
mov edi,0 |
mov ebp,[img_ysize] |
x_pls: |
mov ecx,0 |
mov edx,[img_xsize] |
x_pl: |
mov al,[image_area+edi+ecx] |
mov [image_area+esi+ecx],al |
mov al,[image_area+edi+ecx+1] |
mov [image_area+esi+ecx+1],al |
mov al,[image_area+edi+ecx+2] |
mov [image_area+esi+ecx+2],al |
add ecx,3 |
dec edx |
jnz x_pl |
add edi,[img_xsize] |
add edi,[img_xsize] |
add edi,[img_xsize] |
add esi,[img_xsize] |
add esi,[img_xsize] |
add esi,[img_xsize] |
sub esi,3 |
dec ebp |
jns x_pls |
|
dec [img_xsize] |
jmp red |
no_left: |
|
|
cmp ah,7 |
jne no_right |
|
mov eax,[img_xsize] |
mul [img_ysize] |
mov ebx,3 |
mul ebx |
mov edi,eax |
|
mov eax,[img_xsize] |
inc eax |
mul [img_ysize] |
mov ebx,3 |
mul ebx |
mov esi,eax |
|
; mov esi,0 |
; mov edi,0 |
mov ebp,[img_ysize] |
x_mns: |
mov ecx,[img_xsize] ;0 |
add ecx,[img_xsize] |
add ecx,[img_xsize] |
mov edx,[img_xsize] |
x_mn: |
mov al,[image_area+edi+ecx] |
mov [image_area+esi+ecx],al |
mov al,[image_area+edi+ecx+1] |
mov [image_area+esi+ecx+1],al |
mov al,[image_area+edi+ecx+2] |
mov [image_area+esi+ecx+2],al |
sub ecx,3 |
dec edx |
jnz x_mn |
mov dword [image_area+esi+ecx+0],0xffffffff |
sub edi,[img_xsize] |
sub edi,[img_xsize] |
sub edi,[img_xsize] |
sub esi,[img_xsize] |
sub esi,[img_xsize] |
sub esi,[img_xsize] |
sub esi,3 |
dec ebp |
jns x_mns |
|
inc [img_xsize] |
jmp red |
no_right: |
|
cmp ah,8 |
jne no_up |
dec [img_ysize] |
jmp red |
no_up: |
|
cmp ah,9 |
jne no_down |
inc [img_ysize] |
jmp red |
no_down: |
|
;SAVE MIA |
cmp ah,80 |
jne no_save |
savedialog draw_window, mia_is_save, still, string |
mia_is_save: |
mov dword [fileinfo],1 ;write |
mov eax,[img_xsize] |
mul [img_ysize] |
mov edx,eax |
add edx,eax |
add edx,eax |
add edx,8 |
cmp edx,1024*768*3+20000 |
ja still |
mov dword [fileinfo+12],image ;from read |
mov dword [fileinfo+8],edx ;1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
; puttxt 20,4,string,40,cl_White |
jmp still |
no_save: |
|
;OPEN MIA |
cmp ah,81 |
jne no_open |
opendialog draw_window, mia_is_open, still, string |
mia_is_open: |
mov dword [fileinfo],0 ;read |
mov dword [fileinfo+12],image ;from read |
mov dword [fileinfo+8],1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,ebx |
shr eax,9 |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
; puttxt 20,4,string,40,cl_White |
jmp red |
no_open: |
|
cmp ah,82 |
jne no_save_mhc |
|
|
savedialog draw_window, mhi_is_save, still, string |
mhi_is_save: |
call fill_filebufs |
mov eax,[img_xsize] |
mul [img_ysize] |
mov edx,eax |
add edx,eax |
add edx,eax |
add edx,8 |
mov ecx,edx |
mov esi,image |
mov edi,ifile |
cld |
rep movsb |
mov eax,edx |
call compress |
cmp edx,1024*768*3+20000 |
ja still |
mov dword [fileinfo],1 ;write |
mov dword [fileinfo+12],ofile ;from read |
mov dword [fileinfo+8],edx ;1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
; puttxt 20,4,string,40,cl_White |
jmp still |
|
no_save_mhc: |
|
;OPEN MHI |
cmp ah,83 |
jne no_open_mhc |
|
opendialog draw_window, mhi_is_open, still, string |
mhi_is_open: |
|
call fill_filebufs |
|
mov dword [fileinfo],0 ;read |
mov dword [fileinfo+12],ofile ;ofile for decompress |
mov dword [fileinfo+8],1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
push ebx ;push file size |
mov eax,ebx |
shr eax,9 |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
|
; puttxt 20,4,string,40,cl_White |
; delay 100 |
pop eax ;pop file size |
call decompress |
|
mov ecx,edx |
mov esi,ifile ;image |
mov edi,image ;ifile |
cld |
rep movsb |
|
jmp red |
no_open_mhc: |
|
cmp ah,84 |
jne no_save_bmp |
jmp still |
no_save_bmp: |
|
cmp ah,85 |
jne no_open_bmp |
|
opendialog draw_window, bmp_is_open, still, string |
|
bmp_is_open: |
mov dword [fileinfo],0 ;read |
mov dword [fileinfo+12],MHC_END ;from read |
|
mov dword [fileinfo+8],1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,[MHC_END+2] |
shr eax,9 |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
|
; puttxt 20,4,string,40,cl_White |
bmptoimg MHC_END,image |
|
jmp red |
|
no_open_bmp: |
|
|
cmp ah,86 |
jne no_save_gif |
jmp still |
no_save_gif: |
|
cmp ah,87 |
jne no_open_gif |
|
opendialog draw_window, gif_is_open, still, string |
|
gif_is_open: |
mov dword [fileinfo],0 ;read |
mov dword [fileinfo+12],MHC_END ;from read |
|
mov dword [fileinfo+8],1 |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,[MHC_END+2] |
shr eax,9 |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
|
puttxt 20,4,string,40,cl_White |
giftoimg MHC_END,image |
|
jmp red |
|
no_open_gif: |
|
|
|
cmp ah,100 |
jne nor1 |
|
mov eax,[img_xsize] |
mul [img_ysize] |
mov edx,eax |
add edx,eax |
add edx,eax |
mov esi,image+8 |
norx: |
mov al,byte [esi+2] |
and al,01b ;10000000b |
cmp al,0 |
jna xe |
; mov al,255 |
mov byte [esi],0;255 |
mov byte [esi+1],0;0 |
mov byte [esi+2],255;0 |
jmp xa |
xe: |
mov byte [esi],255 |
mov byte [esi+1],255 |
mov byte [esi+2],255 |
xa: |
add esi,3 |
cmp esi,edx |
jnae norx |
jmp red |
nor1: |
|
jmp still |
|
fileinfo: |
dd 0 |
dd 0 |
dd 1 |
dd MHC_END |
dd out_image_area ;16384 |
string: |
times 256 db 0 |
;times 256 db 0 |
;times 256 db 0 |
|
;filename db "IMAGE MIA" |
;mhcfilename db "IMAGE MHI" |
|
soi dd 0 |
pxs dd 0 |
pys dd 0 |
|
out_image: |
mov eax,[prcinfo.x_size] |
sub eax,21 |
cmp eax,[img_xsize] ;640 |
jna no_x |
mov eax,[img_xsize] ;640 |
no_x: |
mov [pxs],eax |
mov eax,[prcinfo.y_size] |
sub eax,68 |
cmp eax,[img_ysize] ;480 |
jna no_y |
mov eax,[img_ysize] ;480 |
no_y: |
mov [pys],eax |
|
mov eax,[pxs] |
cmp eax,[img_xsize] ;640 |
jne trans |
mov eax,[pys] |
cmp eax,[img_ysize] ;480 |
jne trans |
|
mov eax,7 |
mov ebx,image_area |
mov ecx,[pxs] ;640 |
shl ecx,16 |
add ecx,[pys] ;480 |
mov edx,(5+6)*65536+(22+6+30) ;+30 Reserve for buttons |
int 0x40 |
ret |
|
trans: |
mov ebp,[pys]; 180 |
mov esi,image_area |
mov edi,out_image_area |
loox: |
mov ecx,[pxs] ;200*3 |
add ecx,[pxs] |
add ecx,[pxs] |
cld |
rep movsb |
mov eax,[img_xsize] ;640 |
sub eax,[pxs] |
add esi,eax |
add esi,eax |
add esi,eax |
|
dec ebp |
jnz loox |
|
mov eax,7 |
mov ebx,out_image_area |
mov ecx,[pxs] |
shl ecx,16 |
add ecx,[pys] |
|
mov edx,(5+6)*65536+(22+6+30) ;+30 Reserve for buttons |
int 0x40 |
ret |
|
|
;set put to massive |
puti: |
mov eax,edx |
mov ebx,ecx |
|
setput: |
pushad |
cmp eax,[img_xsize] ;640 |
jae nosetput |
cmp ebx,[img_ysize] ;480 |
jae nosetput |
mov edi,ebx |
mov ebx,3 ;x*3 |
mul ebx |
mov esi,eax |
mov eax,[img_xsize] ;640*3 ;Y*640*3 |
add eax,[img_xsize] |
add eax,[img_xsize] |
mov ebx,edi |
mul ebx |
add eax,esi |
|
mov ebp,[img_xsize] |
shl ebp,4 |
add ebp,16 |
mov esi,ebp |
add esi,ebp |
add esi,ebp |
|
sub eax,esi ;(16+640*16)*3 |
|
mov esi,0 |
mlix: |
push eax |
|
mov edi,[matrix+esi*4] |
mloo: |
shr edi,1 |
jnc nosp |
; cmp eax,640*480*3 ;for detect out of screen |
; jae nosp |
push eax |
mov eax,[img_xsize] |
mul [img_ysize] |
mov ebx,eax |
add ebx,eax |
add ebx,eax |
pop eax |
cmp eax,ebx |
jae nosp |
|
mov ebx,[color] |
mov byte [image_area+eax],bl ;0x00ff |
shr ebx,8 |
mov byte [image_area+eax+1],bl ;0x33 |
shr ebx,8 |
mov byte [image_area+eax+2],bl ;0x33 |
nosp: |
add eax,3 |
cmp edi,0 |
jne mloo |
|
pop eax |
add eax,[img_xsize] ;640*3 |
add eax,[img_xsize] |
add eax,[img_xsize] |
inc esi |
cmp esi,32 |
jnae mlix |
|
nosetput: |
popad |
ret |
|
matrix: |
times 32 dd 0 |
|
brushtable: |
;standart put |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
times 12 dd 0 |
|
;put size 2 |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000011000000000000000b |
dd 00000000000000011000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
times 12 dd 0 |
|
;put size 3 |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000111000000000000000b |
dd 00000000000000111000000000000000b |
dd 00000000000000111000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
times 12 dd 0 |
|
;put size 4 |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000111000000000000000b |
dd 00000000000001111100000000000000b |
dd 00000000000001111100000000000000b |
dd 00000000000001111100000000000000b |
dd 00000000000000111000000000000000b |
dd 00000000000000000000000000000000b |
times 12 dd 0 |
|
|
;put slash ld-ru |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000000010000000000000b |
dd 00000000000000000100000000000000b |
dd 00000000000000001000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000100000000000000000b |
dd 00000000000001000000000000000000b |
dd 00000000000010000000000000000000b |
times 12 dd 0 |
|
;put slash lu-rd |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000010000000000000000000b |
dd 00000000000001000000000000000000b |
dd 00000000000000100000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000001000000000000000b |
dd 00000000000000000100000000000000b |
dd 00000000000000000010000000000000b |
times 12 dd 0 |
|
;pricel |
times 8 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000011111110000000000000b |
dd 00000000000010010010000000000000b |
dd 00000000000010000010000000000000b |
dd 00000000111111010111111000000000b |
dd 00000000000010000010000000000000b |
dd 00000000000010010010000000000000b |
dd 00000000000011111110000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000010000000000000000b |
times 8 dd 0 |
|
;krest |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000010000010000000000000b |
dd 00000000000001000100000000000000b |
dd 00000000000000101000000000000000b |
dd 00000000000000010000000000000000b |
dd 00000000000000101000000000000000b |
dd 00000000000001000100000000000000b |
dd 00000000000010000010000000000000b |
times 12 dd 0 |
|
;krest |
times 12 dd 0 |
dd 00000000000000000000000000000000b |
dd 00000000000010000010000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000000000000000000000000b |
dd 00000000000010000010000000000000b |
times 12 dd 0 |
|
|
;smile |
times 8 dd 0 |
dd 00000111110000000000000b |
dd 00011000001100000000000b |
dd 00100000000010000000000b |
dd 01000000000001000000000b |
dd 01000000000001000000000b |
dd 10001100011000100000000b |
dd 10001100011000100000000b |
dd 10000000000000100000000b |
dd 10000000000000100000000b |
dd 10010000000100100000000b |
dd 01001000001001000000000b |
dd 01000111110001000000000b |
dd 00100000000010000000000b |
dd 00011000001100000000000b |
dd 00000111110000000000000b |
dd 00000000000000000000000000000000b |
times 8 dd 0 |
|
;round |
dd 00000000000111111111100000000000b |
dd 00000000011000000000011000000000b |
dd 00000001100000000000000110000000b |
dd 00000010000000000000000001000000b |
dd 00000100000000000000000000100000b |
dd 00001000000000000000000000010000b |
dd 00010000000000000000000000001000b |
dd 00100000000000000000000000000100b |
dd 00100000000000000000000000000100b |
dd 01000000000000000000000000000010b |
dd 01000000000000000000000000000010b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 10000000000000000000000000000001b |
dd 01000000000000000000000000000010b |
dd 01000000000000000000000000000010b |
dd 00100000000000000000000000000100b |
dd 00100000000000000000000000000100b |
dd 00010000000000000000000000001000b |
dd 00001000000000000000000000010000b |
dd 00000100000000000000000000100000b |
dd 00000010000000000000000001000000b |
dd 00000001100000000000000110000000b |
dd 00000000011000000000011000000000b |
dd 00000000000111111111100000000000b |
|
|
;Draw line procedure |
line: |
jmp n |
previous_X dw -1 |
previous_Y dw -1 |
X_increment dw -1 |
Y_increment dw -1 |
n: |
push ax |
push bx |
push cx |
push dx |
pop cx ;yed |
pop dx ;xed |
pop [previous_Y] |
pop [previous_X] |
|
mov ax,cx |
sub ax,[previous_X] |
jns dx_pos |
neg ax |
mov [X_increment],1 |
jmp dx_neg |
dx_pos: mov [X_increment],-1 |
dx_neg: mov bx,dx |
sub bx,[previous_Y] |
jns dy_pos |
neg bx |
mov [Y_increment],1 |
jmp dy_neg |
dy_pos: mov [Y_increment],-1 |
dy_neg: shl ax,1 |
shl bx,1 |
pusha |
call puti |
popa |
cmp ax,bx |
jna dx_le_dy |
mov di,ax |
shr di,1 |
neg di |
add di,bx |
cycle: |
cmp cx,[previous_X] |
je exit_bres |
cmp di,0 |
jl fractlt0 |
add dx,[Y_increment] |
sub di,ax |
fractlt0: |
add cx,[X_increment] |
add di,bx |
pusha |
call puti |
popa |
jmp cycle |
dx_le_dy: |
mov di,bx |
shr di,1 |
neg di |
add di,ax |
cycle2: |
cmp dx,[previous_Y] |
je exit_bres |
cmp di,0 |
jl fractlt02 |
add cx,[X_increment] |
sub di,bx |
fractlt02: |
add dx,[Y_increment] |
add di,ax |
pusha |
call puti |
popa |
jmp cycle2 |
exit_bres: |
ret |
|
|
draw_window: |
startwd |
window 40,40,(586+8),(380+24),window_Skinned+0x00ffffff |
label 12,8,'2D EXAMPLE: ASCL XPAINT',cl_White+font_Big |
|
; Get proc info |
mov eax,9 |
mov ebx,prcinfo |
mov ecx,-1 |
int 0x40 |
|
mov eax,[prcinfo.x_size] |
mov ebp,[prcinfo.y_size] |
sub eax,5+4 |
sub ebp,22+4 |
|
drawfbox 5,22,eax,ebp,0x00e0f0f4 |
; call out_image |
|
; draw resize buttons |
mov eax,8 |
mov ebx,(341)*65536+9 |
mov ecx,(22+6+6)*65536+6 |
mov edx,6 ;start with 6 |
mov esi,0x00aaaaaa |
int 0x40 |
inc edx |
add ebx,15*65536 |
int 0x40 |
mov ebx,(340+10)*65536+6 |
mov ecx,(22+6-2)*65536+8 |
inc edx |
mov esi,0x00aaaaaa |
int 0x40 |
inc edx |
add ecx,14*65536 |
int 0x40 |
|
;Draw now and back color |
drawfbox 20,32,20,15,[backcolor] |
drawfbox 12,28,20,15,[color] |
|
|
;Draw buttons color set |
mov eax,8 |
mov ebx,(40+6)*65536+8 |
mov ecx,(22+6)*65536+8 |
mov edx,10 ;start with 10 |
mov edi,0 |
nextbut: |
mov esi,dword [colorbuttable+edi*4] |
int 0x40 |
add ecx,(10)*65536 |
inc edx |
inc edi |
mov esi,dword [colorbuttable+edi*4] |
int 0x40 |
sub ecx,(10)*65536 |
add ebx,(10)*65536 |
inc edx |
inc edi |
cmp edi,32 ;64 buttons, 2 string of 32 buttons |
jnae nextbut |
|
;Save as not ziped image button |
mov eax,8 |
mov ebx,(365+6)*65536+50 |
mov ecx,(22+6)*65536+8 |
mov edx,80 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (365+7),(22+7),"SAVE MIA",cl_White |
|
;Open not zipped image button |
mov eax,8 |
mov ebx,(365+6)*65536+50 |
mov ecx,(36+6)*65536+8 |
mov edx,81 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (365+7),(36+7),"OPEN MIA",cl_White |
|
;Save as MHC ziped image button |
mov eax,8 |
mov ebx,(420+6)*65536+50 |
mov ecx,(22+6)*65536+8 |
mov edx,82 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (420+7),(22+7),"SAVE MHI",cl_White |
|
;Open MHC zipped image button |
mov eax,8 |
mov ebx,(420+6)*65536+50 |
mov ecx,(36+6)*65536+8 |
mov edx,83 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (420+7),(36+7),"OPEN MHI",cl_White |
|
;Save as Bitmap image button |
mov eax,8 |
mov ebx,(475+6)*65536+50 |
mov ecx,(22+6)*65536+8 |
mov edx,84 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (475+7),(22+7),"SAVE NOT",cl_White |
|
;Open Bitmap image button |
mov eax,8 |
mov ebx,(475+6)*65536+50 |
mov ecx,(36+6)*65536+8 |
mov edx,85 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (475+7),(36+7),"OPEN BMP",cl_White |
|
;Save as GIF image button |
mov eax,8 |
mov ebx,(530+6)*65536+50 |
mov ecx,(22+6)*65536+8 |
mov edx,86 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (530+7),(22+7),"SAVE NOT",cl_White |
|
;Open GIF image button |
mov eax,8 |
mov ebx,(530+6)*65536+50 |
mov ecx,(36+6)*65536+8 |
mov edx,87 ;ID |
mov esi,cl_Grey |
int 0x40 |
|
label (530+7),(36+7),"OPEN GIF",cl_White |
|
;Draw filter buttons |
mov eax,8 |
mov ebx,(590+6)*65536+6 |
mov ecx,(22+6)*65536+6 |
mov edx,100 ;start with 100 |
mov edi,0 |
nextfbut: |
mov esi,0x00aa0000 |
int 0x40 |
add ecx,(8)*65536 |
inc edx |
inc edi |
mov esi,0x0000aa00 |
int 0x40 |
add ecx,(8)*65536 |
inc edx |
inc edi |
mov esi,0x000000aa |
int 0x40 |
sub ecx,(8*2)*65536 |
add ebx,(8)*65536 |
inc edx |
inc edi |
cmp edi,8*3 ;24 buttons, 3 string of 8 buttons |
jnae nextfbut |
|
|
endwd |
call out_image |
ret |
|
|
; Get from MHC Archiver by Nikita Lesnikov |
; ======== compression/decompression engine ======== |
|
compress: ; File compression |
|
compress_filefound: |
|
jmp lzp_compress ; compress with order-2 LZP |
compress_dumpdata: |
|
ret |
|
decompress: ; File decompression |
|
decompress_filefound: |
|
cmp byte [ofile],0 ; Invalid method! |
jz right_method |
mov edx,0 ;0 size |
ret |
|
right_method: |
|
jmp lzp_decompress |
decompress_dumpdata: |
|
ret |
|
fill_filebufs: ; Fill filebufs with garbage to simplify matching |
pusha |
cld |
mov eax,0xF7D9A03F ; <- "magic number" :) just garbage... |
mov ecx,2000000/2 ;4 |
mov edi,ifile |
rep stosd |
popa |
ret |
|
; ==== algorithms section ==== |
|
; Method 0: LZP compression algorithm |
|
lzp_compress: ; EDX - how much bytes to dump |
|
cld ; clear direction flag |
|
mov esi,ifile ; init pointers |
mov edi,ofile |
|
push eax ; write header: ID0+4bfilesize => total 5 bytes |
xor eax,eax |
stosb |
pop eax |
stosd |
|
pusha ; fill hash table |
mov eax,ifile |
mov edi,hashtable |
mov ecx,65536*2 ;*1 |
rep stosd |
popa |
|
add eax,esi ; calculate endpointer |
mov dword [endpointer],eax |
|
movsw ; copy three bytes |
movsb |
|
mov dword [controlp],edi |
inc edi |
|
mov byte [controld],0 |
mov byte [controlb],0 |
|
c_loop: |
cmp dword [endpointer],esi ; check end of file |
ja c_loop_ok |
jmp finish_c_loop |
c_loop_ok: |
|
call chash |
call compare |
jz two_match_c |
|
lodsb |
mov byte [literal],al |
call chash |
call compare |
jz lit_match_c |
|
mov al,0 |
call putbit |
mov al,byte [literal] |
stosb |
movsb |
jmp end_c_loop |
|
lit_match_c: |
mov al,1 |
call putbit |
mov al,0 |
call putbit |
mov al,byte [literal] |
stosb |
jmp encode_match |
|
two_match_c: |
mov al,1 |
call putbit |
call putbit |
|
encode_match: |
call incpos |
call compare |
jz one_c |
mov al,0 |
call putbit |
jmp end_c_loop |
one_c: |
|
call incpos |
mov al,1 |
call putbit |
|
call compare |
jnz ec1 |
call incpos |
call compare |
jnz ec2 |
call incpos |
call compare |
jnz ec3 |
call incpos |
mov al,1 |
call putbit |
call putbit |
call compare |
jnz ec4 |
call incpos |
call compare |
jnz ec5 |
call incpos |
call compare |
jnz ec6 |
call incpos |
call compare |
jnz ec7 |
call incpos |
call compare |
jnz ec8 |
call incpos |
call compare |
jnz ec9 |
call incpos |
call compare |
jnz ec10 |
call incpos |
|
mov al,1 |
call putbit |
call putbit |
call putbit |
xor ecx,ecx |
|
match_loop_c: |
cmp esi,dword [endpointer] |
jae out_match_loop_c |
call compare |
jnz out_match_loop_c |
inc ecx |
call incpos |
jmp match_loop_c |
out_match_loop_c: |
|
mov al,0xFF |
out_lg: |
cmp ecx,255 |
jb out_lg_out |
stosb |
sub ecx,255 |
jmp out_lg |
out_lg_out: |
mov al,cl |
stosb |
jmp end_c_loop |
|
ec10: |
mov al,1 |
call putbit |
call putbit |
mov al,0 |
call putbit |
jmp end_c_loop |
|
ec9: |
mov al,1 |
call putbit |
mov al,0 |
call putbit |
mov al,1 |
call putbit |
jmp end_c_loop |
|
ec8: |
mov al,1 |
call putbit |
mov al,0 |
call putbit |
call putbit |
jmp end_c_loop |
|
ec7: |
mov al,0 |
call putbit |
mov al,1 |
call putbit |
call putbit |
jmp end_c_loop |
|
ec6: |
mov al,0 |
call putbit |
mov al,1 |
call putbit |
mov al,0 |
call putbit |
jmp end_c_loop |
|
ec5: |
mov al,0 |
call putbit |
call putbit |
mov al,1 |
call putbit |
jmp end_c_loop |
|
ec4: |
mov al,0 |
call putbit |
call putbit |
call putbit |
jmp end_c_loop |
|
ec3: |
mov al,1 |
call putbit |
mov al,0 |
call putbit |
jmp end_c_loop |
|
ec2: |
mov al,0 |
call putbit |
mov al,1 |
call putbit |
jmp end_c_loop |
|
ec1: |
mov al,0 |
call putbit |
call putbit |
|
end_c_loop: |
jmp c_loop |
|
finish_c_loop: |
|
mov eax,dword [controlp] ; store last tagbyte |
mov bl,byte [controld] |
mov [eax], byte bl |
|
sub edi,ofile ; calculate dump size |
mov edx,edi |
|
jmp compress_dumpdata |
|
; LZP decompression algorithm |
|
lzp_decompress: ; EDX - how much bytes to dump |
|
cld |
|
mov edi,ifile |
mov esi,ofile+1 |
|
pusha ; fill hash table |
mov eax,ifile |
mov edi,hashtable |
mov ecx,65536*2 ;*1 |
rep stosd |
popa |
|
lodsd |
|
mov ebx,edi |
add ebx,eax |
mov dword [endpointer],ebx |
|
movsw |
movsb |
|
lodsb |
mov byte [controld],al |
mov byte [controlb],0 |
|
d_loop: |
cmp dword [endpointer],edi |
ja d_loop_ok |
jmp finish_d_loop |
d_loop_ok: |
|
call getbit |
cmp al,0 |
jnz match_d |
call dhash |
movsb |
call dhash |
movsb |
jmp end_d_loop |
|
match_d: |
|
call getbit |
cmp al,0 |
jnz no_literal_before_match |
call dhash |
movsb |
no_literal_before_match: |
|
call dhash |
mov ecx,1 |
call copymatch |
|
call getbit |
cmp al,0 |
jz end_d_loop |
mov ecx,1 |
call copymatch |
call getbit |
cmp al,0 |
jz dc2 |
mov ecx,2 |
call copymatch |
call getbit |
cmp al,0 |
jz end_d_loop |
mov ecx,1 |
call copymatch |
call getbit |
cmp al,0 |
jz dc4 |
mov ecx,4 |
call copymatch |
call getbit |
cmp al,0 |
jz dc5 |
call getbit |
cmp al,0 |
jz dc6 |
mov ecx,3 |
call copymatch |
|
do: |
lodsb |
xor ecx,ecx |
mov cl,al |
call copymatch |
cmp al,0xFF |
jnz end_do |
jmp do |
end_do: |
jmp end_d_loop |
|
dc6: |
mov ecx,2 |
call copymatch |
jmp end_d_loop |
|
dc5: |
call getbit |
cmp al,0 |
jz ndc5 |
mov ecx,1 |
call copymatch |
ndc5: |
jmp end_d_loop |
|
dc4: |
call getbit |
cmp al,0 |
jz ndc4 |
call getbit |
mov ecx,3 |
cmp al,1 |
jz ndcc4 |
dec ecx |
ndcc4: |
call copymatch |
jmp end_d_loop |
ndc4: |
call getbit |
cmp al,0 |
jz ndccc4 |
mov ecx,1 |
call copymatch |
ndccc4: |
jmp end_d_loop |
|
dc2: |
call getbit |
cmp al,0 |
jz ndc2 |
mov ecx,1 |
call copymatch |
ndc2: |
|
end_d_loop: |
jmp d_loop |
finish_d_loop: |
|
mov edx, dword [ofile+1] |
|
jmp decompress_dumpdata |
|
; LZP subroutines |
|
putbit: ; bit -> byte tag, AL holds bit for output |
pusha |
mov cl,byte [controlb] |
shl al,cl |
mov bl,byte [controld] |
or bl,al |
mov byte [controld],bl |
inc cl |
cmp cl,8 |
jnz just_increment |
mov byte [controlb],0 |
mov byte [controld],0 |
push edi |
mov edi, dword [controlp] |
mov al,bl |
stosb |
pop edi |
mov dword [controlp],edi |
popa |
inc edi |
ret |
just_increment: |
mov byte [controlb],cl |
popa |
ret |
|
getbit: ; tag byte -> bit, AL holds input |
push ecx |
mov al,byte [controld] |
mov cl,byte [controlb] |
shr al,cl |
and al,1 |
inc cl |
cmp cl,8 |
jnz just_increment_d |
mov byte [controlb],0 |
push eax |
lodsb |
mov byte [controld],al |
pop eax |
pop ecx |
ret |
just_increment_d: |
mov byte [controlb],cl |
pop ecx |
ret |
|
chash: ; calculate hash -> mp -> fill position |
pusha |
xor eax,eax |
mov al, byte [esi-1] |
mov ah, byte [esi-2] |
shl eax,2 |
add eax,hashtable |
mov edx,dword [eax] |
mov dword [mp],edx |
mov dword [eax],esi |
popa |
ret |
|
dhash: ; calculate hash -> mp -> fill position |
pusha |
xor eax,eax |
mov al, byte [edi-1] |
mov ah, byte [edi-2] |
shl eax,2 |
add eax,hashtable |
mov edx,dword [eax] |
mov dword [mp],edx |
mov dword [eax],edi |
popa |
ret |
|
copymatch: ; ECX bytes from [mp] to [rp] |
push esi |
mov esi,dword [mp] |
rep movsb |
mov dword [mp],esi |
pop esi |
ret |
|
compare: ; compare [mp] with [cpos] |
push edi |
push esi |
mov edi,dword [mp] |
cmpsb |
pop esi |
pop edi |
ret |
|
incpos: |
inc dword [mp] |
inc esi |
ret |
|
|
; LZP algorithm data |
|
endpointer dd 0 |
controlp dd 0 |
controlb db 0 |
controld db 0 |
mp dd 0 |
literal db 0 |
|
; the end... - Nikita Lesnikov (nlo_one) |
|
|
|
; DATA AREA |
newline dd 0 |
xt dd 100 |
yt dd 100 |
counter dd 0 |
tsoi dd 0 |
view dd 0 |
brush dd 0 |
|
color dd 0x00000000 |
backcolor dd 0xffffff |
|
colortable: |
dd 0x00000000 ;black |
dd 0x00FFFFFF ;white |
dd 0x00808080 ;dark-gray |
dd 0x00C0C0C0 ;gray |
dd 0x00000080 ;dark-blue |
dd 0x000000ff ;blue |
dd 0x00400080 ;dark-violet |
dd 0x008000ff ;violet |
dd 0x00800080 ;dark-pink |
dd 0x00ff00ff ;pink |
dd 0x00800040 ; |
dd 0x00ff0080 ; |
dd 0x00800000 ;brown |
dd 0x00ff0000 ;red |
dd 0x00802000 ; |
dd 0x00ff4000 ;dark-orange |
dd 0x00804000 ; |
dd 0x00ff8000 ;orange |
dd 0x00804000 ; |
dd 0x00ff8000 ;orange |
dd 0x00808000 ;oliva |
dd 0x00ffff00 ;yellow |
dd 0x00608000 ; |
dd 0x00C0ff00 ; |
dd 0x00408000 ;green |
dd 0x0080ff00 ;lime |
dd 0x00008000 ; |
dd 0x0000ff00 ; |
dd 0x00008040 ;dark-salat |
dd 0x0000ff80 ;salat |
dd 0x00008080 ;dark-water |
dd 0x0000ffff ;water |
|
colorbuttable: |
dd 0x001e1e1e ;black |
dd 0x00dedede ;white |
dd 0x00808080 ;dark-gray |
dd 0x00C0C0C0 ;gray |
dd 0x001e1e80 ;dark-blue |
dd 0x001e1ede ;blue |
dd 0x00401e80 ;dark-violet |
dd 0x00801ede ;violet |
dd 0x00801e80 ;dark-pink |
dd 0x00de1ede ;pink |
dd 0x00801e40 ; |
dd 0x00de1e80 ; |
dd 0x00801e1e ;brown |
dd 0x00de1e1e ;red |
dd 0x0080201e ; |
dd 0x00de401e ;dark-orange |
dd 0x0080401e ; |
dd 0x00de801e ;orange |
dd 0x0080401e ; |
dd 0x00de801e ;orange |
dd 0x0080801e ;oliva |
dd 0x00dede1e ;yellow |
dd 0x0060801e ; |
dd 0x00C0de1e ; |
dd 0x0040801e ;green |
dd 0x0080de1e ;lime |
dd 0x001e801e ; |
dd 0x001ede1e ; |
dd 0x001e8040 ;dark-salat |
dd 0x001ede80 ;salat |
dd 0x00008080 ;dark-water |
dd 0x0000dede ;water |
|
|
|
prcinfo process_information |
|
;IM_END: |
image: |
img_xsize dd 200 |
img_ysize dd 180 |
IM_END: |
image_area: |
;rb 1024*768*3 |
|
out_image_area = image_area+(1024*768*3) |
;rb 640*480*3 |
|
MHC_END = image_area+(1024*768*3)*2 |
I_END = MHC_END+6000000 ;6 megs for work mhc algorythm |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |