Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ares/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ target_sources(
ares/node/node.hpp
ares/node/object.hpp
ares/node/peripheral.hpp
ares/node/tape.hpp
ares/node/port.hpp
ares/node/system.hpp
)
Expand Down
3 changes: 3 additions & 0 deletions ares/ares/node/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ namespace ares::Core {
struct Object;
struct System;
struct Peripheral;
struct Tape;
struct Port;
namespace Component {
struct Component;
Expand Down Expand Up @@ -48,6 +49,7 @@ namespace ares::Node {
using Object = std::shared_ptr<Core::Object>;
using System = std::shared_ptr<Core::System>;
using Peripheral = std::shared_ptr<Core::Peripheral>;
using Tape = std::shared_ptr<Core::Tape>;
using Port = std::shared_ptr<Core::Port>;
namespace Component {
using Component = std::shared_ptr<Core::Component::Component>;
Expand Down Expand Up @@ -101,6 +103,7 @@ namespace ares::Core {
#include <ares/node/object.hpp>
#include <ares/node/system.hpp>
#include <ares/node/peripheral.hpp>
#include <ares/node/tape.hpp>
#include <ares/node/port.hpp>
namespace Component {
#include <ares/node/component/component.hpp>
Expand Down
74 changes: 74 additions & 0 deletions ares/ares/node/tape.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
struct Tape : Peripheral {
DeclareClass(Tape, "tape") using Peripheral::Peripheral;

auto play() -> void { _playing = true; }
auto record() -> void { _recording = true; }
auto stop() -> void {
_playing = false;
_recording = false;
}

auto playing() const -> bool { return _playing; }
auto recording() const -> bool { return _recording; }

auto loaded() const -> bool { return _loaded; }
auto load() -> bool {
if (!_loaded && _load && _load()) {
_loaded = true;
return true;
}

return _loaded;
}
auto unload() -> void {
if (_loaded) {
if (_unload) _unload();
_loaded = false;
}
}

auto setLoad(std::function<bool()> load) -> void { _load = load; }
auto setUnload(std::function<void()> unload) -> void { _unload = unload; }

auto setSupportPlay(bool support) -> void { _supportPlay = support; }
auto setSupportRecord(bool support) -> void { _supportRecord = support; }

auto supportPlay() const -> bool { return _supportPlay; }
auto supportRecord() const -> bool { return _supportRecord; }

auto length() const -> u64 { return _length; }
auto setLength(u64 length) -> void { _length = length; }

auto position() const -> u64 { return _position; }
auto setPosition(u64 position) -> void { _position = position; }

auto frequency() const -> u64 { return _frequency; }
auto setFrequency(u64 frequency) -> void { _frequency = frequency; }

auto serialize(string &output, string depth) -> void override {
Peripheral::serialize(output, depth);
output.append(depth, " supportPlay: ", _supportPlay, "\n");
output.append(depth, " supportRecord: ", _supportRecord, "\n");
output.append(depth, " playing: ", _playing, "\n");
output.append(depth, " recording: ", _recording, "\n");
}
auto unserialize(Markup::Node node) -> void override {
Peripheral::unserialize(node);
_supportPlay = node["supportPlay"].boolean();
_supportRecord = node["supportRecord"].boolean();
_playing = node["playing"].boolean();
_recording = node["recording"].boolean();
}

private:
bool _supportPlay = false;
bool _supportRecord = false;
bool _playing = false;
bool _recording = false;
bool _loaded = false;
u64 _length = 0;
u64 _position = 0;
u64 _frequency = 1;
std::function<bool()> _load;
std::function<void()> _unload;
};
16 changes: 14 additions & 2 deletions ares/fc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ ares_add_sources(
system/system.cpp
controller/controller.cpp
expansion/expansion.cpp
tape/tape.cpp
cartridge/cartridge.cpp
cpu/cpu.cpp
apu/apu.cpp
Expand Down Expand Up @@ -178,8 +179,8 @@ ares_add_sources(
CORE #
fc
INCLUDED #
expansion/family-keyboard/family-keyboard.cpp
expansion/family-keyboard/family-keyboard.hpp
expansion/family-basic-keyboard/family-basic-keyboard.cpp
expansion/family-basic-keyboard/family-basic-keyboard.hpp
)

ares_add_sources(
Expand Down Expand Up @@ -218,3 +219,14 @@ ares_add_sources(
system/serialization.cpp
system/system.hpp
)

ares_add_sources(
CORE #
fc
INCLUDED #
tape/family-basic-data-recorder/family-basic-data-recorder.cpp
tape/family-basic-data-recorder/family-basic-data-recorder.hpp
tape/port.cpp
tape/port.hpp
tape/tape.hpp
)
2 changes: 1 addition & 1 deletion ares/fc/expansion/expansion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace ares::Famicom {

#include "port.cpp"
#include "epsm/epsm.cpp"
#include "family-keyboard/family-keyboard.cpp"
#include "family-basic-keyboard/family-basic-keyboard.cpp"

}
2 changes: 1 addition & 1 deletion ares/fc/expansion/expansion.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,4 @@ struct Expansion {

#include "port.hpp"
#include "epsm/epsm.hpp"
#include "family-keyboard/family-keyboard.hpp"
#include "family-basic-keyboard/family-basic-keyboard.hpp"
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
FamilyKeyboard::FamilyKeyboard(Node::Port parent) {
node = parent->append<Node::Peripheral>("Family Keyboard");
FamilyBasicKeyboard::FamilyBasicKeyboard(Node::Port parent) {
node = parent->append<Node::Peripheral>("Family BASIC Keyboard");

key.f1 = node->append<Node::Input::Button>("F1");
key.f2 = node->append<Node::Input::Button>("F2");
Expand All @@ -10,18 +10,18 @@ FamilyKeyboard::FamilyKeyboard(Node::Port parent) {
key.f7 = node->append<Node::Input::Button>("F7");
key.f8 = node->append<Node::Input::Button>("F8");

key.one = node->append<Node::Input::Button>("1");
key.two = node->append<Node::Input::Button>("2");
key.three = node->append<Node::Input::Button>("3");
key.four = node->append<Node::Input::Button>("4");
key.five = node->append<Node::Input::Button>("5");
key.six = node->append<Node::Input::Button>("6");
key.seven = node->append<Node::Input::Button>("7");
key.eight = node->append<Node::Input::Button>("8");
key.nine = node->append<Node::Input::Button>("9");
key.zero = node->append<Node::Input::Button>("0");
key.one = node->append<Node::Input::Button>("Num1");
key.two = node->append<Node::Input::Button>("Num2");
key.three = node->append<Node::Input::Button>("Num3");
key.four = node->append<Node::Input::Button>("Num4");
key.five = node->append<Node::Input::Button>("Num5");
key.six = node->append<Node::Input::Button>("Num6");
key.seven = node->append<Node::Input::Button>("Num7");
key.eight = node->append<Node::Input::Button>("Num8");
key.nine = node->append<Node::Input::Button>("Num9");
key.zero = node->append<Node::Input::Button>("Num0");
key.minus = node->append<Node::Input::Button>("Minus");
key.power = node->append<Node::Input::Button>("^");
key.power = node->append<Node::Input::Button>("Power");
key.yen = node->append<Node::Input::Button>("Yen");
key.stop = node->append<Node::Input::Button>("Stop");

Expand All @@ -36,8 +36,8 @@ FamilyKeyboard::FamilyKeyboard(Node::Port parent) {
key.i = node->append<Node::Input::Button>("I");
key.o = node->append<Node::Input::Button>("O");
key.p = node->append<Node::Input::Button>("P");
key.at = node->append<Node::Input::Button>("@");
key.lbrace = node->append<Node::Input::Button>("[");
key.at = node->append<Node::Input::Button>("At");
key.lbrace = node->append<Node::Input::Button>("Left Brace");
key.enter = node->append<Node::Input::Button>("Return");

key.control = node->append<Node::Input::Button>("Control");
Expand All @@ -50,9 +50,9 @@ FamilyKeyboard::FamilyKeyboard(Node::Port parent) {
key.j = node->append<Node::Input::Button>("J");
key.k = node->append<Node::Input::Button>("K");
key.l = node->append<Node::Input::Button>("L");
key.semicolon = node->append<Node::Input::Button>(";");
key.colon = node->append<Node::Input::Button>(":");
key.rbrace = node->append<Node::Input::Button>("]");
key.semicolon = node->append<Node::Input::Button>("Semicolon");
key.colon = node->append<Node::Input::Button>("Colon");
key.rbrace = node->append<Node::Input::Button>("Right Brace");
key.kana = node->append<Node::Input::Button>("Kana");

key.lshift = node->append<Node::Input::Button>("Left Shift");
Expand All @@ -63,32 +63,37 @@ FamilyKeyboard::FamilyKeyboard(Node::Port parent) {
key.b = node->append<Node::Input::Button>("B");
key.n = node->append<Node::Input::Button>("N");
key.m = node->append<Node::Input::Button>("M");
key.comma = node->append<Node::Input::Button>(",");
key.period = node->append<Node::Input::Button>(".");
key.slash = node->append<Node::Input::Button>("/");
key.underscore = node->append<Node::Input::Button>("_");
key.comma = node->append<Node::Input::Button>("Comma");
key.period = node->append<Node::Input::Button>("Period");
key.slash = node->append<Node::Input::Button>("Slash");
key.underscore = node->append<Node::Input::Button>("Underscore");
key.rshift = node->append<Node::Input::Button>("Right Shift");

key.graph = node->append<Node::Input::Button>("Graph");
key.spacebar = node->append<Node::Input::Button>("Spacebar");

key.home = node->append<Node::Input::Button>("Home");
key.insert = node->append<Node::Input::Button>("Insert");
key.backspace = node->append<Node::Input::Button>("Delete");
key.backspace = node->append<Node::Input::Button>("Backspace");

key.up = node->append<Node::Input::Button>("Up");
key.down = node->append<Node::Input::Button>("Down");
key.left = node->append<Node::Input::Button>("Left");
key.right = node->append<Node::Input::Button>("Right");

tapePort.load(node);
}

auto FamilyKeyboard::read1() -> n1 {
n1 data;
//data recorder (unsupported)
return data;
FamilyBasicKeyboard::~FamilyBasicKeyboard() {
tapePort.unload();
node.reset();
}

auto FamilyKeyboard::read2() -> n5 {
auto FamilyBasicKeyboard::read1() -> n1 {
return tapePort.read();
}

auto FamilyBasicKeyboard::read2() -> n5 {
if(!latch.bit(2)) return 0b00000;

#define poll(id, name) \
Expand Down Expand Up @@ -214,9 +219,10 @@ auto FamilyKeyboard::read2() -> n5 {
return data;
}

auto FamilyKeyboard::write(n8 data) -> void {
auto FamilyBasicKeyboard::write(n8 data) -> void {
latch = data.bit(0,2);
if(column && !latch.bit(1)) row = (row + 1) % 10;
column = latch.bit(1);
if(latch.bit(0)) row = 0;
}
tapePort.write(latch);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
struct FamilyKeyboard : Expansion {
struct FamilyBasicKeyboard : Expansion {
TapePort tapePort{"Tape Port"};

struct Key {
Node::Input::Button f1, f2, f3, f4, f5, f6, f7, f8;
Node::Input::Button one, two, three, four, five, six, seven, eight, nine, zero, minus, power, yen, stop;
Expand All @@ -10,7 +12,9 @@ struct FamilyKeyboard : Expansion {
Node::Input::Button up, down, left, right;
} key;

FamilyKeyboard(Node::Port);
FamilyBasicKeyboard(Node::Port);
~FamilyBasicKeyboard() override;

auto read1() -> n1 override;
auto read2() -> n5 override;
auto write(n8 data) -> void override;
Expand All @@ -19,4 +23,4 @@ struct FamilyKeyboard : Expansion {
n3 latch;
n1 column;
n4 row;
};
};
4 changes: 2 additions & 2 deletions ares/fc/expansion/port.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ auto ExpansionPort::load(Node::Object parent) -> void {
port->setHotSwappable(true);
port->setAllocate([&](auto name) { return allocate(name); });
port->setDisconnect([&] { device.reset(); });
port->setSupported({"EPSM", "Family Keyboard"});
port->setSupported({"EPSM", "Family BASIC Keyboard"});
}

auto ExpansionPort::unload() -> void {
Expand All @@ -20,7 +20,7 @@ auto ExpansionPort::unload() -> void {

auto ExpansionPort::allocate(string name) -> Node::Peripheral {
if(name == "EPSM") device = std::make_unique<EPSM>(port);
if(name == "Family Keyboard") device = std::make_unique<FamilyKeyboard>(port);
if(name == "Family Keyboard") device = std::make_unique<FamilyBasicKeyboard>(port);
if(device) return device->node;
return {};
}
Expand Down
1 change: 1 addition & 0 deletions ares/fc/fc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <fc/system/system.cpp>
#include <fc/controller/controller.cpp>
#include <fc/tape/tape.cpp>
#include <fc/expansion/expansion.cpp>
#include <fc/cartridge/cartridge.cpp>
#include <fc/cpu/cpu.cpp>
Expand Down
1 change: 1 addition & 0 deletions ares/fc/fc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ namespace ares::Famicom {
};

#include <fc/controller/controller.hpp>
#include <fc/tape/tape.hpp>
#include <fc/expansion/expansion.hpp>
#include <fc/system/system.hpp>
#include <fc/cartridge/cartridge.hpp>
Expand Down
Loading
Loading