1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-29 12:50:28 +00:00

Adds files for the M50740 and corrects namespace errors elsewhere.

This commit is contained in:
Thomas Harte 2021-01-15 21:30:30 -05:00
parent 15bedc74d4
commit 3c20e1f037
12 changed files with 213 additions and 32 deletions

View File

@ -0,0 +1,17 @@
//
// Decoder.cpp
// Clock Signal
//
// Created by Thomas Harte on 1/15/21.
// Copyright © 2021 Thomas Harte. All rights reserved.
//
#include "Decoder.hpp"
namespace InstructionSet {
namespace M50740 {
}
}

View File

@ -0,0 +1,34 @@
//
// Decoder.hpp
// Clock Signal
//
// Created by Thomas Harte on 1/15/21.
// Copyright © 2021 Thomas Harte. All rights reserved.
//
#ifndef InstructionSets_M50740_Decoder_hpp
#define InstructionSets_M50740_Decoder_hpp
#include "Instruction.hpp"
#include <utility>
namespace InstructionSet {
namespace M50740 {
class Decoder {
public:
std::pair<int, Instruction> decode(const uint8_t *source, size_t length);
private:
enum class Phase {
Instruction,
AwaitingOperand
};
int operand_size_;
};
}
}
#endif /* InstructionSets_M50740_Decoder_hpp */

View File

@ -0,0 +1,120 @@
//
// Instruction.hpp
// Clock Signal
//
// Created by Thomas Harte on 1/15/21.
// Copyright © 2021 Thomas Harte. All rights reserved.
//
#ifndef InstructionSets_M50740_Instruction_h
#define InstructionSets_M50740_Instruction_h
#include <cstdint>
namespace InstructionSet {
namespace M50740 {
enum class AddressingMode {
Implied,
Accumulator,
Immediate,
Absolute,
AbsoluteX,
AbsoluteY,
ZeroPage,
ZeroPageX,
ZeroPageY,
XIndirect,
IndirectY,
Relative,
AbsoluteIndirect,
ZeroPageIndirect,
SpecialPage,
BitAccumulator,
BitZeroPage
};
enum class Operation: uint8_t {
ADC,
AND,
ASL,
BBC,
BBS,
BCC,
BCS,
BEQ,
BIT,
BMI,
BNE,
BPL,
BRA,
BRK,
BVC,
BVS,
CLB,
CLC,
CLD,
CLI,
CLT,
CLV,
CMP,
COM,
CPX,
CPY,
DEC,
DEX,
DEY,
EOR,
FST,
INC,
INX,
INY,
JMP,
JSR,
LDA,
LDM,
LDX,
LDY,
LSR,
NOP,
ORA,
PHA,
PHP,
PLA,
PLP,
ROL,
ROR,
RRF,
RTI,
RTS,
SBC,
SEB,
SEC,
SED,
SEI,
SET,
SLW,
STA,
STP,
STX,
STY,
TAX,
TAY,
TST,
TSX,
TXS,
TYA
};
struct Instruction {
Operation operation;
AddressingMode addressing_mode;
Instruction(Operation operation, AddressingMode addressing_mode) : operation(operation), addressing_mode(addressing_mode) {}
};
}
}
#endif /* InstructionSets_M50740_Instruction_h */

View File

@ -8,7 +8,7 @@
#include "Decoder.hpp"
using namespace CPU::Decoder::PowerPC;
using namespace InstructionSet::PowerPC;
Decoder::Decoder(Model model) : model_(model) {}

View File

