Browse Source

Implemented CHIP-8 program loading.

master
Ian Burgmyer 4 years ago
parent
commit
85f0f0336e
  1. 16
      libplip/Core/PlipChip8.cpp
  2. 7
      libplip/Core/PlipChip8.h
  3. 26
      libplip/PlipIo.cpp
  4. 9
      libplip/PlipIo.h
  5. 5
      plip-sdl/main.cpp

16
libplip/Core/PlipChip8.cpp

@ -10,6 +10,7 @@
namespace Plip::Core {
PlipChip8::PlipChip8(PlipInput *input) : Plip::PlipCore(input) {
m_ram = new PlipMemoryRam(RamSize);
}
PlipError PlipChip8::Load(const std::string &path) {
@ -17,8 +18,19 @@ namespace Plip::Core {
if(!io::FileExists(path)) return PlipError::FileNotFound;
auto size = io::GetSize(path);
auto ram = io::ReadRam(path, io::GetSize(path), 0x200, 0x1000);
m_memoryMap->AddBlock(&ram);
auto data = io::ReadFile(path, size);
// Zero RAM.
for(auto i = 0; i < RamSize; i++)
m_ram->SetByte(i, 0x00);
// Load program.
auto ramByte = ProgramOffset;
auto dataByte = 0;
while(dataByte < size && ramByte < RamSize)
m_ram->SetByte(ramByte++, data[dataByte++]);
m_memoryMap->AddBlock(m_ram);
return PlipError::Success;
}
}

7
libplip/Core/PlipChip8.h

@ -12,6 +12,7 @@
#include "../PlipCore.h"
#include "../PlipError.h"
#include "../Input/PlipInput.h"
#include "../Memory/PlipMemoryRam.h"
namespace Plip::Core {
class PlipChip8 : public PlipCore {
@ -19,5 +20,11 @@ namespace Plip::Core {
explicit PlipChip8(PlipInput *input);
PlipError Load(const std::string &path) override;
static const uint32_t ProgramOffset = 0x200;
static const uint32_t RamSize = 0x1000;
private:
PlipMemoryRam *m_ram;
};
}

26
libplip/PlipIo.cpp

@ -36,30 +36,4 @@ namespace Plip {
auto file = LoadFile(path);
return ReadFile(file, size);
}
PlipMemoryRam PlipIo::ReadRam(std::ifstream &file, uintmax_t dataSize, uint32_t offset, uint32_t ramSize) {
auto data = ReadFile(file, dataSize);
auto ram = PlipMemoryRam(ramSize);
auto ramByte = offset;
auto dataByte = 0;
while(ramByte < dataSize && ramByte < ramSize)
ram.SetByte(ramByte++, data[dataByte++]);
return ram;
}
PlipMemoryRam PlipIo::ReadRam(const std::string &path, uintmax_t dataSize, uint32_t offset, uint32_t ramSize) {
auto file = LoadFile(path);
return ReadRam(file, dataSize, offset, ramSize);
}
PlipMemoryRom PlipIo::ReadRom(std::ifstream &file, uintmax_t size) {
return PlipMemoryRom(ReadFile(file, size).data(), size);
}
PlipMemoryRom PlipIo::ReadRom(const std::string &path, uintmax_t size) {
auto file = LoadFile(path);
return ReadRom(file, size);
}
}

9
libplip/PlipIo.h

@ -19,15 +19,10 @@ namespace Plip {
static bool FileExists(const std::string &path);
static uintmax_t GetSize(const std::string &path);
static std::ifstream LoadFile(const std::string &path);
static PlipMemoryRam ReadRam(std::ifstream &file, uintmax_t dataSize, uint32_t offset, uint32_t ramSize);
static PlipMemoryRam ReadRam(const std::string &path, uintmax_t dataSize, uint32_t offset, uint32_t ramSize);
static PlipMemoryRom ReadRom(std::ifstream &file, uintmax_t size);
static PlipMemoryRom ReadRom(const std::string &path, uintmax_t size);
static std::vector<char> ReadFile(std::ifstream &file, uintmax_t size);
static std::vector<char> ReadFile(const std::string &path, uintmax_t size);
private:
PlipIo() = default;
static std::vector<char> ReadFile(std::ifstream &file, uintmax_t size);
static std::vector<char> ReadFile(const std::string &path, uintmax_t size);
};
}

5
plip-sdl/main.cpp

@ -197,11 +197,6 @@ int main(int argc, char **argv) {
break;
}
auto dCore = plip->GetCore();
auto dMap = dCore->GetMemoryMap();
auto b = dMap->GetByte(0x200);
std::cout << b << std::endl;
gameLoop(plip, config, timer);
SDL_Quit();

Loading…
Cancel
Save