summaryrefslogtreecommitdiff
path: root/src/c4emu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/c4emu.c')
-rw-r--r--src/c4emu.c93
1 files changed, 57 insertions, 36 deletions
diff --git a/src/c4emu.c b/src/c4emu.c
index bec8364..f41d4ec 100644
--- a/src/c4emu.c
+++ b/src/c4emu.c
@@ -120,19 +120,17 @@ static uint8 C4TestPattern [12 * 4] =
static void C4ConvOAM(void)
{
- uint8* ptr;
- uint8* OAMptr = Memory.C4RAM + (Memory.C4RAM[0x626] << 2);
- for (ptr = Memory.C4RAM + 0x1fd; ptr > OAMptr; ptr -= 4)
- {
- // Clear OAM-to-be
- *ptr = 0xe0;
- }
-
uint16 globalX, globalY;
uint8* OAMptr2;
int16 SprX, SprY;
uint8 SprName, SprAttr;
uint8 SprCount;
+ uint8* ptr;
+ uint8* OAMptr = Memory.C4RAM + (Memory.C4RAM[0x626] << 2);
+
+ /* Clear OAM-to-be */
+ for (ptr = Memory.C4RAM + 0x1fd; ptr > OAMptr; ptr -= 4)
+ *ptr = 0xe0;
globalX = READ_WORD(Memory.C4RAM + 0x0621);
globalY = READ_WORD(Memory.C4RAM + 0x0623);
@@ -141,21 +139,29 @@ static void C4ConvOAM(void)
if (Memory.C4RAM[0x0620] != 0)
{
int i;
+ uint8 *srcptr;
+ uint8 offset;
+
SprCount = 128 - Memory.C4RAM[0x626];
- uint8 offset = (Memory.C4RAM[0x626] & 3) * 2;
- uint8* srcptr = Memory.C4RAM + 0x220;
+ offset = (Memory.C4RAM[0x626] & 3) * 2;
+ srcptr = Memory.C4RAM + 0x220;
+
for (i = Memory.C4RAM[0x0620]; i > 0 && SprCount > 0; i--, srcptr += 16)
{
- SprX = READ_WORD(srcptr) - globalX;
- SprY = READ_WORD(srcptr + 2) - globalY;
+ uint8 *sprptr;
+
+ SprX = READ_WORD(srcptr) - globalX;
+ SprY = READ_WORD(srcptr + 2) - globalY;
SprName = srcptr[5];
SprAttr = srcptr[4] | srcptr[0x06]; // XXX: mask bits?
- uint8* sprptr = C4GetMemPointer(READ_3WORD(srcptr + 7));
+ sprptr = C4GetMemPointer(READ_3WORD(srcptr + 7));
+
if (*sprptr != 0)
{
int16 X, Y;
int SprCnt;
+
for (SprCnt = *sprptr++; SprCnt > 0 && SprCount > 0; SprCnt--, sprptr += 4)
{
X = (int8)sprptr[1];
@@ -206,13 +212,24 @@ static void C4ConvOAM(void)
static void C4DoScaleRotate(int row_padding)
{
+ uint8 w, h;
int16 A, B, C, D;
+ int32 XScale, YScale;
+ int32 Cx, Cy;
+ int32 LineX, LineY;
+ uint32 X, Y;
+ uint8 byte;
+ int outidx = 0;
+ uint8 bit = 0x80;
+ int y;
// Calculate matrix
- int32 XScale = READ_WORD(Memory.C4RAM + 0x1f8f);
- if (XScale & 0x8000) XScale = 0x7fff;
- int32 YScale = READ_WORD(Memory.C4RAM + 0x1f92);
- if (YScale & 0x8000) YScale = 0x7fff;
+ XScale = READ_WORD(Memory.C4RAM + 0x1f8f);
+ if (XScale & 0x8000)
+ XScale = 0x7fff;
+ YScale = READ_WORD(Memory.C4RAM + 0x1f92);
+ if (YScale & 0x8000)
+ YScale = 0x7fff;
if (READ_WORD(Memory.C4RAM + 0x1f80) == 0)
{
@@ -257,8 +274,8 @@ static void C4DoScaleRotate(int row_padding)
}
// Calculate Pixel Resolution
- uint8 w = Memory.C4RAM[0x1f89] & ~7;
- uint8 h = Memory.C4RAM[0x1f8c] & ~7;
+ w = Memory.C4RAM[0x1f89] & ~7;
+ h = Memory.C4RAM[0x1f8c] & ~7;
// printf("%dx%d XScale=%04x YScale=%04x angle=%03x\n", w, h, XScale, YScale, READ_WORD(Memory.C4RAM+0x1f80)&0x1ff);
// printf("Matrix: [%10g %10g] [%04x %04x]\n", A/4096.0, B/4096.0, A&0xffff, B&0xffff);
@@ -267,27 +284,25 @@ static void C4DoScaleRotate(int row_padding)
// Clear the output RAM
memset(Memory.C4RAM, 0, (w + row_padding / 4)*h / 2);
- int32 Cx = (int16)READ_WORD(Memory.C4RAM + 0x1f83);
- int32 Cy = (int16)READ_WORD(Memory.C4RAM + 0x1f86);
+
+ Cx = (int16)READ_WORD(Memory.C4RAM + 0x1f83);
+ Cy = (int16)READ_WORD(Memory.C4RAM + 0x1f86);
// Calculate start position (i.e. (Ox, Oy) = (0, 0))
// The low 12 bits are fractional, so (Cx<<12) gives us the Cx we want in
// the function. We do Cx*A etc normally because the matrix parameters
// already have the fractional parts.
- int32 LineX = (Cx << 12) - Cx * A - Cx * B;
- int32 LineY = (Cy << 12) - Cy * C - Cy * D;
+ LineX = (Cx << 12) - Cx * A - Cx * B;
+ LineY = (Cy << 12) - Cy * C - Cy * D;
// Start loop
- uint32 X, Y;
- uint8 byte;
- int outidx = 0;
- uint8 bit = 0x80;
- int y;
for (y = 0; y < h; y++)
{
+ int x;
+
X = LineX;
Y = LineY;
- int x;
+
for (x = 0; x < w; x++)
{
if ((X >> 12) >= w || (Y >> 12) >= h)
@@ -328,6 +343,8 @@ static void C4DoScaleRotate(int row_padding)
static void C4DrawLine(int32 X1, int32 Y1, int16 Z1,
int32 X2, int32 Y2, int16 Z2, uint8 Color)
{
+ int i;
+
// Transform coordinates
C4WFXVal = (short)X1;
C4WFYVal = (short)Y1;
@@ -357,15 +374,15 @@ static void C4DrawLine(int32 X1, int32 Y1, int16 Z1,
Y2 = (int16)C4WFYVal;
// render line
- int i;
for (i = C4WFDist ? C4WFDist : 1; i > 0; i--)
{
//.loop
if (X1 > 0xff && Y1 > 0xff && X1 < 0x6000 && Y1 < 0x6000)
{
+ uint8 bit;
uint16 addr = ((X1 & ~0x7ff) + (Y1 & ~0x7ff) * 12 + (Y1 & 0x700)) >> 7;
addr = (((Y1 >> 8) >> 3) << 8) - (((Y1 >> 8) >> 3) << 6) + (((X1 >> 8) >> 3) << 4) + ((Y1 >> 8) & 7) * 2;
- uint8 bit = 0x80 >> ((X1 >> 8) & 7);
+ bit = 0x80 >> ((X1 >> 8) & 7);
Memory.C4RAM[addr + 0x300] &= ~bit;
Memory.C4RAM[addr + 0x301] &= ~bit;
if (Color & 1) Memory.C4RAM[addr + 0x300] |= bit;
@@ -410,13 +427,17 @@ static void C4DrawWireFrame(void)
static void C4TransformLines(void)
{
+ uint8 *ptr;
+ uint8* ptr2;
+
C4WFX2Val = Memory.C4RAM[0x1f83];
C4WFY2Val = Memory.C4RAM[0x1f86];
C4WFDist = Memory.C4RAM[0x1f89];
C4WFScale = Memory.C4RAM[0x1f8c];
// transform vertices
- uint8* ptr = Memory.C4RAM;
+ ptr = Memory.C4RAM;
+
{
int i;
for (i = READ_WORD(Memory.C4RAM + 0x1f80); i > 0; i--, ptr += 0x10)
@@ -438,8 +459,8 @@ static void C4TransformLines(void)
WRITE_WORD(Memory.C4RAM + 0x602 + 8, 0x60);
WRITE_WORD(Memory.C4RAM + 0x605 + 8, 0x40);
- ptr = Memory.C4RAM + 0xb02;
- uint8* ptr2 = Memory.C4RAM;
+ ptr = Memory.C4RAM + 0xb02;
+ ptr2 = Memory.C4RAM;
{
int i;
for (i = READ_WORD(Memory.C4RAM + 0xb00); i > 0; i--, ptr += 2, ptr2 += 8)
@@ -524,8 +545,9 @@ static void C4BitPlaneWave()
}
}
-static void C4SprDisintegrate()
+static void C4SprDisintegrate(void)
{
+ uint32 y, i;
uint8 width, height;
uint32 StartX, StartY;
uint8* src;
@@ -545,7 +567,6 @@ static void C4SprDisintegrate()
memset(Memory.C4RAM, 0, width * height / 2);
- uint32 y, i;
for (y = StartY, i = 0; i < height; i++, y += scaleY)
{
uint32 x, j;