0,0 → 1,256 |
; |
; application : WAVED 3D FORM SIN(SQRT(x*x+y*y)) |
; author : macgub |
; email : macgub3@wp.pl |
; system : MenuetOS |
; compiler : fasm |
; |
; |
TIMEOUT EQU 2 |
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 0x7fff0 ; 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 |
|
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: |
|
call calc_deg |
|
; mov eax,13 ;clear screen |
; mov ebx,5*65536 + 517 |
; mov ecx,20*65536 + 345 |
; xor edx,edx |
; int 0x40 |
|
mov edi,the_mem ;clear buffer |
mov ecx,512*384*3/4 |
xor eax,eax |
cld |
rep stosd |
|
mov eax,1 ;main loop |
oop: |
mov ebx,1 |
oop1: |
push eax |
push ebx |
mov [x],eax |
mov [z],ebx |
call fun |
add [y],260 |
add [x],40 |
call rotateY |
call put3dpixel |
pop ebx |
pop eax |
add ebx,4 |
cmp ebx,201 |
jne oop1 |
inc eax |
cmp eax,300 |
jne oop |
|
mov eax,7 ;put image |
mov ebx,the_mem |
mov ecx,512*65536+384 |
mov edx,0 |
int 0x40 |
|
jmp still |
;-------------------PROCEDURES------------------------------- |
calc_deg: |
cmp [deg_counter], 360 |
jne go_deg |
mov [deg_counter],0 |
go_deg: |
fldpi |
fidiv [deg_div] |
fimul [deg_counter] |
fst [current_deg] |
fsincos |
fstp [cosbeta] |
fstp [sinbeta] |
inc [deg_counter] |
ret |
;----------------- |
rotateY: |
mov eax,[z] |
sub eax,[zo] |
mov [subz],eax |
mov eax,[x] |
sub eax,[xo] |
mov [subx],eax |
|
fld [sinbeta] |
fimul [subz] |
fchs |
fld [cosbeta] |
fimul[subx] |
faddp |
fiadd [xo] |
fistp [x] |
|
fld [sinbeta] |
fimul [subx] |
fld [cosbeta] |
fimul [subz] |
faddp |
fiadd [zo] |
fistp [z] |
ret |
;----------------------------- |
fun: |
finit |
fild [x] |
fisub [i150] |
fidiv [xdiv] |
fmul st,st0 |
fld st0 |
fild [z] |
fisub [i100] |
fidiv [zdiv] |
fmul st,st0 |
faddp |
fsqrt |
|
fld [current_deg] |
fimul [cur_deg_mul] |
faddp |
fsin |
fimul [ymul] |
fistp [y] |
ret |
;-------------------------- |
put3dpixel: |
fild [z] |
fmul [sq] |
fchs |
fiadd [y] |
fistp [y] |
fild [z] |
fmul [sq] |
fiadd [x] |
fistp [x] |
;mov eax,1 |
;mov ebx,[x] |
;mov ecx,[y] |
;mov edx,[col] |
;int 0x40 |
mov eax,[y] ; calculating pixel position in buffer |
dec eax |
shl eax,9 |
add eax,[x] |
mov ebx,eax |
shl eax,1 |
add eax,ebx |
add eax,the_mem |
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 |
|
mov eax,48 |
mov ebx,4 |
int 0x40 |
mov esi, eax |
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,100*65536+512+9 ; [x start] *65536 + [x size] |
mov ecx,100*65536+384+4 ; [y start] *65536 + [y size] |
add ecx, esi |
mov edx,0x74000000 ; color of work area RRGGBB,8->color gl |
mov edi,labelt |
int 0x40 |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
|
ret |
|
; DATA AREA |
deg_div dd 90 |
deg_counter dd ? |
col dd 0x00ffffff |
sq dd 0.707 ;sin pi/4 |
cosbeta dd ? |
sinbeta dd ? |
x dd ? |
y dd ? |
z dd ? |
xo dd 200 ;axle variables |
;yo dd 110 |
zo dd 80 |
xdiv dd 20 |
zdiv dd 20 |
ymul dd 20 |
subx dd ? |
;suby dd ? |
subz dd ? |
current_deg dd ? ;real |
cur_deg_mul dd 12 |
i100 dd 100 |
i150 dd 150 |
labelt: |
db 'Waved 3d form',0 |
the_mem: |
I_END: |
|
|
|
|