xrick2spr: update this tool, so it can compile the 8x8 tile data (beats mr sprite, by eliminating the 70 clocks of overhead that each Mr. Sprite has), also doesn't require disabling interrupts or doing weird things with mapping of the dpage or stack

This commit is contained in:
dwsJason 2018-08-16 21:25:29 -04:00
parent 82407c7dfa
commit 8ef6e58210
1 changed files with 176 additions and 2 deletions

View File

@ -14,6 +14,160 @@
#include "xrick2spr.h"
#include "rawdata.h"
u16 GetBest16(unsigned char* pFrame, int width, int height)
{
return 0;
}
void EncodePixel(unsigned char* pFrame, int width, int height, u16 pixel)
{
}
int CompileSprite(unsigned char* pFrame, int widthPixels, int heightPixels)
{
int width = (widthPixels+1)>>1;
int height = heightPixels;
// Make a copy of the frame, so that I can write back into it
// While I'm at it expand the frame width by 4 pixels
int srcWidth = width;
width += 2;
int sizeBytes = width * height;
unsigned char *pSrc = (unsigned char*)malloc(sizeBytes);
memset(pSrc,0, sizeBytes);
// Copy 1 line at a time
for (int y=0; y < height; ++y)
{
u8* pS = pFrame + (y*srcWidth);
u8* pD = pSrc + (y*width);
memcpy(pD,pS, srcWidth);
}
while (1)
{
u16 pixel = GetBest16(pSrc, width, height);
if (pixel)
{
EncodePixel(pSrc, width, height, pixel);
}
else
{
break;
}
}
return 0;
}
RAWDATA* gResult = NULL;
void AddString(RAWDATA* pRaw, char* pString)
{
size_t len = strlen(pString);
size_t newlen = len+pRaw->size;
pRaw->data = (unsigned char*) realloc(pRaw->data, newlen);
memcpy(pRaw->data + pRaw->size, pString, len);
pRaw->size = newlen;
}
int AddLine(char*pLabel,char*pInst,char*pExp,int val,int clocks)
{
if (gResult)
{
char temp[256];
char pArg[256];
memset(pArg,0,256);
sprintf(pArg,pExp,val);
sprintf(temp, "%8s %3s %s\n", pLabel,pInst,pArg);
AddString(gResult, temp);
}
return clocks;
}
void CompileTile(RAWDATA *result, u8* pTile)
{
static int offsets[16] =
{
(160 * 0) + 0, (160 * 0) + 2,
(160 * 1) + 0, (160 * 1) + 2,
(160 * 2) + 0, (160 * 2) + 2,
(160 * 3) + 0, (160 * 3) + 2,
(160 * 4) + 0, (160 * 4) + 2,
(160 * 5) + 0, (160 * 5) + 2,
(160 * 6) + 0, (160 * 6) + 2,
(160 * 7) + 0, (160 * 7) + 2
};
int clocks = 0;
u16 *pData = (u16*) pTile;
bool slots[16];
memset(slots, 0, sizeof(bool) * 16);
bool done = false;
while (!done)
{
u16 pixel = 0;
done = true;
// Load a cached Pixel
for (int idx = 0; idx < 16; ++idx)
{
if (slots[idx])
continue;
done = false;
pixel = pData[idx];
clocks += AddLine("","LDA","#$%04X",pixel,3);
break;
}
for (int outIdx = 0; outIdx < 16; ++outIdx)
{
if (slots[outIdx])
continue;
if (pixel == pData[outIdx])
{
clocks += AddLine("","STA","$%04X,Y",offsets[outIdx],6);
slots[outIdx] = true;
}
}
}
clocks += AddLine("","RTL"," ;%d cycles",clocks+6,6);
}
RAWDATA* CompileTiles(RAWDATA* pTilesData, int bank)
{
RAWDATA* result = (RAWDATA*)malloc(sizeof(RAWDATA));
memset(result, 0, sizeof(RAWDATA));
gResult = result;
char temp_label[256];
for (int tileNo = 0; tileNo < 256; ++tileNo)
{
sprintf(temp_label,"tile%d_%d\n", bank, tileNo);
AddString(result, temp_label);
CompileTile(result, &pTilesData->data[ tileNo * 32 ]);
}
return result;
}
static void _usage()
{
printf("xrick2spr v%s\n\n", VERSION);
@ -44,21 +198,41 @@ int main(int argc, char **argv)
}
*argv+= strlen(*argv); // skip rest of string
}
if (argc) _usage();
#if 0
RAWDATA* pData = loadRaw("sprites_data.gs");
if (pData)
{
// each frame 32 * 21 pixels, 0xd6 frames
//printf("%d %d\n", 16*21*0xd6, (int)pData->size);
const int FRAMESIZE = 16*21;
unsigned char* pFrame = pData->data;
printf("%d %d\n", 16*21*0xd6, (int)pData->size );
for (int frameIdx = 0; frameIdx < 0xd6; ++frameIdx)
{
int bytes = CompileSprite(pFrame, 32, 21);
pFrame += FRAMESIZE;
printf("Frame %d = %d bytes\n", frameIdx, bytes);
}
}
#endif
RAWDATA* pData = loadRaw("tiles_data0.gs");
RAWDATA* pSource = CompileTiles(pData,0);
saveRaw(pSource, "tiles_data0.txt");
pData = loadRaw("tiles_data1.gs");
pSource = CompileTiles(pData,1);
saveRaw(pSource, "tiles_data1.txt");
pData = loadRaw("tiles_data2.gs");
pSource = CompileTiles(pData,2);
saveRaw(pSource, "tiles_data2.txt");;
printf("\nxrick2spr - Processing complete.\n");