openMSX
CPU.cc
Go to the documentation of this file.
1 #include "CPU.hh"
2 #include "serialize.hh"
3 
4 namespace openmsx {
5 
6 byte CPU::ZSTable[256];
10 byte CPU::ZSPHTable[256];
11 
12 
13 CPU::CPU(bool r800)
14  : R(r800)
15 {
16  // Avoid initialising twice.
17  static bool alreadyInit = false;
18  if (alreadyInit) return;
19  alreadyInit = true;
20 
21  for (int i = 0; i < 256; ++i) {
22  byte zFlag = (i == 0) ? Z_FLAG : 0;
23  byte sFlag = i & S_FLAG;
24  byte xFlag = i & X_FLAG;
25  byte yFlag = i & Y_FLAG;
26  byte vFlag = V_FLAG;
27  for (int v = 128; v != 0; v >>= 1) {
28  if (i & v) vFlag ^= V_FLAG;
29  }
30  ZSTable [i] = zFlag | sFlag;
31  ZSXYTable [i] = zFlag | sFlag | xFlag | yFlag;
32  ZSPTable [i] = zFlag | sFlag | vFlag;
33  ZSPXYTable[i] = zFlag | sFlag | xFlag | yFlag | vFlag;
34  ZSPHTable [i] = zFlag | sFlag | vFlag | H_FLAG;
35  }
36  assert(ZSTable [ 0] == ZS0);
37  assert(ZSXYTable [ 0] == ZSXY0);
38  assert(ZSPTable [ 0] == ZSP0);
39  assert(ZSPXYTable[ 0] == ZSPXY0);
40  assert(ZSTable [255] == ZS255);
41  assert(ZSXYTable [255] == ZSXY255);
42 }
43 
45 {
46 }
47 
48 void CPU::setPaused(bool paused)
49 {
50  getRegisters().setExtHALT(paused);
52 }
53 
54 
55 // version 1: Initial version.
56 // version 2: Replaced 'afterEI' boolean with 'after' byte
57 // (holds both afterEI and afterLDAI information).
58 template<typename Archive>
59 void CPU::CPURegs::serialize(Archive& ar, unsigned version)
60 {
61  ar.serialize("af", AF_.w);
62  ar.serialize("bc", BC_.w);
63  ar.serialize("de", DE_.w);
64  ar.serialize("hl", HL_.w);
65  ar.serialize("af2", AF2_.w);
66  ar.serialize("bc2", BC2_.w);
67  ar.serialize("de2", DE2_.w);
68  ar.serialize("hl2", HL2_.w);
69  ar.serialize("ix", IX_.w);
70  ar.serialize("iy", IY_.w);
71  ar.serialize("pc", PC_.w);
72  ar.serialize("sp", SP_.w);
73  ar.serialize("i", I_);
74  byte r = getR();
75  ar.serialize("r", r); // combined R_ and R2_
76  if (ar.isLoader()) setR(r);
77  ar.serialize("im", IM_);
78  ar.serialize("iff1", IFF1_);
79  ar.serialize("iff2", IFF2_);
80 
81  assert(isSameAfter());
82  if (ar.versionBelow(version, 2)) {
83  bool afterEI = false; // initialize to avoid warning
84  ar.serialize("afterEI", afterEI);
86  if (afterEI) setAfterEI();
87  } else {
88  ar.serialize("after", afterNext_);
89  }
90  copyNextAfter();
91 
92  ar.serialize("halt", HALT_);
93 }
95 
96 } // namespace openmsx