; ; 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