|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #pragma once
7:
8: struct m68030ccr
9: {
10: // X フラグは、x の X_BIT が立っていれば 1
11: // N フラグは、n の N_BIT が立っていれば 1
12: // Z フラグは、z == 0 なら 1
13: // V フラグは、v の V_BIT が立っていれば 1
14: // C フラグは、c の C_BIT が立っていれば 1
15: static const uint32 X_BIT = 0x00000001;
16: static const uint32 N_BIT = 0x80000000;
17: static const uint32 V_BIT = 0x80000000;
18: static const uint32 C_BIT = 0x00000001;
19:
20: uint32 x;
21: uint32 v;
22: uint32 n;
23: union {
24: uint64 cz;
25: struct {
26: #if BYTE_ORDER == LITTLE_ENDIAN
27: uint32 z;
28: uint32 c;
29: #else
30: uint32 c;
31: uint32 z;
32: #endif
33: } __packed;
34: };
35:
36: // フラグを立てる
37: void SetX() { x = X_BIT; }
38: void SetN() { n = N_BIT; }
39: void SetZ() { z = 0; }
40: void SetV() { v = V_BIT; }
41: void SetC() { c = C_BIT; }
42:
43: // フラグを降ろす
44: void ClrX() { x = 0; }
45: void ClrN() { n = 0; }
46: void ClrZ() { z = 1; }
47: void ClrV() { v = 0; }
48: void ClrC() { c = 0; }
49:
50: // フラグを value (bool値) にセットする
51: void PutX(bool value) { x = (value) ? X_BIT : 0; }
52: void PutN(bool value) { n = (value) ? N_BIT : 0; }
53: void PutZ(bool value) { z = (value) ? 0 : 1; }
54: void PutV(bool value) { v = (value) ? V_BIT : 0; }
55: void PutC(bool value) { c = (value) ? C_BIT : 0; }
56:
57: // フラグが立っていれば真を返す
58: bool IsX() const { return ((x & X_BIT) != 0); }
59: bool IsN() const { return ((n & N_BIT) != 0); }
60: bool IsZ() const { return (z == 0); }
61: bool IsV() const { return ((v & V_BIT) != 0); }
62: bool IsC() const { return ((c & C_BIT) != 0); }
63:
64: // CCR レジスタの内容を作って返す
65: uint8 Get() const {
66: return (IsX() ? M68K_CCR_X : 0)
67: | (IsN() ? M68K_CCR_N : 0)
68: | (IsZ() ? M68K_CCR_Z : 0)
69: | (IsV() ? M68K_CCR_V : 0)
70: | (IsC() ? M68K_CCR_C : 0);
71: }
72:
73: // CCR レジスタに val をセットする
74: void Set(uint8 val) {
75: PutX((val) & M68K_CCR_X);
76: PutN((val) & M68K_CCR_N);
77: PutZ((val) & M68K_CCR_Z);
78: PutV((val) & M68K_CCR_V);
79: PutC((val) & M68K_CCR_C);
80: }
81: };
82:
83: // フラグを立てる
84: #define RegSetX() cpu->reg.ccr.SetX()
85: #define RegSetN() cpu->reg.ccr.SetN()
86: #define RegSetZ() cpu->reg.ccr.SetZ()
87: #define RegSetV() cpu->reg.ccr.SetV()
88: #define RegSetC() cpu->reg.ccr.SetC()
89:
90: // フラグを降ろす
91: #define RegClrX() cpu->reg.ccr.ClrX()
92: #define RegClrN() cpu->reg.ccr.ClrN()
93: #define RegClrZ() cpu->reg.ccr.ClrZ()
94: #define RegClrV() cpu->reg.ccr.ClrV()
95: #define RegClrC() cpu->reg.ccr.ClrC()
96:
97: // フラグを value (bool値) にセットする
98: #define RegPutX(value) cpu->reg.ccr.PutX(value)
99: #define RegPutN(value) cpu->reg.ccr.PutN(value)
100: #define RegPutZ(value) cpu->reg.ccr.PutZ(value)
101: #define RegPutV(value) cpu->reg.ccr.PutV(value)
102: #define RegPutC(value) cpu->reg.ccr.PutC(value)
103:
104: // フラグが立っていれば真を返す
105: #define RegIsX (cpu->reg.ccr.IsX())
106: #define RegIsN (cpu->reg.ccr.IsN())
107: #define RegIsZ (cpu->reg.ccr.IsZ())
108: #define RegIsV (cpu->reg.ccr.IsV())
109: #define RegIsC (cpu->reg.ccr.IsC())
110:
111: #define RegCondT (true)
112: #define RegCondF (false)
113: #define RegCondHI (!RegIsC && !RegIsZ)
114: #define RegCondLS (RegIsC || RegIsZ)
115: #define RegCondCC (!RegIsC)
116: #define RegCondCS (RegIsC)
117: #define RegCondNE (!RegIsZ)
118: #define RegCondEQ (RegIsZ)
119: #define RegCondVC (!RegIsV)
120: #define RegCondVS (RegIsV)
121: #define RegCondPL (!RegIsN)
122: #define RegCondMI (RegIsN)
123: #define RegCondGE ((RegIsN && RegIsV) || (!RegIsN && !RegIsV))
124: #define RegCondLT ((RegIsN && !RegIsV) || (!RegIsN && RegIsV))
125: #define RegCondGT ((RegIsN && RegIsV && !RegIsZ) || \
126: (!RegIsN && !RegIsV && !RegIsZ))
127: #define RegCondLE (RegIsZ || (RegIsN && !RegIsV) || (!RegIsN && RegIsV))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.