mirror of
https://github.com/andrew-jacobs/emu816.git
synced 2024-06-07 01:29:28 +00:00
104 lines
2.1 KiB
C++
104 lines
2.1 KiB
C++
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <string>
|
|
|
|
using namespace std;
|
|
|
|
#include "mem816.h"
|
|
#include "emu816.h"
|
|
|
|
//==============================================================================
|
|
// Memory Definitions and Access
|
|
//------------------------------------------------------------------------------
|
|
|
|
#define RAM_SIZE (384 * 1024)
|
|
#define ROM_SIZE (128 * 1024L)
|
|
#define MEM_MASK (512 * 1024L - 1)
|
|
|
|
// The ROM area 128K
|
|
const wdc816::Byte ROM[ROM_SIZE] =
|
|
{
|
|
0x00, 0x00, 0x00,
|
|
};
|
|
|
|
mem816 mem(MEM_MASK, RAM_SIZE, ROM);
|
|
emu816 emu(mem);
|
|
|
|
//==============================================================================
|
|
//------------------------------------------------------------------------------
|
|
|
|
void setup()
|
|
{
|
|
emu.reset();
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
emu.step();
|
|
}
|
|
|
|
//==============================================================================
|
|
//------------------------------------------------------------------------------
|
|
|
|
unsigned int toNybble(char ch)
|
|
{
|
|
if ((ch >= '0') && (ch <= '9')) return (ch - '0');
|
|
if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10);
|
|
if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10);
|
|
return (0);
|
|
}
|
|
|
|
unsigned int toByte(string &str, int &offset)
|
|
{
|
|
unsigned int h = toNybble(str[offset++]) << 4;
|
|
unsigned int l = toNybble(str[offset++]);
|
|
|
|
return (h | l);
|
|
}
|
|
|
|
unsigned long toAddr(string &str, int &offset)
|
|
{
|
|
unsigned long h = toByte(str, offset) << 16;
|
|
unsigned long m = toByte(str, offset) << 8;
|
|
unsigned long l = toByte(str, offset);
|
|
|
|
return (h | m | l);
|
|
}
|
|
|
|
void load(char *filename)
|
|
{
|
|
ifstream file(filename);
|
|
string line;
|
|
|
|
if (file.is_open()) {
|
|
cout << ">> Loading S28: " << filename << endl;
|
|
|
|
while (!file.eof()) {
|
|
file >> line;
|
|
if ((line[0] == 'S') && (line[1] == '2')) {
|
|
int offset = 2;
|
|
unsigned int count = toByte(line, offset);
|
|
unsigned long addr = toAddr(line, offset);
|
|
count -= 4;
|
|
while (count-- > 0) {
|
|
mem.setByte(addr++, toByte(line, offset));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
file.close();
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
for (int index = 1; index < argc;)
|
|
load(argv[index++]);
|
|
|
|
setup();
|
|
for (;;) loop();
|
|
|
|
return(0);
|
|
}
|