@@ -70,13 +70,41 @@ struct RegisterFile
70
70
const byte r0 = 0 ;
71
71
72
72
private :
73
- byte r1;
74
- byte r2;
75
- byte r3;
76
- byte r4;
77
- byte r5;
78
- byte r6;
79
- byte ap;
73
+ union
74
+ {
75
+ byte r1;
76
+ ubyte r1_u;
77
+ }
78
+ union
79
+ {
80
+ byte r2;
81
+ ubyte r2_u;
82
+ }
83
+ union
84
+ {
85
+ byte r3;
86
+ ubyte r3_u;
87
+ }
88
+ union
89
+ {
90
+ byte r4;
91
+ ubyte r4_u;
92
+ }
93
+ union
94
+ {
95
+ byte r5;
96
+ ubyte r5_u;
97
+ }
98
+ union
99
+ {
100
+ byte r6;
101
+ ubyte r6_u;
102
+ }
103
+ union
104
+ {
105
+ byte ap;
106
+ ubyte ap_u;
107
+ }
80
108
81
109
public :
82
110
void reset ()
@@ -106,6 +134,22 @@ public:
106
134
}
107
135
}
108
136
137
+ ubyte read_u (RegisterType r)
138
+ {
139
+ switch (r)
140
+ {
141
+ case RegisterType.r0: return r0;
142
+ case RegisterType.r1: return r1_u;
143
+ case RegisterType.r2: return r2_u;
144
+ case RegisterType.r3: return r3_u;
145
+ case RegisterType.r4: return r4_u;
146
+ case RegisterType.r5: return r5_u;
147
+ case RegisterType.r6: return r6_u;
148
+ case RegisterType.ap: return ap_u;
149
+ default : return r0;
150
+ }
151
+ }
152
+
109
153
void write (RegisterType rs, byte data)
110
154
{
111
155
switch (rs)
@@ -120,6 +164,21 @@ public:
120
164
default : return ;
121
165
}
122
166
}
167
+
168
+ void write_u (RegisterType rs, ubyte data)
169
+ {
170
+ switch (rs)
171
+ {
172
+ case RegisterType.r1: r1_u = data; return ;
173
+ case RegisterType.r2: r2_u = data; return ;
174
+ case RegisterType.r3: r3_u = data; return ;
175
+ case RegisterType.r4: r4_u = data; return ;
176
+ case RegisterType.r5: r5_u = data; return ;
177
+ case RegisterType.r6: r6_u = data; return ;
178
+ case RegisterType.ap: ap_u = data; return ;
179
+ default : return ;
180
+ }
181
+ }
123
182
}
124
183
125
184
@@ -210,17 +269,17 @@ struct Simulator
210
269
this .registers.write(current_instruction.parameters[0 ].register, 0 );
211
270
break ;
212
271
case InstructionType.inc:
213
- this .registers.write (
272
+ this .registers.write_u (
214
273
current_instruction.parameters[0 ].register,
215
- ALU (ALU_OP .ADD , this .registers.read (current_instruction.parameters[0 ].register), 1 ));
274
+ ALU (ALU_OP .ADD , this .registers.read_u (current_instruction.parameters[0 ].register), 1 ));
216
275
break ;
217
276
case InstructionType.dec:
218
- this .registers.write (
277
+ this .registers.write_u (
219
278
current_instruction.parameters[0 ].register,
220
- ALU (ALU_OP .SUB , this .registers.read (current_instruction.parameters[0 ].register), 1 ));
279
+ ALU (ALU_OP .SUB , this .registers.read_u (current_instruction.parameters[0 ].register), 1 ));
221
280
break ;
222
281
case InstructionType.inv:
223
- this .memory[this .registers.read (RegisterType.ap)] =
282
+ this .memory[this .registers.read_u (RegisterType.ap)] =
224
283
ALU (ALU_OP .INV , this .registers.read(current_instruction.parameters[0 ].register), 0 );
225
284
break ;
226
285
case InstructionType.load:
@@ -229,34 +288,34 @@ struct Simulator
229
288
this .memory[this .registers.read(RegisterType.ap)]);
230
289
break ;
231
290
case InstructionType.store:
232
- this .memory[this .registers.read (RegisterType.ap)] =
291
+ this .memory[this .registers.read_u (RegisterType.ap)] =
233
292
this .registers.read(current_instruction.parameters[0 ].register);
234
293
break ;
235
294
case InstructionType.brnz:
236
- if (this .memory[this .registers.read (RegisterType.ap)] != 0 )
295
+ if (this .memory[this .registers.read_u (RegisterType.ap)] != 0 )
237
296
pc.clock(BranchType.relative, cast (byte )(current_instruction.parameters[0 ].number));
238
297
return ;
239
298
case InstructionType.j:
240
299
pc.clock(BranchType.absolute, cast (ubyte )(current_instruction.parameters[0 ].number));
241
300
return ;
242
301
case InstructionType.jal:
243
- this .memory[this .registers.read (RegisterType.ap)] = this .pc.address;
302
+ this .memory[this .registers.read_u (RegisterType.ap)] = this .pc.address;
244
303
pc.clock(BranchType.absolute, cast (ubyte )(current_instruction.parameters[0 ].number));
245
304
return ;
246
305
case InstructionType.or:
247
- this .memory[this .registers.read (RegisterType.ap)] =
306
+ this .memory[this .registers.read_u (RegisterType.ap)] =
248
307
ALU (ALU_OP .OR ,
249
308
this .registers.read(current_instruction.parameters[0 ].register),
250
309
this .registers.read(current_instruction.parameters[1 ].register));
251
310
break ;
252
311
case InstructionType.add:
253
- this .memory[this .registers.read (RegisterType.ap)] =
312
+ this .memory[this .registers.read_u (RegisterType.ap)] =
254
313
ALU (ALU_OP .ADD ,
255
314
this .registers.read(current_instruction.parameters[0 ].register),
256
315
this .registers.read(current_instruction.parameters[1 ].register));
257
316
break ;
258
317
case InstructionType.sub:
259
- this .memory[this .registers.read (RegisterType.ap)] =
318
+ this .memory[this .registers.read_u (RegisterType.ap)] =
260
319
ALU (ALU_OP .SUB ,
261
320
this .registers.read(current_instruction.parameters[0 ].register),
262
321
this .registers.read(current_instruction.parameters[1 ].register));
0 commit comments