0,0 → 1,447 |
; |
; application : 3d shaking waved spiral |
; compilator : fasm |
; system : MenuetOS |
; author : macgub |
; email : macgub3@wp |
|
timeout equ 3 |
maxx equ 600 ; window size |
maxy equ 420 |
use32 |
|
org 0x0 |
|
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x100000 ; memory for app |
dd 0xbffff ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
|
START: ; start of execution |
|
call draw_window |
|
still: |
|
; mov eax,23 ; wait here for event |
; mov ebx,timeout |
; int 0x40 |
mov eax,11 ; check for event no wait |
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 noclose |
|
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 ; get id |
int 0x40 |
|
cmp ah,1 ; button id=1 ? |
jne noclose |
|
mov eax,-1 ; close this program |
int 0x40 |
noclose: |
|
; mov eax,13 |
; mov ebx,20*65536+maxx-25 |
; mov ecx,20*65536+maxy-25 |
; xor edx,edx |
; int 0x40 |
|
mov edi,screen_buf |
mov ecx,maxx*maxy*3/4 |
xor eax,eax |
cld |
rep stosd |
|
|
call calc_deg |
mov [z],0 |
mov [sin_counter],0 |
finit |
oopz: |
mov [x],0 |
push [z] |
call calc_sin_variable |
oop: |
push [x] |
; call getcol ;(x,z) |
call fun ; calculates y and y1 |
; call rotateY |
mov eax,[sin_variable] |
add eax,[vector_x] ; vector_x |
add [x],eax |
mov eax,[vector_y] |
add [y],eax ; vector_y |
add [y1],eax |
call point_perspective |
call draw_point_3d |
pop [x] |
inc [x] |
mov eax,[x] |
cmp eax,[loop_counter] |
jne oop |
inc [sin_counter] |
pop [z] |
inc [z] |
cmp [z],200 |
jne oopz |
|
mov eax,7 |
mov ebx,screen_buf |
mov ecx,maxx*65536+maxy |
mov edx,20*65536+20 |
int 0x40 |
|
call set_elipse_dim |
call set_vectors |
|
jmp still |
;-----------------++++++PROCEDURES |
getcol: |
mov eax,[x_resolution] |
mul [z] |
add eax,[x] |
mov ebx,eax |
mov eax,35 |
int 0x40 |
mov [col],eax |
ret |
|
set_vectors: |
cmp [vector_x],55 |
jne vec1 |
mov [vector_dir_x],1 |
vec1: |
cmp [vector_x],250 |
jne vec2 |
mov [vector_dir_x],0 |
vec2: |
cmp [vector_dir_x],1 |
jne vec3 |
inc [vector_x] |
jmp end_x |
vec3: |
dec [vector_x] |
end_x: |
cmp [vector_y],195 |
jne vec4 |
mov [vector_dir_y],1 |
vec4: |
cmp [vector_y],205 |
jne vec5 |
mov [vector_dir_y],0 |
vec5: |
cmp [vector_dir_y],1 |
jne vec6 |
inc [vector_y] |
ret |
vec6: |
dec [vector_y] |
ret |
set_elipse_dim: |
cmp [b],60 |
jne go11 |
mov [elipse_dir],0 |
go11: |
cmp [b],10 |
jne go12 |
mov [elipse_dir],1 |
go12: |
cmp [elipse_dir],1 |
jne go13 |
inc [b] |
dec [a] |
mov eax,[a] |
mov [xo],eax |
shl eax,1 |
inc eax |
mov [loop_counter],eax |
ret |
go13: |
dec [b] |
inc [a] |
mov eax,[a] |
mov [xo],eax |
shl eax,1 |
inc eax |
mov [loop_counter],eax |
ret |
|
calc_deg: |
cmp [deg_counter], 360 |
jne go_deg |
mov [deg_counter],0 |
go_deg: |
fldpi |
fidiv [deg_div] |
fimul [deg_counter] |
fstp [current_deg] |
; fsincos |
; fstp [cosbeta] |
; fstp [sinbeta] |
inc [deg_counter] |
ret |
|
;rotateY: |
; mov eax,[z] |
; sub eax,[zoo] |
; mov [subz],eax |
; mov eax,[x] |
; sub eax,[xoo] |
; mov [subx],eax |
; |
; fld [sinbeta] |
; fimul [subz] |
; fchs |
; fld [cosbeta] |
; fimul[subx] |
; faddp |
; fiadd [xoo] |
; fistp [x] |
|
; fld [sinbeta] |
; fimul [subx] |
; fld [cosbeta] |
; fimul [subz] |
; faddp |
; fiadd [zoo] |
; fistp [z] |
; finit |
|
; ret |
|
point_perspective: |
mov eax,[x] |
sub eax,[xobs] |
mov [xobssub],eax |
mov eax,[z] |
sub eax,[zobs] |
mov [zobssub],eax |
|
mov eax,[y] |
sub eax,[yobs] |
mov [yobssub],eax |
mov eax,[y1] |
sub eax,[yobs] |
mov [y1obssub],eax |
|
finit |
fild [xobssub] |
fidiv [zobssub] |
fimul [zobs] |
fchs |
fiadd [xobs] |
fistp [x] |
fild [yobssub] |
fidiv [zobssub] |
fimul [zobs] |
fchs |
fiadd [yobs] |
fistp [y] |
|
; mov eax,[xobssub] |
; idiv [zobssub] |
;; mov eax,edx |
; imul [zobs] |
; neg eax |
; add eax,[xobs] |
; mov [x],eax |
; mov eax,[yobssub] |
; idiv [zobssub] |
;; mov eax,edx |
; imul [zobs] |
; neg eax |
; add eax,[yobs] |
; mov [y],eax |
|
fild [y1obssub] |
fidiv [zobssub] |
fimul [zobs] |
fchs |
fiadd [yobs] |
fistp [y1] |
ret |
calc_sin_variable: |
;calculate sinus variable |
fldpi |
fidiv [sin_gran] |
fimul [sin_counter] |
fadd [current_deg] |
fsin |
fimul [sin_mul] |
fistp [sin_variable] |
ret |
|
fun: |
; finit |
fild [x] |
fisub [xo] |
; fchs |
; faddp |
fild [a] |
fdivp st1,st |
fmul st,st0 |
fchs |
fld1 |
faddp |
fsqrt |
fimul [b] |
fld st |
fchs |
fiadd [yo] |
fistp [y] |
fiadd [yo] |
fistp [y1] |
ret |
draw_point_3d: |
mov eax,[z] |
imul [sq] |
shr eax,10 |
mov ebx,eax |
neg eax |
push eax |
add eax,[y] |
mov [y],eax |
pop eax |
add eax,[y1] |
mov [y1],eax |
mov eax,ebx |
add eax,[x] |
mov [x],eax |
;mov eax,1 |
;mov ebx,[x] |
;mov ecx,[y] |
;mov edx,[col] |
;int 0x40 |
;mov ecx,[y1] |
;int 0x40 |
mov eax,maxx |
mul [y] |
add eax,[x] |
mov ebx,eax |
shl ebx,1 |
add eax,ebx |
add eax,screen_buf |
mov ebx,[col] |
or [eax],ebx |
mov eax,maxx |
mul [y1] |
add eax,[x] |
mov ebx,eax |
shl ebx,1 |
add eax,ebx |
add eax,screen_buf |
mov ebx,[col] |
or [eax],ebx |
ret |
|
; ********************************************* |
; ******* 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+maxx+25 ; [x start] *65536 + [x size] |
mov ecx,100*65536+maxy+25 ; [y start] *65536 + [y size] |
mov edx,0x02000000 ; 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 ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelt ; pointer to text beginning |
mov esi,labellen-labelt ; text length |
int 0x40 |
; CLOSE BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(maxx+25-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,0x6688dd ; button color RRGGBB |
int 0x40 |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
|
ret |
|
x_resolution dd 800 |
vector_x dd 200 |
vector_y dd 200 |
vector_dir_x db 1 |
vector_dir_y db 1 |
elipse_dir db 1 |
|
deg_counter dd ? ; rotation variables |
deg_div dd 20 |
current_deg dd ? |
;cosbeta dd ? |
;sinbeta dd ? |
;zoo dd 100 ; rotation axle |
;xoo dd 40 |
;yoo dd 20 |
;subx dd ? |
;suby dd ? |
;subz dd ? |
|
xobs dd maxx/2 ; 320 observer variables |
yobs dd maxy/2 ; 175 |
zobs dd -200 |
xobssub dd ? |
yobssub dd ? |
y1obssub dd ? |
zobssub dd ? |
|
sin_variable dd ? |
sin_mul dd 60 |
sin_gran dd 30 |
sin_counter dd 0 |
sq dd 724 ; round( (sqrt2)/2*1024 ) |
z dd ? |
x dd ? |
y dd ? |
y1 dd ? |
xo dd 70 ; center point , (loop counter-1)/2 |
yo dd 20 |
a dd 70 ; vertical half-axle |
b dd 20 ; horizontal half-axle |
loop_counter dd 141 ; axle granularity |
col dd 0x00ffffff |
|
labelt: |
db ' 3D SHAKING WAVED SPIRAL' |
labellen: |
screen_buf: |
|
I_END: |
|
|
|
|