Fix atan2, failed in mathtest.c

This commit is contained in:
drmortalwombat 2023-12-30 09:21:17 +01:00
parent 064bf0f8e5
commit da20b4d27a
7 changed files with 57 additions and 13 deletions

View File

@ -54,6 +54,9 @@ rem @echo off
@call :testh stdlibtest.c @call :testh stdlibtest.c
@if %errorlevel% neq 0 goto :error @if %errorlevel% neq 0 goto :error
@call :test mathtest.c
@if %errorlevel% neq 0 goto :error
@call :test testint16.c @call :test testint16.c
@if %errorlevel% neq 0 goto :error @if %errorlevel% neq 0 goto :error

View File

@ -218,22 +218,30 @@ void vspr_hide(char sp)
void vspr_sort(void) void vspr_sort(void)
{ {
spriteYPos[1] = vspriteYLow[spriteOrder[0]]; byte rm = vspriteYLow[spriteOrder[0]];
spriteYPos[1] = rm;
for(char i = 1; i<VSPRITES_MAX; i++) for(char i = 1; i<VSPRITES_MAX; i++)
{ {
byte ri = spriteOrder[i]; byte ri = spriteOrder[i];
byte rr = vspriteYLow[ri]; byte rr = vspriteYLow[ri];
byte j = i, rj = spriteYPos[j]; if (rr < rm)
while (rr < rj)
{ {
spriteYPos[j + 1] = rj; byte j = i, rj = rm;
spriteOrder[j] = spriteOrder[j - 1]; do {
rj = spriteYPos[j - 1]; spriteYPos[j + 1] = rj;
j--; spriteOrder[j] = spriteOrder[j - 1];
rj = spriteYPos[j - 1];
j--;
} while (rr < rj);
spriteOrder[j] = ri;
spriteYPos[j + 1] = rr;
}
else
{
spriteYPos[i + 1] = rr;
rm = rr;
} }
spriteOrder[j] = ri;
spriteYPos[j + 1] = rr;
} }
} }

View File

@ -3099,7 +3099,8 @@ void InterOperand::ForwardMem(const InterOperand& op)
void InterOperand::Forward(const InterOperand& op) void InterOperand::Forward(const InterOperand& op)
{ {
mTemp = op.mTemp; mTemp = op.mTemp;
mType = op.mType; if (mType != IT_INT8 || op.mType != IT_INT16 && op.mType != IT_INT32)
mType = op.mType;
mRange = op.mRange; mRange = op.mRange;
mFinal = false; mFinal = false;
} }
@ -19144,7 +19145,7 @@ void InterCodeProcedure::Close(void)
{ {
GrowingTypeArray tstack(IT_NONE); GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "interpret_statement"); CheckFunc = !strcmp(mIdent->mString, "tile_collide");
CheckCase = false; CheckCase = false;
mEntryBlock = mBlocks[0]; mEntryBlock = mBlocks[0];

View File

@ -28686,6 +28686,15 @@ bool NativeCodeBasicBlock::IsFinalZeroPageUseTail(const NativeCodeBasicBlock* bl
} }
else if (mIns[i].ReferencesZeroPage(to) || (pair && mIns[i].ReferencesZeroPage(to + 1))) else if (mIns[i].ReferencesZeroPage(to) || (pair && mIns[i].ReferencesZeroPage(to + 1)))
return false; return false;
else if (mIns[i].mType == ASMIT_JSR)
{
if (mIns[i].mFlags & NCIF_USE_ZP_32_X)
{
if (to >= mIns[i].mParam && to < mIns[i].mParam + 4 ||
from >= mIns[i].mParam && from < mIns[i].mParam + 4)
return false;
}
}
} }
if (mTrueJump && !mTrueJump->IsFinalZeroPageUseTail(block, from, to, pair)) if (mTrueJump && !mTrueJump->IsFinalZeroPageUseTail(block, from, to, pair))
@ -42657,7 +42666,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
if (mFalseJump) if (mFalseJump)
mFalseJump->CheckLive(); mFalseJump->CheckLive();
#if 1 #if 1
if (pass < 7 && i + 1 < mIns.Size()) if (pass < 10 && i + 1 < mIns.Size())
{ {
if ( if (
mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ABSOLUTE_X || mIns[i + 0].mMode == ASMIM_ABSOLUTE_Y || mIns[i + 0].mMode == ASMIM_INDIRECT_Y) && mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ABSOLUTE_X || mIns[i + 0].mMode == ASMIM_ABSOLUTE_Y || mIns[i + 0].mMode == ASMIM_INDIRECT_Y) &&
@ -45130,7 +45139,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
{ {
mInterProc = proc; mInterProc = proc;
CheckFunc = !strcmp(mInterProc->mIdent->mString, "test"); CheckFunc = !strcmp(mInterProc->mIdent->mString, "atan2");
int nblocks = proc->mBlocks.Size(); int nblocks = proc->mBlocks.Size();
tblocks = new NativeCodeBasicBlock * [nblocks]; tblocks = new NativeCodeBasicBlock * [nblocks];
@ -45936,6 +45945,7 @@ void NativeCodeProcedure::Optimize(void)
changed = true; changed = true;
#endif #endif
if (step == 2) if (step == 2)
{ {
ResetVisited(); ResetVisited();
@ -46614,6 +46624,7 @@ void NativeCodeProcedure::Optimize(void)
else else
cnt++; cnt++;
} while (changed); } while (changed);
#if 1 #if 1

View File

@ -463,6 +463,23 @@ void SourceFile::ReadCharPad(SourceFileDecoder decoder)
} }
return; return;
} }
else if (decoder == SFD_CTM_TILES_8_SW)
{
mMemSize = numTiles * tileWidth * tileHeight;
mLimit = mMemSize;
mMemPos = 0;
mMemData = new uint8[mMemSize];
for (int j = 0; j < numTiles; j++)
{
for (int i = 0; i < tileWidth * tileHeight; i++)
{
int16 d;
fread(&d, 2, 1, mFile);
mMemData[j + i * numTiles] = uint8(d);
}
}
return;
}
else else
fseek(mFile, 2 * numTiles * tileWidth * tileHeight, SEEK_CUR); fseek(mFile, 2 * numTiles * tileWidth * tileHeight, SEEK_CUR);
@ -564,6 +581,7 @@ void SourceFile::Limit(SourceFileDecoder decoder, int skip, int limit)
case SFD_CTM_CHAR_ATTRIB_1: case SFD_CTM_CHAR_ATTRIB_1:
case SFD_CTM_CHAR_ATTRIB_2: case SFD_CTM_CHAR_ATTRIB_2:
case SFD_CTM_TILES_8: case SFD_CTM_TILES_8:
case SFD_CTM_TILES_8_SW:
case SFD_CTM_TILES_16: case SFD_CTM_TILES_16:
case SFD_CTM_MAP_8: case SFD_CTM_MAP_8:
case SFD_CTM_MAP_16: case SFD_CTM_MAP_16:

View File

@ -30,6 +30,7 @@ enum SourceFileDecoder
SFD_CTM_CHAR_ATTRIB_1, SFD_CTM_CHAR_ATTRIB_1,
SFD_CTM_CHAR_ATTRIB_2, SFD_CTM_CHAR_ATTRIB_2,
SFD_CTM_TILES_8, SFD_CTM_TILES_8,
SFD_CTM_TILES_8_SW,
SFD_CTM_TILES_16, SFD_CTM_TILES_16,
SFD_CTM_MAP_8, SFD_CTM_MAP_8,
SFD_CTM_MAP_16, SFD_CTM_MAP_16,

View File

@ -880,6 +880,8 @@ void Scanner::NextPreToken(void)
decoder = SFD_CTM_CHAR_ATTRIB_2; decoder = SFD_CTM_CHAR_ATTRIB_2;
else if (!strcmp(mTokenIdent->mString, "ctm_tiles8")) else if (!strcmp(mTokenIdent->mString, "ctm_tiles8"))
decoder = SFD_CTM_TILES_8; decoder = SFD_CTM_TILES_8;
else if (!strcmp(mTokenIdent->mString, "ctm_tiles8sw"))
decoder = SFD_CTM_TILES_8_SW;
else if (!strcmp(mTokenIdent->mString, "ctm_tiles16")) else if (!strcmp(mTokenIdent->mString, "ctm_tiles16"))
decoder = SFD_CTM_TILES_16; decoder = SFD_CTM_TILES_16;
else if (!strcmp(mTokenIdent->mString, "ctm_map8")) else if (!strcmp(mTokenIdent->mString, "ctm_map8"))