50 using namespace VDPAccessSlots;
53 const byte MXD = 0x20;
54 const byte MXS = 0x10;
55 const byte DIY = 0x08;
56 const byte DIX = 0x04;
58 const byte MAJ = 0x01;
62 template<
typename Mode>
63 static inline unsigned clipNX_1_pixel(
unsigned DX,
unsigned NX,
byte ARG)
65 if (
unlikely(DX >= Mode::PIXELS_PER_LINE)) {
68 NX = NX ? NX : Mode::PIXELS_PER_LINE;
71 :
min(NX, Mode::PIXELS_PER_LINE - DX);
74 template<
typename Mode>
75 static inline unsigned clipNX_1_byte(
unsigned DX,
unsigned NX,
byte ARG)
77 constexpr
unsigned BYTES_PER_LINE =
78 Mode::PIXELS_PER_LINE >> Mode::PIXELS_PER_BYTE_SHIFT;
80 DX >>= Mode::PIXELS_PER_BYTE_SHIFT;
81 if (
unlikely(BYTES_PER_LINE <= DX)) {
84 NX >>= Mode::PIXELS_PER_BYTE_SHIFT;
85 NX = NX ? NX : BYTES_PER_LINE;
88 :
min(NX, BYTES_PER_LINE - DX);
91 template<
typename Mode>
92 static inline unsigned clipNX_2_pixel(
unsigned SX,
unsigned DX,
unsigned NX,
byte ARG)
94 if (
unlikely(SX >= Mode::PIXELS_PER_LINE) ||
95 unlikely(DX >= Mode::PIXELS_PER_LINE)) {
98 NX = NX ? NX : Mode::PIXELS_PER_LINE;
100 ?
min(NX,
min(SX, DX) + 1)
101 :
min(NX, Mode::PIXELS_PER_LINE -
max(SX, DX));
104 template<
typename Mode>
105 static inline unsigned clipNX_2_byte(
unsigned SX,
unsigned DX,
unsigned NX,
byte ARG)
107 constexpr
unsigned BYTES_PER_LINE =
108 Mode::PIXELS_PER_LINE >> Mode::PIXELS_PER_BYTE_SHIFT;
110 SX >>= Mode::PIXELS_PER_BYTE_SHIFT;
111 DX >>= Mode::PIXELS_PER_BYTE_SHIFT;
112 if (
unlikely(BYTES_PER_LINE <= SX) ||
116 NX >>= Mode::PIXELS_PER_BYTE_SHIFT;
117 NX = NX ? NX : BYTES_PER_LINE;
119 ?
min(NX,
min(SX, DX) + 1)
120 :
min(NX, BYTES_PER_LINE -
max(SX, DX));
123 static inline unsigned clipNY_1(
unsigned DY,
unsigned NY,
byte ARG)
126 return (ARG &
DIY) ?
min(NY, DY + 1) : NY;
129 static inline unsigned clipNY_2(
unsigned SY,
unsigned DY,
unsigned NY,
byte ARG)
132 return (ARG &
DIY) ?
min(NY,
min(SY, DY) + 1) : NY;
154 template<
typename LogOp>
static void psetFast(
155 EmuTime::param time,
VDPVRAM& vram,
unsigned addr,
156 byte color,
byte mask, LogOp op)
158 byte src = vram.cmdWriteWindow.readNP(addr);
159 op(time, vram, addr, src, color,
mask);
170 static constexpr
byte COLOR_MASK = 0x0F;
171 static constexpr
byte PIXELS_PER_BYTE = 2;
172 static constexpr
byte PIXELS_PER_BYTE_SHIFT = 1;
173 static constexpr
unsigned PIXELS_PER_LINE = 256;
174 static inline unsigned addressOf(
unsigned x,
unsigned y,
bool extVRAM);
175 static inline byte point(
VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM);
176 template<
typename LogOp>
177 static inline void pset(EmuTime::param time,
VDPVRAM& vram,
178 unsigned x,
unsigned addr,
byte src,
byte color, LogOp op);
179 static inline byte duplicate(
byte color);
183 unsigned x,
unsigned y,
bool extVRAM)
186 ? (((y & 1023) << 7) | ((
x & 255) >> 1))
187 : (((y & 511) << 7) | ((
x & 255) >> 1) | 0x20000);
191 VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM)
194 >> (((~
x) & 1) << 2)) & 15;
197 template<
typename LogOp>
199 EmuTime::param time,
VDPVRAM& vram,
unsigned x,
unsigned addr,
200 byte src,
byte color, LogOp op)
202 byte sh = ((~
x) & 1) << 2;
203 op(time, vram, addr, src, color << sh, ~(15 << sh));
208 assert((color & 0xF0) == 0);
209 return color | (color << 4);
220 static constexpr
byte COLOR_MASK = 0x03;
221 static constexpr
byte PIXELS_PER_BYTE = 4;
222 static constexpr
byte PIXELS_PER_BYTE_SHIFT = 2;
223 static constexpr
unsigned PIXELS_PER_LINE = 512;
224 static inline unsigned addressOf(
unsigned x,
unsigned y,
bool extVRAM);
225 static inline byte point(
VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM);
226 template<
typename LogOp>
227 static inline void pset(EmuTime::param time,
VDPVRAM& vram,
228 unsigned x,
unsigned addr,
byte src,
byte color, LogOp op);
229 static inline byte duplicate(
byte color);
233 unsigned x,
unsigned y,
bool extVRAM)
236 ? (((y & 1023) << 7) | ((
x & 511) >> 2))
237 : (((y & 511) << 7) | ((
x & 511) >> 2) | 0x20000);
241 VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM)
244 >> (((~
x) & 3) << 1)) & 3;
247 template<
typename LogOp>
249 EmuTime::param time,
VDPVRAM& vram,
unsigned x,
unsigned addr,
250 byte src,
byte color, LogOp op)
252 byte sh = ((~
x) & 3) << 1;
253 op(time, vram, addr, src, color << sh, ~(3 << sh));
258 assert((color & 0xFC) == 0);
272 static constexpr
byte COLOR_MASK = 0x0F;
273 static constexpr
byte PIXELS_PER_BYTE = 2;
274 static constexpr
byte PIXELS_PER_BYTE_SHIFT = 1;
275 static constexpr
unsigned PIXELS_PER_LINE = 512;
276 static inline unsigned addressOf(
unsigned x,
unsigned y,
bool extVRAM);
277 static inline byte point(
VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM);
278 template<
typename LogOp>
279 static inline void pset(EmuTime::param time,
VDPVRAM& vram,
280 unsigned x,
unsigned addr,
byte src,
byte color, LogOp op);
281 static inline byte duplicate(
byte color);
285 unsigned x,
unsigned y,
bool extVRAM)
288 ? (((
x & 2) << 15) | ((y & 511) << 7) | ((
x & 511) >> 2))
289 : (0x20000 | ((y & 511) << 7) | ((
x & 511) >> 2));
293 VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM)
296 >> (((~
x) & 1) << 2)) & 15;
299 template<
typename LogOp>
301 EmuTime::param time,
VDPVRAM& vram,
unsigned x,
unsigned addr,
302 byte src,
byte color, LogOp op)
304 byte sh = ((~
x) & 1) << 2;
305 op(time, vram, addr, src, color << sh, ~(15 << sh));
310 assert((color & 0xF0) == 0);
311 return color | (color << 4);
322 static constexpr
byte COLOR_MASK = 0xFF;
323 static constexpr
byte PIXELS_PER_BYTE = 1;
324 static constexpr
byte PIXELS_PER_BYTE_SHIFT = 0;
325 static constexpr
unsigned PIXELS_PER_LINE = 256;
326 static inline unsigned addressOf(
unsigned x,
unsigned y,
bool extVRAM);
327 static inline byte point(
VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM);
328 template<
typename LogOp>
329 static inline void pset(EmuTime::param time,
VDPVRAM& vram,
330 unsigned x,
unsigned addr,
byte src,
byte color, LogOp op);
331 static inline byte duplicate(
byte color);
335 unsigned x,
unsigned y,
bool extVRAM)
338 ? (((
x & 1) << 16) | ((y & 511) << 7) | ((
x & 255) >> 1))
339 : (0x20000 | ((y & 511) << 7) | ((
x & 255) >> 1));
343 VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM)
348 template<
typename LogOp>
350 EmuTime::param time,
VDPVRAM& vram,
unsigned ,
unsigned addr,
351 byte src,
byte color, LogOp op)
353 op(time, vram, addr, src, color, 0);
370 static constexpr
byte COLOR_MASK = 0xFF;
371 static constexpr
byte PIXELS_PER_BYTE = 1;
372 static constexpr
byte PIXELS_PER_BYTE_SHIFT = 0;
373 static constexpr
unsigned PIXELS_PER_LINE = 256;
374 static inline unsigned addressOf(
unsigned x,
unsigned y,
bool extVRAM);
375 static inline byte point(
VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM);
376 template<
typename LogOp>
377 static inline void pset(EmuTime::param time,
VDPVRAM& vram,
378 unsigned x,
unsigned addr,
byte src,
byte color, LogOp op);
379 static inline byte duplicate(
byte color);
383 unsigned x,
unsigned y,
bool extVRAM)
386 ? (((y & 511) << 8) | (
x & 255))
387 : (((y & 255) << 8) | (
x & 255) | 0x20000);
391 VDPVRAM& vram,
unsigned x,
unsigned y,
bool extVRAM)
396 template<
typename LogOp>
398 EmuTime::param time,
VDPVRAM& vram,
unsigned ,
unsigned addr,
399 byte src,
byte color, LogOp op)
401 op(time, vram, addr, src, color, 0);
452 : delta2((tx > 0) ? ( 0x10000 ^ (1 - 0x10000))
453 : (-0x10000 ^ (0x10000 - 1)))
456 delta = (tx > 0) ? 0x10000 : (0x10000 - 1);
457 if (
x & 1) delta ^= delta2;
472 const unsigned delta2;
490 delta = (tx == 1) ? (
x & 1) : ((
x & 1) - 1);
492 [[nodiscard]]
unsigned getAddr()
const {
return addr; }
510 c1 = -(signed(
x) & 1);
517 [[nodiscard]]
unsigned getAddr()
const {
return addr; }
533 : c3((tx == 1) ? unsigned(0x10000 ^ (1 - 0x10000))
534 : unsigned(-0x10000 ^ (0x10000 - 1)))
537 c1 = -(signed(
x) & 1);
539 c2 = (
x & 2) ? (1 - 0x10000) : 0x10000;
542 c2 = (
x & 2) ? -0x10000 : (0x10000 - 1);
545 [[nodiscard]]
unsigned getAddr()
const {
return addr; }
567 mask = 0x0F << ((
x & 1) << 2);
584 : shift((tx > 0) ? 6 : 2)
586 mask = ~(0xC0 >> ((
x & 3) << 1));
617 : shift(((dx - sx) & 1) * 4)
622 return (color >> shift) | (color << shift);
631 : shift(((dx - sx) & 3) * 2)
636 return (color >> shift) | (color << (8 - shift));
656 byte ,
byte ,
byte )
const
664 byte src,
byte color,
byte mask)
const
672 byte src,
byte color,
byte mask)
const
680 byte src,
byte color,
byte )
const
682 vram.
cmdWrite(addr, src | color, time);
688 byte src,
byte color,
byte )
const
690 vram.
cmdWrite(addr, src ^ color, time);
696 byte src,
byte color,
byte mask)
const
702 template<
typename Op>
705 byte src,
byte color,
byte mask)
const
710 if (color) Op::operator()(time, vram, addr, src, color,
mask);
722 void VDPCmdEngine::setStatusChangeTime(EmuTime::param
t)
724 statusChangeTime =
t;
725 if ((
t != EmuTime::infinity()) && executingProbe.anyObservers()) {
726 vdp.scheduleCmdSync(
t);
730 void VDPCmdEngine::calcFinishTime(
unsigned nx,
unsigned ny,
unsigned ticksPerPixel)
733 if (vdp.getBrokenCmdTiming()) {
734 setStatusChangeTime(EmuTime::zero());
742 t *= ((nx * (ny - 1)) + ANX);
743 setStatusChangeTime(engineTime +
t);
748 void VDPCmdEngine::startAbrt(EmuTime::param time)
755 void VDPCmdEngine::startPoint(EmuTime::param time)
757 vram.cmdReadWindow.setMask(0x3FFFF, ~0u << 18, time);
758 vram.cmdWriteWindow.disable(time);
759 nextAccessSlot(time);
760 setStatusChangeTime(EmuTime::zero());
763 template<
typename Mode>
764 void VDPCmdEngine::executePoint(EmuTime::param limit)
766 if (
unlikely(engineTime >= limit))
return;
768 bool srcExt = (ARG &
MXS) != 0;
769 bool doPoint = !srcExt || hasExtendedVRAM;
770 COL =
likely(doPoint) ? Mode::point(vram, SX, SY, srcExt) : 0xFF;
771 commandDone(engineTime);
776 void VDPCmdEngine::startPset(EmuTime::param time)
778 vram.cmdReadWindow.disable(time);
779 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
780 nextAccessSlot(time);
781 setStatusChangeTime(EmuTime::zero());
785 template<
typename Mode,
typename LogOp>
786 void VDPCmdEngine::executePset(EmuTime::param limit)
788 bool dstExt = (ARG &
MXD) != 0;
789 bool doPset = !dstExt || hasExtendedVRAM;
790 unsigned addr = Mode::addressOf(DX, DY, dstExt);
794 if (
unlikely(engineTime >= limit)) { phase = 0;
break; }
796 tmpDst = vram.cmdWriteWindow.readNP(addr);
801 if (
unlikely(engineTime >= limit)) { phase = 1;
break; }
803 byte col = COL & Mode::COLOR_MASK;
804 Mode::pset(engineTime, vram, DX, addr, tmpDst, col, LogOp());
806 commandDone(engineTime);
815 void VDPCmdEngine::startSrch(EmuTime::param time)
817 vram.cmdReadWindow.setMask(0x3FFFF, ~0u << 18, time);
818 vram.cmdWriteWindow.disable(time);
820 nextAccessSlot(time);
821 setStatusChangeTime(EmuTime::zero());
824 template<
typename Mode>
825 void VDPCmdEngine::executeSrch(EmuTime::param limit)
827 byte CL = COL & Mode::COLOR_MASK;
828 int TX = (ARG &
DIX) ? -1 : 1;
829 bool AEQ = (ARG &
EQ) != 0;
833 bool srcExt = (ARG &
MXS) != 0;
834 bool doPoint = !srcExt || hasExtendedVRAM;
835 auto calculator = getSlotCalculator(limit);
837 while (!calculator.limitReached()) {
839 ? Mode::point(vram, ASX, SY, srcExt)
841 if ((p == CL) ^ AEQ) {
843 commandDone(calculator.getTime());
846 if ((ASX += TX) & Mode::PIXELS_PER_LINE) {
848 commandDone(calculator.getTime());
853 engineTime = calculator.getTime();
858 void VDPCmdEngine::startLine(EmuTime::param time)
860 vram.cmdReadWindow.disable(time);
861 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
863 ASX = ((NX - 1) >> 1);
866 nextAccessSlot(time);
867 setStatusChangeTime(EmuTime::zero());
871 template<
typename Mode,
typename LogOp>
872 void VDPCmdEngine::executeLine(EmuTime::param limit)
875 byte CL = COL & Mode::COLOR_MASK;
876 int TX = (ARG &
DIX) ? -1 : 1;
877 int TY = (ARG &
DIY) ? -1 : 1;
878 bool dstExt = (ARG &
MXD) != 0;
879 bool doPset = !dstExt || hasExtendedVRAM;
880 unsigned addr = Mode::addressOf(ADX, DY, dstExt);
881 auto calculator = getSlotCalculator(limit);
885 loop:
if (
unlikely(calculator.limitReached())) { phase = 0;
break; }
887 tmpDst = vram.cmdWriteWindow.readNP(addr);
892 if (
unlikely(calculator.limitReached())) { phase = 1;
break; }
894 Mode::pset(calculator.getTime(), vram, ADX, addr,
895 tmpDst, CL, LogOp());
899 if ((ARG &
MAJ) == 0) {
906 if (ANX++ == NX || (ADX & Mode::PIXELS_PER_LINE)) {
907 commandDone(calculator.getTime());
928 if (ANX++ == NX || (ADX & Mode::PIXELS_PER_LINE)) {
929 commandDone(calculator.getTime());
933 addr = Mode::addressOf(ADX, DY, dstExt);
934 calculator.next(delta);
940 engineTime = calculator.getTime();
946 template<
typename Mode>
947 void VDPCmdEngine::startLmmv(EmuTime::param time)
949 vram.cmdReadWindow.disable(time);
950 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
952 unsigned tmpNX = clipNX_1_pixel<Mode>(DX, NX, ARG);
953 unsigned tmpNY = clipNY_1(DY, NY, ARG);
956 nextAccessSlot(time);
957 calcFinishTime(tmpNX, tmpNY, 72 + 24);
961 template<
typename Mode,
typename LogOp>
962 void VDPCmdEngine::executeLmmv(EmuTime::param limit)
965 unsigned tmpNX = clipNX_1_pixel<Mode>(DX, NX, ARG);
966 unsigned tmpNY = clipNY_1(DY, NY, ARG);
967 int TX = (ARG &
DIX) ? -1 : 1;
968 int TY = (ARG &
DIY) ? -1 : 1;
969 ANX = clipNX_1_pixel<Mode>(ADX, ANX, ARG);
970 byte CL = COL & Mode::COLOR_MASK;
971 bool dstExt = (ARG &
MXD) != 0;
972 bool doPset = !dstExt || hasExtendedVRAM;
973 unsigned addr = Mode::addressOf(ADX, DY, dstExt);
974 auto calculator = getSlotCalculator(limit);
978 loop:
if (
unlikely(calculator.limitReached())) { phase = 0;
break; }
980 tmpDst = vram.cmdWriteWindow.readNP(addr);
985 if (
unlikely(calculator.limitReached())) { phase = 1;
break; }
987 Mode::pset(calculator.getTime(), vram, ADX, addr,
988 tmpDst, CL, LogOp());
995 ADX = DX; ANX = tmpNX;
997 commandDone(calculator.getTime());
1001 addr = Mode::addressOf(ADX, DY, dstExt);
1002 calculator.next(delta);
1008 engineTime = calculator.getTime();
1009 this->calcFinishTime(tmpNX, tmpNY, 72 + 24);
1070 template<
typename Mode>
1071 void VDPCmdEngine::startLmmm(EmuTime::param time)
1073 vram.cmdReadWindow .setMask(0x3FFFF, ~0u << 18, time);
1074 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1076 unsigned tmpNX = clipNX_2_pixel<Mode>(SX, DX, NX, ARG);
1077 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1081 nextAccessSlot(time);
1082 calcFinishTime(tmpNX, tmpNY, 64 + 32 + 24);
1086 template<
typename Mode,
typename LogOp>
1087 void VDPCmdEngine::executeLmmm(EmuTime::param limit)
1090 unsigned tmpNX = clipNX_2_pixel<Mode>(SX, DX, NX, ARG);
1091 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1092 int TX = (ARG &
DIX) ? -1 : 1;
1093 int TY = (ARG &
DIY) ? -1 : 1;
1094 ANX = clipNX_2_pixel<Mode>(ASX, ADX, ANX, ARG);
1095 bool srcExt = (ARG &
MXS) != 0;
1096 bool dstExt = (ARG &
MXD) != 0;
1097 bool doPoint = !srcExt || hasExtendedVRAM;
1098 bool doPset = !dstExt || hasExtendedVRAM;
1099 unsigned dstAddr = Mode::addressOf(ADX, DY, dstExt);
1100 auto calculator = getSlotCalculator(limit);
1104 loop:
if (
unlikely(calculator.limitReached())) { phase = 0;
break; }
1106 ? Mode::point(vram, ASX, SY, srcExt)
1111 if (
unlikely(calculator.limitReached())) { phase = 1;
break; }
1113 tmpDst = vram.cmdWriteWindow.readNP(dstAddr);
1118 if (
unlikely(calculator.limitReached())) { phase = 2;
break; }
1120 Mode::pset(calculator.getTime(), vram, ADX, dstAddr,
1121 tmpDst, tmpSrc, LogOp());
1123 ASX += TX; ADX += TX;
1127 SY += TY; DY += TY; --NY;
1128 ASX = SX; ADX = DX; ANX = tmpNX;
1130 commandDone(calculator.getTime());
1134 dstAddr = Mode::addressOf(ADX, DY, dstExt);
1135 calculator.next(delta);
1141 engineTime = calculator.getTime();
1142 this->calcFinishTime(tmpNX, tmpNY, 64 + 32 + 24);
1213 template<
typename Mode>
1214 void VDPCmdEngine::startLmcm(EmuTime::param time)
1216 vram.cmdReadWindow.setMask(0x3FFFF, ~0u << 18, time);
1217 vram.cmdWriteWindow.disable(time);
1219 unsigned tmpNX = clipNX_1_pixel<Mode>(SX, NX, ARG);
1224 nextAccessSlot(time);
1225 setStatusChangeTime(EmuTime::zero());
1228 template<
typename Mode>
1229 void VDPCmdEngine::executeLmcm(EmuTime::param limit)
1231 if (!transfer)
return;
1232 if (
unlikely(engineTime >= limit))
return;
1235 unsigned tmpNX = clipNX_1_pixel<Mode>(SX, NX, ARG);
1236 unsigned tmpNY = clipNY_1(SY, NY, ARG);
1237 int TX = (ARG &
DIX) ? -1 : 1;
1238 int TY = (ARG &
DIY) ? -1 : 1;
1239 ANX = clipNX_1_pixel<Mode>(ASX, ANX, ARG);
1240 bool srcExt = (ARG &
MXS) != 0;
1241 bool doPoint = !srcExt || hasExtendedVRAM;
1247 ? Mode::point(vram, ASX, SY, srcExt)
1253 ASX = SX; ANX = tmpNX;
1255 commandDone(engineTime);
1258 nextAccessSlot(limit);
1263 template<
typename Mode>
1264 void VDPCmdEngine::startLmmc(EmuTime::param time)
1266 vram.cmdReadWindow.disable(time);
1267 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1269 unsigned tmpNX = clipNX_1_pixel<Mode>(DX, NX, ARG);
1272 setStatusChangeTime(EmuTime::zero());
1276 nextAccessSlot(time);
1279 template<
typename Mode,
typename LogOp>
1280 void VDPCmdEngine::executeLmmc(EmuTime::param limit)
1283 unsigned tmpNX = clipNX_1_pixel<Mode>(DX, NX, ARG);
1284 unsigned tmpNY = clipNY_1(DY, NY, ARG);
1285 int TX = (ARG &
DIX) ? -1 : 1;
1286 int TY = (ARG &
DIY) ? -1 : 1;
1287 ANX = clipNX_1_pixel<Mode>(ADX, ANX, ARG);
1288 bool dstExt = (ARG &
MXD) != 0;
1289 bool doPset = !dstExt || hasExtendedVRAM;
1292 byte col = COL & Mode::COLOR_MASK;
1299 unsigned addr = Mode::addressOf(ADX, DY, dstExt);
1300 tmpDst = vram.cmdWriteWindow.readNP(addr);
1301 Mode::pset(limit, vram, ADX, addr,
1302 tmpDst, col, LogOp());
1313 ADX = DX; ANX = tmpNX;
1319 nextAccessSlot(limit);
1324 template<
typename Mode>
1325 void VDPCmdEngine::startHmmv(EmuTime::param time)
1327 vram.cmdReadWindow.disable(time);
1328 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1330 unsigned tmpNX = clipNX_1_byte<Mode>(DX, NX, ARG);
1331 unsigned tmpNY = clipNY_1(DY, NY, ARG);
1334 nextAccessSlot(time);
1335 calcFinishTime(tmpNX, tmpNY, 48);
1338 template<
typename Mode>
1339 void VDPCmdEngine::executeHmmv(EmuTime::param limit)
1342 unsigned tmpNX = clipNX_1_byte<Mode>(DX, NX, ARG);
1343 unsigned tmpNY = clipNY_1(DY, NY, ARG);
1344 int TX = (ARG &
DIX)
1345 ? -Mode::PIXELS_PER_BYTE : Mode::PIXELS_PER_BYTE;
1346 int TY = (ARG &
DIY) ? -1 : 1;
1347 ANX = clipNX_1_byte<Mode>(
1348 ADX, ANX << Mode::PIXELS_PER_BYTE_SHIFT, ARG);
1349 bool dstExt = (ARG &
MXD) != 0;
1350 bool doPset = !dstExt || hasExtendedVRAM;
1351 auto calculator = getSlotCalculator(limit);
1353 while (!calculator.limitReached()) {
1355 vram.cmdWrite(Mode::addressOf(ADX, DY, dstExt),
1356 COL, calculator.getTime());
1363 ADX = DX; ANX = tmpNX;
1365 commandDone(calculator.getTime());
1369 calculator.next(delta);
1371 engineTime = calculator.getTime();
1372 calcFinishTime(tmpNX, tmpNY, 48);
1428 template<
typename Mode>
1429 void VDPCmdEngine::startHmmm(EmuTime::param time)
1431 vram.cmdReadWindow .setMask(0x3FFFF, ~0u << 18, time);
1432 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1434 unsigned tmpNX = clipNX_2_byte<Mode>(SX, DX, NX, ARG);
1435 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1439 nextAccessSlot(time);
1440 calcFinishTime(tmpNX, tmpNY, 24 + 64);
1444 template<
typename Mode>
1445 void VDPCmdEngine::executeHmmm(EmuTime::param limit)
1448 unsigned tmpNX = clipNX_2_byte<Mode>(SX, DX, NX, ARG);
1449 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1450 int TX = (ARG &
DIX)
1451 ? -Mode::PIXELS_PER_BYTE : Mode::PIXELS_PER_BYTE;
1452 int TY = (ARG &
DIY) ? -1 : 1;
1453 ANX = clipNX_2_byte<Mode>(
1454 ASX, ADX, ANX << Mode::PIXELS_PER_BYTE_SHIFT, ARG);
1455 bool srcExt = (ARG &
MXS) != 0;
1456 bool dstExt = (ARG &
MXD) != 0;
1457 bool doPoint = !srcExt || hasExtendedVRAM;
1458 bool doPset = !dstExt || hasExtendedVRAM;
1459 auto calculator = getSlotCalculator(limit);
1463 loop:
if (
unlikely(calculator.limitReached())) { phase = 0;
break; }
1465 ? vram.cmdReadWindow.readNP(
1466 Mode::addressOf(ASX, SY, srcExt))
1471 if (
unlikely(calculator.limitReached())) { phase = 1;
break; }
1473 vram.cmdWrite(Mode::addressOf(ADX, DY, dstExt),
1474 tmpSrc, calculator.getTime());
1476 ASX += TX; ADX += TX;
1480 SY += TY; DY += TY; --NY;
1481 ASX = SX; ADX = DX; ANX = tmpNX;
1483 commandDone(calculator.getTime());
1487 calculator.next(delta);
1493 engineTime = calculator.getTime();
1494 calcFinishTime(tmpNX, tmpNY, 24 + 64);
1560 template<
typename Mode>
1561 void VDPCmdEngine::startYmmm(EmuTime::param time)
1563 vram.cmdReadWindow .setMask(0x3FFFF, ~0u << 18, time);
1564 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1566 unsigned tmpNX = clipNX_1_byte<Mode>(DX, 512, ARG);
1568 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1571 nextAccessSlot(time);
1572 calcFinishTime(tmpNX, tmpNY, 24 + 40);
1576 template<
typename Mode>
1577 void VDPCmdEngine::executeYmmm(EmuTime::param limit)
1580 unsigned tmpNX = clipNX_1_byte<Mode>(DX, 512, ARG);
1582 unsigned tmpNY = clipNY_2(SY, DY, NY, ARG);
1583 int TX = (ARG &
DIX)
1584 ? -Mode::PIXELS_PER_BYTE : Mode::PIXELS_PER_BYTE;
1585 int TY = (ARG &
DIY) ? -1 : 1;
1586 ANX = clipNX_1_byte<Mode>(ADX, 512, ARG);
1591 bool dstExt = (ARG &
MXD) != 0;
1592 bool doPset = !dstExt || hasExtendedVRAM;
1593 auto calculator = getSlotCalculator(limit);
1597 loop:
if (
unlikely(calculator.limitReached())) { phase = 0;
break; }
1599 tmpSrc = vram.cmdReadWindow.readNP(
1600 Mode::addressOf(ADX, SY, dstExt));
1605 if (
unlikely(calculator.limitReached())) { phase = 1;
break; }
1607 vram.cmdWrite(Mode::addressOf(ADX, DY, dstExt),
1608 tmpSrc, calculator.getTime());
1613 SY += TY; DY += TY; --NY;
1614 ADX = DX; ANX = tmpNX;
1616 commandDone(calculator.getTime());
1625 engineTime = calculator.getTime();
1626 calcFinishTime(tmpNX, tmpNY, 24 + 40);
1688 template<
typename Mode>
1689 void VDPCmdEngine::startHmmc(EmuTime::param time)
1691 vram.cmdReadWindow.disable(time);
1692 vram.cmdWriteWindow.setMask(0x3FFFF, ~0u << 18, time);
1694 unsigned tmpNX = clipNX_1_byte<Mode>(DX, NX, ARG);
1697 setStatusChangeTime(EmuTime::zero());
1700 nextAccessSlot(time);
1703 template<
typename Mode>
1704 void VDPCmdEngine::executeHmmc(EmuTime::param limit)
1707 unsigned tmpNX = clipNX_1_byte<Mode>(DX, NX, ARG);
1708 unsigned tmpNY = clipNY_1(DY, NY, ARG);
1709 int TX = (ARG &
DIX)
1710 ? -Mode::PIXELS_PER_BYTE : Mode::PIXELS_PER_BYTE;
1711 int TY = (ARG &
DIY) ? -1 : 1;
1712 ANX = clipNX_1_byte<Mode>(
1713 ADX, ANX << Mode::PIXELS_PER_BYTE_SHIFT, ARG);
1714 bool dstExt = (ARG &
MXD) != 0;
1715 bool doPset = !dstExt || hasExtendedVRAM;
1722 vram.cmdWrite(Mode::addressOf(ADX, DY, dstExt),
1730 ADX = DX; ANX = tmpNX;
1736 nextAccessSlot(limit);
1741 : vdp(vdp_), vram(vdp.getVRAM())
1743 commandController, vdp_.
getName() ==
"VDP" ?
"vdpcmdtrace" :
1744 vdp_.
getName() +
" vdpcmdtrace",
"VDP command tracing on/off",
1746 , cmdInProgressCallback(
1747 commandController, vdp_.
getName() ==
"VDP" ?
1748 "vdpcmdinprogress_callback" : vdp_.
getName() +
1749 " vdpcmdinprogress_callback",
1750 "Tcl proc to call when a write to the VDP command engine is "
1751 "detected while the previous command is still in progress.")
1753 vdp_.getMotherBoard().getDebugger(),
1755 "Is the V99x8 VDP is currently executing a command",
1757 , engineTime(EmuTime::zero())
1758 , statusChangeTime(EmuTime::infinity())
1759 , hasExtendedVRAM(vram.getSize() == (192 * 1024))
1764 SX = SY = DX = DY = NX = NY = 0;
1765 ASX = ADX = ANX = 0;
1766 COL = ARG = CMD = 0;
1767 phase = tmpSrc = tmpDst = 0;
1772 for (
int i = 14; i >= 0; --i) {
1784 if (CMD && (index != 12)) {
1785 cmdInProgressCallback.
execute(index, value);
1789 SX = (SX & 0x100) | value;
1792 SX = (SX & 0x0FF) | ((value & 0x01) << 8);
1795 SY = (SY & 0x300) | value;
1798 SY = (SY & 0x0FF) | ((value & 0x03) << 8);
1802 DX = (DX & 0x100) | value;
1805 DX = (DX & 0x0FF) | ((value & 0x01) << 8);
1808 DY = (DY & 0x300) | value;
1811 DY = (DY & 0x0FF) | ((value & 0x03) << 8);
1817 NX = (NX & 0x300) | value;
1820 NX = (NX & 0x0FF) | ((value & 0x03) << 8);
1823 NY = (NY & 0x300) | value;
1826 NY = (NY & 0x0FF) | ((value & 0x03) << 8);
1834 if (!CMD) status &= 0x7F;
1842 executeCommand(time);
1852 case 0x00:
return SX & 0xFF;
1853 case 0x01:
return SX >> 8;
1854 case 0x02:
return SY & 0xFF;
1855 case 0x03:
return SY >> 8;
1857 case 0x04:
return DX & 0xFF;
1858 case 0x05:
return DX >> 8;
1859 case 0x06:
return DY & 0xFF;
1860 case 0x07:
return DY >> 8;
1862 case 0x08:
return NX & 0xFF;
1863 case 0x09:
return NX >> 8;
1864 case 0x0A:
return NY & 0xFF;
1865 case 0x0B:
return NY >> 8;
1867 case 0x0C:
return COL;
1868 case 0x0D:
return ARG;
1869 case 0x0E:
return CMD;
1876 int newScrMode = [&] {
1896 if (newScrMode != scrMode) {
1900 if (newScrMode == -1) {
1908 scrMode = newScrMode;
1912 void VDPCmdEngine::executeCommand(EmuTime::param time)
1927 executingProbe =
true;
1929 switch ((scrMode << 4) | (CMD >> 4)) {
1930 case 0x00:
case 0x10:
case 0x20:
case 0x30:
case 0x40:
1931 case 0x01:
case 0x11:
case 0x21:
case 0x31:
case 0x41:
1932 case 0x02:
case 0x12:
case 0x22:
case 0x32:
case 0x42:
1933 case 0x03:
case 0x13:
case 0x23:
case 0x33:
case 0x43:
1934 startAbrt(time);
break;
1936 case 0x04:
case 0x14:
case 0x24:
case 0x34:
case 0x44:
1937 startPoint(time);
break;
1938 case 0x05:
case 0x15:
case 0x25:
case 0x35:
case 0x45:
1939 startPset(time);
break;
1940 case 0x06:
case 0x16:
case 0x26:
case 0x36:
case 0x46:
1941 startSrch(time);
break;
1942 case 0x07:
case 0x17:
case 0x27:
case 0x37:
case 0x47:
1943 startLine(time);
break;
1945 case 0x08: startLmmv<Graphic4Mode >(time);
break;
1946 case 0x18: startLmmv<Graphic5Mode >(time);
break;
1947 case 0x28: startLmmv<Graphic6Mode >(time);
break;
1948 case 0x38: startLmmv<Graphic7Mode >(time);
break;
1949 case 0x48: startLmmv<NonBitmapMode>(time);
break;
1951 case 0x09: startLmmm<Graphic4Mode >(time);
break;
1952 case 0x19: startLmmm<Graphic5Mode >(time);
break;
1953 case 0x29: startLmmm<Graphic6Mode >(time);
break;
1954 case 0x39: startLmmm<Graphic7Mode >(time);
break;
1955 case 0x49: startLmmm<NonBitmapMode>(time);
break;
1957 case 0x0A: startLmcm<Graphic4Mode >(time);
break;
1958 case 0x1A: startLmcm<Graphic5Mode >(time);
break;
1959 case 0x2A: startLmcm<Graphic6Mode >(time);
break;
1960 case 0x3A: startLmcm<Graphic7Mode >(time);
break;
1961 case 0x4A: startLmcm<NonBitmapMode>(time);
break;
1963 case 0x0B: startLmmc<Graphic4Mode >(time);
break;
1964 case 0x1B: startLmmc<Graphic5Mode >(time);
break;
1965 case 0x2B: startLmmc<Graphic6Mode >(time);
break;
1966 case 0x3B: startLmmc<Graphic7Mode >(time);
break;
1967 case 0x4B: startLmmc<NonBitmapMode>(time);
break;
1969 case 0x0C: startHmmv<Graphic4Mode >(time);
break;
1970 case 0x1C: startHmmv<Graphic5Mode >(time);
break;
1971 case 0x2C: startHmmv<Graphic6Mode >(time);
break;
1972 case 0x3C: startHmmv<Graphic7Mode >(time);
break;
1973 case 0x4C: startHmmv<NonBitmapMode>(time);
break;
1975 case 0x0D: startHmmm<Graphic4Mode >(time);
break;
1976 case 0x1D: startHmmm<Graphic5Mode >(time);
break;
1977 case 0x2D: startHmmm<Graphic6Mode >(time);
break;
1978 case 0x3D: startHmmm<Graphic7Mode >(time);
break;
1979 case 0x4D: startHmmm<NonBitmapMode>(time);
break;
1981 case 0x0E: startYmmm<Graphic4Mode >(time);
break;
1982 case 0x1E: startYmmm<Graphic5Mode >(time);
break;
1983 case 0x2E: startYmmm<Graphic6Mode >(time);
break;
1984 case 0x3E: startYmmm<Graphic7Mode >(time);
break;
1985 case 0x4E: startYmmm<NonBitmapMode>(time);
break;
1987 case 0x0F: startHmmc<Graphic4Mode >(time);
break;
1988 case 0x1F: startHmmc<Graphic5Mode >(time);
break;
1989 case 0x2F: startHmmc<Graphic6Mode >(time);
break;
1990 case 0x3F: startHmmc<Graphic7Mode >(time);
break;
1991 case 0x4F: startHmmc<NonBitmapMode>(time);
break;
1999 switch ((scrMode << 8) | CMD) {
2000 case 0x000:
case 0x100:
case 0x200:
case 0x300:
case 0x400:
2001 case 0x001:
case 0x101:
case 0x201:
case 0x301:
case 0x401:
2002 case 0x002:
case 0x102:
case 0x202:
case 0x302:
case 0x402:
2003 case 0x003:
case 0x103:
case 0x203:
case 0x303:
case 0x403:
2004 case 0x004:
case 0x104:
case 0x204:
case 0x304:
case 0x404:
2005 case 0x005:
case 0x105:
case 0x205:
case 0x305:
case 0x405:
2006 case 0x006:
case 0x106:
case 0x206:
case 0x306:
case 0x406:
2007 case 0x007:
case 0x107:
case 0x207:
case 0x307:
case 0x407:
2008 case 0x008:
case 0x108:
case 0x208:
case 0x308:
case 0x408:
2009 case 0x009:
case 0x109:
case 0x209:
case 0x309:
case 0x409:
2010 case 0x00A:
case 0x10A:
case 0x20A:
case 0x30A:
case 0x40A:
2011 case 0x00B:
case 0x10B:
case 0x20B:
case 0x30B:
case 0x40B:
2012 case 0x00C:
case 0x10C:
case 0x20C:
case 0x30C:
case 0x40C:
2013 case 0x00D:
case 0x10D:
case 0x20D:
case 0x30D:
case 0x40D:
2014 case 0x00E:
case 0x10E:
case 0x20E:
case 0x30E:
case 0x40E:
2015 case 0x00F:
case 0x10F:
case 0x20F:
case 0x30F:
case 0x40F:
2016 case 0x010:
case 0x110:
case 0x210:
case 0x310:
case 0x410:
2017 case 0x011:
case 0x111:
case 0x211:
case 0x311:
case 0x411:
2018 case 0x012:
case 0x112:
case 0x212:
case 0x312:
case 0x412:
2019 case 0x013:
case 0x113:
case 0x213:
case 0x313:
case 0x413:
2020 case 0x014:
case 0x114:
case 0x214:
case 0x314:
case 0x414:
2021 case 0x015:
case 0x115:
case 0x215:
case 0x315:
case 0x415:
2022 case 0x016:
case 0x116:
case 0x216:
case 0x316:
case 0x416:
2023 case 0x017:
case 0x117:
case 0x217:
case 0x317:
case 0x417:
2024 case 0x018:
case 0x118:
case 0x218:
case 0x318:
case 0x418:
2025 case 0x019:
case 0x119:
case 0x219:
case 0x319:
case 0x419:
2026 case 0x01A:
case 0x11A:
case 0x21A:
case 0x31A:
case 0x41A:
2027 case 0x01B:
case 0x11B:
case 0x21B:
case 0x31B:
case 0x41B:
2028 case 0x01C:
case 0x11C:
case 0x21C:
case 0x31C:
case 0x41C:
2029 case 0x01D:
case 0x11D:
case 0x21D:
case 0x31D:
case 0x41D:
2030 case 0x01E:
case 0x11E:
case 0x21E:
case 0x31E:
case 0x41E:
2031 case 0x01F:
case 0x11F:
case 0x21F:
case 0x31F:
case 0x41F:
2032 case 0x020:
case 0x120:
case 0x220:
case 0x320:
case 0x420:
2033 case 0x021:
case 0x121:
case 0x221:
case 0x321:
case 0x421:
2034 case 0x022:
case 0x122:
case 0x222:
case 0x322:
case 0x422:
2035 case 0x023:
case 0x123:
case 0x223:
case 0x323:
case 0x423:
2036 case 0x024:
case 0x124:
case 0x224:
case 0x324:
case 0x424:
2037 case 0x025:
case 0x125:
case 0x225:
case 0x325:
case 0x425:
2038 case 0x026:
case 0x126:
case 0x226:
case 0x326:
case 0x426:
2039 case 0x027:
case 0x127:
case 0x227:
case 0x327:
case 0x427:
2040 case 0x028:
case 0x128:
case 0x228:
case 0x328:
case 0x428:
2041 case 0x029:
case 0x129:
case 0x229:
case 0x329:
case 0x429:
2042 case 0x02A:
case 0x12A:
case 0x22A:
case 0x32A:
case 0x42A:
2043 case 0x02B:
case 0x12B:
case 0x22B:
case 0x32B:
case 0x42B:
2044 case 0x02C:
case 0x12C:
case 0x22C:
case 0x32C:
case 0x42C:
2045 case 0x02D:
case 0x12D:
case 0x22D:
case 0x32D:
case 0x42D:
2046 case 0x02E:
case 0x12E:
case 0x22E:
case 0x32E:
case 0x42E:
2047 case 0x02F:
case 0x12F:
case 0x22F:
case 0x32F:
case 0x42F:
2048 case 0x030:
case 0x130:
case 0x230:
case 0x330:
case 0x430:
2049 case 0x031:
case 0x131:
case 0x231:
case 0x331:
case 0x431:
2050 case 0x032:
case 0x132:
case 0x232:
case 0x332:
case 0x432:
2051 case 0x033:
case 0x133:
case 0x233:
case 0x333:
case 0x433:
2052 case 0x034:
case 0x134:
case 0x234:
case 0x334:
case 0x434:
2053 case 0x035:
case 0x135:
case 0x235:
case 0x335:
case 0x435:
2054 case 0x036:
case 0x136:
case 0x236:
case 0x336:
case 0x436:
2055 case 0x037:
case 0x137:
case 0x237:
case 0x337:
case 0x437:
2056 case 0x038:
case 0x138:
case 0x238:
case 0x338:
case 0x438:
2057 case 0x039:
case 0x139:
case 0x239:
case 0x339:
case 0x439:
2058 case 0x03A:
case 0x13A:
case 0x23A:
case 0x33A:
case 0x43A:
2059 case 0x03B:
case 0x13B:
case 0x23B:
case 0x33B:
case 0x43B:
2060 case 0x03C:
case 0x13C:
case 0x23C:
case 0x33C:
case 0x43C:
2061 case 0x03D:
case 0x13D:
case 0x23D:
case 0x33D:
case 0x43D:
2062 case 0x03E:
case 0x13E:
case 0x23E:
case 0x33E:
case 0x43E:
2063 case 0x03F:
case 0x13F:
case 0x23F:
case 0x33F:
case 0x43F:
2066 case 0x040:
case 0x041:
case 0x042:
case 0x043:
2067 case 0x044:
case 0x045:
case 0x046:
case 0x047:
2068 case 0x048:
case 0x049:
case 0x04A:
case 0x04B:
2069 case 0x04C:
case 0x04D:
case 0x04E:
case 0x04F:
2070 executePoint<Graphic4Mode>(time);
break;
2071 case 0x140:
case 0x141:
case 0x142:
case 0x143:
2072 case 0x144:
case 0x145:
case 0x146:
case 0x147:
2073 case 0x148:
case 0x149:
case 0x14A:
case 0x14B:
2074 case 0x14C:
case 0x14D:
case 0x14E:
case 0x14F:
2075 executePoint<Graphic5Mode>(time);
break;
2076 case 0x240:
case 0x241:
case 0x242:
case 0x243:
2077 case 0x244:
case 0x245:
case 0x246:
case 0x247:
2078 case 0x248:
case 0x249:
case 0x24A:
case 0x24B:
2079 case 0x24C:
case 0x24D:
case 0x24E:
case 0x24F:
2080 executePoint<Graphic6Mode>(time);
break;
2081 case 0x340:
case 0x341:
case 0x342:
case 0x343:
2082 case 0x344:
case 0x345:
case 0x346:
case 0x347:
2083 case 0x348:
case 0x349:
case 0x34A:
case 0x34B:
2084 case 0x34C:
case 0x34D:
case 0x34E:
case 0x34F:
2085 executePoint<Graphic7Mode>(time);
break;
2086 case 0x440:
case 0x441:
case 0x442:
case 0x443:
2087 case 0x444:
case 0x445:
case 0x446:
case 0x447:
2088 case 0x448:
case 0x449:
case 0x44A:
case 0x44B:
2089 case 0x44C:
case 0x44D:
case 0x44E:
case 0x44F:
2090 executePoint<NonBitmapMode>(time);
break;
2092 case 0x050: executePset<Graphic4Mode, ImpOp>(time);
break;
2093 case 0x051: executePset<Graphic4Mode, AndOp>(time);
break;
2094 case 0x052: executePset<Graphic4Mode, OrOp >(time);
break;
2095 case 0x053: executePset<Graphic4Mode, XorOp>(time);
break;
2096 case 0x054: executePset<Graphic4Mode, NotOp>(time);
break;
2097 case 0x058: executePset<Graphic4Mode, TImpOp>(time);
break;
2098 case 0x059: executePset<Graphic4Mode, TAndOp>(time);
break;
2099 case 0x05A: executePset<Graphic4Mode, TOrOp >(time);
break;
2100 case 0x05B: executePset<Graphic4Mode, TXorOp>(time);
break;
2101 case 0x05C: executePset<Graphic4Mode, TNotOp>(time);
break;
2102 case 0x055:
case 0x056:
case 0x057:
case 0x05D:
case 0x05E:
case 0x05F:
2103 executePset<Graphic4Mode, DummyOp>(time);
break;
2104 case 0x150: executePset<Graphic5Mode, ImpOp>(time);
break;
2105 case 0x151: executePset<Graphic5Mode, AndOp>(time);
break;
2106 case 0x152: executePset<Graphic5Mode, OrOp >(time);
break;
2107 case 0x153: executePset<Graphic5Mode, XorOp>(time);
break;
2108 case 0x154: executePset<Graphic5Mode, NotOp>(time);
break;
2109 case 0x158: executePset<Graphic5Mode, TImpOp>(time);
break;
2110 case 0x159: executePset<Graphic5Mode, TAndOp>(time);
break;
2111 case 0x15A: executePset<Graphic5Mode, TOrOp >(time);
break;
2112 case 0x15B: executePset<Graphic5Mode, TXorOp>(time);
break;
2113 case 0x15C: executePset<Graphic5Mode, TNotOp>(time);
break;
2114 case 0x155:
case 0x156:
case 0x157:
case 0x15D:
case 0x15E:
case 0x15F:
2115 executePset<Graphic5Mode, DummyOp>(time);
break;
2116 case 0x250: executePset<Graphic6Mode, ImpOp>(time);
break;
2117 case 0x251: executePset<Graphic6Mode, AndOp>(time);
break;
2118 case 0x252: executePset<Graphic6Mode, OrOp >(time);
break;
2119 case 0x253: executePset<Graphic6Mode, XorOp>(time);
break;
2120 case 0x254: executePset<Graphic6Mode, NotOp>(time);
break;
2121 case 0x258: executePset<Graphic6Mode, TImpOp>(time);
break;
2122 case 0x259: executePset<Graphic6Mode, TAndOp>(time);
break;
2123 case 0x25A: executePset<Graphic6Mode, TOrOp >(time);
break;
2124 case 0x25B: executePset<Graphic6Mode, TXorOp>(time);
break;
2125 case 0x25C: executePset<Graphic6Mode, TNotOp>(time);
break;
2126 case 0x255:
case 0x256:
case 0x257:
case 0x25D:
case 0x25E:
case 0x25F:
2127 executePset<Graphic6Mode, DummyOp>(time);
break;
2128 case 0x350: executePset<Graphic7Mode, ImpOp>(time);
break;
2129 case 0x351: executePset<Graphic7Mode, AndOp>(time);
break;
2130 case 0x352: executePset<Graphic7Mode, OrOp >(time);
break;
2131 case 0x353: executePset<Graphic7Mode, XorOp>(time);
break;
2132 case 0x354: executePset<Graphic7Mode, NotOp>(time);
break;
2133 case 0x358: executePset<Graphic7Mode, TImpOp>(time);
break;
2134 case 0x359: executePset<Graphic7Mode, TAndOp>(time);
break;
2135 case 0x35A: executePset<Graphic7Mode, TOrOp >(time);
break;
2136 case 0x35B: executePset<Graphic7Mode, TXorOp>(time);
break;
2137 case 0x35C: executePset<Graphic7Mode, TNotOp>(time);
break;
2138 case 0x355:
case 0x356:
case 0x357:
case 0x35D:
case 0x35E:
case 0x35F:
2139 executePset<Graphic7Mode, DummyOp>(time);
break;
2140 case 0x450: executePset<NonBitmapMode, ImpOp>(time);
break;
2141 case 0x451: executePset<NonBitmapMode, AndOp>(time);
break;
2142 case 0x452: executePset<NonBitmapMode, OrOp >(time);
break;
2143 case 0x453: executePset<NonBitmapMode, XorOp>(time);
break;
2144 case 0x454: executePset<NonBitmapMode, NotOp>(time);
break;
2145 case 0x458: executePset<NonBitmapMode, TImpOp>(time);
break;
2146 case 0x459: executePset<NonBitmapMode, TAndOp>(time);
break;
2147 case 0x45A: executePset<NonBitmapMode, TOrOp >(time);
break;
2148 case 0x45B: executePset<NonBitmapMode, TXorOp>(time);
break;
2149 case 0x45C: executePset<NonBitmapMode, TNotOp>(time);
break;
2150 case 0x455:
case 0x456:
case 0x457:
case 0x45D:
case 0x45E:
case 0x45F:
2151 executePset<NonBitmapMode, DummyOp>(time);
break;
2153 case 0x060:
case 0x061:
case 0x062:
case 0x063:
2154 case 0x064:
case 0x065:
case 0x066:
case 0x067:
2155 case 0x068:
case 0x069:
case 0x06A:
case 0x06B:
2156 case 0x06C:
case 0x06D:
case 0x06E:
case 0x06F:
2157 executeSrch<Graphic4Mode>(time);
break;
2158 case 0x160:
case 0x161:
case 0x162:
case 0x163:
2159 case 0x164:
case 0x165:
case 0x166:
case 0x167:
2160 case 0x168:
case 0x169:
case 0x16A:
case 0x16B:
2161 case 0x16C:
case 0x16D:
case 0x16E:
case 0x16F:
2162 executeSrch<Graphic5Mode>(time);
break;
2163 case 0x260:
case 0x261:
case 0x262:
case 0x263:
2164 case 0x264:
case 0x265:
case 0x266:
case 0x267:
2165 case 0x268:
case 0x269:
case 0x26A:
case 0x26B:
2166 case 0x26C:
case 0x26D:
case 0x26E:
case 0x26F:
2167 executeSrch<Graphic6Mode>(time);
break;
2168 case 0x360:
case 0x361:
case 0x362:
case 0x363:
2169 case 0x364:
case 0x365:
case 0x366:
case 0x367:
2170 case 0x368:
case 0x369:
case 0x36A:
case 0x36B:
2171 case 0x36C:
case 0x36D:
case 0x36E:
case 0x36F:
2172 executeSrch<Graphic7Mode>(time);
break;
2173 case 0x460:
case 0x461:
case 0x462:
case 0x463:
2174 case 0x464:
case 0x465:
case 0x466:
case 0x467:
2175 case 0x468:
case 0x469:
case 0x46A:
case 0x46B:
2176 case 0x46C:
case 0x46D:
case 0x46E:
case 0x46F:
2177 executeSrch<NonBitmapMode>(time);
break;
2179 case 0x070: executeLine<Graphic4Mode, ImpOp>(time);
break;
2180 case 0x071: executeLine<Graphic4Mode, AndOp>(time);
break;
2181 case 0x072: executeLine<Graphic4Mode, OrOp >(time);
break;
2182 case 0x073: executeLine<Graphic4Mode, XorOp>(time);
break;
2183 case 0x074: executeLine<Graphic4Mode, NotOp>(time);
break;
2184 case 0x078: executeLine<Graphic4Mode, TImpOp>(time);
break;
2185 case 0x079: executeLine<Graphic4Mode, TAndOp>(time);
break;
2186 case 0x07A: executeLine<Graphic4Mode, TOrOp >(time);
break;
2187 case 0x07B: executeLine<Graphic4Mode, TXorOp>(time);
break;
2188 case 0x07C: executeLine<Graphic4Mode, TNotOp>(time);
break;
2189 case 0x075:
case 0x076:
case 0x077:
case 0x07D:
case 0x07E:
case 0x07F:
2190 executeLine<Graphic4Mode, DummyOp>(time);
break;
2191 case 0x170: executeLine<Graphic5Mode, ImpOp>(time);
break;
2192 case 0x171: executeLine<Graphic5Mode, AndOp>(time);
break;
2193 case 0x172: executeLine<Graphic5Mode, OrOp >(time);
break;
2194 case 0x173: executeLine<Graphic5Mode, XorOp>(time);
break;
2195 case 0x174: executeLine<Graphic5Mode, NotOp>(time);
break;
2196 case 0x178: executeLine<Graphic5Mode, TImpOp>(time);
break;
2197 case 0x179: executeLine<Graphic5Mode, TAndOp>(time);
break;
2198 case 0x17A: executeLine<Graphic5Mode, TOrOp >(time);
break;
2199 case 0x17B: executeLine<Graphic5Mode, TXorOp>(time);
break;
2200 case 0x17C: executeLine<Graphic5Mode, TNotOp>(time);
break;
2201 case 0x175:
case 0x176:
case 0x177:
case 0x17D:
case 0x17E:
case 0x17F:
2202 executeLine<Graphic5Mode, DummyOp>(time);
break;
2203 case 0x270: executeLine<Graphic6Mode, ImpOp>(time);
break;
2204 case 0x271: executeLine<Graphic6Mode, AndOp>(time);
break;
2205 case 0x272: executeLine<Graphic6Mode, OrOp >(time);
break;
2206 case 0x273: executeLine<Graphic6Mode, XorOp>(time);
break;
2207 case 0x274: executeLine<Graphic6Mode, NotOp>(time);
break;
2208 case 0x278: executeLine<Graphic6Mode, TImpOp>(time);
break;
2209 case 0x279: executeLine<Graphic6Mode, TAndOp>(time);
break;
2210 case 0x27A: executeLine<Graphic6Mode, TOrOp >(time);
break;
2211 case 0x27B: executeLine<Graphic6Mode, TXorOp>(time);
break;
2212 case 0x27C: executeLine<Graphic6Mode, TNotOp>(time);
break;
2213 case 0x275:
case 0x276:
case 0x277:
case 0x27D:
case 0x27E:
case 0x27F:
2214 executeLine<Graphic6Mode, DummyOp>(time);
break;
2215 case 0x370: executeLine<Graphic7Mode, ImpOp>(time);
break;
2216 case 0x371: executeLine<Graphic7Mode, AndOp>(time);
break;
2217 case 0x372: executeLine<Graphic7Mode, OrOp >(time);
break;
2218 case 0x373: executeLine<Graphic7Mode, XorOp>(time);
break;
2219 case 0x374: executeLine<Graphic7Mode, NotOp>(time);
break;
2220 case 0x378: executeLine<Graphic7Mode, TImpOp>(time);
break;
2221 case 0x379: executeLine<Graphic7Mode, TAndOp>(time);
break;
2222 case 0x37A: executeLine<Graphic7Mode, TOrOp >(time);
break;
2223 case 0x37B: executeLine<Graphic7Mode, TXorOp>(time);
break;
2224 case 0x37C: executeLine<Graphic7Mode, TNotOp>(time);
break;
2225 case 0x375:
case 0x376:
case 0x377:
case 0x37D:
case 0x37E:
case 0x37F:
2226 executeLine<Graphic7Mode, DummyOp>(time);
break;
2227 case 0x470: executeLine<NonBitmapMode, ImpOp>(time);
break;
2228 case 0x471: executeLine<NonBitmapMode, AndOp>(time);
break;
2229 case 0x472: executeLine<NonBitmapMode, OrOp >(time);
break;
2230 case 0x473: executeLine<NonBitmapMode, XorOp>(time);
break;
2231 case 0x474: executeLine<NonBitmapMode, NotOp>(time);
break;
2232 case 0x478: executeLine<NonBitmapMode, TImpOp>(time);
break;
2233 case 0x479: executeLine<NonBitmapMode, TAndOp>(time);
break;
2234 case 0x47A: executeLine<NonBitmapMode, TOrOp >(time);
break;
2235 case 0x47B: executeLine<NonBitmapMode, TXorOp>(time);
break;
2236 case 0x47C: executeLine<NonBitmapMode, TNotOp>(time);
break;
2237 case 0x475:
case 0x476:
case 0x477:
case 0x47D:
case 0x47E:
case 0x47F:
2238 executeLine<NonBitmapMode, DummyOp>(time);
break;
2240 case 0x080: executeLmmv<Graphic4Mode, ImpOp>(time);
break;
2241 case 0x081: executeLmmv<Graphic4Mode, AndOp>(time);
break;
2242 case 0x082: executeLmmv<Graphic4Mode, OrOp >(time);
break;
2243 case 0x083: executeLmmv<Graphic4Mode, XorOp>(time);
break;
2244 case 0x084: executeLmmv<Graphic4Mode, NotOp>(time);
break;
2245 case 0x088: executeLmmv<Graphic4Mode, TImpOp>(time);
break;
2246 case 0x089: executeLmmv<Graphic4Mode, TAndOp>(time);
break;
2247 case 0x08A: executeLmmv<Graphic4Mode, TOrOp >(time);
break;
2248 case 0x08B: executeLmmv<Graphic4Mode, TXorOp>(time);
break;
2249 case 0x08C: executeLmmv<Graphic4Mode, TNotOp>(time);
break;
2250 case 0x085:
case 0x086:
case 0x087:
case 0x08D:
case 0x08E:
case 0x08F:
2251 executeLmmv<Graphic4Mode, DummyOp>(time);
break;
2252 case 0x180: executeLmmv<Graphic5Mode, ImpOp>(time);
break;
2253 case 0x181: executeLmmv<Graphic5Mode, AndOp>(time);
break;
2254 case 0x182: executeLmmv<Graphic5Mode, OrOp >(time);
break;
2255 case 0x183: executeLmmv<Graphic5Mode, XorOp>(time);
break;
2256 case 0x184: executeLmmv<Graphic5Mode, NotOp>(time);
break;
2257 case 0x188: executeLmmv<Graphic5Mode, TImpOp>(time);
break;
2258 case 0x189: executeLmmv<Graphic5Mode, TAndOp>(time);
break;
2259 case 0x18A: executeLmmv<Graphic5Mode, TOrOp >(time);
break;
2260 case 0x18B: executeLmmv<Graphic5Mode, TXorOp>(time);
break;
2261 case 0x18C: executeLmmv<Graphic5Mode, TNotOp>(time);
break;
2262 case 0x185:
case 0x186:
case 0x187:
case 0x18D:
case 0x18E:
case 0x18F:
2263 executeLmmv<Graphic5Mode, DummyOp>(time);
break;
2264 case 0x280: executeLmmv<Graphic6Mode, ImpOp>(time);
break;
2265 case 0x281: executeLmmv<Graphic6Mode, AndOp>(time);
break;
2266 case 0x282: executeLmmv<Graphic6Mode, OrOp >(time);
break;
2267 case 0x283: executeLmmv<Graphic6Mode, XorOp>(time);
break;
2268 case 0x284: executeLmmv<Graphic6Mode, NotOp>(time);
break;
2269 case 0x288: executeLmmv<Graphic6Mode, TImpOp>(time);
break;
2270 case 0x289: executeLmmv<Graphic6Mode, TAndOp>(time);
break;
2271 case 0x28A: executeLmmv<Graphic6Mode, TOrOp >(time);
break;
2272 case 0x28B: executeLmmv<Graphic6Mode, TXorOp>(time);
break;
2273 case 0x28C: executeLmmv<Graphic6Mode, TNotOp>(time);
break;
2274 case 0x285:
case 0x286:
case 0x287:
case 0x28D:
case 0x28E:
case 0x28F:
2275 executeLmmv<Graphic6Mode, DummyOp>(time);
break;
2276 case 0x380: executeLmmv<Graphic7Mode, ImpOp>(time);
break;
2277 case 0x381: executeLmmv<Graphic7Mode, AndOp>(time);
break;
2278 case 0x382: executeLmmv<Graphic7Mode, OrOp >(time);
break;
2279 case 0x383: executeLmmv<Graphic7Mode, XorOp>(time);
break;
2280 case 0x384: executeLmmv<Graphic7Mode, NotOp>(time);
break;
2281 case 0x388: executeLmmv<Graphic7Mode, TImpOp>(time);
break;
2282 case 0x389: executeLmmv<Graphic7Mode, TAndOp>(time);
break;
2283 case 0x38A: executeLmmv<Graphic7Mode, TOrOp >(time);
break;
2284 case 0x38B: executeLmmv<Graphic7Mode, TXorOp>(time);
break;
2285 case 0x38C: executeLmmv<Graphic7Mode, TNotOp>(time);
break;
2286 case 0x385:
case 0x386:
case 0x387:
case 0x38D:
case 0x38E:
case 0x38F:
2287 executeLmmv<Graphic7Mode, DummyOp>(time);
break;
2288 case 0x480: executeLmmv<NonBitmapMode, ImpOp>(time);
break;
2289 case 0x481: executeLmmv<NonBitmapMode, AndOp>(time);
break;
2290 case 0x482: executeLmmv<NonBitmapMode, OrOp >(time);
break;
2291 case 0x483: executeLmmv<NonBitmapMode, XorOp>(time);
break;
2292 case 0x484: executeLmmv<NonBitmapMode, NotOp>(time);
break;
2293 case 0x488: executeLmmv<NonBitmapMode, TImpOp>(time);
break;
2294 case 0x489: executeLmmv<NonBitmapMode, TAndOp>(time);
break;
2295 case 0x48A: executeLmmv<NonBitmapMode, TOrOp >(time);
break;
2296 case 0x48B: executeLmmv<NonBitmapMode, TXorOp>(time);
break;
2297 case 0x48C: executeLmmv<NonBitmapMode, TNotOp>(time);
break;
2298 case 0x485:
case 0x486:
case 0x487:
case 0x48D:
case 0x48E:
case 0x48F:
2299 executeLmmv<NonBitmapMode, DummyOp>(time);
break;
2301 case 0x090: executeLmmm<Graphic4Mode, ImpOp>(time);
break;
2302 case 0x091: executeLmmm<Graphic4Mode, AndOp>(time);
break;
2303 case 0x092: executeLmmm<Graphic4Mode, OrOp >(time);
break;
2304 case 0x093: executeLmmm<Graphic4Mode, XorOp>(time);
break;
2305 case 0x094: executeLmmm<Graphic4Mode, NotOp>(time);
break;
2306 case 0x098: executeLmmm<Graphic4Mode, TImpOp>(time);
break;
2307 case 0x099: executeLmmm<Graphic4Mode, TAndOp>(time);
break;
2308 case 0x09A: executeLmmm<Graphic4Mode, TOrOp >(time);
break;
2309 case 0x09B: executeLmmm<Graphic4Mode, TXorOp>(time);
break;
2310 case 0x09C: executeLmmm<Graphic4Mode, TNotOp>(time);
break;
2311 case 0x095:
case 0x096:
case 0x097:
case 0x09D:
case 0x09E:
case 0x09F:
2312 executeLmmm<Graphic4Mode, DummyOp>(time);
break;
2313 case 0x190: executeLmmm<Graphic5Mode, ImpOp>(time);
break;
2314 case 0x191: executeLmmm<Graphic5Mode, AndOp>(time);
break;
2315 case 0x192: executeLmmm<Graphic5Mode, OrOp >(time);
break;
2316 case 0x193: executeLmmm<Graphic5Mode, XorOp>(time);
break;
2317 case 0x194: executeLmmm<Graphic5Mode, NotOp>(time);
break;
2318 case 0x198: executeLmmm<Graphic5Mode, TImpOp>(time);
break;
2319 case 0x199: executeLmmm<Graphic5Mode, TAndOp>(time);
break;
2320 case 0x19A: executeLmmm<Graphic5Mode, TOrOp >(time);
break;
2321 case 0x19B: executeLmmm<Graphic5Mode, TXorOp>(time);
break;
2322 case 0x19C: executeLmmm<Graphic5Mode, TNotOp>(time);
break;
2323 case 0x195:
case 0x196:
case 0x197:
case 0x19D:
case 0x19E:
case 0x19F:
2324 executeLmmm<Graphic5Mode, DummyOp>(time);
break;
2325 case 0x290: executeLmmm<Graphic6Mode, ImpOp>(time);
break;
2326 case 0x291: executeLmmm<Graphic6Mode, AndOp>(time);
break;
2327 case 0x292: executeLmmm<Graphic6Mode, OrOp >(time);
break;
2328 case 0x293: executeLmmm<Graphic6Mode, XorOp>(time);
break;
2329 case 0x294: executeLmmm<Graphic6Mode, NotOp>(time);
break;
2330 case 0x298: executeLmmm<Graphic6Mode, TImpOp>(time);
break;
2331 case 0x299: executeLmmm<Graphic6Mode, TAndOp>(time);
break;
2332 case 0x29A: executeLmmm<Graphic6Mode, TOrOp >(time);
break;
2333 case 0x29B: executeLmmm<Graphic6Mode, TXorOp>(time);
break;
2334 case 0x29C: executeLmmm<Graphic6Mode, TNotOp>(time);
break;
2335 case 0x295:
case 0x296:
case 0x297:
case 0x29D:
case 0x29E:
case 0x29F:
2336 executeLmmm<Graphic6Mode, DummyOp>(time);
break;
2337 case 0x390: executeLmmm<Graphic7Mode, ImpOp>(time);
break;
2338 case 0x391: executeLmmm<Graphic7Mode, AndOp>(time);
break;
2339 case 0x392: executeLmmm<Graphic7Mode, OrOp >(time);
break;
2340 case 0x393: executeLmmm<Graphic7Mode, XorOp>(time);
break;
2341 case 0x394: executeLmmm<Graphic7Mode, NotOp>(time);
break;
2342 case 0x398: executeLmmm<Graphic7Mode, TImpOp>(time);
break;
2343 case 0x399: executeLmmm<Graphic7Mode, TAndOp>(time);
break;
2344 case 0x39A: executeLmmm<Graphic7Mode, TOrOp >(time);
break;
2345 case 0x39B: executeLmmm<Graphic7Mode, TXorOp>(time);
break;
2346 case 0x39C: executeLmmm<Graphic7Mode, TNotOp>(time);
break;
2347 case 0x395:
case 0x396:
case 0x397:
case 0x39D:
case 0x39E:
case 0x39F:
2348 executeLmmm<Graphic7Mode, DummyOp>(time);
break;
2349 case 0x490: executeLmmm<NonBitmapMode, ImpOp>(time);
break;
2350 case 0x491: executeLmmm<NonBitmapMode, AndOp>(time);
break;
2351 case 0x492: executeLmmm<NonBitmapMode, OrOp >(time);
break;
2352 case 0x493: executeLmmm<NonBitmapMode, XorOp>(time);
break;
2353 case 0x494: executeLmmm<NonBitmapMode, NotOp>(time);
break;
2354 case 0x498: executeLmmm<NonBitmapMode, TImpOp>(time);
break;
2355 case 0x499: executeLmmm<NonBitmapMode, TAndOp>(time);
break;
2356 case 0x49A: executeLmmm<NonBitmapMode, TOrOp >(time);
break;
2357 case 0x49B: executeLmmm<NonBitmapMode, TXorOp>(time);
break;
2358 case 0x49C: executeLmmm<NonBitmapMode, TNotOp>(time);
break;
2359 case 0x495:
case 0x496:
case 0x497:
case 0x49D:
case 0x49E:
case 0x49F:
2360 executeLmmm<NonBitmapMode, DummyOp>(time);
break;
2362 case 0x0A0:
case 0x0A1:
case 0x0A2:
case 0x0A3:
2363 case 0x0A4:
case 0x0A5:
case 0x0A6:
case 0x0A7:
2364 case 0x0A8:
case 0x0A9:
case 0x0AA:
case 0x0AB:
2365 case 0x0AC:
case 0x0AD:
case 0x0AE:
case 0x0AF:
2366 executeLmcm<Graphic4Mode>(time);
break;
2367 case 0x1A0:
case 0x1A1:
case 0x1A2:
case 0x1A3:
2368 case 0x1A4:
case 0x1A5:
case 0x1A6:
case 0x1A7:
2369 case 0x1A8:
case 0x1A9:
case 0x1AA:
case 0x1AB:
2370 case 0x1AC:
case 0x1AD:
case 0x1AE:
case 0x1AF:
2371 executeLmcm<Graphic5Mode>(time);
break;
2372 case 0x2A0:
case 0x2A1:
case 0x2A2:
case 0x2A3:
2373 case 0x2A4:
case 0x2A5:
case 0x2A6:
case 0x2A7:
2374 case 0x2A8:
case 0x2A9:
case 0x2AA:
case 0x2AB:
2375 case 0x2AC:
case 0x2AD:
case 0x2AE:
case 0x2AF:
2376 executeLmcm<Graphic6Mode>(time);
break;
2377 case 0x3A0:
case 0x3A1:
case 0x3A2:
case 0x3A3:
2378 case 0x3A4:
case 0x3A5:
case 0x3A6:
case 0x3A7:
2379 case 0x3A8:
case 0x3A9:
case 0x3AA:
case 0x3AB:
2380 case 0x3AC:
case 0x3AD:
case 0x3AE:
case 0x3AF:
2381 executeLmcm<Graphic7Mode>(time);
break;
2382 case 0x4A0:
case 0x4A1:
case 0x4A2:
case 0x4A3:
2383 case 0x4A4:
case 0x4A5:
case 0x4A6:
case 0x4A7:
2384 case 0x4A8:
case 0x4A9:
case 0x4AA:
case 0x4AB:
2385 case 0x4AC:
case 0x4AD:
case 0x4AE:
case 0x4AF:
2386 executeLmcm<NonBitmapMode>(time);
break;
2388 case 0x0B0: executeLmmc<Graphic4Mode, ImpOp>(time);
break;
2389 case 0x0B1: executeLmmc<Graphic4Mode, AndOp>(time);
break;
2390 case 0x0B2: executeLmmc<Graphic4Mode, OrOp >(time);
break;
2391 case 0x0B3: executeLmmc<Graphic4Mode, XorOp>(time);
break;
2392 case 0x0B4: executeLmmc<Graphic4Mode, NotOp>(time);
break;
2393 case 0x0B8: executeLmmc<Graphic4Mode, TImpOp>(time);
break;
2394 case 0x0B9: executeLmmc<Graphic4Mode, TAndOp>(time);
break;
2395 case 0x0BA: executeLmmc<Graphic4Mode, TOrOp >(time);
break;
2396 case 0x0BB: executeLmmc<Graphic4Mode, TXorOp>(time);
break;
2397 case 0x0BC: executeLmmc<Graphic4Mode, TNotOp>(time);
break;
2398 case 0x0B5:
case 0x0B6:
case 0x0B7:
case 0x0BD:
case 0x0BE:
case 0x0BF:
2399 executeLmmc<Graphic4Mode, DummyOp>(time);
break;
2400 case 0x1B0: executeLmmc<Graphic5Mode, ImpOp>(time);
break;
2401 case 0x1B1: executeLmmc<Graphic5Mode, AndOp>(time);
break;
2402 case 0x1B2: executeLmmc<Graphic5Mode, OrOp >(time);
break;
2403 case 0x1B3: executeLmmc<Graphic5Mode, XorOp>(time);
break;
2404 case 0x1B4: executeLmmc<Graphic5Mode, NotOp>(time);
break;
2405 case 0x1B8: executeLmmc<Graphic5Mode, TImpOp>(time);
break;
2406 case 0x1B9: executeLmmc<Graphic5Mode, TAndOp>(time);
break;
2407 case 0x1BA: executeLmmc<Graphic5Mode, TOrOp >(time);
break;
2408 case 0x1BB: executeLmmc<Graphic5Mode, TXorOp>(time);
break;
2409 case 0x1BC: executeLmmc<Graphic5Mode, TNotOp>(time);
break;
2410 case 0x1B5:
case 0x1B6:
case 0x1B7:
case 0x1BD:
case 0x1BE:
case 0x1BF:
2411 executeLmmc<Graphic5Mode, DummyOp>(time);
break;
2412 case 0x2B0: executeLmmc<Graphic6Mode, ImpOp>(time);
break;
2413 case 0x2B1: executeLmmc<Graphic6Mode, AndOp>(time);
break;
2414 case 0x2B2: executeLmmc<Graphic6Mode, OrOp >(time);
break;
2415 case 0x2B3: executeLmmc<Graphic6Mode, XorOp>(time);
break;
2416 case 0x2B4: executeLmmc<Graphic6Mode, NotOp>(time);
break;
2417 case 0x2B8: executeLmmc<Graphic6Mode, TImpOp>(time);
break;
2418 case 0x2B9: executeLmmc<Graphic6Mode, TAndOp>(time);
break;
2419 case 0x2BA: executeLmmc<Graphic6Mode, TOrOp >(time);
break;
2420 case 0x2BB: executeLmmc<Graphic6Mode, TXorOp>(time);
break;
2421 case 0x2BC: executeLmmc<Graphic6Mode, TNotOp>(time);
break;
2422 case 0x2B5:
case 0x2B6:
case 0x2B7:
case 0x2BD:
case 0x2BE:
case 0x2BF:
2423 executeLmmc<Graphic6Mode, DummyOp>(time);
break;
2424 case 0x3B0: executeLmmc<Graphic7Mode, ImpOp>(time);
break;
2425 case 0x3B1: executeLmmc<Graphic7Mode, AndOp>(time);
break;
2426 case 0x3B2: executeLmmc<Graphic7Mode, OrOp >(time);
break;
2427 case 0x3B3: executeLmmc<Graphic7Mode, XorOp>(time);
break;
2428 case 0x3B4: executeLmmc<Graphic7Mode, NotOp>(time);
break;
2429 case 0x3B8: executeLmmc<Graphic7Mode, TImpOp>(time);
break;
2430 case 0x3B9: executeLmmc<Graphic7Mode, TAndOp>(time);
break;
2431 case 0x3BA: executeLmmc<Graphic7Mode, TOrOp >(time);
break;
2432 case 0x3BB: executeLmmc<Graphic7Mode, TXorOp>(time);
break;
2433 case 0x3BC: executeLmmc<Graphic7Mode, TNotOp>(time);
break;
2434 case 0x3B5:
case 0x3B6:
case 0x3B7:
case 0x3BD:
case 0x3BE:
case 0x3BF:
2435 executeLmmc<Graphic7Mode, DummyOp>(time);
break;
2436 case 0x4B0: executeLmmc<NonBitmapMode, ImpOp>(time);
break;
2437 case 0x4B1: executeLmmc<NonBitmapMode, AndOp>(time);
break;
2438 case 0x4B2: executeLmmc<NonBitmapMode, OrOp >(time);
break;
2439 case 0x4B3: executeLmmc<NonBitmapMode, XorOp>(time);
break;
2440 case 0x4B4: executeLmmc<NonBitmapMode, NotOp>(time);
break;
2441 case 0x4B8: executeLmmc<NonBitmapMode, TImpOp>(time);
break;
2442 case 0x4B9: executeLmmc<NonBitmapMode, TAndOp>(time);
break;
2443 case 0x4BA: executeLmmc<NonBitmapMode, TOrOp >(time);
break;
2444 case 0x4BB: executeLmmc<NonBitmapMode, TXorOp>(time);
break;
2445 case 0x4BC: executeLmmc<NonBitmapMode, TNotOp>(time);
break;
2446 case 0x4B5:
case 0x4B6:
case 0x4B7:
case 0x4BD:
case 0x4BE:
case 0x4BF:
2447 executeLmmc<NonBitmapMode, DummyOp>(time);
break;
2449 case 0x0C0:
case 0x0C1:
case 0x0C2:
case 0x0C3:
2450 case 0x0C4:
case 0x0C5:
case 0x0C6:
case 0x0C7:
2451 case 0x0C8:
case 0x0C9:
case 0x0CA:
case 0x0CB:
2452 case 0x0CC:
case 0x0CD:
case 0x0CE:
case 0x0CF:
2453 executeHmmv<Graphic4Mode>(time);
break;
2454 case 0x1C0:
case 0x1C1:
case 0x1C2:
case 0x1C3:
2455 case 0x1C4:
case 0x1C5:
case 0x1C6:
case 0x1C7:
2456 case 0x1C8:
case 0x1C9:
case 0x1CA:
case 0x1CB:
2457 case 0x1CC:
case 0x1CD:
case 0x1CE:
case 0x1CF:
2458 executeHmmv<Graphic5Mode>(time);
break;
2459 case 0x2C0:
case 0x2C1:
case 0x2C2:
case 0x2C3:
2460 case 0x2C4:
case 0x2C5:
case 0x2C6:
case 0x2C7:
2461 case 0x2C8:
case 0x2C9:
case 0x2CA:
case 0x2CB:
2462 case 0x2CC:
case 0x2CD:
case 0x2CE:
case 0x2CF:
2463 executeHmmv<Graphic6Mode>(time);
break;
2464 case 0x3C0:
case 0x3C1:
case 0x3C2:
case 0x3C3:
2465 case 0x3C4:
case 0x3C5:
case 0x3C6:
case 0x3C7:
2466 case 0x3C8:
case 0x3C9:
case 0x3CA:
case 0x3CB:
2467 case 0x3CC:
case 0x3CD:
case 0x3CE:
case 0x3CF:
2468 executeHmmv<Graphic7Mode>(time);
break;
2469 case 0x4C0:
case 0x4C1:
case 0x4C2:
case 0x4C3:
2470 case 0x4C4:
case 0x4C5:
case 0x4C6:
case 0x4C7:
2471 case 0x4C8:
case 0x4C9:
case 0x4CA:
case 0x4CB:
2472 case 0x4CC:
case 0x4CD:
case 0x4CE:
case 0x4CF:
2473 executeHmmv<NonBitmapMode>(time);
break;
2475 case 0x0D0:
case 0x0D1:
case 0x0D2:
case 0x0D3:
2476 case 0x0D4:
case 0x0D5:
case 0x0D6:
case 0x0D7:
2477 case 0x0D8:
case 0x0D9:
case 0x0DA:
case 0x0DB:
2478 case 0x0DC:
case 0x0DD:
case 0x0DE:
case 0x0DF:
2479 executeHmmm<Graphic4Mode>(time);
break;
2480 case 0x1D0:
case 0x1D1:
case 0x1D2:
case 0x1D3:
2481 case 0x1D4:
case 0x1D5:
case 0x1D6:
case 0x1D7:
2482 case 0x1D8:
case 0x1D9:
case 0x1DA:
case 0x1DB:
2483 case 0x1DC:
case 0x1DD:
case 0x1DE:
case 0x1DF:
2484 executeHmmm<Graphic5Mode>(time);
break;
2485 case 0x2D0:
case 0x2D1:
case 0x2D2:
case 0x2D3:
2486 case 0x2D4:
case 0x2D5:
case 0x2D6:
case 0x2D7:
2487 case 0x2D8:
case 0x2D9:
case 0x2DA:
case 0x2DB:
2488 case 0x2DC:
case 0x2DD:
case 0x2DE:
case 0x2DF:
2489 executeHmmm<Graphic6Mode>(time);
break;
2490 case 0x3D0:
case 0x3D1:
case 0x3D2:
case 0x3D3:
2491 case 0x3D4:
case 0x3D5:
case 0x3D6:
case 0x3D7:
2492 case 0x3D8:
case 0x3D9:
case 0x3DA:
case 0x3DB:
2493 case 0x3DC:
case 0x3DD:
case 0x3DE:
case 0x3DF:
2494 executeHmmm<Graphic7Mode>(time);
break;
2495 case 0x4D0:
case 0x4D1:
case 0x4D2:
case 0x4D3:
2496 case 0x4D4:
case 0x4D5:
case 0x4D6:
case 0x4D7:
2497 case 0x4D8:
case 0x4D9:
case 0x4DA:
case 0x4DB:
2498 case 0x4DC:
case 0x4DD:
case 0x4DE:
case 0x4DF:
2499 executeHmmm<NonBitmapMode>(time);
break;
2501 case 0x0E0:
case 0x0E1:
case 0x0E2:
case 0x0E3:
2502 case 0x0E4:
case 0x0E5:
case 0x0E6:
case 0x0E7:
2503 case 0x0E8:
case 0x0E9:
case 0x0EA:
case 0x0EB:
2504 case 0x0EC:
case 0x0ED:
case 0x0EE:
case 0x0EF:
2505 executeYmmm<Graphic4Mode>(time);
break;
2506 case 0x1E0:
case 0x1E1:
case 0x1E2:
case 0x1E3:
2507 case 0x1E4:
case 0x1E5:
case 0x1E6:
case 0x1E7:
2508 case 0x1E8:
case 0x1E9:
case 0x1EA:
case 0x1EB:
2509 case 0x1EC:
case 0x1ED:
case 0x1EE:
case 0x1EF:
2510 executeYmmm<Graphic5Mode>(time);
break;
2511 case 0x2E0:
case 0x2E1:
case 0x2E2:
case 0x2E3:
2512 case 0x2E4:
case 0x2E5:
case 0x2E6:
case 0x2E7:
2513 case 0x2E8:
case 0x2E9:
case 0x2EA:
case 0x2EB:
2514 case 0x2EC:
case 0x2ED:
case 0x2EE:
case 0x2EF:
2515 executeYmmm<Graphic6Mode>(time);
break;
2516 case 0x3E0:
case 0x3E1:
case 0x3E2:
case 0x3E3:
2517 case 0x3E4:
case 0x3E5:
case 0x3E6:
case 0x3E7:
2518 case 0x3E8:
case 0x3E9:
case 0x3EA:
case 0x3EB:
2519 case 0x3EC:
case 0x3ED:
case 0x3EE:
case 0x3EF:
2520 executeYmmm<Graphic7Mode>(time);
break;
2521 case 0x4E0:
case 0x4E1:
case 0x4E2:
case 0x4E3:
2522 case 0x4E4:
case 0x4E5:
case 0x4E6:
case 0x4E7:
2523 case 0x4E8:
case 0x4E9:
case 0x4EA:
case 0x4EB:
2524 case 0x4EC:
case 0x4ED:
case 0x4EE:
case 0x4EF:
2525 executeYmmm<NonBitmapMode>(time);
break;
2527 case 0x0F0:
case 0x0F1:
case 0x0F2:
case 0x0F3:
2528 case 0x0F4:
case 0x0F5:
case 0x0F6:
case 0x0F7:
2529 case 0x0F8:
case 0x0F9:
case 0x0FA:
case 0x0FB:
2530 case 0x0FC:
case 0x0FD:
case 0x0FE:
case 0x0FF:
2531 executeHmmc<Graphic4Mode>(time);
break;
2532 case 0x1F0:
case 0x1F1:
case 0x1F2:
case 0x1F3:
2533 case 0x1F4:
case 0x1F5:
case 0x1F6:
case 0x1F7:
2534 case 0x1F8:
case 0x1F9:
case 0x1FA:
case 0x1FB:
2535 case 0x1FC:
case 0x1FD:
case 0x1FE:
case 0x1FF:
2536 executeHmmc<Graphic5Mode>(time);
break;
2537 case 0x2F0:
case 0x2F1:
case 0x2F2:
case 0x2F3:
2538 case 0x2F4:
case 0x2F5:
case 0x2F6:
case 0x2F7:
2539 case 0x2F8:
case 0x2F9:
case 0x2FA:
case 0x2FB:
2540 case 0x2FC:
case 0x2FD:
case 0x2FE:
case 0x2FF:
2541 executeHmmc<Graphic6Mode>(time);
break;
2542 case 0x3F0:
case 0x3F1:
case 0x3F2:
case 0x3F3:
2543 case 0x3F4:
case 0x3F5:
case 0x3F6:
case 0x3F7:
2544 case 0x3F8:
case 0x3F9:
case 0x3FA:
case 0x3FB:
2545 case 0x3FC:
case 0x3FD:
case 0x3FE:
case 0x3FF:
2546 executeHmmc<Graphic7Mode>(time);
break;
2547 case 0x4F0:
case 0x4F1:
case 0x4F2:
case 0x4F3:
2548 case 0x4F4:
case 0x4F5:
case 0x4F6:
case 0x4F7:
2549 case 0x4F8:
case 0x4F9:
case 0x4FA:
case 0x4FB:
2550 case 0x4FC:
case 0x4FD:
case 0x4FE:
case 0x4FF:
2551 executeHmmc<NonBitmapMode>(time);
break;
2558 void VDPCmdEngine::reportVdpCommand()
const
2560 const char*
const COMMANDS[16] = {
2561 " ABRT",
" ????",
" ????",
" ????",
"POINT",
" PSET",
" SRCH",
" LINE",
2562 " LMMV",
" LMMM",
" LMCM",
" LMMC",
" HMMV",
" HMMM",
" YMMM",
" HMMC"
2564 const char*
const OPS[16] = {
2565 "IMP ",
"AND ",
"OR ",
"XOR ",
"NOT ",
"NOP ",
"NOP ",
"NOP ",
2566 "TIMP",
"TAND",
"TOR ",
"TXOR",
"TNOT",
"NOP ",
"NOP ",
"NOP "
2569 std::cerr <<
"VDPCmd " << COMMANDS[CMD >> 4] <<
'-' << OPS[CMD & 15]
2570 <<
'(' << int(SX) <<
',' << int(SY) <<
")->("
2571 << int(DX) <<
',' << int(DY) <<
")," << int(COL)
2572 <<
" [" << int((ARG &
DIX) ? -
int(NX) :
int(NX))
2573 <<
',' << int((ARG &
DIY) ? -
int(NY) :
int(NY)) <<
"]\n";
2576 void VDPCmdEngine::commandDone(EmuTime::param time)
2580 executingProbe =
false;
2582 setStatusChangeTime(EmuTime::infinity());
2583 vram.cmdReadWindow.disable(time);
2584 vram.cmdWriteWindow.disable(time);
2591 template<
typename Archive>
2599 if (ar.versionAtLeast(version, 2)) {
2600 ar.serialize(
"time", engineTime);
2603 assert(ar.isLoader());
2605 ar.serialize(
"clock", clock);
2608 ar.serialize(
"statusChangeTime", statusChangeTime,
2611 "transfer", transfer,
2625 if (ar.versionAtLeast(version, 3)) {
2626 ar.serialize(
"phase", phase,
2630 assert(ar.isLoader());
2631 phase = tmpSrc = tmpDst = 0;
2634 if (ar.isLoader()) {
2636 assert(scrMode >= 0);