/* 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 namespace plutoisa { 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; default: cout << "Invalid Instruction, quitting." << endl; exit ( 1 ); } } void cpuEmulation ( uint8_t *rom ) { *pointer = 0; while ( true ) { cpuInstructions ( rom ); } } }