1 package com.tapina.robe.runtime;
2
3 /***
4 * Created by IntelliJ IDEA.
5 * User: gareth
6 * Date: Aug 21, 2003
7 * Time: 8:05:58 AM
8 */
9 public final class CPU {
10 public final int R[] = new int[16];
11 private int PSR = 0;
12 public final boolean modeIs32Bit = false;
13 static final int ADDRESS_MASK = 0x03fffffc;
14 static final int FLAGS_MASK = 0xfc000003;
15
16 public final int getPC() {
17 if (modeIs32Bit) {
18 return R[15];
19 } else {
20 return R[15] & ADDRESS_MASK;
21 }
22 }
23
24 public final void setPC(int pc) {
25 if (modeIs32Bit) {
26 R[15] = pc;
27 } else {
28 R[15] = (R[15] & FLAGS_MASK) | (pc & ADDRESS_MASK);
29 }
30 }
31
32 public final void setFlags(int flags) {
33 if (modeIs32Bit) {
34 PSR = flags;
35 } else {
36 R[15] = (R[15] & ADDRESS_MASK) | (flags & FLAGS_MASK);
37 }
38 }
39
40 public final void setF() {
41 setFlag(26);
42 }
43
44 public final void clearF() {
45 clearFlag(26);
46 }
47
48 public final void setI() {
49 setFlag(27);
50 }
51
52 public final void clearI() {
53 clearFlag(27);
54 }
55
56 public final boolean getV() {
57 return getFlag(28);
58 }
59
60 public final void setV() {
61 setFlag(28);
62 }
63
64 public final void clearV() {
65 clearFlag(28);
66 }
67
68 public final boolean getC() {
69 return getFlag(29);
70 }
71
72 public final void setC() {
73 setFlag(29);
74 }
75
76 public final void clearC() {
77 clearFlag(29);
78 }
79
80 public final boolean getZ() {
81 return getFlag(30);
82 }
83
84 public final void setZ() {
85 setFlag(30);
86 }
87
88 public final void clearZ() {
89 clearFlag(30);
90 }
91
92 public final boolean getN() {
93 return getFlag(31);
94 }
95
96 public final void setN() {
97 setFlag(31);
98 }
99
100 public final void clearN() {
101 clearFlag(31);
102 }
103
104 private final boolean getFlag(int bit) {
105 if (!modeIs32Bit) {
106 return (R[15] & (1 << bit)) != 0;
107 } else {
108 return (PSR & (1 << bit)) != 0;
109 }
110 }
111
112 private final void setFlag(int bit) {
113 if (!modeIs32Bit) {
114 R[15] |= (1 << bit);
115 } else {
116 PSR |= (1 << bit);
117 }
118 }
119
120 private final void clearFlag(int bit) {
121 if (!modeIs32Bit) {
122 R[15] &= ~(1 << bit);
123 } else {
124 PSR &= ~(1 << bit);
125 }
126 }
127
128 public final String toString() {
129 StringBuffer buffer = new StringBuffer();
130 for (int i = 0; i < 16; i++) {
131 buffer.append("R").append(i).append(" = &").append(Integer.toHexString(R[i])).
132 append("/").append(R[i]).append("; ");
133 }
134 return buffer.toString();
135 }
136 }