Flower256
;**********************************************************
;
; FlOWER256(Updated with displacement and a nice palette)
; Morphing tunnel of the overused XOR texture. :*)
; Another 256 Byte demo by
; Relsoft (Richard Eric M. Lope BSN RN)
; http://rel.betterwebber.com
; Assemble with FASM (FlatAssembler.net)
;
;**********************************************************
diameter = 32
diamxscale = (64 * diameter)
scx = 160
scy = 100
org 100h
;*****************************************************************
;*****************************************************************
;*****************************************************************
push word 0a000h ;word
pop es ;byte
mov al, 13h ; mode 13h
int 10h ; we are now in 320x200x256
mov dx, 03c8h ;palette write register
xor ax, ax
mov word[fold_off],ax
out dx, al
mov cx, 20
inc dx
genpal:
out dx, al
xchg al, ah
out dx, al
xor ax, cx
xchg al, ah
out dx, al
inc al
jnz genpal
main_loop:
;si = frame counter
inc word [si]
;flower
;fold_off += 0.2
fld [c_fold_off]
fadd dword[fold_off]
fstp dword[fold_off]
;fold_scale = 0.5 * sin(frame / 40)
fild word [si] ;st0 = frame; st1 = 0.3
mov ax, 90
mov bx, bp
mov word [bx], ax
fidiv word [bx]
fstp dword [bx]
fld dword [bx]
fsincos
fmul [c_fold_scale]
fstp dword[fold_scale]
;displacement
mov word[bx], ax
fimul word[bx]
fistp word[cenx]
add word[cenx], scx
fld dword[fold_scale]
fimul word[bx]
fistp word[ceny]
add word[ceny], scy
;===========tunnel
mov dx,200
xor di, di
tunnel_yloop:
mov cx,320
tunnel_xloop:
;bx = word pointer
;bp = dword ptr
;
;
;atan2
fninit ;call this to ditch the st pops
mov bx, bp
mov ax, [ceny]
mov word [bx], ax
sub [bx], dx
fild word [bx] ;st0 = dy
mov ax, [cenx]
mov word [bx], ax
sub [bx], cx
fild word [bx] ;st0 = dx, st1 = dy
fpatan ;st0 = atan(dy/dx) = atan(st1/st0)
;flower
;xdist = xdist * ((sin(fold_off + fold_num * angle) * fold_scale)+1)
fstp dword [bx]
fld dword [bx] ;restore
fld dword [bx]
fimul [fold_num]
fadd dword[fold_off]
fsin
fmul dword[fold_scale]
mov word [bx], 1
fiadd word [bx]
fstp dword [bp] ;real_var =((sin(fold_off + fold_num * angle) * fold_scale)+1)
fmul [c_scale] ;atan(st0))*256/pi
fistp word [bx] ;short_var = scaledpi
mov gs,[bx]
mov ax, [cenx]
sub ax, cx ;cmx
mov [bx], ax
fild word [bx] ;st0 = cmx
fmul st0, st0 ;cmx * cmx
mov ax, [ceny]
sub ax, dx
mov [bx], ax
fild word [bx] ;st0 = cmy st1 = cmx*cmx
fmul st0, st0 ;cmy * cmy
fadd st0, st1 ;st0 cmx^2 + cmy^2
fsqrt ;sqrt st0
fmul dword [bp]
mov word [bx], diamxscale ;st0 = diamxscale st1 = sqrt(dist)
fidivr word [bx] ;st0 = diamxscale / dist
fistp word [bx]
mov ax, word [bx]
add ax, word [si]
mov bx, gs
add bx, word [si]
xor ax, bx
stosb
dec cx
jnz tunnel_xloop
dec dx
jnz tunnel_yloop
mov dx,3dah
vsync:
in al,dx
and al,8
jz vsync
in al,60h
dec al
jnz main_loop
ret
fold_num dw 5
c_fold_off dd 0.2
c_fold_scale dd 0.35
c_scale dd 40.74
fold_scale dd ?
fold_off dd ?
cenx dw ?
ceny dw ?[ back to the prod ]
