kolibrios/programs/media/pic4/trunk/pic4.asm

661 lines
11 KiB
NASM
Raw Normal View History

;
; 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:
mov eax,48
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
mcall
call check_parameters
call draw_window
call load_texture
call draw_image
still:
mov eax,10 ; wait here for event
mcall
dec eax
jz red
dec eax
jnz button
key:
mov al,2
mcall
jmp still
red:
call draw_window
jmp still
button:
mov al,17
mcall
shr eax,8
cmp eax,101 ; tiled
jne no101
mov eax,15
mov ebx,4
mov ecx,1
mcall
mov eax,15
mov ebx,3
mcall
jmp still
no101:
cmp eax,102 ; stretch
jne no102
mov eax,15
mov ebx,4
mov ecx,2
mcall
mov eax,15
mov ebx,3
mcall
jmp still
no102:
cmp eax,1 ; end program
jnz no_end
or eax,-1
mcall
no_end:
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
mcall
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
mcall
mov eax,15
mov ebx,4
mov ecx,2
mcall
mov eax,15
mov ebx,3
mcall
mov eax,-1
mcall
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
mcall
mov eax,15
mov ebx,5
mov ecx,edi
mov edx,0
mov esi,256*256*3
mcall
mov eax,15
mov ebx,3
mcall
jmp still
; colored background
bg2:
push eax
mcall 15,4,1
mov eax,15
mov ebx,1
mov ecx,1
mov edx,1
mcall
pop eax
sub eax,14
imul eax,3
mov ecx,fill
add ecx,eax
mov eax,15
mov ebx,5
xor edx,edx
mov esi,3*1*1
mcall
mov eax,15
mov ebx,3
mcall
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
mcall
mov eax,15
mov ebx,3
mcall
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
xlup:
push edi
mov edi, 0
mov esi, 512000000 ; abnormous initial value :)
pixlup:
push esi
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...
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
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW *********
; *********************************************
draw_image:
mov eax,7
mov ebx,0x40000
mov ecx,256*65536+255
mov edx,14*65536+40;55
mcall
ret
y_add equ 19 ; 30
y_s equ 13
y_add2 equ 315 ;325
set equ 0 ;15
draw_window:
mov eax, 12 ; tell os about draw
mov ebx, 1
mcall
xor eax, eax ; define and draw window
mov ebx, 220*65536+293
mov ecx, 50*65536+408
mov edx, [sc.work]
or edx, 0x33000000
mov edi, title
mcall
call draw_image
mov eax,8 ; Blue button
mov ebx,(set+190+27)*65536+17
mov ecx,y_add*65536+y_s
mov edx,11
mov esi,0x005555bb
mcall
;mov eax,8 ; Red button
mov ebx,(set+208+27)*65536+17
mov edx,12
mov esi,0x00bb5555
mcall
;mov eax,8 ; Green button
mov ebx,(set+253)*65536+17
mov edx,13
mov esi,0x0055bb55
mcall
;mov eax, 8 ; tiled
mov ebx, 90*65536+63
mov ecx, y_add*65536+y_s
mov edx, 101
mov esi, [sc.work_button]
mcall
;mov eax, 8 ; stretch
mov ebx, 154*65536+61
mov edx, 102
mcall
mov eax, 4
mov ebx, 215*65536+5
mov ecx, [sc.work_text]
mov edx, apply_text
mov esi, apply_text.size
mcall
mov ebx, 14*65536+301
mov edx, image_buttons_text
mov esi, image_buttons_text.size
mcall
mov ebx, 14*65536+(y_add2+27)
mov edx, simple_text
mov esi, simple_text.size
mcall
mov ecx, (y_add2)*65536+20
mov ebx, (13)*65536+25
mov edx, 121
mov esi, [sc.work_button]
mov edi, 9
mov eax, 8
@@:
mcall
add ebx, 29*65536
inc edx
dec edi
jnz @b
mov edx, 34+4
mov edi, 4
;mov eax, 8
mov ebx, 13*65536+18
mov ecx, y_add*65536+y_s
@@:
mcall
inc edx
add ebx, 19*65536
dec edi
jnz @b
;-----------------------
mov eax,8
mov edx,14 ; button number
mov ebx,(13)*65536+17 ; button start x & size
mov ecx,(y_add2+40)*65536+14 ; button start y & size
newcb:
mov esi,[(edx-14)*4+colors]
mcall
inc edx
add ebx,20*65536
cmp edx,27
jnz newcb
;-----------------------
mov eax, 4
mov ebx, 94*65536+4+y_add
mov ecx, [sc.work_button_text]
mov edx, la2
mov esi, la2.size
mcall
mov eax,12
mov ebx,2
mcall
ret
; DATA SECTION
if lang eq ru
title db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><><EFBFBD> <20><EFBFBD>',0
else
title db 'Background',0
end if
lsz apply_text,\
ru, "<22><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>:",\
en, "Apply:"
lsz image_buttons_text,\
ru, "<22><EFBFBD><EBA1A5><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A7>:",\
en, "Select pattern:"
lsz simple_text,\
ru, "<22><><EFBFBD><EFBFBD><EFBFBD><E6A2A5><EFBFBD><EFBFBD> 䮭:",\
en, "Single-color background:"
lsz la2,\
ru, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",\
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 0x111111
dd 0xcccccc
fill:
db 0x00,0x00,0x77
db 0x00,0x77,0x00
db 0x77,0x00,0x00
db 0x00,0x77,0x77
db 0x77,0x00,0x77
db 0x77,0x77,0x00
db 0x77,0x77,0x77
db 0x77,0x55,0x33
db 0x33,0x55,0x77
db 0x55,0x33,0x77
db 0x77,0x33,0x55
db 0x11,0x11,0x11
db 0xcc,0xcc,0xcc
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_END:
sc system_colors
I_Param:
image: