Restructure project

This commit is contained in:
2025-02-03 02:04:33 +01:00
parent a97406c31f
commit d6f319e2ef
4 changed files with 154 additions and 50 deletions

View File

@@ -128,15 +128,13 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EntryPointSymbol>main</EntryPointSymbol>
</Link> </Link>
<MASM /> <MASM />
<MASM /> <MASM />
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<None Include="main.asm" /> <MASM Include="app.asm" />
</ItemGroup>
<ItemGroup>
<MASM Include="main2.asm" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@@ -15,12 +15,7 @@
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="main.asm"> <MASM Include="app.asm">
<Filter>Quelldateien</Filter>
</None>
</ItemGroup>
<ItemGroup>
<MASM Include="main2.asm">
<Filter>Quelldateien</Filter> <Filter>Quelldateien</Filter>
</MASM> </MASM>
</ItemGroup> </ItemGroup>

View File

@@ -22,6 +22,8 @@ GetClientRect PROTO
GetTickCount PROTO GetTickCount PROTO
PlaySoundA PROTO PlaySoundA PROTO
Sleep PROTO Sleep PROTO
MessageBoxA PROTO
KillTimer PROTO
RECT struct RECT struct
left dd ? left dd ?
@@ -51,12 +53,15 @@ RECT ends
myClassName db "TestKlasse", 0 myClassName db "TestKlasse", 0
myWindowTitle db "Tetris", 0 myWindowTitle db "Tetris", 0
GRID_SIZE_X EQU 20 GRID_SIZE_X EQU 30
GRID_SIZE_Y EQU 30 GRID_SIZE_Y EQU 40
BLOCK_PIXEL_LENGTH EQU 24 BLOCK_PIXEL_LENGTH EQU 25
GRID_NUM_ELEMENTS EQU GRID_SIZE_X * GRID_SIZE_Y GRID_NUM_ELEMENTS EQU GRID_SIZE_X * GRID_SIZE_Y
GRID_BYTE_SIZE EQU GRID_NUM_ELEMENTS GRID_BYTE_SIZE EQU GRID_NUM_ELEMENTS
StrPoints db "Score: ", 0
StrGameOver db "You have lost.",0
StrGameOverCaption db "Game Over!",0
.const ; Win32 Definitions --- .const ; Win32 Definitions ---
WS_OVERLAPPEDWINDOW EQU 13565952 WS_OVERLAPPEDWINDOW EQU 13565952
@@ -73,18 +78,18 @@ RECT ends
VK_S EQU 1F0001h VK_S EQU 1F0001h
VK_D EQU 200001h VK_D EQU 200001h
SND_ASYNC EQU 1 SND_ASYNC EQU 1
; Tetromino shape definitions ; Tetromino shape definitions
TETRO_0 db 2, 4, 1, "x x x xx" ; L ; width height color data
TETRO_1 db 2, 4, 2, " x x xxx" ; Reverse L TETRO_0 db 2, 3, 1, "x x xx" ; L
TETRO_1 db 2, 3, 2, " x xxx" ; J
TETRO_2 db 2, 2, 3, "xxxx" ; Block TETRO_2 db 2, 2, 3, "xxxx" ; Block
TETRO_3 db 4, 1, 4, "xxxx" ; Line TETRO_3 db 4, 1, 4, "xxxx" ; Line
TETRO_4 db 3, 2, 5, " xxxx " ; snake from BL to TR TETRO_4 db 3, 2, 5, " xxxx " ; S: snake from BL to TR
TETRO_5 db 3, 2, 6, "xx xx" ; snake from TR to BL TETRO_5 db 3, 2, 6, "xx xx" ; Z: from TR to BL
TETRO_6 db 3, 2, 7, " x xxx" ; penith TETRO_6 db 3, 2, 7, " x xxx" ; T
shapePoolStart: shapePoolStart:
TETRO_SHAPE_POOL dq TETRO_0, TETRO_1, TETRO_2, TETRO_3, TETRO_4, TETRO_5, TETRO_6 TETRO_SHAPE_POOL dq TETRO_0, TETRO_1, TETRO_2, TETRO_3, TETRO_4, TETRO_5, TETRO_6, TETRO_3
; Tetromino shape pool ; Tetromino shape pool
TETRO_SHAPE_POOL_SIZE EQU ($-shapePoolStart) / 8 TETRO_SHAPE_POOL_SIZE EQU ($-shapePoolStart) / 8
colorPoolStart: colorPoolStart:
@@ -110,6 +115,8 @@ RECT ends
hdc dq ? hdc dq ?
rndSeed dq ? rndSeed dq ?
skipNextGL db ? skipNextGL db ?
points dq ?
pointsBuf db 12 dup(?)
.code ; -------------------------- .code ; --------------------------
@@ -140,10 +147,12 @@ main PROC
; mov rax, OFFSET TETRO_0 ; mov rax, OFFSET TETRO_0
;mov qword ptr [TETRO_SHAPE_POOL], rax ;mov qword ptr [TETRO_SHAPE_POOL], rax
mov byte ptr [pointsBuf], '0'
call InitPlayField call InitPlayField
call LoadRandomTetromino call LoadRandomTetromino
call UpdatePointsString
mov rcx, 0 mov rcx, 0
mov rdx, 0 mov rdx, 0
@@ -152,7 +161,7 @@ main PROC
mov rdx, 0 mov rdx, 0
call GetTetroState call GetTetroState
mov qword ptr [points], 0
mov byte ptr [playerPosX], 0 mov byte ptr [playerPosX], 0
mov byte ptr [playerPosY], 0 mov byte ptr [playerPosY], 0
@@ -310,6 +319,40 @@ RandomRange PROC
ret ret
RandomRange ENDP RandomRange ENDP
; Unsigned integer to string
; rsi -> Target string address (must support at least 10 bytes)
; rax -> Integer value to be interpreted (32 bit)
IntToStr PROC
push rax ; Preserve
push r9 ; String index
push r10 ; Temporary register for digit character
push r11 ; Register for divison, holds the base
push rdx ; Holds the remainder
mov r8, 0
mov r9, 9 ; We start at the end of the string because little endian
mov r11, 10 ; The base we operate in
itos_loop:
cmp r9, -1 ; Check if we did the whole number (32 bit -> 8 bytes)
je itos_ret
mov rdx, 0
idiv r11
add rdx, '0' ; Convert to ASCII
mov byte ptr [rsi + r9], dl ; Move charater into the string
dec r9 ; Increase the string index
jmp itos_loop
itos_ret:
pop rdx
pop r11
pop r10
pop r9
pop rax
ret
IntToStr ENDP
LoadRandomTetromino PROC LoadRandomTetromino PROC
push rcx push rcx
push rdx push rdx
@@ -1048,32 +1091,44 @@ _loop_break:
MoveAllRowsDown ENDP MoveAllRowsDown ENDP
; (in) rcx row to clear ; (in) rcx row to clear
ClearRow PROC ; ClearRow PROC
push r8 ; push r8
xor r8, r8 ; xor r8, r8
_loop: ; _loop:
cmp r8, GRID_SIZE_X ; cmp r8, GRID_SIZE_X
je _loop_break ; je _loop_break
;
; push rcx
; push rdx
; push r8
; mov rdx, rcx
; mov rcx, r8
; mov r8, 0
; call SetFieldState
; pop r8
; pop rdx
; pop rcx
;
; inc r8
; jmp _loop
;
; _loop_break:
; pop r8
;
; ret
; ClearRow ENDP
push rcx UpdatePointsString PROC
push rdx push rsi
push r8 push rax
mov rdx, rcx mov rax, qword ptr [points]
mov rcx, r8 lea rsi, pointsBuf
mov r8, 0 call IntToStr
call SetFieldState
pop r8
pop rdx
pop rcx
inc r8
jmp _loop
_loop_break:
pop r8
pop rax
pop rsi
ret ret
ClearRow ENDP UpdatePointsString ENDP
CheckRowClear PROC CheckRowClear PROC
push rcx push rcx
@@ -1090,12 +1145,22 @@ innerloop:
test rax, rax test rax, rax
jz loop_continue jz loop_continue
inc r8 inc r8
call ClearRow ;call ClearRow
call MoveAllRowsDown call MoveAllRowsDown
jmp innerloop jmp innerloop
loop_continue: loop_continue:
; todo attrib points with combo in r8 push rax
push rdx
mov rax, r8
mul rax
mov r8, rax
pop rdx
pop rax
add qword ptr [points], r8
call UpdatePointsString
dec rcx dec rcx
jmp _loop jmp _loop
@@ -1128,7 +1193,23 @@ GamePaint PROC
call RenderPlayer call RenderPlayer
sub rsp, 16
mov rcx, [hdc]
mov rdx, 10
mov r8, 10
lea r9, OFFSET strPoints
mov dword ptr [rsp + 32], 6
call TextOutA
mov rcx, [hdc]
mov rdx, 60
mov r8, 10
lea r9, OFFSET pointsBuf
add r9, 5
mov dword ptr [rsp + 32], 5
call TextOutA
add rsp, 16
mov rcx, [hwndWindow] mov rcx, [hwndWindow]
mov rdx, ps mov rdx, ps
@@ -1319,14 +1400,44 @@ MovePlayerDown PROC
mov byte ptr [playerPosY], 0 mov byte ptr [playerPosY], 0
call LoadRandomTetromino call LoadRandomTetromino
push r10
decollide_loop: decollide_loop:
inc r10
cmp r10, 2048
jge decollide_gameOver
call IsPlayerJammed call IsPlayerJammed
test rax, rax test rax, rax
jz decollide_break jz decollide_break
dec [playerPosX] dec [playerPosX]
jmp decollide_loop jmp decollide_loop
decollide_gameOver:
push rcx
push rdx
push r8
push r9
mov rcx, 0
mov rdx, 1
sub rsp, 32
call KillTimer
add rsp, 32
mov rcx, 0
lea rdx, strGameOver
lea r8, strGameOverCaption
mov r9, 0
sub rsp, 32
;scall MessageBoxA
add rsp, 32
mov rcx, 0
call ExitProcess
pop r9
pop r8
pop rdx
pop rcx
decollide_break: decollide_break:
pop r10
cleanup: cleanup:
ret ret
MovePlayerDown ENDP MovePlayerDown ENDP

View File