From a8bba409c3bc3a7fb6990dcf8670ef2d1c818b4d Mon Sep 17 00:00:00 2001
From: Peter Evans <pevans@activecampaign.com>
Date: Mon, 8 Jan 2018 17:10:26 -0600
Subject: [PATCH] Change 16-bit references to respect little-endianness

As the Apple II (or rather the 6502 chip) is little-endian, meaning the
least significant byte is the first byte you read going forward, rather
than the last byte.
---
 src/mos6502.addr.c   |  6 +++---
 src/vm_segment.c     |  4 ++--
 tests/apple2.c       |  4 ++--
 tests/mos6502.addr.c | 28 ++++++++++++++--------------
 tests/vm_segment.c   |  4 ++--
 5 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/src/mos6502.addr.c b/src/mos6502.addr.c
index ded3acb..85c181a 100644
--- a/src/mos6502.addr.c
+++ b/src/mos6502.addr.c
@@ -44,8 +44,8 @@ static int addr_modes[] = {
 #define ADDR_HILO(cpu) \
     vm_16bit addr; \
     vm_8bit hi, lo; \
-    hi = mos6502_next_byte(cpu); \
     lo = mos6502_next_byte(cpu); \
+    hi = mos6502_next_byte(cpu); \
     addr = (hi << 8) | lo
 
 /*
@@ -155,8 +155,8 @@ DEFINE_ADDR(ind)
 
     ADDR_HILO(cpu);
 
-    ind_hi = vm_segment_get(cpu->memory, addr);
-    ind_lo = vm_segment_get(cpu->memory, addr + 1);
+    ind_lo = vm_segment_get(cpu->memory, addr);
+    ind_hi = vm_segment_get(cpu->memory, addr + 1);
     EFF_ADDR((ind_hi << 8) | ind_lo);
 
     return vm_segment_get(cpu->memory, eff_addr);
diff --git a/src/vm_segment.c b/src/vm_segment.c
index b79ec20..8f1a7ac 100644
--- a/src/vm_segment.c
+++ b/src/vm_segment.c
@@ -157,8 +157,8 @@ vm_segment_get16(vm_segment *segment, size_t addr)
 {
     vm_16bit msb, lsb;
 
-    msb = (vm_16bit)vm_segment_get(segment, addr);
-    lsb = (vm_16bit)vm_segment_get(segment, addr+1);
+    lsb = (vm_16bit)vm_segment_get(segment, addr);
+    msb = (vm_16bit)vm_segment_get(segment, addr+1);
 
     return (msb << 8) | lsb;
 }
diff --git a/tests/apple2.c b/tests/apple2.c
index 29961b0..8e61197 100644
--- a/tests/apple2.c
+++ b/tests/apple2.c
@@ -128,8 +128,8 @@ Test(apple2, set_memory)
 Test(apple2, reset)
 {
     apple2_set_memory(mach, MEMORY_BANK_ROM);
-    vm_segment_set(mach->rom, 0x2FFC, 0x12);
-    vm_segment_set(mach->rom, 0x2FFD, 0x34);
+    vm_segment_set(mach->rom, 0x2FFC, 0x34);
+    vm_segment_set(mach->rom, 0x2FFD, 0x12);
     apple2_reset(mach);
 
     cr_assert_eq(mach->cpu->PC, 0x1234);
diff --git a/tests/mos6502.addr.c b/tests/mos6502.addr.c
index 880c656..0fb28ef 100644
--- a/tests/mos6502.addr.c
+++ b/tests/mos6502.addr.c
@@ -22,16 +22,16 @@ Test(mos6502_addr, addr_mode_acc)
 Test(mos6502_addr, addr_mode_abs)
 {
     vm_segment_set(cpu->memory, 0x1234, 111);
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x34);
+    SET_PC_BYTE(cpu, 0, 0x34);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cr_assert_eq(mos6502_resolve_abs(cpu), 111);
 }
 
 Test(mos6502_addr, addr_mode_abx_carry0)
 {
     vm_segment_set(cpu->memory, 0x1234, 111);
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x30);
+    SET_PC_BYTE(cpu, 0, 0x30);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cpu->X = 4;
     cr_assert_eq(mos6502_resolve_abx(cpu), 111);
 }
@@ -39,8 +39,8 @@ Test(mos6502_addr, addr_mode_abx_carry0)
 Test(mos6502_addr, addr_mode_abx_carry1)
 {
     vm_segment_set(cpu->memory, 0x1234, 111);
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x30);
+    SET_PC_BYTE(cpu, 0, 0x30);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cpu->X = 3;
     cpu->P = cpu->P | MOS_CARRY;
     cr_assert_eq(mos6502_resolve_abx(cpu), 111);
@@ -49,8 +49,8 @@ Test(mos6502_addr, addr_mode_abx_carry1)
 Test(mos6502_addr, addr_mode_aby_carry0)
 {
     vm_segment_set(cpu->memory, 0x1234, 111);
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x30);
+    SET_PC_BYTE(cpu, 0, 0x30);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cpu->Y = 4;
     cr_assert_eq(mos6502_resolve_aby(cpu), 111);
 }
@@ -58,8 +58,8 @@ Test(mos6502_addr, addr_mode_aby_carry0)
 Test(mos6502_addr, addr_mode_aby_carry1)
 {
     vm_segment_set(cpu->memory, 0x1234, 111);
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x30);
+    SET_PC_BYTE(cpu, 0, 0x30);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cpu->Y = 3;
     cpu->P = cpu->P | MOS_CARRY;
     cr_assert_eq(mos6502_resolve_aby(cpu), 111);
@@ -93,12 +93,12 @@ Test(mos6502_addr, addr_mode_idy)
 
 Test(mos6502_addr, addr_mode_ind)
 {
-    vm_segment_set(cpu->memory, 0x1234, 0x23);
-    vm_segment_set(cpu->memory, 0x1235, 0x45);
+    vm_segment_set(cpu->memory, 0x1234, 0x45);
+    vm_segment_set(cpu->memory, 0x1235, 0x23);
     vm_segment_set(cpu->memory, 0x2345, 123);
 
-    SET_PC_BYTE(cpu, 0, 0x12);
-    SET_PC_BYTE(cpu, 1, 0x34);
+    SET_PC_BYTE(cpu, 0, 0x34);
+    SET_PC_BYTE(cpu, 1, 0x12);
     cr_assert_eq(mos6502_resolve_ind(cpu), 123);
 }
 
diff --git a/tests/vm_segment.c b/tests/vm_segment.c
index 3f10a58..773eed2 100644
--- a/tests/vm_segment.c
+++ b/tests/vm_segment.c
@@ -169,8 +169,8 @@ Test(vm_segment, set_map_machine)
 
 Test(vm_segment, get16)
 {
-    vm_segment_set(segment, 0, 0x12);
-    vm_segment_set(segment, 1, 0x34);
+    vm_segment_set(segment, 0, 0x34);
+    vm_segment_set(segment, 1, 0x12);
 
     cr_assert_eq(vm_segment_get16(segment, 0), 0x1234);
 }