diff --git a/LICENSE b/LICENSE
index 2387953..d85bc28 100644
--- a/LICENSE
+++ b/LICENSE
@@ -213,6 +213,8 @@ To do so, attach the following notices to the program. It is safest to attach th
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ Please note that the assembled code that gets output from this program is NOT under the GPL, and can be licensed under any other license at your choice.
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see .
diff --git a/Makefile b/Makefile
index 0d248f1..2ed6cbf 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CXX = g++
# Source file
SRC = main.cpp
# Executable name
-EXEC = pluto_isa_emu
+EXEC = pluto_isa_asm
# Default target
all:
diff --git a/README.md b/README.md
index 43008e4..418b76b 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
# PlutoISA
-This is an emulator for the custom made PlutoISA.
+This is an assembler for the custom made PlutoISA.
diff --git a/assembler.hpp b/assembler.hpp
new file mode 100644
index 0000000..312e794
--- /dev/null
+++ b/assembler.hpp
@@ -0,0 +1,53 @@
+/*
+PlutoISA
+Copyright (C) 2024 Patrick_Pluto
+
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+Please note that the assembled code that gets output from this program is NOT under the GPL, and can be licensed under any other license at your choice.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program. If not, see .
+*/
+
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+void assemble ( vector tokens, uint8_t *rom ) {
+ int index = 0;
+
+ for ( const auto& part : tokens ) {
+ if ( part == "GET" ) {
+ rom[index] = 0x00;
+ } else if ( part == "LOAD" ) {
+ rom[index] = 0x01;
+ } else if ( part == "STORE" ) {
+ rom[index] = 0x02;
+ } else if ( part == "ADD" ) {
+ rom[index] = 0x03;
+ } else if ( part == "SUB" ) {
+ rom[index] = 0x04;
+ } else if ( part == "JMP" ) {
+ rom[index] = 0x05;
+ } else if ( part == "JEQ" ) {
+ rom[index] = 0x06;
+ } else if ( part == "HIN" ) {
+ rom[index] = 0x07;
+ } else {
+ uint8_t value = stoi(part, nullptr, 16);
+ rom[index] = value;
+ }
+ index += 1;
+ }
+}
+
diff --git a/cpu.hpp b/cpu.hpp
deleted file mode 100644
index 6ad2757..0000000
--- a/cpu.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-PlutoISA
-Copyright (C) 2024 Patrick_Pluto
-
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this program. If not, see .
-*/
-
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include "tpu.hpp"
-
-using namespace std;
-
-uint8_t *registers = ( uint8_t * ) malloc ( 8 * sizeof ( uint8_t ) );
-uint8_t *memory = ( uint8_t * ) malloc ( 128 * sizeof ( uint8_t ) );
-uint8_t *pointer = ( uint8_t * ) malloc ( sizeof ( uint8_t ) );
-
-void cpuInstructions ( uint8_t *rom ) {
- cout << static_cast ( rom[*pointer] ) << endl;
- cout << static_cast ( *pointer ) << endl;
- switch ( rom[*pointer] ) {
- case 0x00: // GET
- registers[rom[*pointer + 1]] = rom[*pointer + 2];
- *pointer += 3;
- break;
- case 0x01: // LOAD
- registers[rom[*pointer + 1]] = memory[rom[*pointer + 2]];
- *pointer += 3;
- break;
- case 0x02: // STORE
- memory[rom[*pointer + 2]] = registers[rom[*pointer + 1]];
- *pointer += 3;
- break;
- case 0x03: // ADD
- registers[rom[*pointer + 1]] = registers[rom[*pointer + 2]] + registers[rom[*pointer + 3]];
- *pointer += 4;
- break;
- case 0x04: // SUB
- registers[rom[*pointer + 1]] = registers[rom[*pointer + 2]] - registers[rom[*pointer + 3]];
- *pointer += 4;
- break;
- case 0x05: // JMP
- *pointer = rom[*pointer + 1];
- break;
- case 0x06: // JEQ
- if ( rom[*pointer + 2] == registers[rom[*pointer + 3]] ) {
- *pointer = rom[*pointer + 1];
- }
- break;
- case 0x07: // HIN
- cin >> registers[rom[*pointer + 1]];
- *pointer += 2;
- break;
- default:
- cout << "Invalid Instruction, quitting." << endl;
- exit ( 1 );
- }
-}
-
-void cpuEmulation ( uint8_t *rom ) {
- const int targetFPS = 20;
- const int frameDuration = 1000 / targetFPS;
- *pointer = 0;
-
- while ( true ) {
- auto start = chrono::high_resolution_clock::now();
-
- cpuInstructions ( rom );
- textProcessing ( registers[7] );
-
- auto end = chrono::high_resolution_clock::now();
- chrono::duration elapsed = end - start;
-
- if ( elapsed.count() < frameDuration ) {
- this_thread::sleep_for ( chrono::milliseconds ( frameDuration ) - elapsed );
- }
- }
-}
-
diff --git a/main.cpp b/main.cpp
index 6170dcb..6931a68 100644
--- a/main.cpp
+++ b/main.cpp
@@ -4,12 +4,15 @@ Copyright (C) 2024 Patrick_Pluto
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+Please note that the assembled code that gets output from this program is NOT under the GPL, and can be licensed under any other license at your choice.
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see .
*/
-#include "cpu.hpp"
+#include "assembler.hpp"
+#include "split.hpp"
using namespace std;
@@ -17,11 +20,14 @@ int main ( int argc, char *argv[] ) {
const char *filename = argv[1];
const int rom_size = 256;
- ifstream file ( filename, ios::binary );
+ ifstream file(filename); // Open the file
+ string asmCode((istreambuf_iterator(file)), istreambuf_iterator());
uint8_t *rom = ( uint8_t * ) malloc ( rom_size * sizeof ( uint8_t ) );
- file.read ( reinterpret_cast ( rom ), rom_size );
+ assemble(splitAsm(asmCode), rom);
- cpuEmulation ( rom );
+ ofstream outFile(argv[2], ios::binary);;
+ outFile.write(reinterpret_cast(rom), rom_size * sizeof ( uint8_t ));
}
+
diff --git a/split.hpp b/split.hpp
new file mode 100644
index 0000000..23cc311
--- /dev/null
+++ b/split.hpp
@@ -0,0 +1,43 @@
+/*
+PlutoISA
+Copyright (C) 2024 Patrick_Pluto
+
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+Please note that the assembled code that gets output from this program is NOT under the GPL, and can be licensed under any other license at your choice.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program. If not, see .
+*/
+
+#pragma once
+
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+vector splitAsm(string asmSource)
+{
+ for (char& ch : asmSource) {
+ if (ch == '\n') {
+ ch = ' ';
+ }
+ }
+
+ stringstream ss(asmSource);
+
+ string token;
+ vector tokens;
+ char delimiter = ' ';
+
+ while (getline(ss, token, delimiter)) {
+ tokens.push_back(token);
+ }
+
+ return tokens;
+}
+
diff --git a/tpu.hpp b/tpu.hpp
deleted file mode 100644
index 35b1edf..0000000
--- a/tpu.hpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
-PlutoISA
-Copyright (C) 2024 Patrick_Pluto
-
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this program. If not, see .
-*/
-
-#pragma once
-
-#include
-#include
-#include
-
-using namespace std;
-
-void textProcessing ( uint8_t ch ) {
- switch ( ch ) {
- case 0x01:
- cout << "0";
- break;
- case 0x02:
- cout << "1";
- break;
- case 0x03:
- cout << "2";
- break;
- case 0x04:
- cout << "3";
- break;
- case 0x05:
- cout << "4";
- break;
- case 0x06:
- cout << "5";
- break;
- case 0x07:
- cout << "6";
- break;
- case 0x08:
- cout << "7";
- break;
- case 0x09:
- cout << "8";
- break;
- case 0x0A:
- cout << "9";
- break;
- case 0x0B:
- cout << "A";
- break;
- case 0x0C:
- cout << "B";
- break;
- case 0x0D:
- cout << "C";
- break;
- case 0x0E:
- cout << "D";
- break;
- case 0x0F:
- cout << "E";
- break;
- case 0x10:
- cout << "F";
- break;
- case 0x11:
- cout << "G";
- break;
- case 0x12:
- cout << "H";
- break;
- case 0x13:
- cout << "I";
- break;
- case 0x14:
- cout << "J";
- break;
- case 0x15:
- cout << "K";
- break;
- case 0x16:
- cout << "L";
- break;
- case 0x17:
- cout << "M";
- break;
- case 0x18:
- cout << "N";
- break;
- case 0x19:
- cout << "O";
- break;
- case 0x1A:
- cout << "P";
- break;
- case 0x1B:
- cout << "Q";
- break;
- case 0x1C:
- cout << "R";
- break;
- case 0x1D:
- cout << "S";
- break;
- case 0x1E:
- cout << "T";
- break;
- case 0x1F:
- cout << "U";
- break;
- case 0x20:
- cout << "V";
- break;
- case 0x21:
- cout << "W";
- break;
- case 0x22:
- cout << "X";
- break;
- case 0x23:
- cout << "Y";
- break;
- case 0x24:
- cout << "Z";
- break;
- case 0x25:
- cout << " ";
- break;
- case 0x26:
- cout << endl;
- break;
- default:
- break;
- }
-}