View Javadoc

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; // Top 6 bits and bottom two used for flags
14      static final int FLAGS_MASK = 0xfc000003; // Top 6 bits and bottom two used for flags
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 }