From f872e197071d82f94d8d1a90048fe4eafa17fd2a Mon Sep 17 00:00:00 2001
From: Lauchmelder <robert.trololo@gmail.com>
Date: Fri, 22 Oct 2021 17:49:20 +0200
Subject: [PATCH] added logging

---
 NES Emulator/CMakeLists.txt |   2 +-
 NES Emulator/cpu.c          |  31 ++-
 NES Emulator/cpu.h          |   4 +-
 NES Emulator/log.c          |  44 +++
 NES Emulator/log.h          |  14 +
 NES Emulator/opcodes.c      | 514 ++++++++++++++++++------------------
 6 files changed, 341 insertions(+), 268 deletions(-)
 create mode 100644 NES Emulator/log.c
 create mode 100644 NES Emulator/log.h

diff --git a/NES Emulator/CMakeLists.txt b/NES Emulator/CMakeLists.txt
index 8475916..79888f4 100644
--- a/NES Emulator/CMakeLists.txt	
+++ b/NES Emulator/CMakeLists.txt	
@@ -1,6 +1,6 @@
 cmake_minimum_required (VERSION 3.8)
 
-add_executable (nesemu "main.c"  "cpu.h" "types.h" "bus.h" "bus.c" "cartridge.h" "cpu.c" "cartridge.c" "opcodes.c")
+add_executable (nesemu "main.c"  "cpu.h" "types.h" "bus.h" "bus.c" "cartridge.h" "cpu.c" "cartridge.c" "opcodes.c" "log.c")
 
 if(MSVC)
 target_compile_definitions(nesemu PUBLIC _CRT_SECURE_NO_WARNINGS)
diff --git a/NES Emulator/cpu.c b/NES Emulator/cpu.c
index e6ca66c..0e5e191 100644
--- a/NES Emulator/cpu.c	
+++ b/NES Emulator/cpu.c	
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+#include "log.h"
 #include "bus.h"
 
 struct CPU* createCPU(struct Bus* parent)
@@ -16,6 +17,14 @@ struct CPU* createCPU(struct Bus* parent)
 	// TODO: THIS IS JUST FOR THE TEST ROM
 	cpu->pc = 0xC000;
 
+	cpu->status.raw = 0x34;
+	cpu->acc = 0;
+	cpu->x = 0;
+	cpu->y = 0;
+
+	cpu->remainingCycles = 7;
+	cpu->totalCycles = 0;
+
 	cpu->bus = parent;
 	return cpu;
 }
@@ -25,27 +34,29 @@ void destroyCPU(struct CPU* cpu)
 	free(cpu);
 }
 
