void OPProcessFixedBitmap(uint64 p0, uint64 p1, bool render);
void OPProcessScaledBitmap(uint64 p0, uint64 p1, uint64 p2, bool render);
-void OPDumpObjectList(uint32 address);
+void OPDiscoverObjects(uint32 address);
+void OPDumpObjectList(void);
void DumpScaledObject(uint64 p0, uint64 p1, uint64 p2);
void DumpFixedObject(uint64 p0, uint64 p1);
void DumpBitmapCore(uint64 p0, uint64 p1);
{ "(BITMAP)", "(SCALED BITMAP)", "(GPU INT)", "(BRANCH)", "(STOP)", "???", "???", "???" };
static const char * ccType[8] =
{ "\"==\"", "\"<\"", "\">\"", "(opflag set)", "(second half line)", "?", "?", "?" };
-static uint32 objectLink[8192];
-static uint32 numberOfLinks;
+static uint32 object[8192];
+static uint32 numberOfObjects;
+//static uint32 objectLink[8192];
+//static uint32 numberOfLinks;
void OPDone(void)
{
WriteLog("\n");
#else
- numberOfLinks = 0;
-
- OPDumpObjectList(olp);
+ numberOfObjects = 0;
+ OPDiscoverObjects(olp);
+ OPDumpObjectList();
#endif
}
-
-// To do this properly, we have to use recursion...
-void OPDumpObjectList(uint32 address)
+void OPDiscoverObjects(uint32 address)
{
- // Sanity checking: If we've already visited this link, bail out!
- for(uint32 i=0; i<numberOfLinks; i++)
+ // Check to see if we've already seen this object
+ for(uint32 i=0; i<numberOfObjects; i++)
{
- if (address == objectLink[i])
+ if (address == object[i])
return;
}
- objectLink[numberOfLinks++] = address;
+ // Store the object...
+ object[numberOfObjects++] = address;
uint8 objectType = 0;
do
uint32 lo = JaguarReadLong(address + 4, OP);
objectType = lo & 0x07;
uint32 link = ((hi << 11) | (lo >> 21)) & 0x3FFFF8;
- WriteLog("%08X: %08X %08X %s", address, hi, lo, opType[objectType]);
if (objectType == 3)
{
uint16 ypos = (lo >> 3) & 0x7FF;
uint8 cc = (lo >> 14) & 0x07; // Proper # of bits == 3
- WriteLog(" YPOS=%u, CC=%s, link=$%08X", ypos, ccType[cc], link);
// Recursion needed to follow all links!
- WriteLog("\n");
- OPDumpObjectList(address + 8);
-
- // Do the sanity check after recursive call: We may have already seen this...
- // Sanity checking: If we've already visited this link, bail out!
-//disnowok: we added ourself above
-// for(uint32 i=0; i<numberOfLinks; i++)
-// {
-// if (address == objectLink[i])
-// return;
-// }
+ OPDiscoverObjects(address + 8);
+ }
+
+ if (address == link) // Ruh roh...
+ {
+ // Runaway recursive link is bad!
+ return;
+ }
+
+ address = link;
+
+ // Check to see if we've already seen this object, and add it if not
+ bool seenObject = false;
+
+ for(uint32 i=0; i<numberOfObjects; i++)
+ {
+ if (address == object[i])
+ {
+ seenObject = true;
+ break;
+ }
+ }
+
+ if (!seenObject)
+ object[numberOfObjects++] = address;
+ }
+ while (objectType != 4);
+}
+
+void OPDumpObjectList(void)
+{
+ for(uint32 i=0; i<numberOfObjects; i++)
+ {
+ uint32 address = object[i];
+
+ uint32 hi = JaguarReadLong(address + 0, OP);
+ uint32 lo = JaguarReadLong(address + 4, OP);
+ uint8 objectType = lo & 0x07;
+ uint32 link = ((hi << 11) | (lo >> 21)) & 0x3FFFF8;
+ WriteLog("%08X: %08X %08X %s", address, hi, lo, opType[objectType]);
+
+ if (objectType == 3)
+ {
+ uint16 ypos = (lo >> 3) & 0x7FF;
+ uint8 cc = (lo >> 14) & 0x07; // Proper # of bits == 3
+ WriteLog(" YPOS=%u, CC=%s, link=$%08X", ypos, ccType[cc], link);
}
WriteLog("\n");
{
// Runaway recursive link is bad!
WriteLog("***** SELF REFERENTIAL LINK *****\n\n");
- return;
}
-
- address = link;
- objectLink[numberOfLinks++] = address;
}
- while (objectType != 4);
WriteLog("\n");
}
-
-
//
// Object Processor memory access
// Memory range: F00010 - F00027
void DumpBitmapCore(uint64 p0, uint64 p1)
{
+ uint32 bdMultiplier[8] = { 64, 32, 16, 8, 4, 2, 1, 1 };
uint8 bitdepth = (p1 >> 12) & 0x07;
//WAS: int16 ypos = ((p0 >> 3) & 0x3FF); // ??? What if not interlaced (/2)?
int16 ypos = ((p0 >> 3) & 0x7FF); // ??? What if not interlaced (/2)?
uint8 flags = (p1 >> 45) & 0x0F;
uint8 idx = (p1 >> 38) & 0x7F;
uint32 pitch = (p1 >> 15) & 0x07;
- WriteLog(" [%u (%u) x %u @ (%i, %u) (%u bpp), l: %08X, p: %08X fp: %02X, fl:%s%s%s%s, idx:%02X, pt:%02X]\n",
- iwidth, dwidth, height, xpos, ypos, op_bitmap_bit_depth[bitdepth], link,
+ WriteLog(" [%u x %u @ (%i, %u) (iw:%u, dw:%u) (%u bpp), l:%08X, p:%08X fp:%02X, fl:%s%s%s%s, idx:%02X, pt:%02X]\n",
+ iwidth * bdMultiplier[bitdepth],
+ height, xpos, ypos, iwidth, dwidth, op_bitmap_bit_depth[bitdepth], link,
ptr, firstPix, (flags&OPFLAG_REFLECT ? "REFLECT " : ""),
(flags&OPFLAG_RMW ? "RMW " : ""), (flags&OPFLAG_TRANS ? "TRANS " : ""),
(flags&OPFLAG_RELEASE ? "RELEASE" : ""), idx, pitch);
#warning "Need to fix this so that when an GPU object IRQ happens, we can pick up OP processing where we left off. !!! FIX !!!"
void OPProcessList(int halfline, bool render)
{
+#warning "!!! NEED TO HANDLE MULTIPLE FIELDS PROPERLY !!!
+// We ignore them, for now; not good
+ halfline &= 0x7FF;
+
extern int op_start_log;
// char * condition_to_str[8] =
// { "==", "<", ">", "(opflag set)", "(second half line)", "?", "?", "?" };