For all of you living in cold areas of this world, here is a little "fire" for your monitor.
This is my first app for windows in asm - and im proud :toothy that i got this working. But, however,
i think this needs a lot of optimization. So please have a look, every help is greatly appreciated.
Dependencies: gdiplus.dll - LIB and INC-files are included within the zip-file.
Merry Christmas!
[attachment deleted by admin]
Phoenix,
What a fantastic job , I haven't looked at the code behind the application, yet, but that is a very kewl effect!
Paul
Quote from: pbrennick on December 25, 2004, 12:21:49 AM
... but that is a very kewl effect!
Paul
Thank you, but the idea for this effect is not mine. This was done by Cicri on PSC in VB6 (as mentioned in code and about), all i did is to develop it further by using gdi+ and asm.
However, i have a working version of it in VB6 that shows text above the flames which burns after a while. But it is still a lot of work to implement this in asm.
Just noticed that i forgot to prevent the window being resized smaller than 130 pixels in height :red . This may cause unexpected results. I'll try a fix tomorrow.
Regards, Phoenix
Quote from: Phoenix on December 24, 2004, 11:12:01 PM
For all of you living in cold areas of this world, here is a little "fire" for your monitor.
This is my first app for windows in asm - and im proud :toothy that i got this working. But, however,
i think this needs a lot of optimization. So please have a look, every help is greatly appreciated.
Dependencies: gdiplus.dll - LIB and INC-files are included within the zip-file.
Merry Christmas!
DLL is missing
Don't know what is going on but as I try to re-assemble your Fire.asm it turns out that there are many missing .inc files, missing .lib files. After I went to get all the missing files and add then in the source I get a really big error report from the assemble and or link. In any event I can't get it to compile nor can I run the .exe that was in the zip file because of missisng DLL
Here's one I found somewhere but I don't remember where I go it
.686p
.MMX
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\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-2004 © 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
mov lightx,eax ; Light last one
mov eax,y
mov lighty,eax
mov eax,flash ; having only one light source
add eax,3200 ; 3200 million jouls...!
mov flash,eax ; add if previous lighting not extinguished
invoke random,20
inc eax
imul minlife
mov ebx,eax ; sync explosions by mouse clicks with rest
mov eax,[edi] ; by maintaining minimum delay of 'minlife'
xor edx,edx
idiv minlife
add edx,ebx
mov [edi],edx
invoke random,30 ; like its real world counterpart, creation process
add eax,10 ; is long and boring but the end product is explodin..
mov [esp-4],eax ; refer C++ source also. Most of the below area
mov eax,10000 ; is blind translation of that original C code
mov [esp-8],eax ; i crawled on that code as a Human C compiler...!
fld1
fild dword ptr[esp-4]
fidiv dword ptr[esp-8]
fsubp st(1),st(0)
fstp dword ptr[edi+AIR]
add edi,SPARC
fild y
fild x
mov eax,1000
mov [esp-4],eax
fild dword ptr[esp-4] ; 1000 (constant)
invoke random,maxpower
inc eax
mov [esp-4],eax
fild dword ptr[esp-4] ; power
mov ecx,nd
dec ecx
shl ecx,4
@@:
push ecx
invoke random,2000
mov [esp-4],eax
fild dword ptr[esp-4]
fsub st(0),st(2)
fdiv st(0),st(2)
fmul st(0),st(1)
mov ecx,[esp]
fstp dword ptr[edi+ecx+4]
fld st(0)
fmul st(0),st(0)
fld dword ptr[edi+ecx+4]
fmul st(0),st(0)
fsubp st(1),st(0)
fsqrt
invoke random,2000
mov [esp-4],eax
fild dword ptr[esp-4]
fsub st(0),st(3)
fdiv st(0),st(3)
fmulp st(1),st(0)
mov ecx,[esp]
fstp dword ptr[edi+ecx+12]
fld st(2)
fstp dword ptr[edi+ecx]
fld st(3)
fstp dword ptr[edi+ecx+8]
pop ecx
sub ecx,16
jnc @B
fcompp
fcompp
ret
FShell_recycle ENDP
; -------------------------------------------------------------------------
FireThread:
invoke SetThreadPriority,idThread1,THREAD_PRIORITY_HIGHEST
invoke GetDC,hwnd
mov wnddc,eax
invoke GetProcessHeap
mov hHeap,eax
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,4194304
add eax,4096 ; blur: -1'th line problem
mov bitmap1,eax
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,4194304
add eax,4096 ; blur: -1'th line problem
mov bitmap2,eax
mov eax,nd
shl eax,4
add eax,SPARC
mov sb,eax ; size of FShell = nd*16+8
imul nb ; array size = nb*sb
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,eax
mov hFShells,eax
finit ; initialise floating point unit
mov ax,07fh ; low precision floats
mov word ptr[esp-4],ax ; fireworks... not space rockets
fldcw word ptr[esp-4]
sub ebp,12 ; as 3 local variables
mov eax,nb
mov [ebp],eax
mov eax,hFShells
mov [ebp+4],eax
initshells:
;mov eax,maxx ; naah... not needed
;shr eax,1 ; trusting auto-zero
;invoke FShell_recycle,[ebp+4],eax,maxy
;mov eax,sb
;add [ebp+4],eax
;dec dword ptr[ebp]
;jnz initFShells
;mov flash,6400
lp1:
mov eax,motionQ
mov dword ptr[ebp+8],eax
lp2:
mov eax,nb
mov [ebp],eax
mov eax,hFShells
mov [ebp+4],eax
lp3:
invoke FShell_render,[ebp+4],[ebp]
mov eax,GMode
mov ecx,offset FShell_explodeAG
mov ebx,offset FShell_explodeOS
test eax,eax
cmovz ecx,ebx
push [ebp+4]
call ecx
test eax,eax
jns @F
invoke random,maxy
push eax
mov eax,maxx
add eax,eax
invoke random,eax
mov edx,maxx
shr edx,1
sub eax,edx
push eax
push [ebp+4]
call FShell_recycle
@@:
mov eax,sb
add [ebp+4],eax
dec dword ptr[ebp]
jnz lp3
dec dword ptr[ebp+8]
jnz lp2
mov eax,EMode
test eax,eax
jz r1
mov eax,CMode ; switch pre/post blur according to -
test eax,eax ; current chemical in fire
jz @F
invoke Blur_MMX2
@@:
invoke Light_Flash3,lightx,lighty,flash,bitmap1,bitmap2
invoke SetDIBitsToDevice,wnddc,0,0,maxx,maxy,\
0,0,0,maxy,bitmap2,ADDR bminf,DIB_RGB_COLORS
mov eax,CMode
test eax,eax
jnz r2
invoke Blur_MMX2
jmp r2
r1:
invoke SetDIBitsToDevice,wnddc,0,0,maxx,maxy,\
0,0,0,maxy,bitmap1,ADDR bminf,DIB_RGB_COLORS
mov eax,maxx
imul maxy
lea eax,[eax+eax*2]
invoke RtlZeroMemory,bitmap1,eax
r2:
inc fcount ; count the frames
fild flash
fmul flfactor
fistp flash
invoke Sleep,5 ; control, if frames rate goes too high
mov eax,stop
test eax,eax
jz lp1
invoke ReleaseDC,hwnd,wnddc
invoke HeapFree,hHeap,0,bitmap1
invoke HeapFree,hHeap,0,bitmap2
invoke HeapFree,hHeap,0,hFShells
mov idThread1,-1
invoke ExitThread,2003
hlt ; ...! i8085 memories
; -------------------------------------------------------------------------
.data
fps db 64 dup (0)
fmat db "fps = %u [www.ronybc.8k.com]",0
.code
MoniThread:
invoke Sleep,1000
invoke wsprintf,ADDR fps,ADDR fmat,fcount
invoke SetWindowText,hwnd,ADDR fps
xor eax,eax
mov fcount,eax
mov eax,stop
test eax,eax
jz MoniThread
mov idThread2,-1
invoke ExitThread,2003
; -------------------------------------------------------------------------
Switch PROC oMode:DWORD, iid:DWORD
xor eax,eax
mov edx,oMode
or al,byte ptr [edx]
setz byte ptr [edx]
mov eax,[edx]
mov ebx,MF_CHECKED
shl eax,3
and eax,ebx
or eax,MF_BYCOMMAND
invoke CheckMenuItem,hmnu,iid,eax
ret
Switch ENDP
; -------------------------------------------------------------------------
WndProc PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_MOUSEMOVE && wParam==MK_CONTROL
xor edx,edx
mov flash,2400
mov eax,lParam
mov dx,ax
shr eax,16
mov lightx,edx
mov lighty,eax
.ELSEIF uMsg==WM_SIZE && wParam!=SIZE_MINIMIZED
xor edx,edx
mov eax,lParam
mov dx,ax
shr eax,16
shr edx,2
shl edx,2
mov maxx,edx
mov maxy,eax
mov bminf.bmiHeader.biWidth,edx
neg eax ; -maxy
mov bminf.bmiHeader.biHeight,eax
.ELSEIF uMsg==WM_KEYDOWN && wParam==VK_SPACE
invoke Switch,OFFSET GMode,1200
.ELSEIF uMsg==WM_KEYDOWN && wParam==VK_RETURN
invoke Switch,OFFSET EMode,1220
mov flash,0
.ELSEIF uMsg==WM_RBUTTONDOWN
invoke MessageBox,hWnd,ADDR info,ADDR AppName,MB_OK or MB_ICONASTERISK
.ELSEIF uMsg==WM_LBUTTONDOWN
xor edx,edx
mov eax,lParam
mov dx,ax
shr eax,16
push eax
push edx
mov edx,nb
dec edx
mov eax,click
dec eax
cmovs eax,edx
mov click,eax
imul sb
add eax,hFShells
push eax
call FShell_recycle
.ELSEIF uMsg==WM_CLOSE
mov stop,1 ; stop running threads
invoke Sleep,100 ; avoid FireThread drawing without window
invoke DestroyWindow,hwnd
invoke PostQuitMessage,0
.ELSEIF uMsg==WM_COMMAND
.IF wParam==1010
invoke SendMessage,hwnd,WM_CLOSE,0,0
.ELSEIF wParam==1000
invoke SuspendThread,hFThread ; suffering technical difiiculties :)
mov eax,maxx ; major motiv - to see ZeroMem in acion
imul maxy
lea eax,[eax+eax*2]
invoke RtlZeroMemory,bitmap1,eax ; this thing is fast,
invoke RtlZeroMemory,bitmap2,eax ; but hidden from some API docs
push nb
push hFShells
@@:
mov eax,maxx
;shr eax,1
shr eax,2
mov edx,[esp+4]
dec edx
imul eax,edx
mov ebx,maxy
shr ebx,1
invoke FShell_recycle,[esp+8],eax,ebx
mov eax,sb
add [esp],eax
dec dword ptr[esp+4]
jnz @B
;mov flash,6400
invoke ResumeThread,hFThread
pop eax
pop eax
.ELSEIF wParam==1200
invoke Switch,OFFSET GMode,1200
.ELSEIF wParam==1210
invoke Switch,OFFSET CMode,1210
mov ecx,CMode
mov eax,16
shr eax,cl
mov motionQ,eax ; changing motionQ affects speed
.ELSEIF wParam==1220
invoke Switch,OFFSET EMode,1220
mov flash,0
.ELSEIF wParam==1300
invoke CheckMenuItem,hmnu,1310,MF_BYCOMMAND or MF_UNCHECKED
invoke CheckMenuItem,hmnu,1300,MF_BYCOMMAND or MF_CHECKED
mov minlife,500 ; long interval between shoots
.ELSEIF wParam==1310
invoke CheckMenuItem,hmnu,1300,MF_BYCOMMAND or MF_UNCHECKED
invoke CheckMenuItem,hmnu,1310,MF_BYCOMMAND or MF_CHECKED
mov minlife,100 ; short interval
.ELSEIF wParam==1400
invoke MessageBox,hWnd,ADDR info,ADDR AppName,MB_OK or MB_ICONASTERISK
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc ENDP
; -------------------------------------------------------------------------
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
mov wc.hInstance,eax
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNCLIENT
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov wc.hbrBackground,COLOR_MENUTEXT
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke LoadIcon,hInstance,500
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke RegisterClassEx,ADDR wc
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,wwidth,wheight,NULL,NULL,\
hInstance,NULL
mov hwnd,eax
add seed,eax ;)
invoke LoadMenu,hInstance,600
mov hmnu,eax
invoke SetMenu,hwnd,eax
invoke CheckMenuItem,hmnu,1200,MF_BYCOMMAND or MF_CHECKED
invoke CheckMenuItem,hmnu,1220,MF_BYCOMMAND or MF_CHECKED
invoke CheckMenuItem,hmnu,1300,MF_BYCOMMAND or MF_CHECKED
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
invoke CreateThread,0,4096,ADDR MoniThread,0,0,ADDR idThread1
invoke CreateThread,0,4096,ADDR FireThread,0,0,ADDR idThread2
mov hFThread,eax
MsgLoop:
invoke GetMessage,ADDR msg,0,0,0
test eax,eax
jz EndLoop
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp MsgLoop
EndLoop:
@@: mov eax,idThread1
or eax,idThread2
not eax
and eax,eax
jnz @B
invoke ExitProcess,eax
end start
MSDN: GDI+ (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/gdiplus/gdiplus.asp)
GDI+ 1.0 Security Update Overview (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/gdiplus10security.asp)
The attachment contains a related topic from the old forum.
Hi All,
The attached zipfile has been reworked so it assembles without error and a batch file has been included. Pheonix included all the files you needed to rebuild his project. I just had to modify two inc files because they did not have the full paths to the masm32 inc and lib files. As far as the gdiplus.dll file goes, it should already be in the windows directory, it is on my machine and the exe runs without error. Thanks.
Paul
[attachment deleted by admin]
Robert Collins,
I also built the file you posted the source (by ronybc, actually) and it is a nice fireworks demo. Not the same as what Phoenix's program does, at all, but still nice.
Paul
Quote from: Robert Collins on December 25, 2004, 02:33:31 AM
Here's one I found somewhere but I don't remember where I go it
Hehe it is in the comments
http://www.ronybc.8k.com
Anyway I have seen this example. I think bitrake made a screensaver version of it before.
Quote from: pbrennick on December 25, 2004, 05:15:30 AM
Hi All,
The attached zipfile has been reworked so it assembles without error and a batch file has been included. Pheonix included all the files you needed to rebuild his project. I just had to modify two inc files because they did not have the full paths to the masm32 inc and lib files. As far as the gdiplus.dll file goes, it should already be in the windows directory, it is on my machine and the exe runs without error. Thanks.
Paul
I have Windows 98 (not SE) and I did a search for 'gdi' and found no hits on gdiplus.dll. Is this a DLL for later versions of Windows?
Robert,
According to http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/gdiplus/gdiplus.asp, there is a version for win98, it can be downloaded from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm
Quote from: pbrennick on December 25, 2004, 06:41:01 AM
Robert,
According to http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/gdiplus/gdiplus.asp, there is a version for win98, it can be downloaded from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm
Thanks for the link info however right after I posted I found the DLL on the Web and download it from http://www.dll-files.com/dllindex/dll-files.shtml?gdiplus and put the DLL in the same folder as the program and it works great.
Robert,
I am glad you solved your problem and can see how kewl the program is. I would encourage you to place the dll in the c:\windows\system directory so you can use it for all your GDI+ needs.
Paul
Quote from: pbrennick on December 25, 2004, 05:15:30 AM
The attached zipfile has been reworked so it assembles without error ...
Hi all,
I should have mentioned that i did this code using WinAsm Studio, as the paths are declared in general there i did forget to do this for the posting.Sorry!
Does someone have ideas to optimize the code? I also have a little problem with the settimer_api, seems that windows accepts only steps of 10 ms, so if you set uElapse to 25, the timerproc is called every 30ms.
Phoenix
I don't know much about it, but I think you are supposed to use the multimedia timers for tasks that require a high timing accuracy.
MSDN: Multimedia Timers (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_multimedia_timers.asp)
The functions seem to be easy to use, and everything I tested other than timeBeginPeriod (and timeEndPeriod) seemed to work just as I expected. On the one system I tested the timeGetDevCaps function returned minimum and maximum periods of 1 and 1000000ms.
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\winmm.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\winmm.lib
include \masm32\macros\macros.asm
TimeProc PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
printv MACRO varname:VARARG
FOR arg, <varname>
invoke StdOut, reparg(arg)
ENDM
ENDM
NL EQU SADD(13,10)
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.data
tcaps TIMECAPS <>
timerID dd 0
count dd 0
buffer db 30 dup(0)
.code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke timeGetDevCaps, ADDR tcaps, SIZEOF tcaps
cmp eax, TIMERR_NOERROR
je @F
printv chr$("timeGetDevCaps returned an error"), NL
@@:
printv chr$("wPeriodMin = "), ustr$(tcaps.wPeriodMin), chr$("ms"), NL
printv chr$("wPeriodMax = "), ustr$(tcaps.wPeriodMax), chr$("ms"), NL
; This does not seem to produce any significant effect.
;invoke timeBeginPeriod, 100
;cmp eax, TIMERR_NOERROR
;je @F
;printv chr$("timeBeginPeriod returned an error"), NL
@@:
printv chr$("Timing 10000 timer events...")
; Sync with timer tick for better accuracy.
call GetTickCount
mov ebx, eax
@@:
call GetTickCount
cmp ebx, eax
je @B
call GetTickCount
push eax
invoke timeSetEvent, 1, 1, offset TimeProc, 0, TIME_PERIODIC
mov timerID, eax
test eax, eax
jnz @F
printv chr$("timeSetEvent returned an error"), NL
@@:
cmp count, 10000
jb @B
invoke timeKillEvent, timerID
cmp eax, TIMERR_NOERROR
je @F
printv chr$("timeKillEvent returned an error"), NL
@@:
;invoke timeEndPeriod, 100
;cmp eax, TIMERR_NOERROR
;je @F
;printv chr$("timeEndPeriod returned an error"), NL
@@:
call GetTickCount
pop ebx
sub eax, ebx
printv NL, chr$("Elapsed time = "), ustr$(eax), chr$("ms"), NL
printv NL, chr$("Press enter to exit..."), NL
invoke StdIn, addr buffer, 1
exit
TimeProc proc uID:DWORD, uMsg:DWORD, dwUser:DWORD, dw1:DWORD, dw2:DWORD
inc count
ret
TimeProc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start
[edit]Fixed a stupid mistake in the timer sync code[/edit]
Quote from: pbrennickI would encourage you to place the dll in the c:\windows\system directory so you can use it for all your GDI+ needs.
Redist.txt that accompanies the Microsoft download:
Quote
===========
Gdiplus.dll
===========
For Windows XP use the system-supplied gdiplus.dll. Do not install a new gdiplus.dll over the system-supplied version (it will fail due to Windows File Protection).
For Windows 2000, Windows Millennium Edition, Windows NT 4.0 and Windows 98, install gdiplus.dll into the private directory of the application not into the system directory.
In addition to the rights granted in Section 1 of the Agreement ("Agreement"), with respect to gdiplus.dll for Windows 2000, Windows Millennium Edition, Windows NT 4.0 and Windows 98, you have the following non-exclusive, royalty free rights subject to the Distribution Requirements detailed in Section 1 of the Agreement:
(1) You may distribute gdiplus.dll solely for use with Windows 2000, Windows Millennium Edition, Windows NT 4.0 and Windows 98.
We are talking about installing it in win98, here, where there is NO possible collision with a previous version as it never was released with this windows version.
Paul
GDI+ was not released with Windows 2000, NT4, or ME, but that specific warning includes those versions.
QuoteGDI+ can be used in all Windows-based applications. GDI+ is new technology that is included in Windows XP and the Windows Server 2003. It is required as a redistributable for applications that run on the Microsoft Windows NT 4.0 SP6, Windows 2000, Windows 98, and Windows Millennium Edition (Windows Me) operating systems.
Perhaps this is a case of the right hand not knowing what the left hand is doing, but Microsoft could have had a good reason for the warning, and I suspect that security might be part of it.
MichaelW: Thankyou for your suggestion to use mmTimer, i am working on this.
Quote from: MichaelW on December 25, 2004, 05:00:26 PM
GDI+ was not released with Windows 2000, NT4, or ME, but that specific warning includes those versions.
....but Microsoft could have had a good reason for the warning, and I suspect that security might be part of it.
What should happen if using gdiplus.dll? This is part of XP, and MS states that it works with 98, Me, W2k and so on. I use gdiplus on a W2K-system, and it is installed in the system32-directory. So what is the difference, if we put it to the application-directory or to the system32-directory?
As far as i know, the security problem is in the JPEG Parsing Engine (Buffer Overflow) so this might be the problem with it.
For anything else, i noticed that gdi+ is very powerful, it is sometimes unbelievable what is possible. And we can use it from every HLL or with asm using flat API calls with great results.
QuoteSo what is the difference, if we put it to the application-directory or to the system32-directory?
I think I found the likely explanation
here (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/gdiplus10security.asp):
Quote
Although the updated GDIPlus.dll is designed to be compatible with previous versions, there are always applications that are too tightly designed to the idiosyncrasies of a given version. The result can be a situation not anticipated by you or the application developer. So we encourage you to work in concert with your software vendor for an update that has been tested with the latest version of GDI+.
Basically, it seems that Microsoft wants to avoid a situation where the updated GDIPlus.dll breaks existing applications. For Windows 98 SE and 2000 there is a relatively simple method of forcing an existing application to use a local copy of the DLL -- see Private DLLs, The second side-by-side approach...
here (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsetup/html/dlldanger1.asp). So I now think it would be reasonable to put the DLL in the system/system32 directory, and then force any application that breaks to use the local copy.
Quote from: MichaelW on December 26, 2004, 09:45:52 AM
Basically, it seems that Microsoft wants to avoid a situation where the updated GDIPlus.dll breaks existing applications.
MichaelW: Thank you for your explanations (and patience), i think they made me a little bit more careful. But, however, i think the technology behind gdiplus is one for the future, and the up to date version of this dll can be used without doubt, either in system32- or application-directory. The reason for me to put it into the system32-directory on my system is that - with all versions of my vb and asm-projects - I had it a lot of times on my harddrive. But i will do a further version-check in future!