fix(engine): resolve DDA division overflow crash and Pause mnemonic collision
This commit is contained in:
parent
fe4e38140d
commit
99fc93c700
6 changed files with 30379 additions and 30269 deletions
48
build.bat
48
build.bat
|
|
@ -1,14 +1,56 @@
|
|||
@echo off
|
||||
set MASM_PATH=D:\MASM32\masm32
|
||||
setlocal
|
||||
|
||||
rem Check standard MASM32 paths first
|
||||
if exist "D:\MASM32\masm32\bin\ml.exe" (
|
||||
set "ML_EXE=D:\MASM32\masm32\bin\ml.exe"
|
||||
set "LINK_EXE=D:\MASM32\masm32\bin\link.exe"
|
||||
set "LIB_PATHS=/LIBPATH:D:\MASM32\masm32\lib"
|
||||
set "EXTRA_FLAGS=/SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0"
|
||||
goto do_build
|
||||
)
|
||||
if exist "C:\masm32\bin\ml.exe" (
|
||||
set "ML_EXE=C:\masm32\bin\ml.exe"
|
||||
set "LINK_EXE=C:\masm32\bin\link.exe"
|
||||
set "LIB_PATHS=/LIBPATH:C:\masm32\lib"
|
||||
set "EXTRA_FLAGS=/SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0"
|
||||
goto do_build
|
||||
)
|
||||
|
||||
rem Fallback to Visual Studio / MSVC BuildTools
|
||||
set "MSVC_BIN=C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\bin\Hostx64\x86"
|
||||
set "SDK_LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x86"
|
||||
set "UCRT_LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x86"
|
||||
set "VC_LIB=C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\lib\x86"
|
||||
|
||||
if exist "%MSVC_BIN%\ml.exe" (
|
||||
set "ML_EXE=%MSVC_BIN%\ml.exe"
|
||||
set "LINK_EXE=%MSVC_BIN%\link.exe"
|
||||
set LIB_PATHS=/LIBPATH:"%SDK_LIB%" /LIBPATH:"%UCRT_LIB%" /LIBPATH:"%VC_LIB%"
|
||||
set "EXTRA_FLAGS=/NOLOGO /SUBSYSTEM:WINDOWS"
|
||||
goto do_build
|
||||
)
|
||||
|
||||
echo [ERROR] No compatible MASM/MSVC assembler found!
|
||||
goto err
|
||||
|
||||
:do_build
|
||||
echo Assembling poker.asm...
|
||||
"%MASM_PATH%\bin\ml.exe" /c /coff /Cp /nologo /I. /I"%MASM_PATH%\include" poker.asm
|
||||
"%ML_EXE%" /c /coff /Cp /nologo /I. poker.asm
|
||||
if errorlevel 1 goto err
|
||||
|
||||
echo Linking poker.obj...
|
||||
"%MASM_PATH%\bin\link.exe" /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"%MASM_PATH%\lib" /OUT:poker.exe poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib
|
||||
"%LINK_EXE%" %EXTRA_FLAGS% %LIB_PATHS% /OUT:poker.exe poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib
|
||||
if errorlevel 1 goto err
|
||||
|
||||
copy /y poker.exe build\graphics\poker.exe >nul 2>&1
|
||||
echo [SUCCESS] poker.exe built successfully!
|
||||
goto end
|
||||
|
||||
:err
|
||||
echo [ERROR] Build failed!
|
||||
pause
|
||||
exit /b 1
|
||||
|
||||
:end
|
||||
endlocal
|
||||
|
|
|
|||
|
|
@ -146,10 +146,10 @@ sz3DWindowTitle db "Assembler Casino - 2.5D",0
|
|||
szTexturesRelPath db "assets\textures\casino3d-hd.bin",0
|
||||
szTexturesFullPath db 260 dup(0)
|
||||
|
||||
soundCoin db "assets\audio\Звон падающей монеты.wav",0
|
||||
soundCoin db "assets\audio\Çâîí ïàäàþùåé ìîíåòû.wav",0
|
||||
soundCards db "assets\audio\playing_cards_deck_flick_through_001_20485.wav",0
|
||||
soundRoulette db "assets\audio\roulette-wheel-throw-2.wav",0
|
||||
soundJackpot db "assets\audio\Джекпот.wav",0
|
||||
soundJackpot db "assets\audio\Äæåêïîò.wav",0
|
||||
soundClick db "assets\audio\b05e1ac8be34248.wav",0
|
||||
|
||||
playerX dd (16 * FP_1 + FP_HALF)
|
||||
|
|
@ -179,12 +179,12 @@ promptBackroom db "BACKROOM - UNDER CONSTRUCTION",0
|
|||
promptDurak db "DURAK - UNDER CONSTRUCTION",0
|
||||
promptHell db "TOWER - UNDER CONSTRUCTION",0
|
||||
|
||||
msgDancerTipped db "Вы бросили $100 танцовщице! УДАЧА АКТИВИРОВАНА!",0
|
||||
msgNeedMoney db "Недостаточно денег в кошельке!",0
|
||||
statusHUDFormat db "БАНКРОЛЛ: $",0
|
||||
targetHUDFormat db " ЦЕЛЬ: $",0
|
||||
luckHUDFormat db " УДАЧА: +",0
|
||||
controlsHUD db "WASD/Стрелки: Ходьба | E: Действие | ESC: Меню",0
|
||||
msgDancerTipped db "Âû áðîñèëè $100 òàíöîâùèöå! ÓÄÀ×À ÀÊÒÈÂÈÐÎÂÀÍÀ!",0
|
||||
msgNeedMoney db "Íåäîñòàòî÷íî äåíåã â êîøåëüêå!",0
|
||||
statusHUDFormat db "ÁÀÍÊÐÎËË: $",0
|
||||
targetHUDFormat db " ÖÅËÜ: $",0
|
||||
luckHUDFormat db " ÓÄÀ×À: +",0
|
||||
controlsHUD db "WASD/Ñòðåëêè: Õîäüáà | E: Äåéñòâèå | ESC: Ìåíþ",0
|
||||
|
||||
NUM_SPRITES equ 13
|
||||
ALIGN 4
|
||||
|
|
@ -227,12 +227,12 @@ roulOutcomeMsg db 64 dup(0)
|
|||
shopMsg db 128 dup(0)
|
||||
atmMsg db 128 dup(0)
|
||||
|
||||
strWin db "ПОБЕДА! +$",0
|
||||
strLose db "ПРОИГРЫШ",0
|
||||
strJackpot db "ДЖЕКПОТ! +$",0
|
||||
strPush db "НИЧЬЯ (PUSH)",0
|
||||
strDealerBust db "ДИЛЕР ПЕРЕБРАЛ! ПОБЕДА! +$",0
|
||||
strPlayerBust db "ПЕРЕБОР (>21)! ПРОИГРЫШ",0
|
||||
strWin db "ÏÎÁÅÄÀ! +$",0
|
||||
strLose db "ÏÐÎÈÃÐÛØ",0
|
||||
strJackpot db "ÄÆÅÊÏÎÒ! +$",0
|
||||
strPush db "ÍÈ×Üß (PUSH)",0
|
||||
strDealerBust db "ÄÈËÅÐ ÏÅÐÅÁÐÀË! ÏÎÁÅÄÀ! +$",0
|
||||
strPlayerBust db "ÏÅÐÅÁÎÐ (>21)! ÏÐÎÈÃÐÛØ",0
|
||||
|
||||
sym7 db " 777 ",0
|
||||
symBar db " BAR ",0
|
||||
|
|
@ -763,11 +763,15 @@ calc_delta_x:
|
|||
neg eax
|
||||
@@:
|
||||
mov ebx, eax
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
cmp ebx, 4
|
||||
jbe delta_x_clamp
|
||||
xor eax, eax
|
||||
mov edx, 1
|
||||
idiv ebx
|
||||
div ebx
|
||||
mov deltaDistX, eax
|
||||
jmp calc_delta_y
|
||||
delta_x_clamp:
|
||||
mov deltaDistX, 7FFFFFFFh
|
||||
|
||||
calc_delta_y:
|
||||
mov eax, rayDirY
|
||||
|
|
@ -781,11 +785,15 @@ calc_delta_y_ok:
|
|||
neg eax
|
||||
@@:
|
||||
mov ebx, eax
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
cmp ebx, 4
|
||||
jbe delta_y_clamp
|
||||
xor eax, eax
|
||||
mov edx, 1
|
||||
idiv ebx
|
||||
div ebx
|
||||
mov deltaDistY, eax
|
||||
jmp check_step
|
||||
delta_y_clamp:
|
||||
mov deltaDistY, 7FFFFFFFh
|
||||
|
||||
check_step:
|
||||
cmp rayDirX, 0
|
||||
|
|
@ -988,6 +996,13 @@ select_tex:
|
|||
mov drawEnd, SCREEN_H - 1
|
||||
@@:
|
||||
|
||||
mov eax, lineH
|
||||
cmp eax, 1
|
||||
jge @F
|
||||
mov eax, 1
|
||||
mov lineH, eax
|
||||
@@:
|
||||
|
||||
mov eax, 128 * FP_1
|
||||
cdq
|
||||
idiv lineH
|
||||
|
|
@ -1151,13 +1166,22 @@ draw_spr_loop:
|
|||
; Sample animation by elapsed time. Pausing freezes the clock.
|
||||
push eax
|
||||
mov ecx, [casinoSprites + eax].animSpeed
|
||||
cmp ecx, 0
|
||||
jg @F
|
||||
mov ecx, 1
|
||||
@@:
|
||||
imul ecx, 40
|
||||
mov eax, animationClock3D
|
||||
xor edx, edx
|
||||
div ecx
|
||||
pop ebx
|
||||
mov ecx, [casinoSprites + ebx].frameCount
|
||||
cmp ecx, 0
|
||||
jg @F
|
||||
mov ecx, 1
|
||||
@@:
|
||||
xor edx, edx
|
||||
div [casinoSprites + ebx].frameCount
|
||||
div ecx
|
||||
mov [casinoSprites + ebx].curFrame, edx
|
||||
mov eax, ebx
|
||||
|
||||
|
|
@ -1181,8 +1205,14 @@ draw_spr_loop:
|
|||
imul playerPlaneY
|
||||
shrd eax, edx, 16
|
||||
sub ebx, eax
|
||||
test ebx, ebx
|
||||
jz next_spr
|
||||
|
||||
mov eax, ebx
|
||||
test eax, eax
|
||||
jns @F
|
||||
neg eax
|
||||
@@:
|
||||
cmp eax, 4
|
||||
jbe next_spr
|
||||
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
xor eax, eax
|
||||
|
|
@ -1238,6 +1268,10 @@ draw_spr_loop:
|
|||
test eax, eax
|
||||
jns @F
|
||||
neg eax
|
||||
@@:
|
||||
cmp eax, 1
|
||||
jge @F
|
||||
jmp next_spr
|
||||
@@:
|
||||
cmp eax, SCREEN_H * 2
|
||||
jle @F
|
||||
|
|
|
|||
30238
build/graphics/poker.asm
30238
build/graphics/poker.asm
File diff suppressed because it is too large
Load diff
Binary file not shown.
48
casino3d.inc
48
casino3d.inc
|
|
@ -763,11 +763,15 @@ calc_delta_x:
|
|||
neg eax
|
||||
@@:
|
||||
mov ebx, eax
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
cmp ebx, 4
|
||||
jbe delta_x_clamp
|
||||
xor eax, eax
|
||||
mov edx, 1
|
||||
idiv ebx
|
||||
div ebx
|
||||
mov deltaDistX, eax
|
||||
jmp calc_delta_y
|
||||
delta_x_clamp:
|
||||
mov deltaDistX, 7FFFFFFFh
|
||||
|
||||
calc_delta_y:
|
||||
mov eax, rayDirY
|
||||
|
|
@ -781,11 +785,15 @@ calc_delta_y_ok:
|
|||
neg eax
|
||||
@@:
|
||||
mov ebx, eax
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
cmp ebx, 4
|
||||
jbe delta_y_clamp
|
||||
xor eax, eax
|
||||
mov edx, 1
|
||||
idiv ebx
|
||||
div ebx
|
||||
mov deltaDistY, eax
|
||||
jmp check_step
|
||||
delta_y_clamp:
|
||||
mov deltaDistY, 7FFFFFFFh
|
||||
|
||||
check_step:
|
||||
cmp rayDirX, 0
|
||||
|
|
@ -988,6 +996,13 @@ select_tex:
|
|||
mov drawEnd, SCREEN_H - 1
|
||||
@@:
|
||||
|
||||
mov eax, lineH
|
||||
cmp eax, 1
|
||||
jge @F
|
||||
mov eax, 1
|
||||
mov lineH, eax
|
||||
@@:
|
||||
|
||||
mov eax, 128 * FP_1
|
||||
cdq
|
||||
idiv lineH
|
||||
|
|
@ -1151,13 +1166,22 @@ draw_spr_loop:
|
|||
; Sample animation by elapsed time. Pausing freezes the clock.
|
||||
push eax
|
||||
mov ecx, [casinoSprites + eax].animSpeed
|
||||
cmp ecx, 0
|
||||
jg @F
|
||||
mov ecx, 1
|
||||
@@:
|
||||
imul ecx, 40
|
||||
mov eax, animationClock3D
|
||||
xor edx, edx
|
||||
div ecx
|
||||
pop ebx
|
||||
mov ecx, [casinoSprites + ebx].frameCount
|
||||
cmp ecx, 0
|
||||
jg @F
|
||||
mov ecx, 1
|
||||
@@:
|
||||
xor edx, edx
|
||||
div [casinoSprites + ebx].frameCount
|
||||
div ecx
|
||||
mov [casinoSprites + ebx].curFrame, edx
|
||||
mov eax, ebx
|
||||
|
||||
|
|
@ -1181,8 +1205,14 @@ draw_spr_loop:
|
|||
imul playerPlaneY
|
||||
shrd eax, edx, 16
|
||||
sub ebx, eax
|
||||
test ebx, ebx
|
||||
jz next_spr
|
||||
|
||||
mov eax, ebx
|
||||
test eax, eax
|
||||
jns @F
|
||||
neg eax
|
||||
@@:
|
||||
cmp eax, 4
|
||||
jbe next_spr
|
||||
|
||||
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
|
||||
xor eax, eax
|
||||
|
|
@ -1238,6 +1268,10 @@ draw_spr_loop:
|
|||
test eax, eax
|
||||
jns @F
|
||||
neg eax
|
||||
@@:
|
||||
cmp eax, 1
|
||||
jge @F
|
||||
jmp next_spr
|
||||
@@:
|
||||
cmp eax, SCREEN_H * 2
|
||||
jle @F
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue