Bug fixes
Added stack collision detection. Added SETD instruction.
This commit is contained in:
+1
-1
@@ -25,7 +25,7 @@ uint32_t readLength(FILE *file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t readHeader(FILE *file, const char *expectedHeader) {
|
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++) {
|
for (int i = 0; i < HEADER_LENGTH; i++) {
|
||||||
int byte = fgetc(file);
|
int byte = fgetc(file);
|
||||||
if (byte == EOF) {
|
if (byte == EOF) {
|
||||||
|
|||||||
+14
-1
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
void initializeCPU(CPURegisters *cpu, uint8_t *programMemory, uint8_t *dataMemory) {
|
void initializeCPU(CPURegisters *cpu, uint8_t *programMemory, uint8_t *dataMemory) {
|
||||||
cpu->A = 0;
|
cpu->A = 0;
|
||||||
@@ -247,6 +246,15 @@ uint8_t executeOperation(uint8_t Instruction, CPURegisters *cpu) {
|
|||||||
// STB - Store B into Data.
|
// STB - Store B into Data.
|
||||||
cpu->Data[cpu->DataPointer] = cpu->B;
|
cpu->Data[cpu->DataPointer] = cpu->B;
|
||||||
break;
|
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:
|
// Dx - Output Operations:
|
||||||
//
|
//
|
||||||
@@ -301,5 +309,10 @@ uint8_t executeOperation(uint8_t Instruction, CPURegisters *cpu) {
|
|||||||
// Unknown Instruction.
|
// Unknown Instruction.
|
||||||
return 1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -47,15 +47,17 @@ int main (int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
CPURegisters cpu;
|
CPURegisters cpu;
|
||||||
initializeCPU(&cpu, Program, Data);
|
initializeCPU(&cpu, Program, Data);
|
||||||
|
if(debugEnable) {
|
||||||
|
printRegisters(&cpu, Program, Data);
|
||||||
|
}
|
||||||
while (!(cpu.Status & 0x80)) {
|
while (!(cpu.Status & 0x80)) {
|
||||||
|
executeOperation(cpu.Program[cpu.ProgramCounter], &cpu);
|
||||||
|
cpu.ProgramCounter++;
|
||||||
|
cycleCount++;
|
||||||
if (debugEnable) {
|
if (debugEnable) {
|
||||||
getchar();
|
getchar();
|
||||||
printRegisters(&cpu, Program, Data);
|
printRegisters(&cpu, Program, Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
executeOperation(cpu.Program[cpu.ProgramCounter], &cpu);
|
|
||||||
cpu.ProgramCounter++;
|
|
||||||
cycleCount++;
|
|
||||||
}
|
}
|
||||||
printf("Execution halted after %u cycles.\n", cycleCount);
|
printf("Execution halted after %u cycles.\n", cycleCount);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user