Ejemplo n.º 1
0
        static bool tstCx(int i, TIACxFlags cxf1, TIACxFlags cxf2)
        {
            var f1 = (int)cxf1;
            var f2 = (int)cxf2;

            return(((i & f1) != 0) && ((i & f2) != 0));
        }
Ejemplo n.º 2
0
        void RenderFromStartClockTo(ulong endClock)
        {
RenderClock:
            if (StartClock >= endClock)
            {
                return;
            }

            ++HSync;

            if (StartClock == StartHMOVEClock)
            {
                // turn on HMOVE
                HMoveLatch   = true;
                HMoveCounter = 0xf;
                P0mmr        = P1mmr = M0mmr = M1mmr = BLmmr = true;
            }
            else if (HSync == 0)
            {
                // just wrapped around, clear late HBLANK
                HMoveLatch = false;
            }

            // position counters are incremented during the visible portion of the scanline
            if (HSync >= 68 + (HMoveLatch ? 8 : 0))
            {
                ++P0; ++P1; ++M0; ++M1; ++BL;
            }

            // HMOVE compare, once every 1/4 CLK when on
            if (HMoveCounter >= 0 && (HSync & 3) == 0)
            {
                if (((HMoveCounter ^ RegW[HMP0]) & 0xf) == 0xf)
                {
                    P0mmr = false;
                }
                if (((HMoveCounter ^ RegW[HMP1]) & 0xf) == 0xf)
                {
                    P1mmr = false;
                }
                if (((HMoveCounter ^ RegW[HMM0]) & 0xf) == 0xf)
                {
                    M0mmr = false;
                }
                if (((HMoveCounter ^ RegW[HMM1]) & 0xf) == 0xf)
                {
                    M1mmr = false;
                }
                if (((HMoveCounter ^ RegW[HMBL]) & 0xf) == 0xf)
                {
                    BLmmr = false;
                }
                if (HMoveCounter >= 0)
                {
                    HMoveCounter--;
                }
            }

            // HMOVE increment, once every 1/4 CLK, 2 CLK after first compare when on
            if (HMoveCounter < 0xf && (HSync & 3) == 2)
            {
                if (HSync < 68 + (HMoveLatch ? 8 : 0))
                {
                    if (P0mmr)
                    {
                        ++P0;
                    }
                    if (P1mmr)
                    {
                        ++P1;
                    }
                    if (M0mmr)
                    {
                        ++M0;
                    }
                    if (M1mmr)
                    {
                        ++M1;
                    }
                    if (BLmmr)
                    {
                        ++BL;
                    }
                }
            }

            if (HSync == 68 + 76)
            {
                PFReflectionState = RegW[CTRLPF] & 0x01;
            }

            var        fbyte        = (byte)0;
            var        fbyte_colupf = colupf;
            TIACxFlags cxflags      = 0;

            if (vblankon || HSync < 68 + (HMoveLatch ? 8 : 0))
            {
                goto WritePixel;
            }

            fbyte = colubk;

            var colupfon = false;

            if ((PF210 & TIATables.PFMask[PFReflectionState][HSync - 68]) != 0)
            {
                if (scoreon)
                {
                    fbyte_colupf = (HSync - 68) < 80 ? colup0 : colup1;
                }
                colupfon = true;
                cxflags |= TIACxFlags.PF;
            }
            if (blon && BL >= 0 && TIATables.BLMask[BLsize][BL])
            {
                colupfon = true;
                cxflags |= TIACxFlags.BL;
            }
            if (!pfpriority && colupfon)
            {
                fbyte = fbyte_colupf;
            }
            if (m1on && M1 >= 0 && TIATables.MxMask[M1size][M1type][M1])
            {
                fbyte    = colup1;
                cxflags |= TIACxFlags.M1;
            }
            if (P1 >= 0 && (TIATables.PxMask[P1suppress][P1type][P1] & EffGRP1) != 0)
            {
                fbyte    = colup1;
                cxflags |= TIACxFlags.P1;
            }
            if (m0on && M0 >= 0 && TIATables.MxMask[M0size][M0type][M0])
            {
                fbyte    = colup0;
                cxflags |= TIACxFlags.M0;
            }
            if (P0 >= 0 && (TIATables.PxMask[P0suppress][P0type][P0] & EffGRP0) != 0)
            {
                fbyte    = colup0;
                cxflags |= TIACxFlags.P0;
            }
            if (pfpriority && colupfon)
            {
                fbyte = fbyte_colupf;
            }

WritePixel:
            Collisions |= TIATables.CollisionMask[(int)cxflags];

            if (HSync >= 68)
            {
                M.FrameBuffer.VideoBuffer[FrameBufferIndex++] = fbyte;
                if (FrameBufferIndex == M.FrameBuffer.VideoBufferByteLength)
                {
                    FrameBufferIndex = 0;
                }
                if (HSync == 227)
                {
                    ScanLine++;
                }
            }

            if (P0 >= 156)
            {
                P0suppress = 0;
            }
            if (P1 >= 156)
            {
                P1suppress = 0;
            }

            // denote this CLK has been completed by incrementing to the next
            StartClock++;

            goto RenderClock;
        }
Ejemplo n.º 3
0
 static bool tstCx(int i, TIACxFlags cxf1, TIACxFlags cxf2)
 {
     var f1 = (int)cxf1;
     var f2 = (int)cxf2;
     return ((i & f1) != 0) && ((i & f2) != 0);
 }