2017-11-10 22:41:50 +00:00
|
|
|
#include "stdafx.h"
|
2021-05-29 09:31:32 +00:00
|
|
|
#include "../inc/Bus.h"
|
|
|
|
#include "../inc/Ram.h"
|
|
|
|
#include "../inc/IntelHexFile.h"
|
|
|
|
#include "../inc/EightBitCompilerDefinitions.h"
|
2018-09-15 13:35:59 +00:00
|
|
|
|
2019-01-14 02:10:17 +00:00
|
|
|
void EightBit::Bus::raisePOWER() {}
|
2018-11-11 16:48:44 +00:00
|
|
|
|
2019-01-14 02:10:17 +00:00
|
|
|
void EightBit::Bus::lowerPOWER() {}
|
2018-11-11 16:48:44 +00:00
|
|
|
|
2017-11-10 22:41:50 +00:00
|
|
|
uint8_t EightBit::Bus::read() {
|
2021-01-08 09:06:46 +00:00
|
|
|
ReadingByte.fire();
|
2018-10-27 16:30:23 +00:00
|
|
|
const auto returned = DATA() = reference();
|
2021-01-08 09:06:46 +00:00
|
|
|
ReadByte.fire();
|
2018-10-27 16:30:23 +00:00
|
|
|
return returned;
|
2017-11-10 22:41:50 +00:00
|
|
|
}
|
|
|
|
|
2018-06-09 23:40:56 +00:00
|
|
|
void EightBit::Bus::write() {
|
2021-01-08 09:06:46 +00:00
|
|
|
WritingByte.fire();
|
2018-06-09 23:40:56 +00:00
|
|
|
reference() = DATA();
|
2021-01-08 09:06:46 +00:00
|
|
|
WrittenByte.fire();
|
2017-11-10 22:41:50 +00:00
|
|
|
}
|
|
|
|
|
2018-06-09 23:40:56 +00:00
|
|
|
void EightBit::Bus::write(const uint8_t value) {
|
|
|
|
DATA() = value;
|
|
|
|
write();
|
|
|
|
}
|
2018-09-15 13:35:59 +00:00
|
|
|
|
|
|
|
void EightBit::Bus::loadHexFile(const std::string path) {
|
2019-07-06 21:44:42 +00:00
|
|
|
IntelHexFile file(path);
|
|
|
|
const auto chunks = file.parse();
|
2018-09-15 13:35:59 +00:00
|
|
|
for (const auto& chunk : chunks) {
|
|
|
|
const auto address = chunk.first;
|
|
|
|
const auto content = chunk.second;
|
|
|
|
const auto mapped = mapping(address);
|
2018-09-16 16:54:53 +00:00
|
|
|
const uint16_t offset = address - mapped.begin;
|
|
|
|
mapped.memory.load(content, offset);
|
2018-09-15 13:35:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-20 23:16:00 +00:00
|
|
|
uint8_t& EightBit::Bus::reference(const uint16_t address) {
|
2018-09-15 13:35:59 +00:00
|
|
|
const auto mapped = mapping(address);
|
2018-11-01 23:43:29 +00:00
|
|
|
const uint16_t offset = (address - mapped.begin) & mapped.mask;
|
2019-12-29 01:18:54 +00:00
|
|
|
if (mapped.access == MemoryMapping::AccessLevel::ReadOnly) {
|
|
|
|
DATA() = mapped.memory.peek(offset);
|
|
|
|
return DATA();
|
|
|
|
}
|
2018-11-03 23:11:48 +00:00
|
|
|
return mapped.memory.reference(offset);
|
2018-09-15 13:35:59 +00:00
|
|
|
}
|