static bool tstCx(int i, TIACxFlags cxf1, TIACxFlags cxf2) { var f1 = (int)cxf1; var f2 = (int)cxf2; return(((i & f1) != 0) && ((i & f2) != 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; }
static bool tstCx(int i, TIACxFlags cxf1, TIACxFlags cxf2) { var f1 = (int)cxf1; var f2 = (int)cxf2; return ((i & f1) != 0) && ((i & f2) != 0); }