]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/op.cpp
Added interlace display to TOM/video handler.
[virtualjaguar] / src / op.cpp
index 3cca7fa669aaa69969146d5511bd24cb5814cdc6..f4f858da1472aff8e6749fbf65dbdcd845edb9d0 100644 (file)
@@ -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))