29 virtual void execute(
const vector<TclObject>& tokens,
31 virtual string help (
const vector<string>& tokens)
const;
40 const string& name,
CPUClock& clock);
41 virtual void execute(
const vector<TclObject>& tokens,
43 virtual string help (
const vector<string>& tokens)
const;
53 virtual void write(
unsigned address,
byte value);
60 : motherboard(motherboard_)
62 motherboard.getCommandController(),
"cputrace",
63 "CPU tracing on/off", false,
Setting::DONT_SAVE))
65 motherboard.getCommandController(),
"di_halt_callback",
66 "Tcl proc called when the CPU executed a DI/HALT sequence"))
68 motherboard,
"z80", *traceSetting,
69 *diHaltCallback,
EmuTime::zero))
70 , r800(motherboard.isTurboR()
72 motherboard,
"r800", *traceSetting,
77 motherboard.getMachineInfoCommand(), *this))
79 motherboard.getMachineInfoCommand(),
"z80_freq", *z80))
80 , r800FreqInfo(r800.get()
82 motherboard.getMachineInfoCommand(),
"r800_freq", *r800)
86 activeCPU = z80.get();
91 traceSetting->attach(*
this);
96 traceSetting->detach(*
this);
103 z80 ->setInterface(interface);
105 r800->setInterface(interface);
136 if (tmp != activeCPU) {
145 r800->setDRAMmode(dram);
148 void MSXCPU::execute(
bool fastForward)
156 activeCPU->
execute(fastForward);
184 r800->updateVisiblePage(page, primarySlot, secondarySlot);
229 return activeCPU == r800.get();
239 activeCPU->
wait(time);
250 r800->waitCycles(cycles);
254 void MSXCPU::update(
const Setting& setting)
257 assert(&setting == traceSetting.get());
287 EmuDuration dur = msxcpu.getCurrentTime() - msxcpu.reference;
293 return "Prints the time in seconds that the MSX is powered on\n";
300 const string& name,
CPUClock& clock_)
314 return "Returns the actual frequency of this CPU.\n"
315 "This frequency can vary because:\n"
316 " - the user has overridden the freq via the '{z80,r800}_freq' setting\n"
317 " - (only on some MSX machines) the MSX software can switch the Z80 between 2 frequencies\n"
318 "See also the '{z80,r800}_freq_locked' setting.\n";
324 static const char*
const CPU_REGS_DESC =
325 "Registers of the active CPU (Z80 or R800).\n"
326 "Each byte in this debuggable represents one 8 bit register:\n"
327 " 0 -> A 1 -> F 2 -> B 3 -> C\n"
328 " 4 -> D 5 -> E 6 -> H 7 -> L\n"
329 " 8 -> A' 9 -> F' 10 -> B' 11 -> C'\n"
330 " 12 -> D' 13 -> E' 14 -> H' 15 -> L'\n"
331 " 16 -> IXH 17 -> IXL 18 -> IYH 19 -> IYL\n"
332 " 20 -> PCH 21 -> PCL 22 -> SPH 23 -> SPL\n"
333 " 24 -> I 25 -> R 26 -> IM 27 -> IFF1/2\n"
334 "The last position (27) contains the IFF1 and IFF2 flags in respectively\n"
335 "bit 0 and 1. Bit 2 contains 'IFF1 AND last-instruction-was-not-EI', so\n"
336 "this effectively indicates that the CPU could accept an interrupt at\n"
337 "the start of the current instruction.\n";
349 case 0:
return regs.
getA();
350 case 1:
return regs.
getF();
351 case 2:
return regs.
getB();
352 case 3:
return regs.
getC();
353 case 4:
return regs.
getD();
354 case 5:
return regs.
getE();
355 case 6:
return regs.
getH();
356 case 7:
return regs.
getL();
357 case 8:
return regs.
getA2();
358 case 9:
return regs.
getF2();
359 case 10:
return regs.
getB2();
360 case 11:
return regs.
getC2();
361 case 12:
return regs.
getD2();
362 case 13:
return regs.
getE2();
363 case 14:
return regs.
getH2();
364 case 15:
return regs.
getL2();
365 case 16:
return regs.
getIXh();
366 case 17:
return regs.
getIXl();
367 case 18:
return regs.
getIYh();
368 case 19:
return regs.
getIYl();
369 case 20:
return regs.
getPCh();
370 case 21:
return regs.
getPCl();
371 case 22:
return regs.
getSPh();
372 case 23:
return regs.
getSPl();
373 case 24:
return regs.
getI();
374 case 25:
return regs.
getR();
375 case 26:
return regs.
getIM();
376 case 27:
return 1 * regs.
getIFF1() +
387 case 0: regs.
setA(value);
break;
388 case 1: regs.
setF(value);
break;
389 case 2: regs.
setB(value);
break;
390 case 3: regs.
setC(value);
break;
391 case 4: regs.
setD(value);
break;
392 case 5: regs.
setE(value);
break;
393 case 6: regs.
setH(value);
break;
394 case 7: regs.
setL(value);
break;
395 case 8: regs.
setA2(value);
break;
396 case 9: regs.
setF2(value);
break;
397 case 10: regs.
setB2(value);
break;
398 case 11: regs.
setC2(value);
break;
399 case 12: regs.
setD2(value);
break;
400 case 13: regs.
setE2(value);
break;
401 case 14: regs.
setH2(value);
break;
402 case 15: regs.
setL2(value);
break;
403 case 16: regs.
setIXh(value);
break;
404 case 17: regs.
setIXl(value);
break;
405 case 18: regs.
setIYh(value);
break;
406 case 19: regs.
setIYl(value);
break;
407 case 20: regs.
setPCh(value);
break;
408 case 21: regs.
setPCl(value);
break;
409 case 22: regs.
setSPh(value);
break;
410 case 23: regs.
setSPl(value);
break;
411 case 24: regs.
setI(value);
break;
412 case 25: regs.
setR(value);
break;
414 if (value < 3) regs.
setIM(value);
417 regs.
setIFF1((value & 0x01) != 0);
418 regs.
setIFF2((value & 0x02) != 0);
427 template<
typename Archive>
430 ar.serializeWithID(
"z80", *z80);
432 ar.serializeWithID(
"r800", *r800);
434 ar.serializePointerID(
"activeCPU", activeCPU);
435 ar.serializePointerID(
"newCPU", newCPU);
436 ar.serialize(
"resetTime", reference);