; ; BACKGROUND SET - Compile with fasm ; use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; version dd START ; program start dd I_END ; image size dd 0x80000 ; reguired amount of memory dd 0x80000 ; stack pointer dd I_Param,0 include 'lang.inc' include 'macros.inc' START: call check_parameters call draw_window call load_texture call draw_image still: mov eax,10 ; wait here for event int 0x40 cmp eax,1 jz red cmp eax,2 jz key cmp eax,3 jz button jmp still key: mov eax,2 int 0x40 jmp still red: call draw_window jmp still button: mov eax,17 int 0x40 shr eax,8 and eax,255 cmp eax,101 ; tiled jne no101 mov eax,15 mov ebx,4 mov ecx,1 int 0x40 mov eax,15 mov ebx,3 int 0x40 jmp still no101: cmp eax,102 ; stretch jne no102 mov eax,15 mov ebx,4 mov ecx,2 int 0x40 mov eax,15 mov ebx,3 int 0x40 jmp still no102: cmp eax,1 ; end program jnz noproend or eax,-1 int 0x40 noproend: cmp eax,11 jz bg cmp eax,12 jz bg cmp eax,13 jz bg cmp eax,121 jb no_bg_select cmp eax,133 jg no_bg_select sub eax,121 shl eax,2 add eax,arrays mov eax,[eax] mov [usearray],eax call load_texture call draw_image jmp still no_bg_select: cmp eax,14+20 jge bg4 jmp bg2 check_parameters: cmp [I_Param],dword 'BOOT' je @f ret @@: call load_texture mov eax,15 mov ebx,1 mov ecx,256 mov edx,256 int 0x40 mov eax,15 mov ebx,5 mov ecx,0x40000 ; <<< 0x40000 for blue, 0x40000+1 for red, ; <<< 0x40000+2 for green background at boot mov edx,0 mov esi,256*3*256 int 0x40 mov eax,15 mov ebx,4 mov ecx,2 int 0x40 mov eax,15 mov ebx,3 int 0x40 mov eax,-1 int 0x40 set_picture: mov eax,image+99-3*16 mov ebx,0x40000+255*3+255*3*256 newpix: mov ecx,[eax] mov [ebx],cx shr ecx,16 mov [ebx+2],cl add eax,3 sub ebx,3 cmp ebx,0x40002 jge newpix ret load_texture: call gentexture call set_picture ret ; set background bg: mov edi,0x40000 cmp eax,12 jnz bb1 mov edi,0x40000+1 bb1: cmp eax,13 jnz bb2 mov edi,0x40000+2 bb2: mov eax,15 mov ebx,1 mov ecx,256 mov edx,256 int 0x40 mov eax,15 mov ebx,5 mov ecx,edi mov edx,0 mov esi,256*256*3 int 0x40 mov eax,15 mov ebx,3 int 0x40 jmp still ; colored background bg2: push eax mov eax,15 mov ebx,1 mov ecx,8 mov edx,8 int 0x40 mov eax,[esp] sub eax,14 shl eax,2 mov edx,[colors+eax] mov esi,32*32*4 mov edi,0 mov ecx,0 dbl2: mov eax,15 mov ebx,2 int 0x40 add ecx,3 inc edi cmp edi,esi jb dbl2 mov eax,15 mov ebx,3 int 0x40 jmp still ; shaped background bg4: sub eax,14+20 shl eax,3 add eax,shape mov ecx,[eax+0] mov edx,[eax+4] mov eax,15 mov ebx,1 int 0x40 mov eax,15 mov ebx,3 int 0x40 jmp still ; ********************************************* ; ******* CELLULAR TEXTURE GENERATION ********* ; **** by Cesare Castiglia (dixan/sk/mfx) ***** ; ********* dixan@spinningkids.org ********** ; ********************************************* ; * the algorythm is kinda simple. the color * ; * component for every pixel is evaluated * ; * according to the squared distance from * ; * the closest point in 'ptarray'. * ; ********************************************* gentexture: mov ecx,0 ; ycounter mov edi,0 ; pixel counter mov ebp,[usearray] ylup: mov ebx,0 ; call precalcbar xlup: push edi mov edi, 0 mov esi, 512000000 ; abnormous initial value :) pixlup: push esi ; add edi,4 mov eax,ebx ; evaluate first distance sub eax, [ebp+edi] ; x-x1 call wrappit imul eax mov esi, eax ; (x-x1)^2 mov eax, ecx add edi,4 sub eax, [ebp+edi] ; y-y1 call wrappit imul eax ; (y-y1)^2 add eax,esi ; (x-x1)^2+(y-y1)^2 pop esi cmp esi,eax jb ok ; compare and take the smaller one mov esi,eax ok: add edi,4 cmp [ebp+edi],dword 777 jne pixlup mov eax,esi ; now evaluate color... ; cmp eax,255*24 ; jbe ok2 ; imul eax,12 ; ok2: mov edi,24 ; 50 = max shaded distance idiv edi pop edi mov [image+51+edi],eax add edi,3 add ebx,1 ; bounce x loop cmp ebx,256 ; xsize jne xlup add ecx,1 cmp ecx,256 ; ysize jne ylup ret wrappit: cmp eax,0 ; this makes the texture wrap jg noabs neg eax noabs: cmp eax,128 jb nowrap neg eax add eax,256 nowrap: ret ;precalcbar: ; pusha ; mov eax,1 ; mov ebx,ecx ; add ebx,18 ; mov ecx,44 ; mov edx,0x00000060 ; bar: ; add ecx,2 ; add edx,0x00020100 ; int 0x40 ; cmp ecx,298 ; jb bar ; popa ; ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ********* ; ********************************************* draw_image: mov eax,7 mov ebx,0x40000 mov ecx,256*65536+255 mov edx,19*65536+65;55 int 0x40 ret y_add equ 44 ; 30 y_s equ 13 y_add2 equ 340 ;325 set equ 0 ;15 button_color equ 0A0A0A0h ; 207090 306090h wnd_color equ 3B0B0B0h ; 34090B0h draw_window: mov eax, 12 ; tell os about draw mov ebx, 1 int 0x40 mov eax, 0 ; define and draw window mov ebx, 220*65536+293 mov ecx, 50*65536+408 mov edx, wnd_color int 0x40 call draw_image mov eax,8 ; Blue button mov ebx,(set+195+27)*65536+17 mov ecx,y_add*65536+y_s mov edx,11 mov esi,0x004444cc int 0x40 mov eax,8 ; Red button mov ebx,(set+213+27)*65536+17 mov edx,12 mov esi,0x00cc4444 int 0x40 mov eax,8 ; Green button mov ebx,(set+258)*65536+17 mov edx,13 mov esi,0x0044cc44 int 0x40 mov eax, 8 ; tiled mov ebx, 96*65536+63 mov ecx, y_add*65536+y_s mov edx, 101 mov esi, button_color int 0x40 mov eax, 8 ; stretch mov ebx, 160*65536+61 mov edx, 102 int 0x40 mov eax, 4 ; window header mov ebx, 8*65536+8 mov ecx, 0x10ffffff mov edx, header mov esi, header.size int 0x40 mov ebx, 220*65536+30 mov ecx, 0 mov edx, apply_text mov esi, apply_text.size int 0x40 mov ebx, 19*65536+326 mov edx, image_buttons_text mov esi, image_buttons_text.size int 0x40 mov ebx, 19*65536+(y_add2+27) mov edx, simple_text mov esi, simple_text.size int 0x40 mov ecx, (y_add2)*65536+20 mov ebx, (18)*65536+25 mov edx, 121 mov esi, button_color mov edi, 9 mov eax, 8 @@: int 0x40 add ebx, 29*65536 inc edx dec edi jnz @b mov edx, 34+4 mov edi, 4 mov eax, 8 mov ebx, 18*65536+18 mov ecx, y_add*65536+y_s @@: int 0x40 inc edx add ebx, 19*65536 dec edi jnz @b ;----------------------- mov edx,14 ; button number mov ebx,(18)*65536+17 ; button start x & size mov ecx,(y_add2+40)*65536+14 ; button start y & size newcb: mov esi,[(edx-14)*4+colors] mov eax,8 int 0x40 inc edx add ebx,20*65536 add esi,5*256*256 cmp edx,27 jnz newcb ;----------------------- mov eax, 4 mov ebx, 8*65536+4+y_add mov ecx, 0 mov edx, la2 mov esi, la2.size int 0x40 mov eax,12 mov ebx,2 int 0x40 ret ; DATA SECTION lsz header,\ ru, "ƒ¥­¥à â®à ä®­  à ¡®ç¥£® á⮫ ",\ en, "BACKGROUND" lsz apply_text,\ ru, "ਬ¥­¨âì:",\ en, "Apply:" lsz image_buttons_text,\ ru, "‚ë¡¥à¨â¥ ®¡à §¥æ:",\ en, "Select pattern:" lsz simple_text,\ ru, "Ž¤­®æ¢¥â­ë© ä®­:",\ en, "Single-color background:" lsz la2,\ ru, " ‡€ŒŽ‘’ˆ’œ €‘’Ÿ“’œ",\ en, " TILED STRETCH" xx db 'x' colors: dd 0x770000 dd 0x007700 dd 0x000077 dd 0x777700 dd 0x770077 dd 0x007777 dd 0x777777 dd 0x335577 dd 0x775533 dd 0x773355 dd 0x553377 dd 0x000000 dd 0xcccccc shape: dd 1024,64 dd 1024,32 dd 2048,32 dd 4096,32 dd 512,16 dd 1024,16 dd 2048,16 dd 4096,16 dd 64,32 dd 64,16 dd 32,32 dd 8,8 dd 16,16 dd 64,64 usearray dd ptarray arrays dd ptarray,ptarray2,ptarray3,ptarray4,ptarray5,ptarray6 dd ptarray7,ptarray8,ptarray9 ptarray: dd 150,50 dd 120,30 dd 44,180 dd 50,66 dd 27,6 dd 95,212 dd 128,177 dd 201,212 dd 172,201 dd 250,100 dd 24,221 dd 11,123 dd 248,32 dd 34,21 dd 777 ; <- end of array ptarray2: dd 0,0,50,50,100,100,150,150,200,200,250,250 dd 50,150,150,50,200,100,100,200 dd 777 ptarray3: dd 55,150,150,55,200,105,105,200 dd 30,30,220,220 dd 777 ptarray4: dd 196,0,196,64,196,128,196,196 dd 64,32,64,96,64,150,64,228 dd 777 ptarray5: dd 196,0,196,64,196,128,196,196 dd 64,0,64,64,64,128,64,196 dd 777 ptarray6: dd 49,49,128,50,210,50 dd 50,128,128,128,210,128 dd 50,210,128,210,210,210 dd 777 ptarray7: dd 0,0 dd 196,196,64,64 dd 128,0 dd 0,128 dd 64,64,196,64 dd 196,196,64,196 dd 128,128 dd 777 ptarray8: dd 0, 128 dd 0, 128 dd 128, 0 dd 0, 128 dd 128, 0 dd 0, 128 dd 128, 0 dd 0, 128 dd 128, 0 dd 128, 128 dd 777 ptarray9: dd 0,248,64,128,128,64,196,48,160,160,94,224,240,96,5,5,777 I_Param: image: I_END: