From 158cbf443d5e4a65d4a499cfc9cf5ca81c4c9458 Mon Sep 17 00:00:00 2001 From: Anachronaut <75824887+RealBusinessAccount@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:40:54 -0400 Subject: [PATCH] Bug fixes Added stack collision detection. Added SETD instruction. --- Source/bootstrap.c | 2 +- Source/cpu.c | 15 ++++++++++++++- Source/emulator.c | 10 ++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Source/bootstrap.c b/Source/bootstrap.c index f7e6c2d..fd88f17 100644 --- a/Source/bootstrap.c +++ b/Source/bootstrap.c @@ -25,7 +25,7 @@ uint32_t readLength(FILE *file) { } uint32_t readHeader(FILE *file, const char *expectedHeader) { - uint8_t header[HEADER_LENGTH]; + char header[HEADER_LENGTH]; for (int i = 0; i < HEADER_LENGTH; i++) { int byte = fgetc(file); if (byte == EOF) { diff --git a/Source/cpu.c b/Source/cpu.c index 265e3be..6148321 100644 --- a/Source/cpu.c +++ b/Source/cpu.c @@ -5,7 +5,6 @@ #include "cpu.h" #include "io.h" -#include void initializeCPU(CPURegisters *cpu, uint8_t *programMemory, uint8_t *dataMemory) { cpu->A = 0; @@ -247,6 +246,15 @@ uint8_t executeOperation(uint8_t Instruction, CPURegisters *cpu) { // STB - Store B into Data. cpu->Data[cpu->DataPointer] = cpu->B; break; + case 0x47: + // SETD - Set the Data Pointer. + cpu->ProgramCounter++; + uint16_t Address; + Address = (uint16_t)cpu->Program[cpu->ProgramCounter] << 8; // Cast the 8 bits to a 16 bit value and shift them to the high byte. + cpu->ProgramCounter++; + Address |= (uint16_t)cpu->Program[cpu->ProgramCounter]; + cpu-> DataPointer = Address; + break; // // Dx - Output Operations: // @@ -301,5 +309,10 @@ uint8_t executeOperation(uint8_t Instruction, CPURegisters *cpu) { // Unknown Instruction. return 1; } + if (cpu->DataPointer >= cpu->StackPointer) { + // A Stack Collision was detected. + cpu->Status |= 0x82; // Set Stack Collision Flag and Halt . (Bits 7 and 1 of the Status Register); + return 2; + } return 0; } diff --git a/Source/emulator.c b/Source/emulator.c index 5198e3f..11e2a84 100644 --- a/Source/emulator.c +++ b/Source/emulator.c @@ -47,15 +47,17 @@ int main (int argc, char *argv[]) { } CPURegisters cpu; initializeCPU(&cpu, Program, Data); + if(debugEnable) { + printRegisters(&cpu, Program, Data); + } while (!(cpu.Status & 0x80)) { + executeOperation(cpu.Program[cpu.ProgramCounter], &cpu); + cpu.ProgramCounter++; + cycleCount++; if (debugEnable) { getchar(); printRegisters(&cpu, Program, Data); } - - executeOperation(cpu.Program[cpu.ProgramCounter], &cpu); - cpu.ProgramCounter++; - cycleCount++; } printf("Execution halted after %u cycles.\n", cycleCount); }