Эффект пламени

Тема в разделе "WASM.X64", создана пользователем Mikl___, 17 июл 2024.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Переделанная для masm x64 программа ManHunter'a
    00.jpg
    Чтобы пламя красиво гасло, установим палитру так:
    Номер
    цвета
    0→63​
    64→127​
    128→134
    135→189​
    190→255​
    Цветчерныйкрасный
    желтый​
    ярко-
    желтый​
    белый​
    a
    rc-файл
    Код (C++):
    1. #include "resource.h"
    2. #define ID_DIALOG 100
    3. ID_DIALOG DIALOG 0, 0, 200, 144
    4. STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
    5. CAPTION "Fire Effect Demo"
    6. FONT 8, "MS Sans Serif"
    7. {
    8.    CONTROL "Exit", IDCANCEL, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 148, 126, 50, 15
    9. }
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ; Размеры окна
    4. WINDOW_WIDTH  equ 300
    5. WINDOW_HEIGHT equ 202
    6. ID_DIALOG     equ 100
    7. .code
    8. WinMain proc dummy:qword
    9.        and qword ptr[rsp+20h],0
    10.        invoke  DialogBoxParam,IMAGE_BASE,ID_DIALOG,HWND_DESKTOP,&DialogProc
    11.        invoke RtlExitUserProcess,NULL
    12. WinMain endp
    13. ;---------------------------------------------
    14. DialogProc proc hwnddlg:qword,msg:qword,wparam:qword,lparam:qword
    15. local ps:PAINTSTRUCT
    16. local hCompDC:qword
    17. local hBitmap:dword
    18. local hOldBitmap:qword
    19.         mov hwnddlg,rcx
    20.         cmp edx,WM_INITDIALOG
    21.         je      wmINITDIALOG
    22.         cmp edx,WM_COMMAND
    23.         je      wmCOMMAND
    24.         cmp edx,WM_CLOSE
    25.         je      wmCLOSE
    26.         cmp edx,WM_TIMER
    27.         je      wmTIMER
    28.         cmp edx,WM_PAINT
    29.         je      wmPAINT
    30.         cmp edx,WM_LBUTTONDOWN
    31.         jne     wmBYE
    32. drag_window: ;Перетаскивание окна за любое место
    33.         invoke ReleaseCapture
    34.         invoke  SendMessage,hwnddlg,WM_SYSCOMMAND,SC_MOVE or HTCAPTION,0
    35.         jmp     wmBYE
    36. wmINITDIALOG:; Инициализация ГПСЧ
    37.         invoke  GetTickCount
    38.         mov     random_seed,eax
    39.         ; Шрифт текста
    40.         pushaddr szFont
    41.         push FIXED_PITCH or FF_DONTCARE
    42.         push PROOF_QUALITY
    43.         push CLIP_DEFAULT_PRECIS
    44.         push OUT_RASTER_PRECIS
    45.         push ANSI_CHARSET
    46.         push FALSE
    47.         push FALSE
    48.         push FALSE
    49.         push FW_BOLD
    50.         sub esp,20h
    51.         invoke CreateFont,80,25,0,0
    52.         mov     hFont,rax
    53.         invoke GlobalAlloc,GMEM_ZEROINIT or GMEM_FIXED,256*4
    54.         mov palette,rax
    55.         ; Заполнить палитру
    56.         mov     edi,eax;palette
    57.         mov     ecx,64;от 0 до 63
    58. @@:     mov     eax,64
    59.         sub     eax,ecx
    60.         shl     eax,2
    61.         stosd;eax от 0 до 63*4=0FC0000h (от черного к красному)
    62.         loop    @b
    63.         mov     ecx,64;от 64 к 127
    64. @@:     mov     eax,64
    65.         sub     eax,ecx
    66.         shl     eax,10
    67.         or al,0FFh
    68.         stosd;eax от 0FF0000h до 0FF0200h (от красного к темно-желтому)
    69.         loop    @b
    70.         mov     ecx,64;от 128 к 191
    71. @@:     mov     eax,64
    72.         sub     eax,ecx
    73.         shl     eax,10
    74.         bswap   eax
    75.         or ax,0FFFFh
    76.         stosd;eax от 0FFFF00h до 0FFFF76h (от желтого к белому)
    77.         loop    @b
    78.         mov     ecx,65;от 192 к 255
    79.         mov     eax,0FFFFFFh
    80.         rep     stosd;белый
    81.         ; Чем меньше интервал таймера, тем быстрее горит огонь
    82.         invoke  SetTimer,hwnddlg,1,50,NULL
    83.         invoke GlobalAlloc,GMEM_ZEROINIT or GMEM_FIXED,WINDOW_WIDTH*WINDOW_HEIGHT
    84.         mov px_data,rax
    85.         jmp     wmBYE
    86. wmTIMER:; Интервал между появлением текста
    87.         cmp     text_interval,0
    88.         jne     @f
    89.         ; Вывести текст на форму
    90.         call FireText
    91.         ; Следующая строка
    92.         mov     text_interval,100
    93.         mov ecx,pointer
    94.         invoke  lstrlen
    95.         inc     eax
    96.         add     pointer,eax
    97.         ; Строки закончились?
    98.         mov ecx,pointer
    99.         invoke  lstrlen
    100.         or      eax,eax
    101.         jnz     @f
    102.         ; Перемотать указатель на начало списка
    103.         mov     pointer,offset text
    104. @@:     dec     text_interval
    105.         ; Заполнить нижнюю линию изображения
    106.         invoke WIRandom,WINDOW_WIDTH-1
    107.         inc     eax
    108.         xor     edx,edx
    109.         mov     ecx,WINDOW_WIDTH
    110.         xchg    eax,ecx
    111.         div     ecx
    112.         mov     edi,eax
    113.         mov     esi,WINDOW_WIDTH*(WINDOW_HEIGHT-1)
    114.         add     esi,eax
    115. loc_fill:invoke WIRandom,100
    116.         mov rdx,px_data
    117.         or bl,255
    118.         cmp     eax,11
    119.         jbe     @f
    120.         and     bl,0
    121.         cmp     eax,19
    122.         jbe     @f
    123.         mov     bl,[rdx+rsi-1]
    124.         cmp     eax,59
    125.         jbe     @f
    126.         mov     bl,[rdx+rsi+1]
    127. @@:     mov     [rdx+rsi],bl
    128.         inc     esi
    129.         inc     edi
    130.         cmp     edi,(WINDOW_WIDTH-1)
    131.         jb      loc_fill
    132.         ; Смиксовать ближайшие точки
    133.         mov     esi,WINDOW_WIDTH*(WINDOW_HEIGHT-1)-1
    134.         mov rdx,px_data
    135. loc_mix:movzx eax,byte ptr[rdx+rsi]
    136.         add     al,[rdx+rsi+WINDOW_WIDTH]
    137.         adc     ah,0
    138.         add     al,[rdx+rsi+WINDOW_WIDTH+1]
    139.         adc     ah,0
    140.         add     al,[rdx+rsi+WINDOW_WIDTH-1]
    141.         adc     ah,0
    142.         dec     eax
    143.         jns     @f
    144.         xor     eax,eax
    145. @@:     shr     eax,2
    146.         mov     [rdx+rsi],al
    147.         dec     esi
    148.         jnz     loc_mix
    149.         ; Обновить содержимое окна
    150.         invoke  InvalidateRect,hwnddlg,NULL,NULL
    151.         jmp     wmBYE
    152. wmPAINT:invoke  BeginPaint,,&ps
    153.         mov     hDC,rax
    154.         invoke  CreateCompatibleDC,eax
    155.         mov     hCompDC,rax
    156.         invoke  CreateCompatibleBitmap,hDC,WINDOW_WIDTH,WINDOW_HEIGHT
    157.         mov     hBitmap,eax
    158.         invoke  SelectObject,hCompDC,eax
    159.         mov     hOldBitmap,rax
    160.         ; Перенести точки на холст
    161.         mov     esi,WINDOW_WIDTH*WINDOW_HEIGHT
    162.         mov rdi,palette
    163. @@:      mov rdx,px_data
    164.         movzx   ebx,byte ptr[rdx+rsi]
    165.         xor     edx,edx
    166.         mov     eax,esi
    167.         mov     ecx,WINDOW_WIDTH
    168.         div     ecx
    169.        mov r8d,eax
    170.        mov r9d,[rdi+rbx*4]
    171.         invoke  SetPixel,hCompDC
    172.         dec     esi
    173.         jnz     @b
    174.         invoke  SetBkMode,hDC,OPAQUE
    175.         cmp     text_interval,90
    176.         ja      @f
    177.         ; Шрифт
    178.         invoke  SelectObject,hCompDC,hFont
    179.         invoke  SetBkMode,hCompDC,TRANSPARENT
    180.         ; Вывести текст на форму
    181.         invoke  SetTextColor,hCompDC,0
    182.         add     rc.right,6
    183.         add     rc.top,6
    184.         mov qword ptr [rsp+20h],DT_VCENTER or DT_CENTER or DT_NOPREFIX or DT_SINGLELINE
    185.         mov edx,pointer
    186.         invoke  DrawText,hCompDC,,-1,&rc
    187.         sub     rc.right,6
    188.         sub     rc.top,6
    189.         invoke  SetTextColor,hCompDC,0FFFFFFh
    190.         mov qword ptr [rsp+20h],DT_VCENTER or DT_CENTER or DT_NOPREFIX or DT_SINGLELINE
    191.         mov edx,pointer
    192.        invoke  DrawText,hCompDC,,-1,&rc
    193. @@:    xor edx,edx
    194.        push SRCCOPY
    195.        push rdx
    196.        push rdx
    197.        push hCompDC
    198.        push WINDOW_HEIGHT-2
    199.        sub esp,20h
    200.        invoke  BitBlt,hDC,,0,WINDOW_WIDTH
    201.         ; Прибраться за собой
    202.        invoke  SelectObject,hCompDC,hOldBitmap
    203.        mov ecx,hBitmap
    204.         invoke  DeleteObject
    205.         invoke  DeleteDC,hCompDC
    206.         invoke  EndPaint,hwnddlg,&ps
    207.         jmp     wmBYE
    208. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
    209.         jne     wmBYE
    210. wmCLOSE:invoke  EndDialog,,0
    211.        invoke GlobalFree,px_data
    212.        invoke GlobalFree,palette
    213. wmBYE: xor eax,eax
    214.        leave
    215.         retn
    216. DialogProc endp
    217. FireText proc
    218. local hzCompDC:qword
    219. local hzBitmap:qword
    220. local hzDC:qword
    221. local zps:PAINTSTRUCT
    222.         ; Нанести надпись
    223.         invoke  CreateCompatibleDC,NULL
    224.         mov     hzCompDC,rax
    225.         invoke  CreateCompatibleBitmap,eax,WINDOW_WIDTH,WINDOW_HEIGHT
    226.         mov     hzBitmap,rax
    227.         invoke  SelectObject,hzCompDC,eax
    228.         invoke  FillRect,hzCompDC,&rc,0
    229.         ; Шрифт
    230.         invoke  SelectObject,hzCompDC,hFont
    231.         invoke  SetTextColor,hzCompDC,0FF00h
    232.        mov qword ptr [rsp+20h],DT_VCENTER or DT_CENTER or DT_NOPREFIX or DT_SINGLELINE
    233.        mov edx,pointer
    234.         invoke  DrawText,hzCompDC,,-1,&rc
    235.         ; Перенести точки на холст
    236.         mov     esi,WINDOW_WIDTH*WINDOW_HEIGHT
    237. @@:     xor     edx,edx
    238.         mov     eax,esi
    239.         mov     ecx,WINDOW_WIDTH
    240.         div     ecx
    241.         invoke  GetPixel,hzCompDC,,eax
    242.         dec     esi
    243.         jz      @f
    244.         or eax,eax
    245.          jne     @b
    246.         mov rdx,px_data
    247.         or byte ptr [rdx+rsi+1],255
    248.         jmp     @b
    249. @@: invoke  DeleteObject,hzBitmap
    250.         invoke  DeleteDC,hzCompDC
    251.         leave
    252.         ret
    253. FireText endp
    254. ;---------------------------------------------
    255. ; Park Miller random number algorithm
    256. ; Получить случайное число в нужном интервале от 1 до max
    257. ; на выходе EAX - случайное число
    258. ;---------------------------------------------
    259. WIRandom proc    rmax:dword
    260.         mov rmax,ecx
    261.         mov     eax,random_seed
    262.         or      eax,eax
    263.         ; Модификация против зацикливания генератора
    264.         ; на случай если в random_seed будет нулевое значение
    265.         jnz     @f
    266.         rdtsc
    267.         xor     eax,edx
    268.         mov     random_seed,eax
    269. @@:     xor     edx,edx
    270.         mov     ecx,127773
    271.         div     ecx
    272.         mov     ecx,eax
    273.         mov     eax,16807
    274.         mul     edx
    275.         mov     edx,ecx
    276.         mov     ecx,eax
    277.         mov     eax,2836
    278.         mul     edx
    279.         sub     ecx,eax
    280.         xor     edx,edx
    281.         mov     eax,ecx
    282.         mov     random_seed,ecx
    283.         mov     ecx,100000
    284.         div     ecx
    285.         mov     eax,edx
    286.         xor     edx,edx
    287.         div     rmax
    288.         lea     eax,[rdx+1]
    289.         leave
    290.         ret
    291. WIRandom endp
    292. .data
    293. text    db 'ManHunter',0,'presents',0,'FIRE DEMO',0,0
    294. szFont  db 'Arial',0
    295. text_interval  dd 29
    296. pointer dd text
    297. rc       RECT <0,0,WINDOW_WIDTH,WINDOW_HEIGHT>
    298. .data?
    299. px_data dq ?
    300. palette dq ?
    301. random_seed  dd ?
    302. hDC     dq ?
    303. hFont   dq ?
    304. end
    Во вложении asm-/rc-/exe-файлы
     

    Вложения:

    • fire_demo.zip
      Размер файла:
      5 КБ
      Просмотров:
      97
    miilalex, Win32Api, __sheva740 и 4 другим нравится это.