@@ -126,15 +126,19 @@ public static void logicalAndCC(IOController io, UnsignedByte registerByte, Unsi
126
126
* Adds the specified value to the specified register.
127
127
*/
128
128
public static void addByte (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
129
- int signedResult = registerByte .getSignedShort () + memoryByte .getSignedShort ();
130
- UnsignedByte result = new UnsignedByte (registerByte .getShort () + memoryByte .getShort ());
131
- io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C | CC_H ));
132
- io .regs .cc .or (((registerByte .getShort () ^ memoryByte .getShort () ^ result .getShort ()) & 0x10 ) > 0 ? CC_H : 0 );
133
- io .regs .cc .or (result .isZero () ? CC_Z : 0 );
134
- io .regs .cc .or (result .isNegative () ? CC_N : 0 );
135
- io .regs .cc .or (signedResult > 127 || signedResult < -127 ? CC_V : 0 );
136
- io .regs .cc .or (((registerByte .getShort () + memoryByte .getShort ()) & 0x100 ) > 0 ? CC_C : 0 );
129
+ int result = registerByte .get () + memoryByte .get ();
130
+ boolean half_carry = (registerByte .get () & 0xF ) + (memoryByte .get () & 0xF ) >= 0x10 ;
131
+ boolean overflow = ((registerByte .get () ^ memoryByte .get () ^ 0x80 ) & (registerByte .get () ^ result ) & 0x80 ) > 0 ;
132
+ boolean carry = (result & 0x100 ) > 0 ;
133
+
137
134
registerByte .set (result );
135
+
136
+ io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C | CC_H ));
137
+ io .regs .cc .or (half_carry ? CC_H : 0 );
138
+ io .regs .cc .or (carry ? CC_C : 0 );
139
+ io .regs .cc .or (overflow ? CC_V : 0 );
140
+ io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
141
+ io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
138
142
}
139
143
140
144
/**
@@ -143,56 +147,29 @@ public static void addByte(IOController io, UnsignedByte registerByte, UnsignedB
143
147
* specified register.
144
148
*/
145
149
public static void addWithCarry (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
146
- UnsignedByte carry = new UnsignedByte ((io .regs .cc .isMasked (CC_C )) ? 1 : 0 );
147
- io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C | CC_H ));
148
-
149
- // Check for overflow condition
150
- int signedResult = registerByte .getSignedShort () + carry .getSignedShort ();
151
- int overflow = signedResult > 127 || signedResult < -127 ? CC_V : 0 ;
152
-
153
- // Check for carry condition if we add the carry value
154
- if (((registerByte .getShort () + carry .getShort ()) & 0x100 ) > 0 ) {
155
- io .regs .cc .or (CC_C );
156
- }
150
+ int carryBit = io .regs .cc .isMasked (CC_C ) ? 1 : 0 ;
151
+ int result = registerByte .get () + memoryByte .get () + carryBit ;
152
+ boolean half_carry = (registerByte .get () & 0xF ) + (memoryByte .get () & 0xF ) + (carryBit & 0xF ) >= 0x10 ;
153
+ boolean overflow = ((registerByte .get () ^ memoryByte .get () ^ 0x80 ) & (registerByte .get () ^ result ) & 0x80 ) > 0 ;
154
+ boolean carry = (result & 0x100 ) > 0 ;
157
155
158
- // Check for half carry condition on the carry bit addition
159
- UnsignedByte test = new UnsignedByte ((registerByte .getShort () & 0xF ) + (carry .getShort () & 0xF ));
160
- if (test .isMasked (0x10 )) {
161
- io .regs .cc .or (CC_H );
162
- }
163
-
164
- // Add the carry bit
165
- registerByte .set (new UnsignedByte (registerByte .getShort () + carry .getShort ()));
166
-
167
- // Check for overflow condition of the actual byte
168
- signedResult = registerByte .getSignedShort () + memoryByte .getSignedShort ();
169
- overflow |= signedResult > 127 || signedResult < -127 ? CC_V : 0 ;
170
-
171
- // Check for carry condition if we add the actual byte now
172
- if (((registerByte .getShort () + memoryByte .getShort ()) & 0x100 ) > 0 ) {
173
- io .regs .cc .or (CC_C );
174
- }
175
-
176
- // Check for half carry condition on the second byte addition
177
- test = new UnsignedByte ((registerByte .getShort () & 0xF ) + (memoryByte .getShort () & 0xF ));
178
- if (test .isMasked (0x10 )) {
179
- io .regs .cc .or (CC_H );
180
- }
156
+ registerByte .set (result );
181
157
182
- // Add the second byte
183
- registerByte .set (new UnsignedByte (registerByte .getShort () + memoryByte .getShort ()));
158
+ io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C | CC_H ));
159
+ io .regs .cc .or (half_carry ? CC_H : 0 );
160
+ io .regs .cc .or (carry ? CC_C : 0 );
161
+ io .regs .cc .or (overflow ? CC_V : 0 );
184
162
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
185
163
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
186
- io .regs .cc .or (overflow );
187
164
}
188
165
189
166
/**
190
167
* Logically AND the register byte with a memory byte and tests the byte for zero
191
168
* condition or negative condition. Register contents are left unchanged.
192
169
*/
193
170
public static void bitTest (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
194
- UnsignedByte value = new UnsignedByte (registerByte .getShort ());
195
- value .and (memoryByte .getShort ());
171
+ UnsignedByte value = new UnsignedByte (registerByte .get ());
172
+ value .and (memoryByte .get ());
196
173
io .regs .cc .and (~(CC_N | CC_Z | CC_V ));
197
174
io .regs .cc .or (value .isZero () ? CC_Z : 0 );
198
175
io .regs .cc .or (value .isNegative () ? CC_N : 0 );
@@ -202,23 +179,24 @@ public static void bitTest(IOController io, UnsignedByte registerByte, UnsignedB
202
179
* Compares the two bytes and sets the appropriate register sets.
203
180
*/
204
181
public static void compareByte (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
205
- io .regs .cc .and (~(CC_N | CC_Z | CC_V | CC_C ));
206
- boolean byte1WasNegative = registerByte .isNegative ();
207
- boolean byte2WasNegative = memoryByte .isNegative ();
208
- UnsignedByte result = new UnsignedByte (registerByte .getShort () + memoryByte .twosCompliment ().getShort ());
209
- io .regs .cc .or (registerByte .getShort () < memoryByte .getShort () ? CC_C : 0 );
210
- io .regs .cc .or (result .isZero () ? CC_Z : 0 );
211
- io .regs .cc .or (result .isNegative () ? CC_N : 0 );
212
- boolean overflow = (!byte1WasNegative && byte2WasNegative && result .isNegative ()) || (byte1WasNegative && !byte2WasNegative && !result .isNegative ());
182
+ int result = registerByte .get () - memoryByte .get ();
183
+ UnsignedByte resultByte = new UnsignedByte (result );
184
+ boolean overflow = ((registerByte .get () ^ memoryByte .get ()) & (registerByte .get () ^ result ) & 0x80 ) > 0 ;
185
+ boolean carry = registerByte .get () < memoryByte .get ();
186
+
187
+ io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C ));
188
+ io .regs .cc .or (carry ? CC_C : 0 );
213
189
io .regs .cc .or (overflow ? CC_V : 0 );
190
+ io .regs .cc .or (resultByte .isZero () ? CC_Z : 0 );
191
+ io .regs .cc .or (resultByte .isNegative () ? CC_N : 0 );
214
192
}
215
193
216
194
/**
217
195
* Performs a correction to the A register to transform the value into
218
196
* a proper BCD form.
219
197
*/
220
198
public static void decimalAdditionAdjust (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
221
- int fullByte = registerByte .getShort ();
199
+ int fullByte = registerByte .get ();
222
200
int mostSignificantNibble = fullByte & 0xF0 ;
223
201
int leastSignificantNibble = fullByte & 0x0F ;
224
202
int adjustment = 0 ;
@@ -234,10 +212,10 @@ public static void decimalAdditionAdjust(IOController io, UnsignedByte registerB
234
212
235
213
UnsignedByte result = new UnsignedByte (adjustment );
236
214
io .regs .cc .and (~(CC_C | CC_N | CC_Z ));
237
- if (((io .regs .a .getShort () + result .getShort ()) & 0x100 ) > 0 ) {
215
+ if (((io .regs .a .get () + result .get ()) & 0x100 ) > 0 ) {
238
216
io .regs .cc .or (CC_C );
239
217
}
240
- io .regs .a .set (new UnsignedByte (io .regs .a .getShort () + result .getShort ()));
218
+ io .regs .a .set (new UnsignedByte (io .regs .a .get () + result .get ()));
241
219
io .regs .cc .or (io .regs .a .isZero () ? CC_Z : 0 );
242
220
io .regs .cc .or (io .regs .a .isNegative () ? CC_N : 0 );
243
221
}
@@ -247,42 +225,42 @@ public static void decimalAdditionAdjust(IOController io, UnsignedByte registerB
247
225
* Subtracts the byte value from the specified register.
248
226
*/
249
227
public static void subtractByte (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
228
+ int result = registerByte .get () - memoryByte .get ();
229
+ boolean overflow = ((registerByte .get () ^ memoryByte .get ()) & (registerByte .get () ^ result ) & 0x80 ) > 0 ;
230
+ boolean carry = registerByte .get () < memoryByte .get ();
231
+
232
+ registerByte .set (result );
233
+
250
234
io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C ));
251
- boolean byte1WasNegative = registerByte .isNegative ();
252
- boolean byte2WasNegative = memoryByte .isNegative ();
253
- io .regs .cc .or (registerByte .getShort () < memoryByte .getShort () ? CC_C : 0 );
254
- registerByte .set (new UnsignedByte (registerByte .getShort () + memoryByte .twosCompliment ().getShort ()));
235
+ io .regs .cc .or (carry ? CC_C : 0 );
236
+ io .regs .cc .or (overflow ? CC_V : 0 );
255
237
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
256
238
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
257
- boolean overflow = (!byte1WasNegative && byte2WasNegative && registerByte .isNegative ()) || (byte1WasNegative && !byte2WasNegative && !memoryByte .isNegative ());
258
- io .regs .cc .or (overflow ? CC_V : 0 );
259
239
}
260
240
261
241
/**
262
242
* Subtracts the byte value and the carry from the specified value.
263
243
*/
264
244
public static void subtractByteWithCarry (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
265
- UnsignedByte carry = new UnsignedByte (io .regs .cc .isMasked (CC_C ) ? 1 : 0 );
245
+ int carryBit = io .regs .cc .isMasked (CC_C ) ? 1 : 0 ;
246
+ int result = registerByte .get () - memoryByte .get () - carryBit ;
247
+ boolean overflow = ((registerByte .get () ^ memoryByte .get () ^ 0x80 ) & (registerByte .get () ^ result ) & 0x80 ) > 0 ;
248
+ boolean carry = registerByte .get () < (memoryByte .get () + carryBit );
249
+
250
+ registerByte .set (result );
251
+
266
252
io .regs .cc .and (~(CC_N | CC_V | CC_Z | CC_C ));
267
- boolean byte1WasNegative = registerByte .isNegative ();
268
- boolean byte2WasNegative = memoryByte .isNegative ();
269
- io .regs .cc .or (registerByte .getShort () < memoryByte .getShort () ? CC_C : 0 );
270
- registerByte .set (new UnsignedByte (registerByte .getShort () + memoryByte .twosCompliment ().getShort ()));
271
- boolean overflow = (!byte1WasNegative && byte2WasNegative && registerByte .isNegative ()) || (byte1WasNegative && !byte2WasNegative && !registerByte .isNegative ());
272
- byte1WasNegative = registerByte .isNegative ();
273
- io .regs .cc .or (registerByte .getShort () < carry .getShort () ? CC_C : 0 );
274
- registerByte .set (new UnsignedByte (registerByte .getShort () + carry .twosCompliment ().getShort ()));
275
- overflow |= !byte1WasNegative && registerByte .isNegative () || byte1WasNegative && !registerByte .isNegative ();
253
+ io .regs .cc .or (carry ? CC_C : 0 );
254
+ io .regs .cc .or (overflow ? CC_V : 0 );
276
255
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
277
256
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
278
- io .regs .cc .or (overflow ? CC_V : 0 );
279
257
}
280
258
281
259
/**
282
260
* Performs an exclusive OR of the register and the byte value.
283
261
*/
284
262
public static void exclusiveOr (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
285
- registerByte .set (new UnsignedByte (registerByte .getShort () ^ memoryByte .getShort ()));
263
+ registerByte .set (new UnsignedByte (registerByte .get () ^ memoryByte .get ()));
286
264
io .regs .cc .and (~(CC_N | CC_V | CC_Z ));
287
265
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
288
266
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
@@ -312,19 +290,18 @@ public static void clear(IOController io, UnsignedByte registerByte, UnsignedByt
312
290
*/
313
291
public static void increment (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
314
292
io .regs .cc .and (~(CC_N | CC_Z | CC_V ));
315
- boolean wasNegative = registerByte .isNegative ( );
293
+ io . regs . cc . or ( registerByte .isMasked ( 0x7F ) ? CC_V : 0 );
316
294
registerByte .add (1 );
317
295
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
318
296
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
319
- io .regs .cc .or (registerByte .isNegative () != wasNegative ? CC_V : 0 );
320
297
}
321
298
322
299
/**
323
300
* Decrements the byte value by one.
324
301
*/
325
302
public static void decrement (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
326
303
io .regs .cc .and (~(CC_N | CC_Z | CC_V ));
327
- io .regs .cc .or (registerByte .isZero ( ) ? CC_V : 0 );
304
+ io .regs .cc .or (registerByte .isMasked ( 0x80 ) ? CC_V : 0 );
328
305
registerByte .add (0xFF );
329
306
io .regs .cc .or (registerByte .isZero () ? CC_Z : 0 );
330
307
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
@@ -432,25 +409,10 @@ public static void testByte(IOController io, UnsignedByte registerByte, Unsigned
432
409
*/
433
410
public static void negate (IOController io , UnsignedByte registerByte , UnsignedByte memoryByte , UnsignedWord address ) {
434
411
io .regs .cc .and (~(CC_N | CC_Z | CC_V | CC_C ));
435
-
436
- if (registerByte .equalsInt (0x80 )) {
437
- io .regs .cc .or (CC_V );
438
- io .regs .cc .or (CC_N );
439
- io .regs .cc .or (CC_C );
440
- registerByte .set (0x80 );
441
- return ;
442
- }
443
-
444
- if (registerByte .equalsInt (0x00 )) {
445
- io .regs .cc .or (CC_Z );
446
- registerByte .set (0 );
447
- return ;
448
- }
449
-
450
- registerByte .compliment ();
451
- registerByte .add (1 );
452
- io .regs .cc .or (registerByte .isMasked (0x80 ) ? CC_V : 0 );
412
+ io .regs .cc .or (registerByte .get () == 0x80 ? CC_V : 0 );
413
+ io .regs .cc .or (registerByte .get () != 0x00 ? CC_C : 0 );
414
+ registerByte .set (0x100 - registerByte .get ());
453
415
io .regs .cc .or (registerByte .isNegative () ? CC_N : 0 );
454
- io .regs .cc .or (CC_C );
416
+ io .regs .cc .or (registerByte . isZero () ? CC_Z : 0 );
455
417
}
456
418
}
0 commit comments