-void tickCPU(struct CPU* cpu)
+int tickCPU(struct CPU* cpu)
 {
-	if (cpu->fetchedVal != 0)
+	cpu->remainingCycles--;
+	cpu->totalCycles += 1;
+
+	if (cpu->remainingCycles == 0)
 	{
-		cpu->fetchedVal--;
-		return;
+		fetch(cpu);
+		execute(cpu);
+		return 1;
 	}
 
-	fetch(cpu);
-	execute(cpu);
+	return 0;
 }
 
 void tickInstr(struct CPU* cpu)
 {
-	while (cpu->remainingCycles > 1)
-		tickCPU(cpu);
+	while (!tickCPU(cpu));
 }
 
 void fetch(struct CPU* cpu)
 {
-	Byte opcodeVal = readBus(cpu->bus, cpu->pc);
+	Byte opcodeVal = readBus(cpu->bus, cpu->pc++);
 	cpu->currentOpcode = OPCODE_TABLE + opcodeVal;
 
 	if (cpu->currentOpcode->op == XXX)
@@ -164,6 +175,8 @@ void fetch(struct CPU* cpu)
 
 void execute(struct CPU* cpu)
 {
+	LOG_BUS(cpu->bus);
+
 	switch (cpu->currentOpcode->op)
 	{
 	case JMP:
diff --git a/NES Emulator/cpu.h b/NES Emulator/cpu.h
index bf2bb31..ac92e4f 100644
--- a/NES Emulator/cpu.h	
+++ b/NES Emulator/cpu.h	
@@ -27,6 +27,7 @@ struct Opcode
 	enum Operation op;
 	enum AddrMode addr;
 	Byte cycles;
+	Byte length;
 
 	const char str[4];
 };
@@ -59,6 +60,7 @@ struct CPU
 	Word pc;
 
 	Byte remainingCycles;
+	size_t totalCycles;
 
 	Byte fetchedVal;
 	Word fetchedAddress;
@@ -72,7 +74,7 @@ struct CPU
 struct CPU* createCPU(struct Bus* parent);
 void destroyCPU(struct CPU* cpu);
 
-void tickCPU(struct CPU* cpu);
+int tickCPU(struct CPU* cpu);
 void tickInstr(struct CPU* cpu);
 
 void fetch(struct CPU* cpu);
diff --git a/NES Emulator/log.c b/NES Emulator/log.c
new file mode 100644
index 0000000..d91304c
--- /dev/null
+++ b/NES Emulator/log.c	
@@ -0,0 +1,44 @@
+#include "log.h"
+
+#include <stdio.h>
+#include "bus.h"
+#include "cpu.h"
+
+void logBusState(struct Bus* bus)
+{
+	const char buffer[32];
+
+	Word oldPC = bus->cpu->pc - bus->cpu->currentOpcode->length;
+
+	printf("%04X  ", oldPC);
+
+	Word instructionBytes[3];
+	for (int i = 0; i < bus->cpu->currentOpcode->length; i++)
+	{
+		instructionBytes[i] = readBus(bus, oldPC + i);
+		sprintf(buffer + 3 * i, "%02X ", instructionBytes[i]);
+	}
+
+	printf("%-10s%s ", buffer, bus->cpu->currentOpcode->str);
+
+	switch (bus->cpu->currentOpcode->addr)
+	{
+	case ACC: sprintf(buffer, "A"); break;
+	case ABS: sprintf(buffer, "$%04X",					bus->cpu->fetchedAddress); break;
+	case ABX: sprintf(buffer, "$%04X, X -> $%04X",		(instructionBytes[2] << 8) | instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case ABY: sprintf(buffer, "$%04X, Y -> $%04X",		(instructionBytes[2] << 8) | instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case IMM: sprintf(buffer, "#$%04X",					bus->cpu->fetchedVal); break;
+	case IMP: sprintf(buffer, ""); break;
+	case IND: sprintf(buffer, "($%04X) -> $%04x",		(instructionBytes[2] << 8) | instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case INDX: sprintf(buffer, "($%04X, X) -> $%04x",	(instructionBytes[2] << 8) | instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case INDY: sprintf(buffer, "($%04X), Y -> $%04x",	(instructionBytes[2] << 8) | instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case REL: sprintf(buffer, "$%02X",					bus->cpu->fetchedRelAddress); break;
+	case ZPG: sprintf(buffer, "$%02X",					bus->cpu->fetchedAddress); break;
+	case ZPX: sprintf(buffer, "$%02X, X -> $%02X",		instructionBytes[1], bus->cpu->fetchedAddress); break;
+	case ZPY: sprintf(buffer, "$%02X, Y -> $%02X",		instructionBytes[1], bus->cpu->fetchedAddress); break;
+	}
+
+	printf("%-28s", buffer);
+
+	printf("A:%02X X:%02X Y:%02X SP:%02X P:%02X CYC:%zu\n", bus->cpu->acc, bus->cpu->x, bus->cpu->y, bus->cpu->sp, bus->cpu->status.raw, bus->cpu->totalCycles);
+}
\ No newline at end of file
diff --git a/NES Emulator/log.h b/NES Emulator/log.h
new file mode 100644
index 0000000..357d05b
--- /dev/null
+++ b/NES Emulator/log.h	
@@ -0,0 +1,14 @@
+#ifndef _LOG_H_
+#define _LOG_H_
+
+struct Bus;
+
+void logBusState(struct Bus* bus);
+
+#ifndef NDEBUG
+#define LOG_BUS(b) logBusState(b)
+#else 
+#define LOG_BUS(b)
+#endif // NDEBUG
+
+#endif // _LOG_H_
\ No newline at end of file
diff --git a/NES Emulator/opcodes.c b/NES Emulator/opcodes.c
index ec03b10..add6f2b 100644
--- a/NES Emulator/opcodes.c	
+++ b/NES Emulator/opcodes.c	
@@ -1,278 +1,278 @@
 #include "cpu.h"
 
-#define NEW_OPCODE(op, addr, cyc) {op, addr, cyc, #op}
+#define NEW_OPCODE(op, addr, cyc, len) {op, addr, cyc, len, #op}
 
 const struct Opcode OPCODE_TABLE[256] =
 {
-	/* 00 */	NEW_OPCODE(BRK, IMP, 7),
-	/* 01 */	NEW_OPCODE(ORA, INDX, 6),
-	/* 02 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 03 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 04 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 05 */	NEW_OPCODE(ORA, ZPG, 3),
-	/* 06 */	NEW_OPCODE(ASL, ZPG, 5),
-	/* 07 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 08 */	NEW_OPCODE(PHP, IMP, 3),
-	/* 09 */	NEW_OPCODE(ORA, IMM, 2),
-	/* 0A */	NEW_OPCODE(ASL, ACC, 2),
-	/* 0B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 0C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 0D */	NEW_OPCODE(ORA, ABS, 4),
-	/* 0E */	NEW_OPCODE(ASL, ABS, 6),
-	/* 0F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 00 */	NEW_OPCODE(BRK, IMP, 7, 1),
+	/* 01 */	NEW_OPCODE(ORA, INDX, 6, 2),
+	/* 02 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 03 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 04 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 05 */	NEW_OPCODE(ORA, ZPG, 3, 2),
+	/* 06 */	NEW_OPCODE(ASL, ZPG, 5, 2),
+	/* 07 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 08 */	NEW_OPCODE(PHP, IMP, 3, 1),
+	/* 09 */	NEW_OPCODE(ORA, IMM, 2, 2),
+	/* 0A */	NEW_OPCODE(ASL, ACC, 2, 1),
+	/* 0B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 0C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 0D */	NEW_OPCODE(ORA, ABS, 4, 3),
+	/* 0E */	NEW_OPCODE(ASL, ABS, 6, 3),
+	/* 0F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 10 */	NEW_OPCODE(BPL, REL, 2),
-	/* 11 */	NEW_OPCODE(ORA, INDY, 5),
-	/* 12 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 13 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 14 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 15 */	NEW_OPCODE(ORA, ZPX, 4),
-	/* 16 */	NEW_OPCODE(ASL, ZPX, 6),
-	/* 17 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 18 */	NEW_OPCODE(CLC, IMP, 2),
-	/* 19 */	NEW_OPCODE(ORA, ABY, 4),
-	/* 1A */	NEW_OPCODE(XXX, IMP, 0),
-	/* 1B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 1C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 1D */	NEW_OPCODE(ORA, ABX, 4),
-	/* 1E */	NEW_OPCODE(ASL, ABX, 7),
-	/* 1F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 10 */	NEW_OPCODE(BPL, REL, 2, 2),
+	/* 11 */	NEW_OPCODE(ORA, INDY, 5, 2),
+	/* 12 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 13 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 14 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 15 */	NEW_OPCODE(ORA, ZPX, 4, 2),
+	/* 16 */	NEW_OPCODE(ASL, ZPX, 6, 2),
+	/* 17 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 18 */	NEW_OPCODE(CLC, IMP, 2, 1),
+	/* 19 */	NEW_OPCODE(ORA, ABY, 4, 3),
+	/* 1A */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 1B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 1C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 1D */	NEW_OPCODE(ORA, ABX, 4, 3),
+	/* 1E */	NEW_OPCODE(ASL, ABX, 7, 3),
+	/* 1F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 20 */	NEW_OPCODE(JSR, ABS, 6),
-	/* 21 */	NEW_OPCODE(AND, INDX, 6),
-	/* 22 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 23 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 24 */	NEW_OPCODE(BIT, ZPG, 3),
-	/* 25 */	NEW_OPCODE(AND, ZPG, 3),
-	/* 26 */	NEW_OPCODE(ROL, ZPG, 5),
-	/* 27 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 28 */	NEW_OPCODE(PLP, IMP, 4),
-	/* 29 */	NEW_OPCODE(AND, IMM, 2),
-	/* 2A */	NEW_OPCODE(ROL, ACC, 2),
-	/* 2B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 2C */	NEW_OPCODE(BIT, ABS, 4),
-	/* 2D */	NEW_OPCODE(AND, ABS, 4),
-	/* 2E */	NEW_OPCODE(ROL, ABS, 6),
-	/* 2F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 20 */	NEW_OPCODE(JSR, ABS, 6, 3),
+	/* 21 */	NEW_OPCODE(AND, INDX, 6, 2),
+	/* 22 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 23 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 24 */	NEW_OPCODE(BIT, ZPG, 3, 2),
+	/* 25 */	NEW_OPCODE(AND, ZPG, 3, 2),
+	/* 26 */	NEW_OPCODE(ROL, ZPG, 5, 2),
+	/* 27 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 28 */	NEW_OPCODE(PLP, IMP, 4, 1),
+	/* 29 */	NEW_OPCODE(AND, IMM, 2, 2),
+	/* 2A */	NEW_OPCODE(ROL, ACC, 2, 1),
+	/* 2B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 2C */	NEW_OPCODE(BIT, ABS, 4, 3),
+	/* 2D */	NEW_OPCODE(AND, ABS, 4, 3),
+	/* 2E */	NEW_OPCODE(ROL, ABS, 6, 3),
+	/* 2F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 30 */	NEW_OPCODE(BMI, REL, 2),
-	/* 31 */	NEW_OPCODE(AND, INDY, 5),
-	/* 32 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 33 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 34 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 35 */	NEW_OPCODE(AND, ZPX, 4),
-	/* 36 */	NEW_OPCODE(ROL, ZPX, 6),
-	/* 37 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 38 */	NEW_OPCODE(SEC, IMP, 2),
-	/* 39 */	NEW_OPCODE(AND, ABY, 4),
-	/* 3A */	NEW_OPCODE(XXX, IMP, 0),
-	/* 3B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 3C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 3D */	NEW_OPCODE(AND, ABX, 4),
-	/* 3E */	NEW_OPCODE(ROL, ABX, 7),
-	/* 3F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 30 */	NEW_OPCODE(BMI, REL, 2, 2),
+	/* 31 */	NEW_OPCODE(AND, INDY, 5, 2),
+	/* 32 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 33 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 34 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 35 */	NEW_OPCODE(AND, ZPX, 4, 2),
+	/* 36 */	NEW_OPCODE(ROL, ZPX, 6, 2),
+	/* 37 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 38 */	NEW_OPCODE(SEC, IMP, 2, 1),
+	/* 39 */	NEW_OPCODE(AND, ABY, 4, 3),
+	/* 3A */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 3B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 3C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 3D */	NEW_OPCODE(AND, ABX, 4, 3),
+	/* 3E */	NEW_OPCODE(ROL, ABX, 7, 3),
+	/* 3F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 40 */	NEW_OPCODE(RTI, IMP, 6),
-	/* 41 */	NEW_OPCODE(EOR, INDX, 6),
-	/* 42 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 43 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 44 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 45 */	NEW_OPCODE(EOR, ZPG, 3),
-	/* 46 */	NEW_OPCODE(LSR, ZPG, 5),
-	/* 47 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 48 */	NEW_OPCODE(PHA, IMP, 3),
-	/* 49 */	NEW_OPCODE(EOR, IMM, 2),
-	/* 4A */	NEW_OPCODE(LSR, ACC, 2),
-	/* 4B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 4C */	NEW_OPCODE(JMP, ABS, 3),
-	/* 4D */	NEW_OPCODE(EOR, ABS, 4),
-	/* 4E */	NEW_OPCODE(LSR, ABS, 6),
-	/* 4F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 40 */	NEW_OPCODE(RTI, IMP, 6, 1),
+	/* 41 */	NEW_OPCODE(EOR, INDX, 6, 2),
+	/* 42 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 43 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 44 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 45 */	NEW_OPCODE(EOR, ZPG, 3, 2),
+	/* 46 */	NEW_OPCODE(LSR, ZPG, 5, 2),
+	/* 47 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 48 */	NEW_OPCODE(PHA, IMP, 3, 1),
+	/* 49 */	NEW_OPCODE(EOR, IMM, 2, 2),
+	/* 4A */	NEW_OPCODE(LSR, ACC, 2, 1),
+	/* 4B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 4C */	NEW_OPCODE(JMP, ABS, 3, 3),
+	/* 4D */	NEW_OPCODE(EOR, ABS, 4, 3),
+	/* 4E */	NEW_OPCODE(LSR, ABS, 6, 3),
+	/* 4F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 50 */	NEW_OPCODE(BVC, REL, 2),
-	/* 51 */	NEW_OPCODE(EOR, INDY, 5),
-	/* 52 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 53 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 54 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 55 */	NEW_OPCODE(EOR, ZPX, 4),
-	/* 56 */	NEW_OPCODE(LSR, ZPX, 6),
-	/* 57 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 58 */	NEW_OPCODE(CLI, IMP, 2),
-	/* 59 */	NEW_OPCODE(EOR, ABY, 4),
-	/* 5A */	NEW_OPCODE(XXX, IMP, 0),
-	/* 5B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 5C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 5D */	NEW_OPCODE(EOR, ABX, 4),
-	/* 5E */	NEW_OPCODE(LSR, ABX, 7),
-	/* 5F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 50 */	NEW_OPCODE(BVC, REL, 2, 2),
+	/* 51 */	NEW_OPCODE(EOR, INDY, 5, 2),
+	/* 52 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 53 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 54 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 55 */	NEW_OPCODE(EOR, ZPX, 4, 2),
+	/* 56 */	NEW_OPCODE(LSR, ZPX, 6, 2),
+	/* 57 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 58 */	NEW_OPCODE(CLI, IMP, 2, 1),
+	/* 59 */	NEW_OPCODE(EOR, ABY, 4, 3),
+	/* 5A */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 5B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 5C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 5D */	NEW_OPCODE(EOR, ABX, 4, 3),
+	/* 5E */	NEW_OPCODE(LSR, ABX, 7, 3),
+	/* 5F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 60 */	NEW_OPCODE(RTS, IMP, 6),
-	/* 61 */	NEW_OPCODE(ADC, INDX, 6),
-	/* 62 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 63 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 64 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 65 */	NEW_OPCODE(ADC, ZPG, 3),
-	/* 66 */	NEW_OPCODE(ROR, ZPG, 5),
-	/* 67 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 68 */	NEW_OPCODE(PLA, IMP, 4),
-	/* 69 */	NEW_OPCODE(ADC, IMM, 2),
-	/* 6A */	NEW_OPCODE(ROR, ACC, 2),
-	/* 6B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 6C */	NEW_OPCODE(JMP, IND, 5),
-	/* 6D */	NEW_OPCODE(ADC, ABS, 4),
-	/* 6E */	NEW_OPCODE(ROR, ABS, 6),
-	/* 6F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 60 */	NEW_OPCODE(RTS, IMP, 6, 1),
+	/* 61 */	NEW_OPCODE(ADC, INDX, 6, 2),
+	/* 62 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 63 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 64 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 65 */	NEW_OPCODE(ADC, ZPG, 3, 2),
+	/* 66 */	NEW_OPCODE(ROR, ZPG, 5, 2),
+	/* 67 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 68 */	NEW_OPCODE(PLA, IMP, 4, 1),
+	/* 69 */	NEW_OPCODE(ADC, IMM, 2, 2),
+	/* 6A */	NEW_OPCODE(ROR, ACC, 2, 1),
+	/* 6B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 6C */	NEW_OPCODE(JMP, IND, 5, 3),
+	/* 6D */	NEW_OPCODE(ADC, ABS, 4, 3),
+	/* 6E */	NEW_OPCODE(ROR, ABS, 6, 3),
+	/* 6F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 70 */	NEW_OPCODE(BVS, REL, 2),
-	/* 71 */	NEW_OPCODE(ADC, INDY, 5),
-	/* 72 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 73 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 74 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 75 */	NEW_OPCODE(ADC, ZPX, 4),
-	/* 76 */	NEW_OPCODE(ROR, ZPX, 6),
-	/* 77 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 78 */	NEW_OPCODE(SEI, IMP, 2),
-	/* 79 */	NEW_OPCODE(ADC, ABY, 4),
-	/* 7A */	NEW_OPCODE(XXX, IMP, 0),
-	/* 7B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 7C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 7D */	NEW_OPCODE(ADC, ABX, 4),
-	/* 7E */	NEW_OPCODE(ROR, ABX, 7),
-	/* 7F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 70 */	NEW_OPCODE(BVS, REL, 2, 2),
+	/* 71 */	NEW_OPCODE(ADC, INDY, 5, 2),
+	/* 72 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 73 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 74 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 75 */	NEW_OPCODE(ADC, ZPX, 4, 2),
+	/* 76 */	NEW_OPCODE(ROR, ZPX, 6, 2),
+	/* 77 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 78 */	NEW_OPCODE(SEI, IMP, 2, 1),
+	/* 79 */	NEW_OPCODE(ADC, ABY, 4, 3),
+	/* 7A */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 7B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 7C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 7D */	NEW_OPCODE(ADC, ABX, 4, 3),
+	/* 7E */	NEW_OPCODE(ROR, ABX, 7, 3),
+	/* 7F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 80 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 81 */	NEW_OPCODE(STA, INDX, 6),
-	/* 82 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 83 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 84 */	NEW_OPCODE(STY, ZPG, 3),
-	/* 85 */	NEW_OPCODE(STA, ZPG, 3),
-	/* 86 */	NEW_OPCODE(STX, ZPG, 3),
-	/* 87 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 88 */	NEW_OPCODE(DEY, IMP, 2),
-	/* 89 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 8A */	NEW_OPCODE(TXA, IMP, 2),
-	/* 8B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 8C */	NEW_OPCODE(STY, ABS, 4),
-	/* 8D */	NEW_OPCODE(STA, ABS, 4),
-	/* 8E */	NEW_OPCODE(STX, ABS, 4),
-	/* 8F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 80 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 81 */	NEW_OPCODE(STA, INDX, 6, 2),
+	/* 82 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 83 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 84 */	NEW_OPCODE(STY, ZPG, 3, 2),
+	/* 85 */	NEW_OPCODE(STA, ZPG, 3, 2),
+	/* 86 */	NEW_OPCODE(STX, ZPG, 3, 2),
+	/* 87 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 88 */	NEW_OPCODE(DEY, IMP, 2, 1),
+	/* 89 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 8A */	NEW_OPCODE(TXA, IMP, 2, 1),
+	/* 8B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 8C */	NEW_OPCODE(STY, ABS, 4, 3),
+	/* 8D */	NEW_OPCODE(STA, ABS, 4, 3),
+	/* 8E */	NEW_OPCODE(STX, ABS, 4, 3),
+	/* 8F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* 90 */	NEW_OPCODE(BCC, REL, 2),
-	/* 91 */	NEW_OPCODE(STA, INDY, 6),
-	/* 92 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 93 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 94 */	NEW_OPCODE(STY, ZPX, 4),
-	/* 95 */	NEW_OPCODE(STA, ZPX, 4),
-	/* 96 */	NEW_OPCODE(STX, ZPY, 4),
-	/* 97 */	NEW_OPCODE(XXX, IMP, 0),
-	/* 98 */	NEW_OPCODE(TYA, IMP, 2),
-	/* 99 */	NEW_OPCODE(STA, ABY, 5),
-	/* 9A */	NEW_OPCODE(TXS, IMP, 2),
-	/* 9B */	NEW_OPCODE(XXX, IMP, 0),
-	/* 9C */	NEW_OPCODE(XXX, IMP, 0),
-	/* 9D */	NEW_OPCODE(STA, ABX, 5),
-	/* 9E */	NEW_OPCODE(XXX, IMP, 0),
-	/* 9F */	NEW_OPCODE(XXX, IMP, 0),
+	/* 90 */	NEW_OPCODE(BCC, REL, 2, 2),
+	/* 91 */	NEW_OPCODE(STA, INDY, 6, 2),
+	/* 92 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 93 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 94 */	NEW_OPCODE(STY, ZPX, 4, 2),
+	/* 95 */	NEW_OPCODE(STA, ZPX, 4, 2),
+	/* 96 */	NEW_OPCODE(STX, ZPY, 4, 2),
+	/* 97 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 98 */	NEW_OPCODE(TYA, IMP, 2, 1),
+	/* 99 */	NEW_OPCODE(STA, ABY, 5, 3),
+	/* 9A */	NEW_OPCODE(TXS, IMP, 2, 1),
+	/* 9B */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 9C */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 9D */	NEW_OPCODE(STA, ABX, 5, 3),
+	/* 9E */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* 9F */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* A0 */	NEW_OPCODE(LDY, IMM, 2),
-	/* A1 */	NEW_OPCODE(LDA, INDX, 6),
-	/* A2 */	NEW_OPCODE(LDX, IMM, 2),
-	/* A3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* A4 */	NEW_OPCODE(LDY, ZPG, 3),
-	/* A5 */	NEW_OPCODE(LDA, ZPG, 3),
-	/* A6 */	NEW_OPCODE(LDX, ZPG, 3),
-	/* A7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* A8 */	NEW_OPCODE(TAY, IMP, 2),
-	/* A9 */	NEW_OPCODE(LDA, IMM, 2),
-	/* AA */	NEW_OPCODE(TAX, IMP, 2),
-	/* AB */	NEW_OPCODE(XXX, IMP, 0),
-	/* AC */	NEW_OPCODE(LDY, ABS, 4),
-	/* AD */	NEW_OPCODE(LDA, ABS, 4),
-	/* AE */	NEW_OPCODE(LDX, ABS, 4),
-	/* AF */	NEW_OPCODE(XXX, IMP, 0),
+	/* A0 */	NEW_OPCODE(LDY, IMM, 2, 2),
+	/* A1 */	NEW_OPCODE(LDA, INDX, 6, 2),
+	/* A2 */	NEW_OPCODE(LDX, IMM, 2, 2),
+	/* A3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* A4 */	NEW_OPCODE(LDY, ZPG, 3, 2),
+	/* A5 */	NEW_OPCODE(LDA, ZPG, 3, 2),
+	/* A6 */	NEW_OPCODE(LDX, ZPG, 3, 2),
+	/* A7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* A8 */	NEW_OPCODE(TAY, IMP, 2, 1),
+	/* A9 */	NEW_OPCODE(LDA, IMM, 2, 2),
+	/* AA */	NEW_OPCODE(TAX, IMP, 2, 1),
+	/* AB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* AC */	NEW_OPCODE(LDY, ABS, 4, 3),
+	/* AD */	NEW_OPCODE(LDA, ABS, 4, 3),
+	/* AE */	NEW_OPCODE(LDX, ABS, 4, 3),
+	/* AF */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* B0 */	NEW_OPCODE(BCS, REL, 2),
-	/* B1 */	NEW_OPCODE(LDA, INDY, 5),
-	/* B2 */	NEW_OPCODE(XXX, IMP, 0),
-	/* B3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* B4 */	NEW_OPCODE(LDY, ZPX, 4),
-	/* B5 */	NEW_OPCODE(LDA, ZPX, 4),
-	/* B6 */	NEW_OPCODE(LDX, ZPY, 4),
-	/* B7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* B8 */	NEW_OPCODE(CLV, IMP, 2),
-	/* B9 */	NEW_OPCODE(LDA, ABY, 4),
-	/* BA */	NEW_OPCODE(TSX, IMP, 2),
-	/* BB */	NEW_OPCODE(XXX, IMP, 0),
-	/* BC */	NEW_OPCODE(LDY, ABX, 4),
-	/* BD */	NEW_OPCODE(LDA, ABX, 4),
-	/* BE */	NEW_OPCODE(LDX, ABY, 4),
-	/* BF */	NEW_OPCODE(XXX, IMP, 0),
+	/* B0 */	NEW_OPCODE(BCS, REL, 2, 2),
+	/* B1 */	NEW_OPCODE(LDA, INDY, 5, 2),
+	/* B2 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* B3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* B4 */	NEW_OPCODE(LDY, ZPX, 4, 2),
+	/* B5 */	NEW_OPCODE(LDA, ZPX, 4, 2),
+	/* B6 */	NEW_OPCODE(LDX, ZPY, 4, 2),
+	/* B7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* B8 */	NEW_OPCODE(CLV, IMP, 2, 1),
+	/* B9 */	NEW_OPCODE(LDA, ABY, 4, 3),
+	/* BA */	NEW_OPCODE(TSX, IMP, 2, 1),
+	/* BB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* BC */	NEW_OPCODE(LDY, ABX, 4, 3),
+	/* BD */	NEW_OPCODE(LDA, ABX, 4, 3),
+	/* BE */	NEW_OPCODE(LDX, ABY, 4, 3),
+	/* BF */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* C0 */	NEW_OPCODE(CPY, IMM, 2),
-	/* C1 */	NEW_OPCODE(CMP, INDX, 6),
-	/* C2 */	NEW_OPCODE(XXX, IMP, 0),
-	/* C3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* C4 */	NEW_OPCODE(CPY, ZPG, 3),
-	/* C5 */	NEW_OPCODE(CMP, ZPG, 3),
-	/* C6 */	NEW_OPCODE(DEC, ZPG, 5),
-	/* C7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* C8 */	NEW_OPCODE(INY, IMP, 2),
-	/* C9 */	NEW_OPCODE(CMP, IMM, 2),
-	/* CA */	NEW_OPCODE(DEX, IMP, 2),
-	/* CB */	NEW_OPCODE(XXX, IMP, 0),
-	/* CC */	NEW_OPCODE(CPY, ABS, 4),
-	/* CD */	NEW_OPCODE(CMP, ABS, 4),
-	/* CE */	NEW_OPCODE(DEC, ABS, 6),
-	/* CF */	NEW_OPCODE(XXX, IMP, 0),
+	/* C0 */	NEW_OPCODE(CPY, IMM, 2, 2),
+	/* C1 */	NEW_OPCODE(CMP, INDX, 6, 2),
+	/* C2 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* C3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* C4 */	NEW_OPCODE(CPY, ZPG, 3, 2),
+	/* C5 */	NEW_OPCODE(CMP, ZPG, 3, 2),
+	/* C6 */	NEW_OPCODE(DEC, ZPG, 5, 2),
+	/* C7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* C8 */	NEW_OPCODE(INY, IMP, 2, 1),
+	/* C9 */	NEW_OPCODE(CMP, IMM, 2, 2),
+	/* CA */	NEW_OPCODE(DEX, IMP, 2, 1),
+	/* CB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* CC */	NEW_OPCODE(CPY, ABS, 4, 3),
+	/* CD */	NEW_OPCODE(CMP, ABS, 4, 3),
+	/* CE */	NEW_OPCODE(DEC, ABS, 6, 3),
+	/* CF */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* D0 */	NEW_OPCODE(BNE, REL, 2),
-	/* D1 */	NEW_OPCODE(CMP, INDY, 5),
-	/* D2 */	NEW_OPCODE(XXX, IMP, 0),
-	/* D3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* D4 */	NEW_OPCODE(XXX, IMP, 0),
-	/* D5 */	NEW_OPCODE(CMP, ZPX, 4),
-	/* D6 */	NEW_OPCODE(DEC, ZPX, 6),
-	/* D7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* D8 */	NEW_OPCODE(CLD, IMP, 2),
-	/* D9 */	NEW_OPCODE(CMP, ABY, 4),
-	/* DA */	NEW_OPCODE(XXX, IMP, 0),
-	/* DB */	NEW_OPCODE(XXX, IMP, 0),
-	/* DC */	NEW_OPCODE(XXX, IMP, 0),
-	/* DD */	NEW_OPCODE(CMP, ABX, 4),
-	/* DE */	NEW_OPCODE(DEC, ABX, 7),
-	/* DF */	NEW_OPCODE(XXX, IMP, 0),
+	/* D0 */	NEW_OPCODE(BNE, REL, 2, 2),
+	/* D1 */	NEW_OPCODE(CMP, INDY, 5, 2),
+	/* D2 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* D3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* D4 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* D5 */	NEW_OPCODE(CMP, ZPX, 4, 2),
+	/* D6 */	NEW_OPCODE(DEC, ZPX, 6, 2),
+	/* D7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* D8 */	NEW_OPCODE(CLD, IMP, 2, 1),
+	/* D9 */	NEW_OPCODE(CMP, ABY, 4, 3),
+	/* DA */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* DB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* DC */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* DD */	NEW_OPCODE(CMP, ABX, 4, 3),
+	/* DE */	NEW_OPCODE(DEC, ABX, 7, 3),
+	/* DF */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* E0 */	NEW_OPCODE(CPX, IMM, 2),
-	/* E1 */	NEW_OPCODE(SBC, INDX, 6),
-	/* E2 */	NEW_OPCODE(XXX, IMP, 0),
-	/* E3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* E4 */	NEW_OPCODE(CPX, ZPG, 3),
-	/* E5 */	NEW_OPCODE(SBC, ZPG, 3),
-	/* E6 */	NEW_OPCODE(INC, ZPG, 5),
-	/* E7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* E8 */	NEW_OPCODE(INX, IMP, 2),
-	/* E9 */	NEW_OPCODE(SBC, IMM, 2),
-	/* EA */	NEW_OPCODE(NOP, IMP, 2),
-	/* EB */	NEW_OPCODE(XXX, IMP, 0),
-	/* EC */	NEW_OPCODE(CPX, ABS, 4),
-	/* ED */	NEW_OPCODE(SBC, ABS, 4),
-	/* EE */	NEW_OPCODE(INC, ABS, 6),
-	/* EF */	NEW_OPCODE(XXX, IMP, 0),
+	/* E0 */	NEW_OPCODE(CPX, IMM, 2, 2),
+	/* E1 */	NEW_OPCODE(SBC, INDX, 6, 2),
+	/* E2 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* E3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* E4 */	NEW_OPCODE(CPX, ZPG, 3, 2),
+	/* E5 */	NEW_OPCODE(SBC, ZPG, 3, 2),
+	/* E6 */	NEW_OPCODE(INC, ZPG, 5, 2),
+	/* E7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* E8 */	NEW_OPCODE(INX, IMP, 2, 1),
+	/* E9 */	NEW_OPCODE(SBC, IMM, 2, 2),
+	/* EA */	NEW_OPCODE(NOP, IMP, 2, 1),
+	/* EB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* EC */	NEW_OPCODE(CPX, ABS, 4, 3),
+	/* ED */	NEW_OPCODE(SBC, ABS, 4, 3),
+	/* EE */	NEW_OPCODE(INC, ABS, 6, 3),
+	/* EF */	NEW_OPCODE(XXX, IMP, 0, 1),
 
-	/* F0 */	NEW_OPCODE(BEQ, REL, 2),
-	/* F1 */	NEW_OPCODE(SBC, INDY, 5),
-	/* F2 */	NEW_OPCODE(XXX, IMP, 0),
-	/* F3 */	NEW_OPCODE(XXX, IMP, 0),
-	/* F4 */	NEW_OPCODE(XXX, IMP, 0),
-	/* F5 */	NEW_OPCODE(SBC, ZPX, 4),
-	/* F6 */	NEW_OPCODE(INC, ZPX, 6),
-	/* F7 */	NEW_OPCODE(XXX, IMP, 0),
-	/* F8 */	NEW_OPCODE(SED, IMP, 2),
-	/* F9 */	NEW_OPCODE(SBC, ABY, 4),
-	/* FA */	NEW_OPCODE(XXX, IMP, 0),
-	/* FB */	NEW_OPCODE(XXX, IMP, 0),
-	/* FC */	NEW_OPCODE(XXX, IMP, 0),
-	/* FD */	NEW_OPCODE(SBC, ABX, 4),
-	/* FE */	NEW_OPCODE(INC, ABX, 7),
-	/* FF */	NEW_OPCODE(XXX, IMP, 0)
+	/* F0 */	NEW_OPCODE(BEQ, REL, 2, 2),
+	/* F1 */	NEW_OPCODE(SBC, INDY, 5, 2),
+	/* F2 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* F3 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* F4 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* F5 */	NEW_OPCODE(SBC, ZPX, 4, 2),
+	/* F6 */	NEW_OPCODE(INC, ZPX, 6, 2),
+	/* F7 */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* F8 */	NEW_OPCODE(SED, IMP, 2, 1),
+	/* F9 */	NEW_OPCODE(SBC, ABY, 4, 3),
+	/* FA */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* FB */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* FC */	NEW_OPCODE(XXX, IMP, 0, 1),
+	/* FD */	NEW_OPCODE(SBC, ABX, 4, 3),
+	/* FE */	NEW_OPCODE(INC, ABX, 7, 3),
+	/* FF */	NEW_OPCODE(XXX, IMP, 0, 1)
 };
\ No newline at end of file