⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blurswirl.asm

📁 用win32汇编编写的魅力的彩色漩涡
💻 ASM
字号:
.686
.MMX
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib

SWIRLPIX STRUCT
  x      dd ?
  y      dd ?
  angle  dd ?
  radius dd ?
  color  dd ?
SWIRLPIX ENDS

.data
ClassName db "apocalypse",0
AppName   db "blur'n'swirl... mmx",0
website   db "http://www.ronybc.8k.com",0
info      db "Hit SPACE to pause.",13,10
          db 13,10
          db "This isn't the Final Version",13,10
          db "visit www.ronybc.8k.com for updates",0
wwidth    dd 200
wheight   dd 240
maxx      dd 10
maxy      dd 10
temp      dd 0
radius    dd 0
flength   dd 1
freerun   dd 1
cmode     dd 10
swan      dd 0.0
speed     dd 1.124
accel     dd 0.000002
flevel1   dq 0001000100010001h
flevel2   dq 0002000200020002h
flevel3   dq 0003000300030003h
pix1      SWIRLPIX <0,0,0.00,00,00ffa060h>
pix2      SWIRLPIX <0,0,0.30,10,0040a0ffh>
pix3      SWIRLPIX <0,0,0.60,20,00a0ff40h>
pix4      SWIRLPIX <0,0,3.14,30,0000ffffh>

bminf     BITMAPINFO <<40,0,0,1,24,0,0,0,0,0,0>>

.data?
hInstance HINSTANCE ?
idThread  DWORD ?
hwnd      HWND ?
disp      HDC ?
mbuf1     HDC ?
mbuf2     HDC ?
hHeap     HDC ?
msg       MSG <>
wc        WNDCLASSEX <>

.code

BlurThread:
    invoke SetThreadPriority,idThread,THREAD_PRIORITY_ABOVE_NORMAL
    invoke GetDC,hwnd
    mov disp,eax
    invoke GetProcessHeap
    mov hHeap,eax
    invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,2359296
    add eax,4096         ; blur: -1'th line problem
    mov mbuf1,eax
    invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,2359296
    add eax,4096
    mov mbuf2,eax

xf:
    lea esi,pix1
    call swirl
    lea esi,pix2
    call swirl
    lea esi,pix3
    call swirl
    lea esi,pix4
    call swirl
    ror dword ptr[esi+16],1
    fld speed
    fld swan
    fadd st,st(1)
    fstp swan
    fld accel
    fimul freerun
    fadd
    fstp speed
    dec flength
    jz display
    jmp xf
swirl:
    fild dword ptr [esi+12]
    fld swan
    fadd dword ptr [esi+8]
    fsincos
    fmul st,st(2)
    fistp dword ptr [esi]
    mov eax,radius
    add [esi],eax
    fmul
    fistp dword ptr [esi+4]
    mov eax,radius
    add [esi+4],eax
    mov edi,mbuf1
    mov eax,[esi+4]
    mul maxx              ;position=((y*maxx)+x)*3
    add eax,[esi]
    mov edx,[esi+16]
    lea eax,[eax+eax*2]
    mov [edi+eax],dx
    shr edx,16
    mov [edi+eax+2],dl
    mov eax,[esi+12]
    inc eax
    xor ecx,ecx
    cmp eax,radius
    cmova eax,ecx
    mov [esi+12],eax
    ret
display:
    mov eax,cmode
    mov flength,eax
blurmmx:
    mov esi,mbuf2
    mov edi,mbuf1
    mov mbuf1,esi
    mov mbuf2,edi
    mov eax,maxx
    lea eax,[eax+eax*2]
    push eax              ; maxx*3
    mul maxy              ; maxy*maxx*3
    add edi,eax
    mov ecx,eax
    pop edx
    add edx,3
    lea ebx,[edx-6]
    neg ebx
    pxor MM7,MM7
@@:
    movq MM2,MM1
    movq MM1,MM0
    movd MM0,[edi]        ; loop moves backward
    punpcklbw MM0,MM7
    paddw MM2,MM0
    movd MM4,[edi+edx]
    punpcklbw MM4,MM7
    paddw MM2,MM4
    movd MM4,[edi+ebx]
    punpcklbw MM4,MM7
    paddw MM2,MM4
    psrlw MM2,2
    movq MM4,MM2
    pcmpgtw MM4,MM1       ; compares signed data
    pand MM2,MM4
    pandn MM4,MM1
    por MM2,MM4
    psubusw MM2,flevel1
    packuswb MM2,MM7
    movd eax,MM2
    mov [esi+ecx+3],ax
    shr eax,16
    mov [esi+ecx+5],al
    sub edi,3
    sub ecx,3
    jnc @B
    emms                  ; free for following floating-point functions
    invoke SetDIBitsToDevice,disp,0,0,maxx,maxy,\
           0,0,0,maxy,mbuf1,ADDR bminf,DIB_RGB_COLORS
    jmp xf
    

WndProc PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
        invoke ReleaseDC,hwnd,disp 
        invoke HeapFree,hHeap,0,mbuf1
        invoke HeapFree,hHeap,0,mbuf2
    .ELSEIF uMsg==WM_KEYDOWN
        xor eax,eax
        lea edx,freerun
        or al,byte ptr [edx]
        setz  byte ptr [edx]
    .ELSEIF uMsg==WM_CREATE
        invoke CreateThread,0,8196,ADDR BlurThread,0,0,ADDR idThread
    .ELSEIF uMsg==WM_SIZE
        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
        neg eax
        cmp eax,edx
        cmova eax,edx
        shr eax,1
        mov radius,eax
    .ELSEIF uMsg == WM_COMMAND
        .IF wParam==1100
            mov cmode,10
        .ELSEIF wParam==1200
            mov cmode,20
        .ELSEIF wParam==1300
            mov cmode,30
        .ELSEIF wParam==1000
            invoke SendMessage,hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL
        .ELSEIF wParam==1400
            invoke MessageBox,hwnd,ADDR info,
                   ADDR website,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.hbrBackground,COLOR_WINDOW
    mov wc.lpszClassName,OFFSET ClassName
    mov wc.cbClsExtra,NULL
    mov wc.cbWndExtra,NULL
    mov wc.lpszMenuName,NULL
    invoke LoadIcon,hInstance,500
    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_OVERLAPPEDWINDOW,ADDR ClassName,
                          ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
                          CW_USEDEFAULT,wwidth,wheight,NULL,NULL,
                          hInstance,NULL
    mov hwnd,eax
    invoke LoadMenu,hInstance,600
    invoke SetMenu,hwnd,eax
    invoke ShowWindow,hwnd,SW_SHOWNORMAL
    invoke UpdateWindow,hwnd
    MsgLoop:
        invoke GetMessage,ADDR msg,0,0,0
        test eax,eax
        jz EndLoop
        invoke TranslateMessage,ADDR msg
        invoke DispatchMessage,ADDR msg
        jmp MsgLoop
    EndLoop:
    invoke ExitProcess,msg.wParam

end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -