Add sprite pad tile import
This commit is contained in:
parent
b622c25a56
commit
2d2c696aa4
|
@ -395,6 +395,12 @@ Imports the attribute data
|
||||||
|
|
||||||
Imports the sprite data and compresses it using lzo compression
|
Imports the sprite data and compresses it using lzo compression
|
||||||
|
|
||||||
|
const char SpriteTiles[] = {
|
||||||
|
#embed spd_tiles "sprites.spd"
|
||||||
|
};
|
||||||
|
|
||||||
|
Imports the sprite tile index table in byte form
|
||||||
|
|
||||||
|
|
||||||
### Console input and output
|
### Console input and output
|
||||||
|
|
||||||
|
|
|
@ -3899,7 +3899,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ASMIT_LDX:
|
case ASMIT_LDX:
|
||||||
if (data.mRegs[CPU_REG_X].mMode == NRDM_ZERO_PAGE && data.mRegs[CPU_REG_X].mValue == mAddress)
|
if (data.mRegs[CPU_REG_X].mMode == NRDM_ZERO_PAGE && data.mRegs[CPU_REG_X].mValue == mAddress && !(mLive & LIVE_CPU_REG_Z))
|
||||||
{
|
{
|
||||||
mType = ASMIT_NOP;
|
mType = ASMIT_NOP;
|
||||||
mMode = ASMIM_IMPLIED;
|
mMode = ASMIM_IMPLIED;
|
||||||
|
@ -3961,7 +3961,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ASMIT_LDY:
|
case ASMIT_LDY:
|
||||||
if (data.mRegs[CPU_REG_Y].mMode == NRDM_ZERO_PAGE && data.mRegs[CPU_REG_Y].mValue == mAddress)
|
if (data.mRegs[CPU_REG_Y].mMode == NRDM_ZERO_PAGE && data.mRegs[CPU_REG_Y].mValue == mAddress && !(mLive & LIVE_CPU_REG_Z))
|
||||||
{
|
{
|
||||||
mType = ASMIT_NOP;
|
mType = ASMIT_NOP;
|
||||||
mMode = ASMIM_IMPLIED;
|
mMode = ASMIM_IMPLIED;
|
||||||
|
@ -34958,7 +34958,20 @@ bool NativeCodeBasicBlock::IndexXYValueForwarding(int xreg, int xoffset, int xva
|
||||||
{
|
{
|
||||||
if (mIns[i].mAddress == xreg)
|
if (mIns[i].mAddress == xreg)
|
||||||
{
|
{
|
||||||
if (xoffset <= 3)
|
if (xoffset == 0)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & LIVE_CPU_REG_Z))
|
||||||
|
{
|
||||||
|
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (!(mIns[i].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
mIns[i].mType = ASMIT_TXA; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (xoffset <= 3)
|
||||||
{
|
{
|
||||||
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
for (int j = 0; j < xoffset; j++)
|
for (int j = 0; j < xoffset; j++)
|
||||||
|
@ -34999,7 +35012,20 @@ bool NativeCodeBasicBlock::IndexXYValueForwarding(int xreg, int xoffset, int xva
|
||||||
{
|
{
|
||||||
if (mIns[i].mAddress == yreg)
|
if (mIns[i].mAddress == yreg)
|
||||||
{
|
{
|
||||||
if (yoffset <= 3)
|
if (yoffset == 0)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & LIVE_CPU_REG_Z))
|
||||||
|
{
|
||||||
|
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (!(mIns[i].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
mIns[i].mType = ASMIT_TYA; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (yoffset <= 3)
|
||||||
{
|
{
|
||||||
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
|
||||||
for (int j = 0; j < yoffset; j++)
|
for (int j = 0; j < yoffset; j++)
|
||||||
|
@ -51463,7 +51489,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
mInterProc->mLinkerObject->mNativeProc = this;
|
mInterProc->mLinkerObject->mNativeProc = this;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "main");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "fighter_status");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
|
|
@ -420,6 +420,7 @@ void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceF
|
||||||
if (spdHeader.mID[0] == 'S' && spdHeader.mID[1] == 'P' && spdHeader.mID[2] == 'D')
|
if (spdHeader.mID[0] == 'S' && spdHeader.mID[1] == 'P' && spdHeader.mID[2] == 'D')
|
||||||
{
|
{
|
||||||
int numSprites = 0;
|
int numSprites = 0;
|
||||||
|
int numTiles = 0, tileSize = 0;
|
||||||
|
|
||||||
switch (spdHeader.mVersion[0])
|
switch (spdHeader.mVersion[0])
|
||||||
{
|
{
|
||||||
|
@ -428,6 +429,8 @@ void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceF
|
||||||
SPDHeader5 spdHeader5;
|
SPDHeader5 spdHeader5;
|
||||||
fread(&spdHeader5, sizeof(SPDHeader5), 1, mFile);
|
fread(&spdHeader5, sizeof(SPDHeader5), 1, mFile);
|
||||||
numSprites = spdHeader5.mNumSprites;
|
numSprites = spdHeader5.mNumSprites;
|
||||||
|
numTiles = spdHeader5.mNumTiles;
|
||||||
|
tileSize = spdHeader5.mTileHeight * spdHeader5.mTileWidth;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -435,6 +438,8 @@ void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceF
|
||||||
SPDHeader3 spdHeader3;
|
SPDHeader3 spdHeader3;
|
||||||
fread(&spdHeader3, sizeof(SPDHeader3), 1, mFile);
|
fread(&spdHeader3, sizeof(SPDHeader3), 1, mFile);
|
||||||
numSprites = spdHeader3.mNumSprites;
|
numSprites = spdHeader3.mNumSprites;
|
||||||
|
numTiles = spdHeader3.mNumTiles;
|
||||||
|
tileSize = spdHeader3.mTileHeight * spdHeader3.mTileWidth;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -454,6 +459,21 @@ void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceF
|
||||||
mLimit = 64 * numSprites;
|
mLimit = 64 * numSprites;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (decoder == SFD_SPD_TILES)
|
||||||
|
{
|
||||||
|
fseek(mFile, 64 * numSprites, SEEK_CUR);
|
||||||
|
mMemSize = numTiles * tileSize;
|
||||||
|
mLimit = mMemSize;
|
||||||
|
mMemPos = 0;
|
||||||
|
mMemData = new uint8[mMemSize];
|
||||||
|
for (int i = 0; i < mMemSize; i++)
|
||||||
|
{
|
||||||
|
int16 d;
|
||||||
|
fread(&d, 2, 1, mFile);
|
||||||
|
mMemData[i] = uint8(d);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
errors->Error(location, EERR_UNIMPLEMENTED, "SPD file format not recognized");
|
errors->Error(location, EERR_UNIMPLEMENTED, "SPD file format not recognized");
|
||||||
|
@ -725,6 +745,7 @@ void SourceFile::Limit(Errors* errors, const Location& location, SourceFileDecod
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SFD_SPD_SPRITES:
|
case SFD_SPD_SPRITES:
|
||||||
|
case SFD_SPD_TILES:
|
||||||
ReadSpritePad(errors, location, decoder);
|
ReadSpritePad(errors, location, decoder);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,8 @@ enum SourceFileDecoder
|
||||||
SFD_CTM_TILES_16,
|
SFD_CTM_TILES_16,
|
||||||
SFD_CTM_MAP_8,
|
SFD_CTM_MAP_8,
|
||||||
SFD_CTM_MAP_16,
|
SFD_CTM_MAP_16,
|
||||||
SFD_SPD_SPRITES
|
SFD_SPD_SPRITES,
|
||||||
|
SFD_SPD_TILES,
|
||||||
};
|
};
|
||||||
|
|
||||||
class SourceFile
|
class SourceFile
|
||||||
|
|
|
@ -986,6 +986,8 @@ void Scanner::NextPreToken(void)
|
||||||
decoder = SFD_CTM_MAP_16;
|
decoder = SFD_CTM_MAP_16;
|
||||||
else if (!strcmp(mTokenIdent->mString, "spd_sprites"))
|
else if (!strcmp(mTokenIdent->mString, "spd_sprites"))
|
||||||
decoder = SFD_SPD_SPRITES;
|
decoder = SFD_SPD_SPRITES;
|
||||||
|
else if (!strcmp(mTokenIdent->mString, "spd_tiles"))
|
||||||
|
decoder = SFD_SPD_TILES;
|
||||||
else
|
else
|
||||||
mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Invalid embed compression mode", mTokenIdent);
|
mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Invalid embed compression mode", mTokenIdent);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue