Compare commits
	
		
			No commits in common. "assembler" and "emulator" have entirely different histories.
		
	
	
		
	
		
					 8 changed files with 234 additions and 110 deletions
				
			
		
							
								
								
									
										2
									
								
								LICENSE
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
										
									
									
									
								
							|  | @ -213,8 +213,6 @@ 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. |      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. |      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 <https://www.gnu.org/licenses/>. |      You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -3,7 +3,7 @@ CXX = g++ | ||||||
| # Source file
 | # Source file
 | ||||||
| SRC = main.cpp | SRC = main.cpp | ||||||
| # Executable name
 | # Executable name
 | ||||||
| EXEC = pluto_isa_asm | EXEC = pluto_isa_emu | ||||||
| 
 | 
 | ||||||
| # Default target
 | # Default target
 | ||||||
| all: | all: | ||||||
|  |  | ||||||
|  | @ -1,3 +1,3 @@ | ||||||
| # PlutoISA | # PlutoISA | ||||||
| 
 | 
 | ||||||
| This is an assembler for the custom made PlutoISA. | This is an emulator for the custom made PlutoISA. | ||||||
|  |  | ||||||
|  | @ -1,53 +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. |  | ||||||
| 
 |  | ||||||
| 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 <https://www.gnu.org/licenses/>.
 |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <string> |  | ||||||
| #include <vector> |  | ||||||
| #include <fstream> |  | ||||||
| #include <cstdlib> |  | ||||||
| #include <cstdint> |  | ||||||
| 
 |  | ||||||
| using namespace std; |  | ||||||
| 
 |  | ||||||
| void assemble ( vector<string> 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; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
							
								
								
									
										89
									
								
								cpu.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								cpu.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | /*
 | ||||||
|  | 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 <https://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | #include <fstream> | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <cstdint> | ||||||
|  | #include <chrono> | ||||||
|  | #include <thread> | ||||||
|  | #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<int> ( rom[*pointer] ) << endl; | ||||||
|  |     cout << static_cast<int> ( *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<double, milli> elapsed = end - start; | ||||||
|  | 
 | ||||||
|  |         if ( elapsed.count() < frameDuration ) { | ||||||
|  |             this_thread::sleep_for ( chrono::milliseconds ( frameDuration ) - elapsed ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										14
									
								
								main.cpp
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								main.cpp
									
										
									
									
									
								
							|  | @ -4,15 +4,12 @@ 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 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. | 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 <https://www.gnu.org/licenses/>.
 | You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #include "assembler.hpp" | #include "cpu.hpp" | ||||||
| #include "split.hpp" |  | ||||||
| 
 | 
 | ||||||
| using namespace std; | using namespace std; | ||||||
| 
 | 
 | ||||||
|  | @ -20,14 +17,11 @@ int main ( int argc, char *argv[] ) { | ||||||
|     const char *filename = argv[1]; |     const char *filename = argv[1]; | ||||||
|     const int rom_size = 256; |     const int rom_size = 256; | ||||||
| 
 | 
 | ||||||
|     ifstream file(filename); // Open the file
 |     ifstream file ( filename, ios::binary ); | ||||||
|     string asmCode((istreambuf_iterator<char>(file)), istreambuf_iterator<char>()); |  | ||||||
| 
 | 
 | ||||||
|     uint8_t *rom = ( uint8_t * ) malloc ( rom_size * sizeof ( uint8_t ) ); |     uint8_t *rom = ( uint8_t * ) malloc ( rom_size * sizeof ( uint8_t ) ); | ||||||
| 
 | 
 | ||||||
|     assemble(splitAsm(asmCode), rom); |     file.read ( reinterpret_cast<char*> ( rom ), rom_size ); | ||||||
| 
 | 
 | ||||||
|     ofstream outFile(argv[2], ios::binary);; |     cpuEmulation ( rom ); | ||||||
|     outFile.write(reinterpret_cast<const char*>(rom), rom_size * sizeof ( uint8_t )); |  | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								split.hpp
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								split.hpp
									
										
									
									
									
								
							|  | @ -1,43 +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. |  | ||||||
| 
 |  | ||||||
| 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 <https://www.gnu.org/licenses/>.
 |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <string> |  | ||||||
| #include <vector> |  | ||||||
| 
 |  | ||||||
| using namespace std; |  | ||||||
| 
 |  | ||||||
| vector<string> splitAsm(string asmSource) |  | ||||||
| { |  | ||||||
|     for (char& ch : asmSource) { |  | ||||||
|         if (ch == '\n') { |  | ||||||
|             ch = ' '; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     stringstream ss(asmSource); |  | ||||||
| 
 |  | ||||||
|     string token; |  | ||||||
|     vector<string> tokens; |  | ||||||
|     char delimiter = ' '; |  | ||||||
| 
 |  | ||||||
|     while (getline(ss, token, delimiter)) { |  | ||||||
|         tokens.push_back(token); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return tokens; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
							
								
								
									
										139
									
								
								tpu.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								tpu.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,139 @@ | ||||||
|  | /*
 | ||||||
|  | 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 <https://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <cstdint> | ||||||
|  | 
 | ||||||
|  | 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; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in a new issue