@ -11,8 +11,7 @@
#include "Instruction.hpp"
namespace CPU {
namespace Decoder {
namespace InstructionSet {
namespace PowerPC {
enum class Model {
@ -51,7 +50,6 @@ struct Decoder {
}
};
}
}
}

View File

@ -11,8 +11,7 @@
#include <cstdint>
namespace CPU {
namespace Decoder {
namespace InstructionSet {
namespace PowerPC {
enum class Operation: uint8_t {
@ -185,7 +184,6 @@ struct Instruction {
// Sanity check on Instruction size.
static_assert(sizeof(Instruction) <= 8);
}
}
}

View File

@ -12,12 +12,12 @@
#include <cassert>
#include <utility>
using namespace CPU::Decoder::x86;
using namespace InstructionSet::x86;
// Only 8086 is suppoted for now.
Decoder::Decoder(Model) {}
std::pair<int, CPU::Decoder::x86::Instruction> Decoder::decode(const uint8_t *source, size_t length) {
std::pair<int, InstructionSet::x86::Instruction> Decoder::decode(const uint8_t *source, size_t length) {
const uint8_t *const end = source + length;
// MARK: - Prefixes (if present) and the opcode.

View File

@ -13,8 +13,7 @@
#include <utility>
namespace CPU {
namespace Decoder {
namespace InstructionSet {
namespace x86 {
enum class Model {
@ -26,7 +25,7 @@ enum class Model {
This is an experimental implementation; it has not yet undergone significant testing.
*/
struct Decoder {
class Decoder {
public:
Decoder(Model model);
@ -149,7 +148,6 @@ struct Decoder {
}
};
}
}
}

View File

@ -11,8 +11,7 @@
#include <cstdint>
namespace CPU {
namespace Decoder {
namespace InstructionSet {
namespace x86 {
/*
@ -298,7 +297,6 @@ class Instruction {
static_assert(sizeof(Instruction) <= 8);
}
}
}

View File

@ -928,6 +928,9 @@
4BEDA3BF25B25563000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA3B925B25563000C2DBD /* Decoder.cpp */; };
4BEDA3C025B25563000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA3B925B25563000C2DBD /* Decoder.cpp */; };
4BEDA3C125B25563000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA3B925B25563000C2DBD /* Decoder.cpp */; };
4BEDA40C25B2844B000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA40B25B2844B000C2DBD /* Decoder.cpp */; };
4BEDA40D25B2844B000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA40B25B2844B000C2DBD /* Decoder.cpp */; };
4BEDA40E25B2844B000C2DBD /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA40B25B2844B000C2DBD /* Decoder.cpp */; };
4BEE0A6F1D72496600532C7B /* Cartridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6A1D72496600532C7B /* Cartridge.cpp */; };
4BEE0A701D72496600532C7B /* PRG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6D1D72496600532C7B /* PRG.cpp */; };
4BEE149A227FC0EA00133682 /* IWM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE1498227FC0EA00133682 /* IWM.cpp */; };
@ -1934,6 +1937,9 @@
4BEDA3B925B25563000C2DBD /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = "<group>"; };
4BEDA3D225B257F2000C2DBD /* Instruction.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Instruction.hpp; sourceTree = "<group>"; };
4BEDA3DB25B2588F000C2DBD /* Instruction.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Instruction.hpp; sourceTree = "<group>"; };
4BEDA40A25B2844B000C2DBD /* Decoder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Decoder.hpp; sourceTree = "<group>"; };
4BEDA40B25B2844B000C2DBD /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = "<group>"; };
4BEDA41725B2845D000C2DBD /* Instruction.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Instruction.hpp; sourceTree = "<group>"; };
4BEE0A6A1D72496600532C7B /* Cartridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cartridge.cpp; sourceTree = "<group>"; };
4BEE0A6B1D72496600532C7B /* Cartridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = "<group>"; };
4BEE0A6D1D72496600532C7B /* PRG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PRG.cpp; sourceTree = "<group>"; };
@ -4353,6 +4359,7 @@
isa = PBXGroup;
children = (
4BEDA3B625B25563000C2DBD /* README.md */,
4BEDA40925B2844B000C2DBD /* M50740 */,
4BEDA3B325B25563000C2DBD /* PowerPC */,
4BEDA3B725B25563000C2DBD /* x86 */,
);
@ -4380,6 +4387,16 @@
path = x86;
sourceTree = "<group>";
};
4BEDA40925B2844B000C2DBD /* M50740 */ = {
isa = PBXGroup;
children = (
4BEDA40B25B2844B000C2DBD /* Decoder.cpp */,
4BEDA40A25B2844B000C2DBD /* Decoder.hpp */,
4BEDA41725B2845D000C2DBD /* Instruction.hpp */,
);
path = M50740;
sourceTree = "<group>";
};
4BEE0A691D72496600532C7B /* Cartridge */ = {
isa = PBXGroup;
children = (
@ -5127,6 +5144,7 @@
4B055A941FAE85B50060FFFF /* CommodoreROM.cpp in Sources */,
4BBB70A5202011C2002FE009 /* MultiMediaTarget.cpp in Sources */,
4B8318BC22D3E588006DB630 /* DisplayMetrics.cpp in Sources */,
4BEDA40E25B2844B000C2DBD /* Decoder.cpp in Sources */,
4B1B88BD202E3D3D00B67DFF /* MultiMachine.cpp in Sources */,
4BE0A3EF237BB170002AB46F /* ST.cpp in Sources */,
4B055A971FAE85BB0060FFFF /* ZX8081.cpp in Sources */,
@ -5231,6 +5249,7 @@
4B2BF19623E10F0100C3AD60 /* CSHighPrecisionTimer.m in Sources */,
4BE211FF253FC80900435408 /* StaticAnalyser.cpp in Sources */,
4B8334951F5E25B60097E338 /* C1540.cpp in Sources */,
4BEDA40C25B2844B000C2DBD /* Decoder.cpp in Sources */,
4B89453C201967B4007DE474 /* StaticAnalyser.cpp in Sources */,
4B595FAD2086DFBA0083CAA8 /* AudioToggle.cpp in Sources */,
4B1497921EE4B5A800CE2596 /* ZX8081.cpp in Sources */,
@ -5557,6 +5576,7 @@
4B778F2B23A5EF0F0000D260 /* Commodore.cpp in Sources */,
4B778F3F23A5F1890000D260 /* MacintoshDoubleDensityDrive.cpp in Sources */,
4B778F1623A5ECA00000D260 /* Z80AllRAM.cpp in Sources */,
4BEDA40D25B2844B000C2DBD /* Decoder.cpp in Sources */,
4B778EF723A5EB670000D260 /* SSD.cpp in Sources */,
4B778F5723A5F2BB0000D260 /* ZX8081.cpp in Sources */,
4B778F2F23A5F0B10000D260 /* ScanTarget.cpp in Sources */,

View File

@ -11,8 +11,8 @@
#include "../../../InstructionSets/PowerPC/Decoder.hpp"
namespace {
using Operation = CPU::Decoder::PowerPC::Operation;
using Instruction = CPU::Decoder::PowerPC::Instruction;
using Operation = InstructionSet::PowerPC::Operation;
using Instruction = InstructionSet::PowerPC::Instruction;
}
@interface PowerPCDecoderTests : XCTestCase
@ -119,7 +119,7 @@ namespace {
// MARK: - Decoder
- (void)decode:(const uint32_t *)stream {
CPU::Decoder::PowerPC::Decoder decoder(CPU::Decoder::PowerPC::Model::MPC601);
InstructionSet::PowerPC::Decoder decoder(InstructionSet::Model::MPC601);
for(int c = 0; c < 32; c++) {
instructions[c] = decoder.decode(stream[c]);
}

View File

@ -13,10 +13,10 @@
#include "../../../InstructionSets/x86/Decoder.hpp"
namespace {
using Operation = CPU::Decoder::x86::Operation;
using Instruction = CPU::Decoder::x86::Instruction;
using Source = CPU::Decoder::x86::Source;
using Size = CPU::Decoder::x86::Size;
using Operation = InstructionSet::x86::Operation;
using Instruction = InstructionSet::x86::Instruction;
using Source = InstructionSet::x86::Source;
using Size = InstructionSet::x86::Size;
}
@interface x86DecoderTests : XCTestCase
@ -39,12 +39,12 @@ namespace {
- (void)assert:(Instruction &)instruction operation:(Operation)operation size:(int)size {
XCTAssertEqual(instruction.operation, operation);
XCTAssertEqual(instruction.operation_size(), CPU::Decoder::x86::Size(size));
XCTAssertEqual(instruction.operation_size(), InstructionSet::x86::Size(size));
}
- (void)assert:(Instruction &)instruction operation:(Operation)operation size:(int)size source:(Source)source destination:(Source)destination displacement:(int16_t)displacement {
XCTAssertEqual(instruction.operation, operation);
XCTAssertEqual(instruction.operation_size(), CPU::Decoder::x86::Size(size));
XCTAssertEqual(instruction.operation_size(), InstructionSet::x86::Size(size));
XCTAssertEqual(instruction.source(), source);
XCTAssertEqual(instruction.destination(), destination);
XCTAssertEqual(instruction.displacement(), displacement);
@ -65,19 +65,17 @@ namespace {
- (void)assert:(Instruction &)instruction operation:(Operation)operation size:(int)size source:(Source)source {
XCTAssertEqual(instruction.operation, operation);
XCTAssertEqual(instruction.operation_size(), CPU::Decoder::x86::Size(size));
XCTAssertEqual(instruction.operation_size(), InstructionSet::x86::Size(size));
XCTAssertEqual(instruction.source(), source);
}
- (void)assert:(Instruction &)instruction operation:(Operation)operation size:(int)size destination:(Source)destination {
XCTAssertEqual(instruction.operation, operation);
XCTAssertEqual(instruction.operation_size(), CPU::Decoder::x86::Size(size));
[self assert:instruction operation:operation size:size];
XCTAssertEqual(instruction.destination(), destination);
}
- (void)assert:(Instruction &)instruction operation:(Operation)operation size:(int)size operand:(uint16_t)operand destination:(Source)destination {
XCTAssertEqual(instruction.operation, operation);
XCTAssertEqual(instruction.operation_size(), CPU::Decoder::x86::Size(size));
[self assert:instruction operation:operation size:size];
XCTAssertEqual(instruction.destination(), destination);
XCTAssertEqual(instruction.source(), Source::Immediate);
XCTAssertEqual(instruction.operand(), operand);
@ -105,7 +103,7 @@ namespace {
- (void)decode:(const std::initializer_list<uint8_t> &)stream {
// Decode by offering up all data at once.
CPU::Decoder::x86::Decoder decoder(CPU::Decoder::x86::Model::i8086);
InstructionSet::x86::Decoder decoder(InstructionSet::x86::Model::i8086);
instructions.clear();
const uint8_t *byte = stream.begin();
while(byte != stream.end()) {
@ -117,7 +115,7 @@ namespace {
// Grab a byte-at-a-time decoding and check that it matches the previous.
{
CPU::Decoder::x86::Decoder decoder(CPU::Decoder::x86::Model::i8086);
InstructionSet::x86::Decoder decoder(InstructionSet::x86::Model::i8086);
auto previous_instruction = instructions.begin();
for(auto item: stream) {