X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fop.cpp;fp=src%2Fop.cpp;h=f4f858da1472aff8e6749fbf65dbdcd845edb9d0;hb=40e59fafacbc0df467b9d3c05a6199ff6138949b;hp=3cca7fa669aaa69969146d5511bd24cb5814cdc6;hpb=0c0dea5b5411ef9be8c6d5159faf0d2226db4452;p=virtualjaguar diff --git a/src/op.cpp b/src/op.cpp index 3cca7fa..f4f858d 100644 --- a/src/op.cpp +++ b/src/op.cpp @@ -792,27 +792,22 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp case OBJECT_TYPE_BRANCH: { uint16_t ypos = (p0 >> 3) & 0x7FF; -// NOTE: The JTRM sez there are only 2 bits used for the CC, but lists *five* -// conditions! Need at least one more bit for that! :-P -// Also, the ASIC nets imply that it uses bits 14-16 (height in BM & SBM objects) -#warning "!!! Possibly bad CC handling in OP (missing 1 bit) !!!" - uint8_t cc = (p0 >> 14) & 0x03; + // JTRM is wrong: CC is bits 14-16 (3 bits, *not* 2) + uint8_t cc = (p0 >> 14) & 0x07; uint32_t link = (p0 >> 21) & 0x3FFFF8; -// if ((ypos!=507)&&(ypos!=25)) -// WriteLog("\t%i%s%i link=0x%.8x\n",halfline,condition_to_str[cc],ypos>>1,link); switch (cc) { case CONDITION_EQUAL: - if (TOMReadWord(0xF00006, OP) == ypos || ypos == 0x7FF) + if (halfline == ypos || ypos == 0x7FF) op_pointer = link; break; case CONDITION_LESS_THAN: - if (TOMReadWord(0xF00006, OP) < ypos) + if (halfline < ypos) op_pointer = link; break; case CONDITION_GREATER_THAN: - if (TOMReadWord(0xF00006, OP) > ypos) + if (halfline > ypos) op_pointer = link; break; case CONDITION_OP_FLAG_SET: @@ -820,15 +815,9 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp op_pointer = link; break; case CONDITION_SECOND_HALF_LINE: -//Here's the ASIC code: -// ND4(cctrue5, newheight[2], heightl[1], heightl[0], hcb[10]); -//which means, do the link if bit 10 of HC is set... - - // This basically means branch if bit 10 of HC is set -#warning "Unhandled condition code causes emulator to crash... !!! FIX !!!" - WriteLog("OP: Unexpected CONDITION_SECOND_HALF_LINE in BRANCH object\nOP: shutting down!\n"); - LogDone(); - exit(0); + // Branch if bit 10 of HC is set... + if (TOMGetHC() & 0x0400) + op_pointer = link; break; default: // Basically, if you do this, the OP does nothing. :-) @@ -838,31 +827,19 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp } case OBJECT_TYPE_STOP: { -//op_start_log = 0; - // unsure -//WriteLog("OP: --> STOP\n"); -// op_set_status_register(((p0>>3) & 0xFFFFFFFF)); -//This seems more likely... OPSetCurrentObject(p0); - if (p0 & 0x08) + if ((p0 & 0x08) && TOMIRQEnabled(IRQ_OPFLAG)) { - // We need to check whether these interrupts are enabled or - // not, THEN set an IRQ + pending flag if necessary... - if (TOMIRQEnabled(IRQ_OPFLAG)) - { - TOMSetPendingObjectInt(); - m68k_set_irq(2); // Cause a 68K IPL 2 to occur... - } + TOMSetPendingObjectInt(); + m68k_set_irq(2); // Cause a 68K IPL 2 to occur... } + // Bail out, we're done... return; -// break; } default: -// WriteLog("op: unknown object type %i\n", ((uint8_t)p0 & 0x07)); -// return; - ; + WriteLog("OP: Unknown object type %i\n", (uint8_t)p0 & 0x07); } // Here is a little sanity check to keep the OP from locking up the @@ -885,56 +862,59 @@ void OPProcessFixedBitmap(uint64_t p0, uint64_t p1, bool render) { // Need to make sure that when writing that it stays within the line buffer... // LBUF ($F01800 - $F01D9E) 360 x 32-bit RAM - uint8_t depth = (p1 >> 12) & 0x07; // Color depth of image + uint8_t depth = (p1 >> 12) & 0x07; // Color depth of image int32_t xpos = ((int16_t)((p1 << 4) & 0xFFFF)) >> 4;// Image xpos in LBUF - uint32_t iwidth = (p1 >> 28) & 0x3FF; // Image width in *phrases* - uint32_t data = (p0 >> 40) & 0xFFFFF8; // Pixel data address -//#ifdef OP_DEBUG_BMP + uint32_t iwidth = (p1 >> 28) & 0x3FF; // Image width in *phrases* + uint32_t data = (p0 >> 40) & 0xFFFFF8; // Pixel data address uint32_t firstPix = (p1 >> 49) & 0x3F; // "The LSB is significant only for scaled objects..." -JTRM - // "In 1 BPP mode, all five bits are significant. In 2 BPP mode, the top four are significant..." + // "In 1 BPP mode, all five bits are significant. In 2 BPP mode, the top + // four are significant..." firstPix &= 0x3E; -//#endif + // We can ignore the RELEASE (high order) bit for now--probably forever...! // uint8_t flags = (p1 >> 45) & 0x0F; // REFLECT, RMW, TRANS, RELEASE //Optimize: break these out to their own BOOL values - uint8_t flags = (p1 >> 45) & 0x07; // REFLECT (0), RMW (1), TRANS (2) + uint8_t flags = (p1 >> 45) & 0x07; // REFLECT (0), RMW (1), TRANS (2) bool flagREFLECT = (flags & OPFLAG_REFLECT ? true : false), flagRMW = (flags & OPFLAG_RMW ? true : false), flagTRANS = (flags & OPFLAG_TRANS ? true : false); // "For images with 1 to 4 bits/pixel the top 7 to 4 bits of the index // provide the most significant bits of the palette address." - uint8_t index = (p1 >> 37) & 0xFE; // CLUT index offset (upper pix, 1-4 bpp) - uint32_t pitch = (p1 >> 15) & 0x07; // Phrase pitch - pitch <<= 3; // Optimization: Multiply pitch by 8 + uint8_t index = (p1 >> 37) & 0xFE; // CLUT index offset (upper pix, 1-4 bpp) + uint32_t pitch = (p1 >> 15) & 0x07; // Phrase pitch + pitch <<= 3; // Optimization: Multiply pitch by 8 // int16_t scanlineWidth = tom_getVideoModeWidth(); uint8_t * tomRam8 = TOMGetRamPointer(); uint8_t * paletteRAM = &tomRam8[0x400]; - // This is OK as long as it's used correctly: For 16-bit RAM to RAM direct copies--NOT - // for use when using endian-corrected data (i.e., any of the *_word_read functions!) + // This is OK as long as it's used correctly: For 16-bit RAM to RAM direct + // copies--NOT for use when using endian-corrected data (i.e., any of the + // *_word_read functions!) uint16_t * paletteRAM16 = (uint16_t *)paletteRAM; // WriteLog("bitmap %ix? %ibpp at %i,? firstpix=? data=0x%.8x pitch %i hflipped=%s dwidth=? (linked to ?) RMW=%s Tranparent=%s\n", // iwidth, op_bitmap_bit_depth[bitdepth], xpos, ptr, pitch, (flags&OPFLAG_REFLECT ? "yes" : "no"), (flags&OPFLAG_RMW ? "yes" : "no"), (flags&OPFLAG_TRANS ? "yes" : "no")); // Is it OK to have a 0 for the data width??? (i.e., undocumented?) -// Seems to be... Seems that dwidth *can* be zero (i.e., reuse same line) as well. +// Seems to be... Seems that dwidth *can* be zero (i.e., reuse same line) as +// well. // Pitch == 0 is OK too... -//kludge: Seems that the OP treats iwidth == 0 as iwidth == 1... Need to investigate -// on real hardware... +//kludge: Seems that the OP treats iwidth == 0 as iwidth == 1... Need to +// investigate on real hardware... #warning "!!! Need to investigate iwidth == 0 behavior on real hardware !!!" if (iwidth == 0) iwidth = 1; // if (!render || op_pointer == 0 || ptr == 0 || pitch == 0) -//I'm not convinced that we need to concern ourselves with data & op_pointer here either! +//I'm not convinced that we need to concern ourselves with data & op_pointer +//here either! if (!render || iwidth == 0) return; -//OK, so we know the position in the line buffer is correct. It's the clipping in -//24bpp mode that's wrong! +//OK, so we know the position in the line buffer is correct. It's the clipping +//in 24bpp mode that's wrong! #if 0 //This is a total kludge, based upon the fact that 24BPP mode puts *4* bytes //into the line buffer for each pixel. @@ -954,17 +934,12 @@ if (depth == 5) // i.e., 24bpp mode... : -((phraseWidthToPixels[depth] * iwidth) + 1)); uint32_t clippedWidth = 0, phraseClippedWidth = 0, dataClippedWidth = 0;//, phrasePixel = 0; bool in24BPPMode = (((GET16(tomRam8, 0x0028) >> 1) & 0x03) == 1 ? true : false); // VMODE - // Not sure if this is Jaguar Two only location or what... - // From the docs, it is... If we want to limit here we should think of something else. -// int32_t limit = GET16(tom_ram_8, 0x0008); // LIMIT -// int32_t limit = 720; -// int32_t lbufWidth = (!in24BPPMode ? limit - 1 : (limit / 2) - 1); // Zero based limit... -//printf("[OP:xpos=%i,spos=%i,epos=%i>", xpos, startPos, endPos); // This is correct, the OP line buffer is a constant size... int32_t limit = 720; int32_t lbufWidth = 719; - // If the image is completely to the left or right of the line buffer, then bail. + // If the image is completely to the left or right of the line buffer, then + // bail. //If in REFLECT mode, then these values are swapped! !!! FIX !!! [DONE] //There are four possibilities: // 1. image sits on left edge and no REFLECT; starts out of bounds but ends in bounds. @@ -1020,7 +995,8 @@ if (depth == 5) // i.e., 24bpp mode... if (depth > 5) WriteLog("OP: We're about to encounter a divide by zero error!\n"); // NOTE: We're just using endPos to figure out how much, if any, to clip by. - // ALSO: There may be another case where we start out of bounds and end out of bounds...! + // ALSO: There may be another case where we start out of bounds and end out + // of bounds...! // !!! FIX !!! if (startPos < 0) // Case #1: Begin out, end in, L to R clippedWidth = 0 - startPos, @@ -1277,11 +1253,12 @@ if (firstPix) for(int i=0; i<4; i++) { uint8_t bitsHi = pixels >> 56, bitsLo = pixels >> 48; -// Seems to me that both of these are in the same endian, so we could cast it as -// uint16_t * and do straight across copies (what about 24 bpp? Treat it differently...) -// This only works for the palettized modes (1 - 8 BPP), since we actually have to -// copy data from memory in 16 BPP mode (or does it? Isn't this the same as the CLUT case?) -// No, it isn't because we read the memory in an endian safe way--it *won't* work... +// Seems to me that both of these are in the same endian, so we could cast it +// as uint16_t * and do straight across copies (what about 24 bpp? Treat it +// differently...) This only works for the palettized modes (1 - 8 BPP), since +// we actually have to copy data from memory in 16 BPP mode (or does it? Isn't +// this the same as the CLUT case?) No, it isn't because we read the memory in +// an endian safe way--it *won't* work... //This doesn't seem right... Let's try the encoded black value ($8800): //Apparently, CRY 0 maps to $8800... if (flagTRANS && ((bitsLo | bitsHi) == 0))