diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..40f0bdd
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "modules/catch2"]
+	path = modules/catch2
+	url = https://github.com/catchorg/Catch2.git
diff --git a/EightBit.sln b/EightBit.sln
index 79643c4..03f8c06 100644
--- a/EightBit.sln
+++ b/EightBit.sln
@@ -31,6 +31,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_MC6809", "MC6809\test\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MC6850", "MC6850\src\MC6850.vcxproj", "{A4ADA650-55C3-4C00-8DAD-E4E4AFF86EFF}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unittest_MC6809", "MC6809\unittest\unittest_MC6809.vcxproj", "{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|x64 = Debug|x64
@@ -151,6 +153,14 @@ Global
 		{A4ADA650-55C3-4C00-8DAD-E4E4AFF86EFF}.Release|x64.Build.0 = Release|x64
 		{A4ADA650-55C3-4C00-8DAD-E4E4AFF86EFF}.Release|x86.ActiveCfg = Release|Win32
 		{A4ADA650-55C3-4C00-8DAD-E4E4AFF86EFF}.Release|x86.Build.0 = Release|Win32
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Debug|x64.ActiveCfg = Debug|x64
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Debug|x64.Build.0 = Debug|x64
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Debug|x86.ActiveCfg = Debug|Win32
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Debug|x86.Build.0 = Debug|Win32
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Release|x64.ActiveCfg = Release|x64
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Release|x64.Build.0 = Release|x64
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Release|x86.ActiveCfg = Release|Win32
+		{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/MC6809/unittest/Board.cpp b/MC6809/unittest/Board.cpp
new file mode 100644
index 0000000..bd814cd
--- /dev/null
+++ b/MC6809/unittest/Board.cpp
@@ -0,0 +1,17 @@
+#include "pch.h"
+#include "Board.h"
+
+Board::Board()
+: m_cpu(EightBit::mc6809(*this)) {
+}
+
+void Board::initialise() {
+	CPU().powerOn();
+	CPU().raise(CPU().NMI());
+	CPU().raise(CPU().FIRQ());
+	CPU().reset();
+}
+
+EightBit::MemoryMapping Board::mapping(uint16_t) {
+	return { m_ram, 0x0000, EightBit::MemoryMapping::ReadWrite };
+}
diff --git a/MC6809/unittest/Board.h b/MC6809/unittest/Board.h
new file mode 100644
index 0000000..3253bd1
--- /dev/null
+++ b/MC6809/unittest/Board.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <Ram.h>
+#include <Bus.h>
+#include <mc6809.h>
+
+class Board : public EightBit::Bus {
+public:
+	Board();
+
+	EightBit::mc6809& CPU() { return m_cpu; }
+
+	void initialise();
+
+protected:
+	virtual EightBit::MemoryMapping mapping(uint16_t address) final;
+
+private:
+	EightBit::Ram m_ram = 0x10000;	// 0000 - FFFF, 64K RAM
+	EightBit::mc6809 m_cpu;
+};
diff --git a/MC6809/unittest/mc6809_tests.cpp b/MC6809/unittest/mc6809_tests.cpp
new file mode 100644
index 0000000..3ec28d3
--- /dev/null
+++ b/MC6809/unittest/mc6809_tests.cpp
@@ -0,0 +1,54 @@
+#include "pch.h"
+#include "Board.h"
+
+// Using examples from 6809 Assembly Language Programming, by Lance A. Leventhal
+
+TEST_CASE("Add Accumulator B to Index Register X Unsigned ", "[ABX]") {
+
+	Board board;
+	board.initialise();
+	auto& cpu = board.CPU();
+	cpu.step();	// Jump over the reset
+
+    SECTION("Inherent") {
+		board.poke(0, 0x3a);
+		cpu.B() = 0x84;
+		cpu.X() = 0x1097;
+		cpu.step();
+		REQUIRE(cpu.X() == 0x111b);
+    }
+}
+
+
+//TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
+//
+//    std::vector<int> v( 5 );
+//    
+//    REQUIRE( v.size() == 5 );
+//    REQUIRE( v.capacity() >= 5 );
+//    
+//    SECTION( "resizing bigger changes size and capacity" ) {
+//        v.resize( 10 );
+//        
+//        REQUIRE( v.size() == 10 );
+//        REQUIRE( v.capacity() >= 10 );
+//    }
+//    SECTION( "resizing smaller changes size but not capacity" ) {
+//        v.resize( 0 );
+//        
+//        REQUIRE( v.size() == 0 );
+//        REQUIRE( v.capacity() >= 5 );
+//    }
+//    SECTION( "reserving bigger changes capacity but not size" ) {
+//        v.reserve( 10 );
+//        
+//        REQUIRE( v.size() == 5 );
+//        REQUIRE( v.capacity() >= 10 );
+//    }
+//    SECTION( "reserving smaller does not change size or capacity" ) {
+//        v.reserve( 0 );
+//        
+//        REQUIRE( v.size() == 5 );
+//        REQUIRE( v.capacity() >= 5 );
+//    }
+//}
diff --git a/MC6809/unittest/pch.cpp b/MC6809/unittest/pch.cpp
new file mode 100644
index 0000000..a38f8a3
Binary files /dev/null and b/MC6809/unittest/pch.cpp differ
diff --git a/MC6809/unittest/pch.h b/MC6809/unittest/pch.h
new file mode 100644
index 0000000..d36b3a5
Binary files /dev/null and b/MC6809/unittest/pch.h differ
diff --git a/MC6809/unittest/unittest_MC6809.cpp b/MC6809/unittest/unittest_MC6809.cpp
new file mode 100644
index 0000000..d2bef69
Binary files /dev/null and b/MC6809/unittest/unittest_MC6809.cpp differ
diff --git a/MC6809/unittest/unittest_MC6809.vcxproj b/MC6809/unittest/unittest_MC6809.vcxproj
new file mode 100644
index 0000000..1684d4c
--- /dev/null
+++ b/MC6809/unittest/unittest_MC6809.vcxproj
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{9EFEA22E-E981-4342-BE17-7DD0F33F1F52}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>unittestMC6809</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\inc;..\..\inc;..\..\MC6850\inc;$(SolutionDir)modules\catch2\single_include\catch2;C:\Libraries\boost_1_65_1;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\inc;..\..\inc;..\..\MC6850\inc;$(SolutionDir)modules\catch2\single_include\catch2;C:\Libraries\boost_1_65_1;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\inc;..\..\inc;..\..\MC6850\inc;$(SolutionDir)modules\catch2\single_include\catch2;C:\Libraries\boost_1_65_1;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\inc;..\..\inc;..\..\MC6850\inc;$(SolutionDir)modules\catch2\single_include\catch2;C:\Libraries\boost_1_65_1;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>$(TargetPath)</Command>
+    </PostBuildEvent>
+    <PostBuildEvent>
+      <Message>Running tests</Message>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>
+      </Command>
+    </PostBuildEvent>
+    <PostBuildEvent>
+      <Message>Running tests</Message>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>
+      </Command>
+    </PostBuildEvent>
+    <PostBuildEvent>
+      <Message>Running tests</Message>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>$(TargetPath)</Command>
+    </PostBuildEvent>
+    <PostBuildEvent>
+      <Message>Running tests</Message>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="Board.h" />
+    <ClInclude Include="pch.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Board.cpp" />
+    <ClCompile Include="mc6809_tests.cpp" />
+    <ClCompile Include="pch.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="unittest_MC6809.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\EightBit.vcxproj">
+      <Project>{a9c24bd9-0cb4-4c84-b09b-46b815f9da47}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\src\MC6809.vcxproj">
+      <Project>{09c1b50e-408e-48b1-a616-8400904b5829}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/MC6809/unittest/unittest_MC6809.vcxproj.filters b/MC6809/unittest/unittest_MC6809.vcxproj.filters
new file mode 100644
index 0000000..6209978
--- /dev/null
+++ b/MC6809/unittest/unittest_MC6809.vcxproj.filters
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="pch.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Board.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="pch.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="unittest_MC6809.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="mc6809_tests.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Board.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/modules/catch2 b/modules/catch2
new file mode 160000
index 0000000..9e1bdca
--- /dev/null
+++ b/modules/catch2
@@ -0,0 +1 @@
+Subproject commit 9e1bdca4667295fcb16265eae00efa8423f07007