mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-12-31 05:30:46 +00:00
Tidy some more Windows/Linux compatibility issues.
Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
This commit is contained in:
parent
c55bba5d2b
commit
da806bddcb
@ -46,8 +46,6 @@ namespace EightBit {
|
|||||||
register16_t hl;
|
register16_t hl;
|
||||||
|
|
||||||
uint8_t R(int r) {
|
uint8_t R(int r) {
|
||||||
__assume(r < 8);
|
|
||||||
__assume(r >= 0);
|
|
||||||
switch (r) {
|
switch (r) {
|
||||||
case 0b000:
|
case 0b000:
|
||||||
return B();
|
return B();
|
||||||
@ -66,14 +64,12 @@ namespace EightBit {
|
|||||||
case 0b111:
|
case 0b111:
|
||||||
return A();
|
return A();
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
throw std::logic_error("Unhandled registry mechanism");
|
throw std::logic_error("Unhandled registry mechanism");
|
||||||
}
|
}
|
||||||
|
|
||||||
void R(int r, uint8_t value) {
|
void R(int r, uint8_t value) {
|
||||||
__assume(r < 8);
|
|
||||||
__assume(r >= 0);
|
|
||||||
switch (r) {
|
switch (r) {
|
||||||
case 0b000:
|
case 0b000:
|
||||||
B() = value;
|
B() = value;
|
||||||
@ -100,13 +96,11 @@ namespace EightBit {
|
|||||||
A() = value;
|
A() = value;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
register16_t& RP(int rp) {
|
register16_t& RP(int rp) {
|
||||||
__assume(rp < 4);
|
|
||||||
__assume(rp >= 0);
|
|
||||||
switch (rp) {
|
switch (rp) {
|
||||||
case 0b00:
|
case 0b00:
|
||||||
return BC();
|
return BC();
|
||||||
@ -117,13 +111,11 @@ namespace EightBit {
|
|||||||
case 0b11:
|
case 0b11:
|
||||||
return SP();
|
return SP();
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
register16_t& RP2(int rp) {
|
register16_t& RP2(int rp) {
|
||||||
__assume(rp < 4);
|
|
||||||
__assume(rp >= 0);
|
|
||||||
switch (rp) {
|
switch (rp) {
|
||||||
case 0b00:
|
case 0b00:
|
||||||
return BC();
|
return BC();
|
||||||
@ -134,7 +126,7 @@ namespace EightBit {
|
|||||||
case 0b11:
|
case 0b11:
|
||||||
return AF();
|
return AF();
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ bool EightBit::Intel8080::jumpConditionalFlag(uint8_t& f, int flag) {
|
|||||||
case 7: // M
|
case 7: // M
|
||||||
return jumpConditional(f & SF);
|
return jumpConditional(f & SF);
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
throw std::logic_error("Unhandled JP conditional");
|
throw std::logic_error("Unhandled JP conditional");
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ bool EightBit::Intel8080::returnConditionalFlag(uint8_t& f, int flag) {
|
|||||||
case 7: // M
|
case 7: // M
|
||||||
return returnConditional(f & SF);
|
return returnConditional(f & SF);
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
throw std::logic_error("Unhandled RET conditional");
|
throw std::logic_error("Unhandled RET conditional");
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ bool EightBit::Intel8080::callConditionalFlag(uint8_t& f, int flag) {
|
|||||||
case 7: // M
|
case 7: // M
|
||||||
return callConditional(f & SF);
|
return callConditional(f & SF);
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
throw std::logic_error("Unhandled CALL conditional");
|
throw std::logic_error("Unhandled CALL conditional");
|
||||||
}
|
}
|
||||||
@ -317,7 +317,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
cycles += 13;
|
cycles += 13;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@ -346,11 +346,11 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
cycles += 13;
|
cycles += 13;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: // 16-bit INC/DEC
|
case 3: // 16-bit INC/DEC
|
||||||
@ -362,7 +362,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
--RP(p).word;
|
--RP(p).word;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
cycles += 6;
|
cycles += 6;
|
||||||
break;
|
break;
|
||||||
@ -413,12 +413,12 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
cmc(a, f);
|
cmc(a, f);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: // 8-bit loading
|
case 1: // 8-bit loading
|
||||||
@ -458,7 +458,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
compare(f, a, R(z));
|
compare(f, a, R(z));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
if (z == 6)
|
if (z == 6)
|
||||||
@ -494,7 +494,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // Conditional jump
|
case 2: // Conditional jump
|
||||||
@ -555,7 +555,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6: // Operate on accumulator and immediate operand: alu[y] n
|
case 6: // Operate on accumulator and immediate operand: alu[y] n
|
||||||
@ -585,7 +585,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
compare(f, a, fetchByte());
|
compare(f, a, fetchByte());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
cycles += 7;
|
cycles += 7;
|
||||||
break;
|
break;
|
||||||
@ -594,7 +594,7 @@ void EightBit::Intel8080::execute(int x, int y, int z, int p, int q) {
|
|||||||
cycles += 11;
|
cycles += 11;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__assume(0);
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
#ifdef _MSC_VER
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
@ -98,19 +98,16 @@ namespace EightBit {
|
|||||||
//
|
//
|
||||||
|
|
||||||
static int buildHalfCarryIndex(uint8_t before, uint8_t value, int calculation) {
|
static int buildHalfCarryIndex(uint8_t before, uint8_t value, int calculation) {
|
||||||
__assume(calculation < 0x1ffff);
|
|
||||||
return ((before & 0x88) >> 1) | ((value & 0x88) >> 2) | ((calculation & 0x88) >> 3);
|
return ((before & 0x88) >> 1) | ((value & 0x88) >> 2) | ((calculation & 0x88) >> 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool calculateHalfCarryAdd(uint8_t before, uint8_t value, int calculation) {
|
static bool calculateHalfCarryAdd(uint8_t before, uint8_t value, int calculation) {
|
||||||
__assume(calculation < 0x1ffff);
|
|
||||||
static std::array<bool, 8> m_halfCarryTableAdd = { { false, false, true, false, true, false, true, true } };
|
static std::array<bool, 8> m_halfCarryTableAdd = { { false, false, true, false, true, false, true, true } };
|
||||||
auto index = buildHalfCarryIndex(before, value, calculation);
|
auto index = buildHalfCarryIndex(before, value, calculation);
|
||||||
return m_halfCarryTableAdd[index & Mask3];
|
return m_halfCarryTableAdd[index & Mask3];
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool calculateHalfCarrySub(uint8_t before, uint8_t value, int calculation) {
|
static bool calculateHalfCarrySub(uint8_t before, uint8_t value, int calculation) {
|
||||||
__assume(calculation < 0x1ffff);
|
|
||||||
std::array<bool, 8> m_halfCarryTableSub = { { false, true, true, true, false, false, false, true } };
|
std::array<bool, 8> m_halfCarryTableSub = { { false, true, true, true, false, false, false, true } };
|
||||||
auto index = buildHalfCarryIndex(before, value, calculation);
|
auto index = buildHalfCarryIndex(before, value, calculation);
|
||||||
return m_halfCarryTableSub[index & Mask3];
|
return m_halfCarryTableSub[index & Mask3];
|
||||||
|
@ -4,9 +4,13 @@
|
|||||||
|
|
||||||
#include "Memory.h"
|
#include "Memory.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define UNREACHABLE __assume(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
# define __assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
|
|
||||||
# define __popcnt __builtin_popcount
|
# define __popcnt __builtin_popcount
|
||||||
|
# define UNREACHABLE __builtin_unreachable();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace EightBit {
|
namespace EightBit {
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef _MSC_VER
|
||||||
#include <x86intrin.h>
|
|
||||||
#else
|
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
#else
|
||||||
|
#include <x86intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace EightBit {
|
namespace EightBit {
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
#ifdef _MSC_VER
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@ -14,8 +12,8 @@
|
|||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef _MSC_VER
|
||||||
#include <x86intrin.h>
|
|
||||||
#else
|
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
#else
|
||||||
|
#include <x86intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user