diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj
index 5ced38bd7..1744ac269 100644
--- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj	
+++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj	
@@ -12,6 +12,7 @@
 		4B0333AF2094081A0050B93D /* AppleDSK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0333AD2094081A0050B93D /* AppleDSK.cpp */; };
 		4B0333B02094081A0050B93D /* AppleDSK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0333AD2094081A0050B93D /* AppleDSK.cpp */; };
 		4B049CDD1DA3C82F00322067 /* BCDTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B049CDC1DA3C82F00322067 /* BCDTest.swift */; };
+		4B04C899285E3DC800AA8FD6 /* 65816ComparativeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B04C898285E3DC800AA8FD6 /* 65816ComparativeTests.mm */; };
 		4B051C912669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; };
 		4B051C922669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; };
 		4B051C93266D9D6900CA44E8 /* ROMImages in Resources */ = {isa = PBXBuildFile; fileRef = 4BC9DF441D044FCA00F44158 /* ROMImages */; };
@@ -1110,6 +1111,7 @@
 		4B047075201ABC180047AB0D /* Cartridge.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = "<group>"; };
 		4B049CDC1DA3C82F00322067 /* BCDTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BCDTest.swift; sourceTree = "<group>"; };
 		4B04B65622A58CB40006AB58 /* Target.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Target.hpp; sourceTree = "<group>"; };
+		4B04C898285E3DC800AA8FD6 /* 65816ComparativeTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = 65816ComparativeTests.mm; sourceTree = "<group>"; };
 		4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ROMCatalogue.cpp; sourceTree = "<group>"; };
 		4B051C5926670A9300CA44E8 /* ROMCatalogue.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ROMCatalogue.hpp; sourceTree = "<group>"; };
 		4B051C94266EF50200CA44E8 /* AppleIIController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppleIIController.swift; sourceTree = "<group>"; };
@@ -4230,6 +4232,7 @@
 			children = (
 				4B85322922778E4200F26553 /* Comparative68000.hpp */,
 				4B90467222C6FA31000E2074 /* TestRunner68000.hpp */,
+				4B04C898285E3DC800AA8FD6 /* 65816ComparativeTests.mm */,
 				4B90467522C6FD6E000E2074 /* 68000ArithmeticTests.mm */,
 				4B9D0C4A22C7D70900DE1AD3 /* 68000BCDTests.mm */,
 				4B90467322C6FADD000E2074 /* 68000BitwiseTests.mm */,
@@ -6053,6 +6056,7 @@
 				4B778EF023A5D68C0000D260 /* 68000Storage.cpp in Sources */,
 				4B7752B228217EAE0073E2C5 /* StaticAnalyser.cpp in Sources */,
 				4B7752BC28217F1D0073E2C5 /* Disk.cpp in Sources */,
+				4B04C899285E3DC800AA8FD6 /* 65816ComparativeTests.mm in Sources */,
 				4B01A6881F22F0DB001FD6E3 /* Z80MemptrTests.swift in Sources */,
 				4B778EFA23A5EB790000D260 /* DMK.cpp in Sources */,
 				4BEE1EC122B5E2FD000A26A6 /* Encoder.cpp in Sources */,
diff --git a/OSBindings/Mac/Clock SignalTests/65816ComparativeTests.mm b/OSBindings/Mac/Clock SignalTests/65816ComparativeTests.mm
new file mode 100644
index 000000000..0af1b0ae9
--- /dev/null
+++ b/OSBindings/Mac/Clock SignalTests/65816ComparativeTests.mm	
@@ -0,0 +1,107 @@
+//
+//  65816ComparativeTests.m
+//  Clock SignalTests
+//
+//  Created by Thomas Harte on 18/06/2022.
+//  Copyright © 2022 Thomas Harte. All rights reserved.
+//
+
+#include "65816.hpp"
+
+#import <XCTest/XCTest.h>
+#include <array>
+#include <vector>
+#include <unordered_map>
+
+namespace {
+
+struct BusHandler: public CPU::MOS6502Esque::BusHandler<uint32_t>  {
+	// Use a map to store RAM contents, in order to preserve initialised state.
+	std::unordered_map<uint32_t, uint8_t> ram;
+
+	Cycles perform_bus_operation(CPU::MOS6502Esque::BusOperation operation, uint32_t address, uint8_t *value) {
+		// Record the basics of the operation.
+		auto &cycle = cycles.emplace_back();
+		cycle.address = address;
+		cycle.operation = operation;
+		cycle.value = 0xff;
+
+		// Perform the operation, and fill in the cycle's value.
+		using BusOperation = CPU::MOS6502Esque::BusOperation;
+		auto ram_value = ram.find(address);
+		switch(operation) {
+			case BusOperation::ReadOpcode:
+				++opcodes_fetched_;
+			case BusOperation::Read:
+			case BusOperation::ReadProgram:
+			case BusOperation::ReadVector:
+				if(ram_value != ram.end()) {
+					cycle.value = *value = ram_value->second;
+				} else {
+					cycle.value = *value = uint8_t(rand() >> 8);
+					ram[address] = cycle.value;
+				}
+			break;
+
+			case BusOperation::Write:
+				cycle.value = ram[address] = *value;
+			break;
+
+			default: break;
+		}
+
+		// Don't occupy any bonus time.
+		return Cycles(1);
+	}
+
+	int opcodes_fetched_ = 0;
+
+	struct Cycle {
+		CPU::MOS6502Esque::BusOperation operation;
+		uint32_t address;
+		uint8_t value;
+	};
+	std::vector<Cycle> cycles;
+};
+
+}
+
+// MARK: - New test generator.
+
+@interface TestGenerator : NSObject
+@end
+
+@implementation TestGenerator
+
+- (void)generate {
+	BusHandler handler;
+	CPU::WDC65816::Processor<BusHandler, false> processor(handler);
+
+	for(int operation = 0; operation < 512; operation++) {
+		const bool is_emulated = operation & 256;
+		const uint8_t opcode = operation & 255;
+
+		// TODO: set up for opcode and emulation mode.
+
+		// TODO: run for a bit longer than this, of course.
+		processor.run_for(Cycles(1));
+	}
+
+	printf("");
+}
+
+@end
+
+// MARK: - Existing test evaluator.
+
+@interface WDC65816ComparativeTests : XCTestCase
+@end
+
+@implementation WDC65816ComparativeTests
+
+// A generator for tests; not intended to be a permanent fixture.
+- (void)testGenerate {
+	[[[TestGenerator alloc] init] generate];
+}
+
+@end