📄 fireworks.asm
字号:
.686p
.MMX
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include gdi32.inc
include user32.inc
includelib kernel32.lib
includelib gdi32.lib
includelib user32.lib
; struct spark {float x,xv,y,yv;};
; struct FireShell {DWORD life; float air; spark d[250];};
; sizeof FireShell = 250*4*4+8 = 4008 bytes
EXX EQU 4
EXY EQU 8
AIR EQU 12
SPARC EQU 16
.data
ClassName db "apocalypse",0
AppName db "Fireworks MMX ...by ronybc",0,0,0,0,0,0
info db "Fireworks Version: 3.40229 - Freeware",13,10
db 13,10
db "WARNING: This is a Fireware, softwares that push CPU temperature",13,10
db "to its maximum. It does No harm, but overclockers better stay away :)",13,10
db "Entire source code of this program is free available at my website. ",13,10
db 13,10
db "If you like the work, help the author with donations.",13,10
db "see http://www.ronybc.8k.com/support.htm",13,10
db 13,10
db "SPACE & ENTER keys toggles 'Gravity and Air' and",13,10
db "'Light and Smoke' effects respectively.",13,10
db "And clicks explode..! close clicks produce more light",13,10
db 13,10
db "Manufactured, bottled and distributed by",13,10
db "Silicon Fumes Digital Distilleries, Kerala, INDIA",13,10
db 13,10
db "Copyright 1999-2006 ?Rony B Chandran. All Rights Reserved",13,10
db 13,10
db "This isn't the Final Version",13,10
db "check http://www.ronybc.8k.com for updates and more",0
seed dd 2037280626
wwidth dd 680 ; 1:1.618, The ratio of beauty ;)
wheight dd 420 ; smaller the window faster the fires
maxx dd 123 ; 123: values set on execution
maxy dd 123 ; this thing is best for comparing
lightx dd 123 ; cpu performance.
lighty dd 123
flash dd 123
flfactor dd 0.92
adg dd 0.00024 ; 0.00096 acceleration due to gravity
xcut dd 0.00064
nb dd 5 ; number of shells
nd dd 400 ; sparks per shell
sb dd 0 ; value set on execution
maxpower dd 5
minlife dd 500 ; altered @WndProc:WM_COMMAND:1300
motionQ dd 16 ; 01-25, altered @WndProc:WM_COMMAND:1210
fcount dd 0
GMode dd 1 ; atmosphere or outer-space
CMode dd 0 ; color shifter
EMode dd 1 ; special effects
click dd 0
stop dd 0
fadelvl dd 1
chemtable dd 00e0a0ffh, 00f08030h, 00e6c080h, 0040b070h, 00aad580h
bminf BITMAPINFO <<40,0,0,1,24,0,0,0,0,0,0>>
.data?
hInstance HINSTANCE ?
hwnd LPVOID ?
hmnu HWND ?
wnddc HDC ?
hFThread HANDLE ?
hHeap HANDLE ?
idThread1 DWORD ?
idThread2 DWORD ?
bitmap1 LPVOID ?
bitmap2 LPVOID ?
hFShells LPVOID ?
msg MSG <>
wc WNDCLASSEX <>
.code
random PROC base:DWORD ; Park Miller random number algorithm
mov eax, seed ; from M32lib/nrand.asm
xor edx, edx
mov ecx, 127773
div ecx
mov ecx, eax
mov eax, 16807
mul edx
mov edx, ecx
mov ecx, eax
mov eax, 2836
mul edx
sub ecx, eax
xor edx, edx
mov eax, ecx
mov seed, ecx
div base
mov eax, edx
ret
random ENDP
; -------------------------------------------------------------------------
Light_Flash3 PROC x1:DWORD, y1:DWORD, lum:DWORD, src:DWORD, des:DWORD
LOCAL mx:DWORD, my:DWORD, x2:DWORD, y2:DWORD, tff:DWORD
mov eax,lum
shr eax,1 ; Light_Flash: dynamic 2D lighting routine
mov lum,eax ; does not uses any pre-computed data
mov tff,255 ; ie. pure light frum tha melting cpu core :)
mov eax,maxx
mov mx,eax
mov eax,maxy
dec eax
mov my,eax
mov esi,src
mov edi,des
xor eax,eax
mov y2,eax
ylp3: ; 2x2 instead of per pixel lighting
xor eax,eax ; half the quality, but higher speed
mov x2,eax
xlp3:
mov eax,y2
sub eax,y1
imul eax
mov ebx,x2
sub ebx,x1
imul ebx,ebx
add eax,ebx
mov edx,lum
imul edx,edx
xor ebx,ebx
cmp eax,edx
ja @F ; jump to end causes time waves
push eax
fild dword ptr[esp]
fsqrt
fidiv lum ; this code is -nonlinear-
fld1
fsubrp st(1),st(0)
fmul st(0),st(0) ; curve
fmul st(0),st(0) ; curve more
fimul tff
fistp dword ptr[esp]
pop ebx
imul ebx,01010101h
@@:
mov eax,y2
imul maxx
add eax,x2
lea eax,[eax+eax*2]
mov edx,maxx
lea edx,[edx+edx*2]
add edx,eax
movd MM2,ebx ; simply add with saturation
movq MM0,[esi+eax] ; gamma correction is against this code
psllq MM2,32
movq MM1,[esi+edx]
movd MM3,ebx
por MM2,MM3
paddusb MM0,MM2
movd [edi+eax],MM0
paddusb MM1,MM2
psrlq MM0,32
movd [edi+edx],MM1
movd ebx,MM0
psrlq MM1,32
mov [edi+eax+4],bx
movd ecx,MM1
mov [edi+edx+4],cx
emms
@@:
mov eax,x2
add eax,2
mov x2,eax
cmp eax,mx
jbe xlp3
mov eax,y2
add eax,2
mov y2,eax
cmp eax,my
jbe ylp3
ret
Light_Flash3 ENDP
; -------------------------------------------------------------------------
Blur_MMX2 PROC ; 24bit color version
mov edi,bitmap2 ; (Developed under an old SiS6326 graphic card
mov esi,bitmap1 ; which prefers 24bit for faster operation)
mov bitmap1,edi ; Note: SiS315 is excellent, good rendering quality
mov bitmap2,esi
pxor MM7,MM7
mov eax,fadelvl
imul eax,00010001h
mov [ebp-4],eax
mov [ebp-8],eax
movq MM6,[ebp-8]
mov eax,maxx
lea eax,[eax+eax*2]
mov ebx,eax
imul maxy
push eax ; maxy*maxx*3
lea edx,[ebx-3]
lea ebx,[ebx+3]
neg edx
xor eax,eax
lea esi,[esi-3]
@@:
movd MM0,[esi] ; code enlarged version
punpcklbw MM0,MM7 ; optimized for speed, not size
movd MM1,[esi+8]
movd MM2,[esi+16]
punpcklbw MM1,MM7
punpcklbw MM2,MM7
movd MM3,[esi+6]
movd MM4,[esi+14]
movd MM5,[esi+22]
punpcklbw MM3,MM7
paddw MM0,MM3
punpcklbw MM4,MM7
paddw MM1,MM4
punpcklbw MM5,MM7
paddw MM2,MM5
movd MM3,[esi+ebx]
punpcklbw MM3,MM7
paddw MM0,MM3
movd MM4,[esi+ebx+8]
movd MM5,[esi+ebx+16]
punpcklbw MM4,MM7
paddw MM1,MM4
punpcklbw MM5,MM7
paddw MM2,MM5
movd MM3,[esi+edx]
punpcklbw MM3,MM7
paddw MM0,MM3
movd MM4,[esi+edx+8]
movd MM5,[esi+edx+16]
punpcklbw MM4,MM7
paddw MM1,MM4
punpcklbw MM5,MM7
paddw MM2,MM5
psrlw MM0,2 ; neibours only, ie. smoky blur
psrlw MM1,2
psrlw MM2,2
psubusw MM0,MM6 ; fade
psubusw MM1,MM6
psubusw MM2,MM6
packuswb MM0,MM7
lea esi,[esi+12]
packuswb MM1,MM7
packuswb MM2,MM7
movd [edi+eax],MM0
movd [edi+eax+8],MM1
movd [edi+eax+16],MM2
lea eax,[eax+12]
cmp eax,[esp]
jbe @B
pop eax
emms ; free fpu registers for following
ret ; floating-point functions
Blur_MMX2 ENDP
; -------------------------------------------------------------------------
FShell_explodeOS PROC hb:DWORD
mov edi,hb
add edi,SPARC
mov eax,nd
dec eax
shl eax,4
@@:
fld dword ptr[edi+eax] ; x coordinate
fadd dword ptr[edi+eax+4] ; x velocity
fstp dword ptr[edi+eax]
fld dword ptr[edi+eax+8] ; y coordinate
fadd dword ptr[edi+eax+12] ; y velocity
fstp dword ptr[edi+eax+8]
sub eax,16
jnc @B
dec dword ptr[edi-SPARC]
mov eax,[edi-SPARC] ; return(--life)
ret
FShell_explodeOS ENDP
; -------------------------------------------------------------------------
FShell_explodeAG PROC hb:DWORD
mov edi,hb
fld adg ; acceleration due to gravity
fld dword ptr[edi+AIR] ; air resistance
add edi,SPARC
mov eax,nd
dec eax
shl eax,4
@@:
fld dword ptr[edi+eax+4] ; x velocity
fmul st(0),st(1) ; deceleration by air
fst dword ptr[edi+eax+4]
fadd dword ptr[edi+eax] ; x coordinate
fstp dword ptr[edi+eax]
fld dword ptr[edi+eax+12] ; y velocity
fmul st(0),st(1) ; deceleration by air
fadd st(0),st(2) ; gravity
fst dword ptr[edi+eax+12]
fadd dword ptr[edi+eax+8] ; y coordinate
fstp dword ptr[edi+eax+8]
sub eax,16
jnc @B
fcompp ; marks st(0) and st(1) empty
dec dword ptr[edi-SPARC]
mov eax,[edi-SPARC] ; return(--life)
ret
FShell_explodeAG ENDP
; -------------------------------------------------------------------------
FShell_render PROC hb:DWORD, color:DWORD
LOCAL expx:DWORD, expy:DWORD
mov edi,hb
mov eax,[edi+EXX]
mov expx,eax
mov eax,[edi+EXY]
mov expy,eax
add edi,SPARC
mov ebx,color
dec ebx
;and ebx,3
mov ecx,offset chemtable
mov edx,hFShells ; floats are beautiful, and cheap source of
add edx,32 ; the chemical used for multi colored fires
mov eax,CMode
or eax,eax
cmovz edx,ecx
mov edx,[edx+ebx*4]
mov ecx,nd
dec ecx
shl ecx,4
mov esi,bitmap1
push maxy ; using stack adds speed
push maxx ; (local variables)
push edx
@@:
fld dword ptr[edi+ecx+4]
fabs
fld xcut ; low cost code for independant burnouts
fcomip st(0),st(1)
fistp dword ptr[esp-4]
jae forget
fld dword ptr[edi+ecx]
fistp dword ptr[esp-4]
fld dword ptr[edi+ecx+8]
fistp dword ptr[esp-8]
mov eax,[esp-8]
cmp eax,[esp+8]
jae forget
mov ebx,[esp-4]
cmp ebx,[esp+4]
jae forget
imul dword ptr[esp+4]
add eax,ebx
lea eax,[eax+eax*2]
mov edx,[esp]
mov [esi+eax],dx
shr edx,16
mov [esi+eax+2],dl
forget:
sub ecx,16
jnc @B
;add esp,12 'leave'ing (ENDP)
ret
FShell_render ENDP
; -------------------------------------------------------------------------
FShell_recycle PROC hb:DWORD, x:DWORD, y:DWORD
mov edi,hb
mov eax,x
mov [edi+EXX],eax
mov eax,y
mov [edi+EXY],eax
mov eax,x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -