Fix various issues
authorNick Downing <nick@ndcode.org>
Mon, 25 Jul 2022 07:01:33 +0000 (17:01 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 25 Jul 2022 07:01:33 +0000 (17:01 +1000)
cpu_6800.c
cpu_6800.h
decode_6800.py
decode_6800.sed
emu_6800.c
sim68xx

index b131109..1a9c43e 100644 (file)
@@ -71,10 +71,10 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_ill(self);
     break;
   case 0x06:
-    cpu_6800_sta(self, self->regs.byte.a | 0xc0, CPU_6800_EA_P);
+    cpu_6800_tap(self);
     break;
   case 0x07:
-    cpu_6800_sta(self, self->regs.byte.p, CPU_6800_EA_A);
+    cpu_6800_tpa(self);
     break;
   case 0x08:
     cpu_6800_in(self, CPU_6800_EA_X);
@@ -149,52 +149,52 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_ill(self);
     break;
   case 0x20:
-    cpu_6800_bra(self, true, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, true, cpu_6800_ea_relative(self));
     break;
   case 0x21:
     cpu_6800_ill(self);
     break;
   case 0x22:
-    cpu_6800_bra(self, !self->regs.bit.cf && !self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.cf && !self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x23:
-    cpu_6800_bra(self, self->regs.bit.cf || self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.cf || self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x24:
-    cpu_6800_bra(self, !self->regs.bit.cf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.cf, cpu_6800_ea_relative(self));
     break;
   case 0x25:
-    cpu_6800_bra(self, self->regs.bit.cf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.cf, cpu_6800_ea_relative(self));
     break;
   case 0x26:
-    cpu_6800_bra(self, !self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x27:
-    cpu_6800_bra(self, self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x28:
-    cpu_6800_bra(self, !self->regs.bit.vf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.vf, cpu_6800_ea_relative(self));
     break;
   case 0x29:
-    cpu_6800_bra(self, self->regs.bit.vf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.vf, cpu_6800_ea_relative(self));
     break;
   case 0x2a:
-    cpu_6800_bra(self, !self->regs.bit.nf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.nf, cpu_6800_ea_relative(self));
     break;
   case 0x2b:
-    cpu_6800_bra(self, self->regs.bit.nf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.nf, cpu_6800_ea_relative(self));
     break;
   case 0x2c:
-    cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf, cpu_6800_ea_relative(self));
     break;
   case 0x2d:
-    cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf, cpu_6800_ea_relative(self));
     break;
   case 0x2e:
-    cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf && !self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf && !self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x2f:
-    cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf || self->regs.bit.zf, cpu_6800_ea_direct(self));
+    cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf || self->regs.bit.zf, cpu_6800_ea_relative(self));
     break;
   case 0x30:
     cpu_6800_st(self, self->regs.word.s, CPU_6800_EA_X);
@@ -476,7 +476,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_cp(self, self->regs.word.x, cpu_6800_fetch_word(self));
     break;
   case 0x8d:
-    cpu_6800_bsr(self, cpu_6800_ea_direct(self));
+    cpu_6800_bsr(self, cpu_6800_ea_relative(self));
     break;
   case 0x8e:
     cpu_6800_ld(self, CPU_6800_EA_S, cpu_6800_fetch_word(self));
@@ -506,7 +506,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
     break;
   case 0x97:
-    cpu_6800_sta(self, CPU_6800_EA_A, cpu_6800_ea_direct(self));
+    cpu_6800_sta(self, self->regs.byte.a, cpu_6800_ea_direct(self));
     break;
   case 0x98:
     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
@@ -554,7 +554,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
     break;
   case 0xa7:
-    cpu_6800_sta(self, CPU_6800_EA_A, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
+    cpu_6800_sta(self, self->regs.byte.a, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
     break;
   case 0xa8:
     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
@@ -602,7 +602,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
     break;
   case 0xb7:
-    cpu_6800_sta(self, CPU_6800_EA_A, cpu_6800_ea_extended(self));
+    cpu_6800_sta(self, self->regs.byte.a, cpu_6800_ea_extended(self));
     break;
   case 0xb8:
     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
@@ -698,7 +698,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
     break;
   case 0xd7:
-    cpu_6800_sta(self, CPU_6800_EA_B, cpu_6800_ea_direct(self));
+    cpu_6800_sta(self, self->regs.byte.b, cpu_6800_ea_direct(self));
     break;
   case 0xd8:
     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
@@ -746,7 +746,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
     break;
   case 0xe7:
-    cpu_6800_sta(self, CPU_6800_EA_B, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
+    cpu_6800_sta(self, self->regs.byte.b, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
     break;
   case 0xe8:
     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
@@ -794,7 +794,7 @@ void cpu_6800_execute(struct cpu_6800 *self) {
     cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
     break;
   case 0xf7:
-    cpu_6800_sta(self, CPU_6800_EA_B, cpu_6800_ea_extended(self));
+    cpu_6800_sta(self, self->regs.byte.b, cpu_6800_ea_extended(self));
     break;
   case 0xf8:
     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
index 2bd2c57..14c7478 100644 (file)
@@ -1,3 +1,4 @@
+#include <stdio.h>
 #ifndef _CPU_6800_H
 #define _CPU_6800_H
 
@@ -240,7 +241,6 @@ static ALWAYS_INLINE void cpu_6800_and(struct cpu_6800 *self, int lvalue, int rv
   int result = cpu_6800_read_byte(self, lvalue) & rvalue;
 
   cpu_6800_write_byte(self, lvalue, result);
-  self->regs.byte.a = result;
   self->regs.bit.zf = result == 0;
   self->regs.bit.nf = result >> 7;
 }
@@ -252,12 +252,12 @@ static ALWAYS_INLINE void cpu_6800_asr(struct cpu_6800 *self, int lvalue) {
   ++self->cycles;
 
   cpu_6800_write_byte(self, lvalue, result >> 1);
-  self->regs.bit.cf = result & 1;
-  self->regs.bit.zf = (result & 0xfe) == 0;
   self->regs.bit.nf = false;
+  self->regs.bit.zf = (result & 0xfe) == 0;
+  self->regs.bit.vf = (result ^ (result >> 8)) & 1;
+  self->regs.bit.cf = result & 1;
 }
 
-
 static ALWAYS_INLINE void cpu_6800_bit(struct cpu_6800 *self, int rvalue0, int rvalue1) {
   int result = rvalue0 & rvalue1;
 
@@ -278,7 +278,7 @@ static ALWAYS_INLINE void cpu_6800_bra(struct cpu_6800 *self, bool pred, int lva
 }
 
 static ALWAYS_INLINE void cpu_6800_bsr(struct cpu_6800 *self, int lvalue) {
-  cpu_6800_push_word(self, (self->regs.word.pc - 1) & 0xffff);
+  cpu_6800_push_word(self, self->regs.word.pc);
   self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
   self->regs.word.pc += lvalue;
 }
@@ -292,11 +292,13 @@ static ALWAYS_INLINE void cpu_6800_clr(struct cpu_6800 *self, int lvalue) {
 }
 
 static ALWAYS_INLINE void cpu_6800_cmp(struct cpu_6800 *self, int rvalue0, int rvalue1) {
-  rvalue1 ^= 0xff;
-  int result = 1 + rvalue0 + rvalue1;
-  self->regs.bit.cf = result >> 8;
-  self->regs.bit.zf = (result & 0xff) == 0;
-  self->regs.bit.nf = (result >> 7) & 1;
+  int result0 = (rvalue0 & 0x7f) - (rvalue1 & 0x7f);
+  int result1 = result0 + (rvalue0 & 0x80) - (rvalue1 & 0x80);
+
+  self->regs.bit.nf = (result1 >> 7) & 1;
+  self->regs.bit.zf = (result1 & 0xff) == 0;
+  self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
+  self->regs.bit.cf = (result1 >> 8) & 1;
 }
 
 static ALWAYS_INLINE void cpu_6800_com(struct cpu_6800 *self, int lvalue) {
@@ -308,11 +310,12 @@ static ALWAYS_INLINE void cpu_6800_com(struct cpu_6800 *self, int lvalue) {
 }
 
 static ALWAYS_INLINE void cpu_6800_cp(struct cpu_6800 *self, int rvalue0, int rvalue1) {
-  rvalue1 ^= 0xffff;
-  int result = 1 + rvalue0 + rvalue1;
-  self->regs.bit.cf = result >> 16;
-  self->regs.bit.zf = (result & 0xff) == 0;
-  self->regs.bit.nf = (result >> 15) & 1;
+  int result0 = (rvalue0 & 0x7fff) - (rvalue1 & 0x7fff);
+  int result1 = result0 + (rvalue0 & 0x8000) - (rvalue1 & 0x8000);
+
+  self->regs.bit.nf = (result1 >> 15) & 1;
+  self->regs.bit.zf = (result1 & 0xffff) == 0;
+  self->regs.bit.vf = ((result0 >> 15) ^ (result1 >> 16)) & 1;
 }
 
 static ALWAYS_INLINE void cpu_6800_daa(struct cpu_6800 *self) {
@@ -339,7 +342,6 @@ static ALWAYS_INLINE void cpu_6800_eor(struct cpu_6800 *self, int lvalue, int rv
   int result = cpu_6800_read_byte(self, lvalue) ^ rvalue;
 
   cpu_6800_write_byte(self, lvalue, result);
-  self->regs.byte.a = result;
   self->regs.bit.zf = result == 0;
   self->regs.bit.nf = result >> 7;
 }
@@ -377,20 +379,24 @@ static ALWAYS_INLINE void cpu_6800_jmp(struct cpu_6800 *self, int lvalue) {
 }
 
 static ALWAYS_INLINE void cpu_6800_jsr(struct cpu_6800 *self, int lvalue) {
-  cpu_6800_push_word(self, (self->regs.word.pc - 1) & 0xffff);
+  cpu_6800_push_word(self, self->regs.word.pc);
   self->regs.word.pc = lvalue;
 }
 
 static ALWAYS_INLINE void cpu_6800_ld(struct cpu_6800 *self, int lvalue, int rvalue) {
   cpu_6800_write_word(self, lvalue, rvalue);
-  self->regs.bit.zf = rvalue == 0;
+
   self->regs.bit.nf = (rvalue >> 15) & 1;
+  self->regs.bit.zf = rvalue == 0;
+  self->regs.bit.vf = false;
 }
 
 static ALWAYS_INLINE void cpu_6800_lda(struct cpu_6800 *self, int lvalue, int rvalue) {
   cpu_6800_write_byte(self, lvalue, rvalue);
-  self->regs.bit.zf = rvalue == 0;
+
   self->regs.bit.nf = (rvalue >> 7) & 1;
+  self->regs.bit.zf = rvalue == 0;
+  self->regs.bit.vf = false;
 }
 
 static ALWAYS_INLINE void cpu_6800_lsl(struct cpu_6800 *self, int lvalue) {
@@ -435,31 +441,27 @@ static ALWAYS_INLINE void cpu_6800_ora(struct cpu_6800 *self, int lvalue, int rv
   int result = cpu_6800_read_byte(self, lvalue) | rvalue;
 
   cpu_6800_write_byte(self, lvalue, result);
-  self->regs.byte.a = result;
   self->regs.bit.zf = result == 0;
   self->regs.bit.nf = result >> 7;
 }
 
-static ALWAYS_INLINE void cpu_6800_plp(struct cpu_6800 *self) {
-  self->regs.byte.p = cpu_6800_pop_byte(self) | 0xc0;
-}
+//static ALWAYS_INLINE void cpu_6800_plp(struct cpu_6800 *self) {
+//  self->regs.byte.p = cpu_6800_pop_byte(self) | 0xc0;
+//}
 
 static ALWAYS_INLINE void cpu_6800_psh(struct cpu_6800 *self, int rvalue) {
   cpu_6800_push_byte(self, rvalue);
 }
 
 static ALWAYS_INLINE void cpu_6800_pul(struct cpu_6800 *self, int lvalue) {
-  int result = cpu_6800_pop_byte(self);
-  cpu_6800_write_byte(self, lvalue, result);
-  self->regs.bit.zf = result == 0;
-  self->regs.bit.nf = result >> 7;
+  cpu_6800_write_byte(self, lvalue, cpu_6800_pop_byte(self));
 }
 
-static ALWAYS_INLINE void cpu_6800_rmb(struct cpu_6800 *self, int n, int lvalue) {
-  int result = cpu_6800_read_byte(self, lvalue) & ~(1 << n);
-  ++self->cycles;
-  cpu_6800_write_byte(self, lvalue, result);
-}
+//static ALWAYS_INLINE void cpu_6800_rmb(struct cpu_6800 *self, int n, int lvalue) {
+//  int result = cpu_6800_read_byte(self, lvalue) & ~(1 << n);
+//  ++self->cycles;
+//  cpu_6800_write_byte(self, lvalue, result);
+//}
 
 static ALWAYS_INLINE void cpu_6800_rol(struct cpu_6800 *self, int lvalue) {
   int result = self->regs.bit.cf | (cpu_6800_read_byte(self, lvalue) << 1);
@@ -485,7 +487,7 @@ static ALWAYS_INLINE void cpu_6800_rti(struct cpu_6800 *self) {
 }
 
 static ALWAYS_INLINE void cpu_6800_rts(struct cpu_6800 *self) {
-  self->regs.word.pc = (cpu_6800_pop_word(self) + 1) & 0xffff;
+  self->regs.word.pc = cpu_6800_pop_word(self);
 }
 
 static ALWAYS_INLINE void cpu_6800_sbc(struct cpu_6800 *self, int lvalue, int rvalue) {
@@ -506,50 +508,65 @@ static ALWAYS_INLINE void cpu_6800_se(struct cpu_6800 *self, int n) {
   self->regs.byte.p |= 1 << n;
 }
 
-static ALWAYS_INLINE void cpu_6800_smb(struct cpu_6800 *self, int n, int lvalue) {
-  int result = cpu_6800_read_byte(self, lvalue) | (1 << n);
-  ++self->cycles;
-  cpu_6800_write_byte(self, lvalue, result);
-}
+//static ALWAYS_INLINE void cpu_6800_smb(struct cpu_6800 *self, int n, int lvalue) {
+//  int result = cpu_6800_read_byte(self, lvalue) | (1 << n);
+//  ++self->cycles;
+//  cpu_6800_write_byte(self, lvalue, result);
+//}
 
 static ALWAYS_INLINE void cpu_6800_st(struct cpu_6800 *self, int rvalue, int lvalue) {
   cpu_6800_write_word(self, lvalue, rvalue);
+
+  self->regs.bit.nf = (rvalue >> 15) & 1;
+  self->regs.bit.zf = rvalue == 0;
+  self->regs.bit.vf = false;
 }
 
 static ALWAYS_INLINE void cpu_6800_sta(struct cpu_6800 *self, int rvalue, int lvalue) {
   cpu_6800_write_byte(self, lvalue, rvalue);
+
+  self->regs.bit.nf = (rvalue >> 7) & 1;
+  self->regs.bit.zf = rvalue == 0;
+  self->regs.bit.vf = false;
 }
 
 static ALWAYS_INLINE void cpu_6800_sub(struct cpu_6800 *self, int lvalue, int rvalue) {
   int data = cpu_6800_read_byte(self, lvalue);
-  rvalue ^= 0xff;
 
-  int result0 = (data & 0x7f) + (rvalue & 0x7f);
-  int result1 = result0 + (data & 0x80) + (rvalue & 0x80);
+  int result0 = (data & 0x7f) - (rvalue & 0x7f);
+  int result1 = result0 + (data & 0x80) - (rvalue & 0x80);
 
   cpu_6800_write_byte(self, lvalue, result1 & 0xff);
-  self->regs.bit.cf = result1 >> 8;
+  self->regs.bit.nf = (result1 >> 7) & 1;
   self->regs.bit.zf = (result1 & 0xff) == 0;
   self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
-  self->regs.bit.nf = (result1 >> 7) & 1;
+  self->regs.bit.cf = (result1 >> 8) & 1;
 }
 
-static ALWAYS_INLINE void cpu_6800_trb(struct cpu_6800 *self, int lvalue) {
-  int result = cpu_6800_read_byte(self, lvalue);
-  ++self->cycles;
-  cpu_6800_write_byte(self, lvalue, result & ~self->regs.byte.a);
-  result &= self->regs.byte.a;
-  self->regs.bit.zf = result == 0;
+static ALWAYS_INLINE void cpu_6800_tap(struct cpu_6800 *self) {
+  self->regs.byte.p = self->regs.byte.a | 0xc0;
 }
 
-static ALWAYS_INLINE void cpu_6800_tsb(struct cpu_6800 *self, int lvalue) {
-  int result = cpu_6800_read_byte(self, lvalue);
-  ++self->cycles;
-  cpu_6800_write_byte(self, lvalue, result | self->regs.byte.a);
-  result &= self->regs.byte.a;
-  self->regs.bit.zf = result == 0;
+static ALWAYS_INLINE void cpu_6800_tpa(struct cpu_6800 *self) {
+  self->regs.byte.a = self->regs.byte.p;
 }
 
+//static ALWAYS_INLINE void cpu_6800_trb(struct cpu_6800 *self, int lvalue) {
+//  int result = cpu_6800_read_byte(self, lvalue);
+//  ++self->cycles;
+//  cpu_6800_write_byte(self, lvalue, result & ~self->regs.byte.a);
+//  result &= self->regs.byte.a;
+//  self->regs.bit.zf = result == 0;
+//}
+//
+//static ALWAYS_INLINE void cpu_6800_tsb(struct cpu_6800 *self, int lvalue) {
+//  int result = cpu_6800_read_byte(self, lvalue);
+//  ++self->cycles;
+//  cpu_6800_write_byte(self, lvalue, result | self->regs.byte.a);
+//  result &= self->regs.byte.a;
+//  self->regs.bit.zf = result == 0;
+//}
+
 static ALWAYS_INLINE void cpu_6800_tst(struct cpu_6800 *self, int rvalue) {
   self->regs.bit.zf = rvalue == 0;
   self->regs.bit.nf = rvalue >> 7;
index 8f649e1..20143ab 100755 (executable)
@@ -6,6 +6,7 @@ import sys
 acc_rvalue_opcodes = {
   'cmp',
   'psh',
+  'sta',
   'tst',
 }
 
index 6974f4d..86ea6d3 100644 (file)
@@ -2,15 +2,16 @@ s/cpu_6800_bpl(self/cpu_6800_bnc(self/
 s/cpu_6800_bmi(self/cpu_6800_bns(self/
 s/cpu_6800_bne(self/cpu_6800_bzc(self/
 s/cpu_6800_beq(self/cpu_6800_bzs(self/
-s/cpu_6800_bra(self/cpu_6800_bra(self, true/
-s/cpu_6800_b\([czvn]\)c(self/cpu_6800_bra(self, !self->regs.bit.\1f/
-s/cpu_6800_b\([czvn]\)s(self/cpu_6800_bra(self, self->regs.bit.\1f/
-s/cpu_6800_bge(self/cpu_6800_bra(self, !self->regs.bit.nf \&\& !self->regs.bit.vf/
-s/cpu_6800_bgt(self/cpu_6800_bra(self, !self->regs.bit.nf \&\& !self->regs.bit.vf \&\& !self->regs.bit.zf/
-s/cpu_6800_bhi(self/cpu_6800_bra(self, !self->regs.bit.cf \&\& !self->regs.bit.zf/
-s/cpu_6800_ble(self/cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf || self->regs.bit.zf/
-s/cpu_6800_bls(self/cpu_6800_bra(self, self->regs.bit.cf || self->regs.bit.zf/
-s/cpu_6800_blt(self/cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf/
+s/cpu_6800_bra(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, true, cpu_6800_ea_relative(self)/
+s/cpu_6800_bsr(self, cpu_6800_ea_direct(self)/cpu_6800_bsr(self, cpu_6800_ea_relative(self)/
+s/cpu_6800_b\([czvn]\)c(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, !self->regs.bit.\1f, cpu_6800_ea_relative(self)/
+s/cpu_6800_b\([czvn]\)s(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, self->regs.bit.\1f, cpu_6800_ea_relative(self)/
+s/cpu_6800_bge(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, !self->regs.bit.nf \&\& !self->regs.bit.vf, cpu_6800_ea_relative(self)/
+s/cpu_6800_bgt(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, !self->regs.bit.nf \&\& !self->regs.bit.vf \&\& !self->regs.bit.zf, cpu_6800_ea_relative(self)/
+s/cpu_6800_bhi(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, !self->regs.bit.cf \&\& !self->regs.bit.zf, cpu_6800_ea_relative(self)/
+s/cpu_6800_ble(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf || self->regs.bit.zf, cpu_6800_ea_relative(self)/
+s/cpu_6800_bls(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, self->regs.bit.cf || self->regs.bit.zf, cpu_6800_ea_relative(self)/
+s/cpu_6800_blt(self, cpu_6800_ea_direct(self)/cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf, cpu_6800_ea_relative(self)/
 s/cpu_6800_st\([xs]\)(self/cpu_6800_st(self, self->regs.word.\1/
 s/cpu_6800_ld\([xs]\)(self\(.*\)byte/cpu_6800_ld(self, CPU_6800_EA_\1\2word/
 s/cpu_6800_ld\([xs]\)(self/cpu_6800_ld(self, CPU_6800_EA_\1/
@@ -20,8 +21,6 @@ s/cpu_6800_a\([ab]\)\([ab]\)(self/cpu_6800_add(self, CPU_6800_EA_\2, self->regs.
 s/cpu_6800_c\([ab]\)\([ab]\)(self/cpu_6800_cmp(self, CPU_6800_EA_\2, self->regs.byte.\1/
 s/cpu_6800_s\([ab]\)\([ab]\)(self/cpu_6800_sub(self, CPU_6800_EA_\2, self->regs.byte.\1/
 s/cpu_6800_t\([ab]\)\([ab]\)(self/cpu_6800_lda(self, CPU_6800_EA_\2, self->regs.byte.\1/
-s/cpu_6800_tap(self/cpu_6800_sta(self, self->regs.byte.a | 0xc0, CPU_6800_EA_P/
-s/cpu_6800_tpa(self/cpu_6800_sta(self, self->regs.byte.p, CPU_6800_EA_A/
 s/cpu_6800_cl\([cidv]\)(self/cpu_6800_cl(self, CPU_6800_REG_P_BIT_\1/
 s/cpu_6800_se\([cidv]\)(self/cpu_6800_se(self, CPU_6800_REG_P_BIT_\1/
 s/cpu_6800_in\([xs]\)(self/cpu_6800_in(self, CPU_6800_EA_\1/
index 754d807..ee31ebb 100644 (file)
@@ -1,3 +1,4 @@
+#include <assert.h> // temp
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -11,8 +12,8 @@
 #include "cpu_6800.h"
 #endif
 
-#define REG_TRACE 0
-#define MEM_TRACE 0
+#define REG_TRACE 1
+#define MEM_TRACE 1
 
 #define MEM_SIZE 0x10000
 uint8_t mem[MEM_SIZE];
@@ -123,6 +124,7 @@ int read_byte(void *context, int addr) {
 }
 
 void write_byte(void *context, int addr, int data) {
+ assert((data & ~0xff) == 0);
 #if MEM_TRACE
   fprintf(stderr, "addr=%04x wr=%02x\n", addr, data);
 #endif
@@ -187,7 +189,7 @@ int main(int argc, char **argv) {
 #if REG_TRACE
     fprintf(
       stderr,
-      "pc=%04x a=%02x b=%02x x=%04x s=%04x ccr=%02x hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
+      "pc=%04x a=%02x b=%02x x=%04x s=%04x p=%02x hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
       regs.pc,
       regs.accd.a,
       regs.accd.b,
@@ -214,13 +216,13 @@ int main(int argc, char **argv) {
 #if REG_TRACE
     fprintf(
       stderr,
-      "pc=%04x a=%02x b=%02x x=%04x s=%04x ccr=%02x hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
+      "pc=%04x a=%02x b=%02x x=%04x s=%04x p=%02x hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
       cpu.regs.word.pc,
       cpu.regs.byte.a,
       cpu.regs.byte.b,
       cpu.regs.word.x,
       cpu.regs.word.s,
-      cpu.regs.byte.ccr,
+      cpu.regs.byte.p,
       cpu.regs.bit.hf,
       cpu.regs.bit._if,
       cpu.regs.bit.nf,
diff --git a/sim68xx b/sim68xx
index 64cb8ed..d05bafb 160000 (submodule)
--- a/sim68xx
+++ b/sim68xx
@@ -1 +1 @@
-Subproject commit 64cb8ed44c43dbefa00555677290340728057f40
+Subproject commit d05bafbe581ab92e42e2b0d68e5500c45f4159fc