Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .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\kernel32.inc
- include \masm32\include\user32.inc
- include \masm32\include\gdi32.inc
- include \masm32\include\Advapi32.inc
- ;include \masm32\include\masm32rt.inc
- include \masm32\include\winmm.inc
- includelib \masm32\lib\winmm.lib
- include \masm32\include\dialogs.inc ; macro file for dialogs
- include \masm32\macros\macros.asm ; masm32 macro file
- includelib \masm32\lib\gdi32.lib
- includelib \masm32\lib\user32.lib
- includelib \masm32\lib\kernel32.lib
- includelib \masm32\lib\Comctl32.lib
- includelib \masm32\lib\comdlg32.lib
- includelib \masm32\lib\shell32.lib
- includelib \masm32\lib\oleaut32.lib
- includelib \masm32\lib\ole32.lib
- includelib \masm32\lib\msvcrt.lib
- .const
- BARRIER_SIZE equ 50
- JMP_HEIGHT equ 100
- JMP_SPEED equ 4
- VEL_X equ 1
- VEL_Y equ 1
- RECT_WIDTH_BACKUP equ 30
- RECT_HEIGHT_BACKUP equ 20
- WINDOW_WIDTH equ 815
- WINDOW_HEIGHT equ 600
- RIGHT equ 1
- DOWN equ 2
- LEFT equ 3
- UP equ 4
- MAIN_TIMER_ID equ 0
- .data
- RECT_WIDTH DWORD 30
- RECT_HEIGHT DWORD 20
- PlayerX DWORD 400
- PlayerY DWORD 530
- caption db "Hello",0
- text db "I got into here",0
- ;Facing DWORD LEFT ;1 - Right, 2 -Down, 3 - Left, 4 - Up
- ClassName DB "TheClass",0
- windowTitle DB "A Game!",0
- jmpingDown db 0
- jmpingUp db 0
- StartY DWORD ?
- dstY DWORD ?
- BlockOnStage BYTE 0
- BlockX DWORD 400
- BlockY DWORD 0
- BlockType DWORD 0
- BlockMode DWORD 0
- FramesPassedSinceLastFlip1 DWORD 10
- FramesPassedSinceLastFlip2 DWORD 10
- FramesPassedSinceLastFlip3 DWORD 10
- RIGHTESTBLOCK DWORD 100
- LOWESTBLOCK DWORD 0
- LEFTESTBLOCK DWORD 0
- CurrentBlockType DWORD 0
- CurrentBlockMode DWORD 0
- OldCubes DWORD 1000 dup(0)
- count DWORD 0
- .code
- BUILDRECT PROC, x:DWORD, y:DWORD, h:DWORD, w:DWORD, hdc:HDC, brush:HBRUSH
- LOCAL rectangle:RECT
- mov eax, x
- mov rectangle.left, eax
- add eax, w
- mov rectangle.right, eax
- mov eax, y
- mov rectangle.top, eax
- add eax, h
- mov rectangle.bottom, eax
- invoke FillRect, hdc, addr rectangle, brush
- ret
- BUILDRECT ENDP
- BUILDBLOCK PROC, x:DWORD, y:DWORD, blocktype:DWORD, blockmode:DWORD, hdc:HDC, brush:HBRUSH ;0 - down, 1- right, 2-up, 3 - left
- cmp blocktype, 0
- je block0
- cmp blocktype, 1
- je block1
- cmp blocktype, 2
- je block2
- cmp blocktype, 3
- je block3
- cmp blocktype, 4
- je block4
- cmp blocktype, 5
- je block5
- cmp blocktype, 6
- je block6
- cmp blocktype, 7
- je block7
- block0:
- cmp blockmode, 0
- je block00
- cmp blockmode, 2
- je block02
- cmp blockmode, 1
- je block01
- cmp blockmode, 3
- je block03
- block00:
- cmp y, 600 - 40*4; - 40 ;DO NOT LET Y EXCEED 530
- jl drawnormally00
- mov y, 600- 40*4 + 1
- drawnormally00:
- invoke BUILDRECT, x, y, 40 * 4, 40, hdc, brush
- mov eax, x
- mov LEFTESTBLOCK, eax
- sub LEFTESTBLOCK, 2
- mov RIGHTESTBLOCK, eax
- add RIGHTESTBLOCK, 40
- mov eax, y
- mov LOWESTBLOCK, eax
- add LOWESTBLOCK, 40*4
- jmp endBlockDraw
- block01:
- cmp y, 600 - 40 ;DO NOT LET Y EXCEED 530
- jl drawnormally01
- mov y, 600- 40 + 1
- drawnormally01:
- mov eax, x
- mov LEFTESTBLOCK, eax
- sub LEFTESTBLOCK, 2
- mov RIGHTESTBLOCK, eax
- add RIGHTESTBLOCK, 40*4
- mov eax, y
- mov LOWESTBLOCK, eax
- add LOWESTBLOCK, 40
- invoke BUILDRECT, x, y, 40, 40*4, hdc, brush
- jmp endBlockDraw
- block02:
- cmp y, 600 - 40 ;DO NOT LET Y EXCEED 530
- jl drawnormally02
- mov y, 600- 40+ 1
- drawnormally02:
- mov ebx, y
- sub ebx, 40*3
- invoke BUILDRECT, x, ebx, 40 * 4, 40, hdc, brush
- mov eax, x
- mov LEFTESTBLOCK, eax
- mov RIGHTESTBLOCK, eax
- add RIGHTESTBLOCK, 40
- mov eax, y
- mov LOWESTBLOCK, eax
- add LOWESTBLOCK, 40
- jmp endBlockDraw
- block03:
- push x
- sub x, 40*4-40
- cmp y, 600 - 40 ;DO NOT LET Y EXCEED 530
- jl drawnormally03
- mov y, 600- 40 + 1
- drawnormally03:
- invoke BUILDRECT, x, y, 40, 40 *4, hdc, brush
- mov eax, x
- mov LEFTESTBLOCK, eax
- mov RIGHTESTBLOCK, eax
- add RIGHTESTBLOCK, 40*4
- mov eax, y
- mov LOWESTBLOCK, eax
- add LOWESTBLOCK, 40
- pop x
- jmp endBlockDraw
- block1:
- block2:
- block3:
- block4:
- block5:
- block6:
- block7:
- endBlockDraw:
- ret
- BUILDBLOCK ENDP
- ProjectWndProc PROC, hWnd:HWND, message:UINT, wParam:WPARAM, lParam:LPARAM
- local paint:PAINTSTRUCT
- local hdc:HDC
- local brushcolouring:HBRUSH
- ;invoke SetCursorPos, 10000, 10000
- inc FramesPassedSinceLastFlip2
- inc FramesPassedSinceLastFlip3
- invoke GetAsyncKeyState, VK_RIGHT
- cmp eax, 0
- je checkleft
- mov eax, RIGHTESTBLOCK
- add eax, 16
- cmp eax, WINDOW_WIDTH
- jge thecheck ;check right border
- cmp FramesPassedSinceLastFlip3, 20
- jl checkleft ;check that there is a delay between clicks
- mov FramesPassedSinceLastFlip3, 0
- ;invoke GetPixel,
- normalmoveright:
- add BlockX, 40
- jmp thecheck
- checkleft:
- invoke GetAsyncKeyState, VK_LEFT
- cmp eax, 0
- je thecheck
- cmp LEFTESTBLOCK, 0
- jng thecheck
- cmp FramesPassedSinceLastFlip2, 20
- jl thecheck
- mov FramesPassedSinceLastFlip2, 0
- sub BlockX, 40
- jmp thecheck
- thecheck:
- inc FramesPassedSinceLastFlip1
- invoke GetAsyncKeyState, VK_UP
- cmp eax, 0
- je checkmessages
- cmp FramesPassedSinceLastFlip1, 30
- jl checkmessages
- mov FramesPassedSinceLastFlip1, 0
- inc BlockMode
- checkmessages:
- ;invoke SetCursorPos, 10000, 10000
- cmp message, WM_PAINT
- je painting
- cmp message, WM_CLOSE
- je closing
- ;cmp message, WM_KEYDOWN
- ;je movement
- ;cmp message, WM_KEYUP
- ;je stopmovement
- cmp message, WM_TIMER
- je timing
- jmp OtherInstances
- closing:
- invoke ExitProcess, 0
- painting:
- ;invoke SetCursorPos, 10000, 10000
- invoke BeginPaint, hWnd, addr paint
- mov hdc, eax
- invoke GetStockObject, DC_BRUSH
- mov brushcolouring, eax
- invoke SelectObject, hdc, brushcolouring
- invoke SetDCBrushColor, hdc, 0000FFh
- mov brushcolouring, eax
- cmp count, 0
- je AfterDrawingOldMalbenim
- pusha
- push CurrentBlockType
- push BlockMode
- push BlockX
- push BlockY
- push brushcolouring
- ;~~~~~~~~~~~~draw old malbenim
- mov ecx, count
- mov ebx, offset OldCubes
- drawold:
- mov eax, DWORD ptr [ebx]
- mov CurrentBlockType, eax
- add ebx, 4
- mov eax, DWORD ptr [ebx]
- mov BlockMode ,eax
- add ebx, 4
- mov eax, DWORD ptr [ebx]
- mov BlockX, eax
- add ebx, 4
- mov eax, DWORD ptr [ebx]
- mov BlockY, eax
- add ebx, 4
- mov eax, DWORD ptr [ebx]
- mov brushcolouring, eax
- add ebx, 4
- pusha
- invoke BUILDBLOCK, BlockX, BlockY, CurrentBlockType, BlockMode, hdc, brushcolouring
- popa
- loop drawold
- ;~~~~~~~~~~~~draw old malbenim
- pop brushcolouring
- pop BlockY
- pop BlockX
- pop BlockMode
- pop CurrentBlockType
- popa
- AfterDrawingOldMalbenim:
- mov edx, 0
- mov eax, BlockMode
- mov ebx, 4
- div ebx ;eax = eax
- invoke BUILDBLOCK, BlockX, BlockY, CurrentBlockType, edx, hdc, brushcolouring
- cmp LOWESTBLOCK, WINDOW_HEIGHT -1
- jl advance
- changeblock:
- ;Create new block, add current block to old blocks
- mov edx, 0
- mov eax, BlockMode
- mov ebx, 4
- div ebx
- push edx
- mov eax, count
- mov ebx, 5*4
- imul ebx
- mov ebx, offset OldCubes
- add ebx, eax
- mov eax, CurrentBlockType
- mov DWORD ptr [ebx], eax
- add ebx, 4
- pop edx
- mov DWORD ptr [ebx], edx
- add ebx, 4
- mov eax, BlockX
- mov DWORD ptr [ebx], eax
- add ebx, 4
- mov eax, BlockY
- mov DWORD ptr [ebx], eax
- add ebx, 4
- mov eax, brushcolouring
- mov DWORD ptr [ebx], eax
- mov BlockX, 400
- mov BlockY, 0
- inc count
- ret
- advance:
- add BlockY, 3
- ;sub LOWESTBLOCK, 40
- invoke GetPixel, hdc, BlockX, LOWESTBLOCK
- ;add LOWESTBLOCK, 40
- cmp eax, 0000h
- jne changeblock
- invoke EndPaint, hWnd, addr paint
- ret
- timing:
- invoke InvalidateRect, hWnd, NULL, TRUE
- ret
- OtherInstances:
- invoke DefWindowProc, hWnd, message, wParam, lParam
- ret
- ProjectWndProc ENDP
- main PROC
- LOCAL wndcls:WNDCLASSA ; Class struct for the window
- LOCAL hWnd:HWND ;Handle to the window
- LOCAL msg:MSG
- invoke RtlZeroMemory, addr wndcls, SIZEOF wndcls ;Empty the window class
- mov eax, offset ClassName
- mov wndcls.lpszClassName, eax ;Set the class name
- invoke GetStockObject, BLACK_BRUSH
- mov wndcls.hbrBackground, eax ;Set the background color as black
- mov eax, ProjectWndProc
- mov wndcls.lpfnWndProc, eax ;Set the procedure that handles the window messages
- invoke RegisterClassA, addr wndcls ;Register the class
- invoke CreateWindowExA, WS_EX_COMPOSITED, addr ClassName, addr windowTitle, WS_SYSMENU, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0, 0 ;Create the window
- mov hWnd, eax ;Save the handle
- invoke ShowWindow, eax, SW_SHOW ;Show it
- invoke SetTimer, hWnd, MAIN_TIMER_ID, 20, NULL ;Set the repaint timer
- msgLoop:
- ; PeekMessage
- invoke GetMessage, addr msg, hWnd, 0, 0 ;Retrieve the messages from the window
- invoke DispatchMessage, addr msg ;Dispatches a message to the window procedure
- jmp msgLoop
- invoke ExitProcess, 1
- main ENDP
- end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement