📄 ffttest.asm
字号:
;----------------------------------------------------------------------------------
.586
.387
.mmx
.k3d
.model flat, stdcall
option casemap:none
Include E:\masm32\Include\windows.inc
Include E:\masm32\Include\user32.inc
Include E:\masm32\Include\kernel32.inc
Include E:\masm32\Include\gdi32.inc
Include E:\masm32\Include\winmm.inc
Include E:\masm32\Include\comctl32.inc
IncludeLib E:\masm32\lib\Winmm.lib
Includelib E:\masm32\lib\user32.lib
Includelib E:\masm32\lib\kernel32.lib
IncludeLib E:\masm32\lib\gdi32.lib
IncludeLib E:\masm32\lib\comctl32.lib
include macros.asm
include filedlgs.asm
include wave.asm
include Display.asm
include FFT.asm
include module.asm
WinMain Proto :Dword,:Dword,:Dword,:Dword
WavProc Proto :Dword,:Dword,:Dword,:Dword,:Dword
Check3dNowCPU Proto
IdPlay EQU 2000
IdPause EQU 2001
IdStop EQU 2002
IdOpen EQU 2003
IdHPass EQU 2004
IdLPass EQU 2005
IdDisp EQU 2006
IdTrHpass EQU 2007
IdTrLpass EQU 2008
.DATA
PauseFlag DD 0
FinFlag DD 0
ClassName DB "FFT",0
SliderNm DB "msctls_trackbar32",0
ButtonCNm DB "Button",0
Align 8
;----------------------------------------------------------------------------------
.DATA?
hInstance DD ?
CommandLine DD ?
nmHdrWav DD ?
hPlay DD ?
hPause DD ?
hStop DD ?
hOpen DD ?
hHPass DD ?
hLPass DD ?
hDisp DD ?
hTrHpass DD ?
hTrLpass DD ?
;----------------------------------------------------------------------------------
.CODE
start:
Invoke GetModuleHandle, NULL
mov hInstance,eax
Invoke GetCommandLine
mov CommandLine,eax
call Check3dNowCPU
.If eax==0
Invoke MessageBox,0,cStr("This programme needs 3dNow! processor"),cStr("Error"),MB_OK or MB_ICONERROR
jmp @f
.EndIf
Invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
@@: Invoke ExitProcess,eax
;----------------------------------------------------------------------------------
WinMain Proc hInst:Dword,hPrevInst:Dword,CmdLine:LPSTR,CmdShow:Dword
Local wc:WNDCLASSEX
Local msg:MSG
Local hwndM:Dword
mov wc.cbSize,Sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, Offset WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,Offset ClassName
Invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
Invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
Invoke RegisterClassEx, Addr wc
Invoke CreateWindowEx,WS_EX_DLGMODALFRAME,Addr ClassName,cStr("FFT sample Band Pass wave player by Pradeepan"),\
WS_POPUPWINDOW or WS_VISIBLE or WS_CAPTION,CW_USEDEFAULT,\
CW_USEDEFAULT,500,200,NULL,NULL,\
hInstance,NULL
mov hwndM,eax
Invoke UpdateWindow, hwndM
.While TRUE
Invoke GetMessage, Addr msg,0,0,0
.Break .If (!eax)
Invoke TranslateMessage, Addr msg
Invoke DispatchMessage, Addr msg
.EndW
mov eax,msg.wParam
ret
WinMain EndP
;----------------------------------------------------------------------------------
WndProc Proc hWnd:Dword, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Local mnHdr:NMHDR
Local ps:PAINTSTRUCT
.If uMsg==WM_DESTROY
Invoke waveOutClose,WOpenHnd
VMfree WavDblBuff,1
VMfree WavBuff2,1
CloseHnd wFlHnd,1
Invoke PostQuitMessage,NULL
.ElseIf uMsg==WM_COMMAND
mov eax,wParam
and eax,0ffffh
.If eax==IdOpen
mov PauseFlag,4
Invoke waveOutReset ,WOpenHnd
Invoke waveOutClose,WOpenHnd
mov PauseFlag,0
VMfree WavDblBuff,1
VMfree WavBuff2,1
CloseHnd wFlHnd,1
Invoke SendMessage,hPlay,BM_SETCHECK,0,0
Invoke SendMessage,hPause,BM_SETCHECK,0,0
Open
.ElseIf eax==IdPlay
.If PauseFlag==1
mov PauseFlag,0
Play
.Else
.If PauseFlag==3
Invoke SendMessage,hPlay,BM_SETCHECK,1,0
.ElseIf PauseFlag==2
mov PauseFlag,0
Invoke waveOutRestart,WOpenHnd
.Else
.If FileOpenedFlag==1
mov PauseFlag,3
Play
.Else
Invoke SendMessage,hPlay,BM_SETCHECK,0,0
.EndIf
.EndIf
.EndIf
.ElseIf eax==IdPause
.If PauseFlag==2
Invoke SendMessage,hPause,BM_SETCHECK,1,0
.Else
mov PauseFlag,2
Invoke waveOutPause,WOpenHnd
Invoke SendMessage,hPlay,BM_SETCHECK,0,0
.EndIf
.ElseIf eax==IdStop
mov PauseFlag,4
Invoke waveOutReset,WOpenHnd
mov PauseFlag,1
mov edx,WavBuff2
mov WavPtr,eax
Invoke SendMessage,hPlay,BM_SETCHECK,0,0
Invoke SendMessage,hPause,BM_SETCHECK,0,0
FileSeek wFlHnd,46,FILE_BEGIN,1
.ElseIf eax==IdHPass
Invoke SendMessage,hHPass,BM_GETSTATE,0,0
.If eax==9
mov HPFlag,1
.Else
mov HPFlag,0
.EndIf
.ElseIf eax==IdLPass
Invoke SendMessage,hLPass,BM_GETSTATE,0,0
.If eax==9
mov LPFlag,1
.Else
mov LPFlag,0
.EndIf
.ElseIf eax==IdDisp
Invoke SendMessage,hDisp,BM_GETSTATE,0,0
.If eax==9
mov DispFlag,1
.Else
mov DispFlag,0
.EndIf
.EndIf
.ElseIf uMsg==WM_CREATE
Invoke WinFFTMain,0,0,0,0
Invoke InitFFT,1024*2,Offset rexMem,Offset imxMem,Offset magMem,Offset phsMem ;initialize FFT with 1024 samples (only 16bit stereo samples- not number of bytes)
SetWinBk 0ff9988h,hWnd
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Play"),WS_VISIBLE or WS_CHILD or WS_BORDER or BS_PUSHBUTTON,50,20,50,32,hWnd,IdPlay,hInstance,0
mov hPlay,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Pause"),WS_VISIBLE or WS_CHILD or WS_BORDER or BS_PUSHBUTTON,110,20,50,32,hWnd,IdPause,hInstance,0
mov hPause,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Stop"),WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON,170,20,50,32,hWnd,IdStop,hInstance,0
mov hStop,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Open"),WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON,230,20,50,32,hWnd,IdOpen,hInstance,0
mov hStop,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable low freq cutoff"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,60,200,30,hWnd,IdLPass,hInstance,0
mov hLPass,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable High freq cutoff"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,100,200,30,hWnd,IdHPass,hInstance,0
mov hHPass,eax
Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable Display"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,140,200,30,hWnd,IdDisp,hInstance,0
mov hDisp,eax
Invoke CreateWindowEx,0,Addr SliderNm,0,WS_VISIBLE or WS_CHILD or TBS_AUTOTICKS,260,60,200,30,hWnd,IdTrLpass,hInstance,0
mov hTrLpass,eax
Invoke SendMessage,eax,TBM_SETRANGE,1,02000000h
Invoke CreateWindowEx,0,Addr SliderNm,0,WS_VISIBLE or WS_CHILD or TBS_AUTOTICKS,260,100,200,30,hWnd,IdTrHpass,hInstance,0
mov hTrHpass,eax
Invoke SendMessage,eax,TBM_SETRANGE,1,02000000h
.ElseIf uMsg==WM_NOTIFY
mov eax,wParam
and eax,0ffffh
.If eax==IdTrHpass
Invoke SendMessage,hTrHpass,TBM_GETPOS,0,0
mov HpVal,eax
.ElseIf eax==IdTrLpass
Invoke SendMessage,hTrLpass,TBM_GETPOS,0,0
mov LpVal,eax
.EndIf
.Else
Invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.EndIf
xor eax,eax
ret
WndProc EndP
;----------------------------------------------------------------------------------
WavProc Proc hwndW:Dword,uMsg:UINT,UserData:Dword,Param1:Dword,Param2:Dword
.If uMsg==WOM_DONE && PauseFlag!=4
add WavPtr,Buffsz
mov eax,Param1
Invoke waveOutWrite,WOpenHnd,Param1,Sizeof WAVEHDR
mov ecx,Buffsz
sub BytesLeft,ecx
shl ecx,2
add ecx,WavBuff2
.If WavPtr>=ecx
FileRead wFlHnd,WavBuff2,Buffsz*4
.If eax<(Buffsz*4)
mov esi,eax
FileSeek wFlHnd,46,FILE_BEGIN,1
mov edx,Buffsz*4
sub edx,esi
add esi,WavBuff2
mov ecx,Buffsz
sub ecx,edx
mov BytesLeft,ecx
FileRead wFlHnd,esi,edx
.EndIf
mov eax,WavBuff2
mov WavPtr,eax
.EndIf
mov eax,Param1
mov [eax].WAVEHDR.dwBufferLength,Buffsz
; pusha
; mov ecx,[eax].WAVEHDR.dwBufferLength
; mov ebx,WavPtr
; mov edi,[eax].WAVEHDR.lpData
; shr ecx,3
;@@: movq MM0,[ebx]
; movq [edi],MM0
; add ebx,8
; add edi,8
; dec ecx
; jnz @b
; popa
Invoke pFFT,WavPtr,[eax].WAVEHDR.lpData
.ElseIf uMsg==WOM_CLOSE
Invoke waveOutUnprepareHeader,WOpenHnd, Offset WavHdr,Sizeof WavHdr
Invoke waveOutUnprepareHeader,WOpenHnd, Offset WavHdr2,Sizeof WavHdr
.EndIf
ret
WavProc EndP
;----------------------------------------------------------------------------------
Check3dNowCPU Proc
pushfd
pop eax
mov ebx,eax
xor eax,200000h
push eax
popfd
pushfd
pop eax
cmp eax,ebx
jz No3dNow
mov eax,80000000h
cpuid
cmp eax,80000000h
jbe No3dNow
mov eax,80000001h
cpuid
mov eax,1
test edx,80000000h
jnz Yes3dNow
No3dNow: xor eax,eax
Yes3dNow: ret
Check3dNowCPU EndP
;----------------------------------------------------------------------------------
END start
;----------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -