Fix run on linux

This commit is contained in:
Kilian committed 2026-08-31 04:43:52 +02:00
1 parent f5672ee9c3
commit d37d434228
13 files changed
+151 -98

No files matched your search

+38 -40
View File
@@ -1,4 +1,5 @@
#include "cpu.h"
#include "memoryMap.h"
#include "opcodes.h"
@@ -74,7 +75,6 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t opcode = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Decode opcode, fetch operands, execute
switch (opcode) {
case BRK: {
// Store return address on stack
@@ -132,7 +132,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -187,7 +187,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -250,7 +250,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -297,7 +297,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -369,7 +369,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -442,7 +442,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -508,7 +508,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -558,7 +558,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -614,7 +614,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = 0;
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -677,7 +677,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = 0;
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -740,7 +740,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = 0;
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -787,7 +787,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Set flags and write to memory
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = 0;
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -840,7 +840,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -911,7 +911,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -973,7 +973,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -1019,7 +1019,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Write value
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -1033,7 +1033,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(_address, ram, rom);
uint8_t high = readMemory((uint8_t)(_address + 1), ram, rom);
// Store accumulator at address
writeMemory(COMBINE(high, low), cpu->Accumulator, ram, rom);
writeMemory(COMBINE(high, low), cpu->Accumulator, ram);
return 6;
}
@@ -1041,7 +1041,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store Y at address
writeMemory(offset, cpu->Y, ram, rom);
writeMemory(offset, cpu->Y, ram);
return 3;
}
@@ -1049,7 +1049,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory(offset, cpu->Accumulator, ram, rom);
writeMemory(offset, cpu->Accumulator, ram);
return 3;
}
@@ -1057,7 +1057,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store X at address
writeMemory(offset, cpu->X, ram, rom);
writeMemory(offset, cpu->X, ram);
return 3;
}
@@ -1082,7 +1082,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(cpu->ProgrammeCounter++, ram, rom);
uint8_t high = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store Y at address
writeMemory(COMBINE(high, low), cpu->Y, ram, rom);
writeMemory(COMBINE(high, low), cpu->Y, ram);
return 4;
}
@@ -1091,7 +1091,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(cpu->ProgrammeCounter++, ram, rom);
uint8_t high = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory(COMBINE(high, low), cpu->Accumulator, ram, rom);
writeMemory(COMBINE(high, low), cpu->Accumulator, ram);
return 4;
}
@@ -1100,7 +1100,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(cpu->ProgrammeCounter++, ram, rom);
uint8_t high = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store X at address
writeMemory(COMBINE(high, low), cpu->X, ram, rom);
writeMemory(COMBINE(high, low), cpu->X, ram);
return 4;
}
@@ -1132,7 +1132,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get address
uint16_t address = cpu->Y + COMBINE(high, low);
// Store accumulator at address
writeMemory(address, cpu->Accumulator, ram, rom);
writeMemory(address, cpu->Accumulator, ram);
return 6;
}
@@ -1140,7 +1140,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory((uint8_t)(cpu->X + offset), cpu->Y, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), cpu->Y, ram);
return 4;
}
@@ -1148,7 +1148,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory((uint8_t)(cpu->X + offset), cpu->Accumulator, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), cpu->Accumulator, ram);
return 4;
}
@@ -1156,7 +1156,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
// Get offset
uint8_t offset = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory((uint8_t)(cpu->Y + offset), cpu->X, ram, rom);
writeMemory((uint8_t)(cpu->Y + offset), cpu->X, ram);
return 4;
}
@@ -1173,7 +1173,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(cpu->ProgrammeCounter++, ram, rom);
uint8_t high = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory(cpu->Y + COMBINE(high, low), cpu->Accumulator, ram, rom);
writeMemory(cpu->Y + COMBINE(high, low), cpu->Accumulator, ram);
return 5;
}
@@ -1187,7 +1187,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
uint8_t low = readMemory(cpu->ProgrammeCounter++, ram, rom);
uint8_t high = readMemory(cpu->ProgrammeCounter++, ram, rom);
// Store accumulator at address
writeMemory(cpu->X + COMBINE(high, low), cpu->Accumulator, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), cpu->Accumulator, ram);
return 5;
}
@@ -1533,7 +1533,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -1606,7 +1606,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -1672,7 +1672,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -1722,7 +1722,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -1788,7 +1788,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(offset, value, ram, rom);
writeMemory(offset, value, ram);
return 5;
}
@@ -1848,7 +1848,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(COMBINE(high, low), value, ram, rom);
writeMemory(COMBINE(high, low), value, ram);
return 6;
}
@@ -1906,7 +1906,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory((uint8_t)(cpu->X + offset), value, ram, rom);
writeMemory((uint8_t)(cpu->X + offset), value, ram);
return 6;
}
@@ -1948,7 +1948,7 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
cpu->Flags.ZeroFlag = value == 0;
cpu->Flags.NegativeFlag = (value & 0x80) != 0;
// Store at address
writeMemory(cpu->X + COMBINE(high, low), value, ram, rom);
writeMemory(cpu->X + COMBINE(high, low), value, ram);
return 7;
}
@@ -1957,7 +1957,5 @@ uint8_t runCycle(CPU *cpu, uint8_t *ram, uint8_t *rom) {
break;
}
// Return sleep duration in microseconds to emulate cycle count of executed instruction
return 1;
}
+4 -5
View File
@@ -49,13 +49,15 @@ int main(void) {
/* DEBUG */
//FILE *fp = fopen("/Users/Kili2/Documents/Projekte/6502pc/6502_65C02_functional_tests/6502_functional_test.bin", "rb");
FILE *fp = fopen("/Users/Kili2/Documents/Projekte/6502pc/6502_65C02_functional_tests/6502_decimal_test.bin", "rb");
//FILE *fp = fopen("/Users/Kili2/Documents/Projekte/6502pc/6502_65C02_functional_tests/6502_decimal_test.bin", "rb");
FILE *fp = fopen("/mnt/c/Users/llego/source/repos/6502PC/6502_65C02_functional_tests/6502_functional_test.bin", "rb");
//FILE *fp = fopen("/mnt/c/Users/llego/source/repos/6502PC/6502_65C02_functional_tests/6502_decimal_test.bin", "rb");
if (!fp) {
perror("fopen");
return 1;
}
fread(ram, 1, 64 * 1024, fp);
fread(ram, 1, RAM_SIZE, fp);
if (ferror(fp)) {
perror("fread");
fclose(fp);
@@ -70,7 +72,6 @@ int main(void) {
resetCPU(&cpu, rom);
while (1) {
// printf("\tPC: 0x%x\tOP: 0x%x\n", cpu.ProgrammeCounter, ram[cpu.ProgrammeCounter]);
uint8_t sleep = runCycle(&cpu, ram, rom);
if (sleep == 1) {
printf("opcode missing: 0x%X\n", ram[cpu.ProgrammeCounter - 1]);
@@ -81,8 +82,6 @@ int main(void) {
nanosleep(&sleepTime, NULL);
}
/* CPU WORK */
destroyRAM(ram);
return 0;
+21 -12
View File
@@ -1,41 +1,50 @@
#include "memoryMap.h"
uint8_t readMemory(uint16_t address, uint8_t *ram, uint8_t *rom) {
if (address < RAM_SIZE || address >= IO_BASE + IO_SIZE) { // FIXME: Expanded for debug
if ((address < RAM_SIZE && address < IO_BASE) || address >= ROM_BASE) {
if (address >= ROM_BASE && ram[IO_BASE + ROM_BANKED_OUT] == 0) {
return rom[address - ROM_BASE];
}
return ram[address];
} else if (address < RAM_SIZE + IO_SIZE) {
uint16_t _address = address - RAM_SIZE;
} else {
uint16_t _address = address - IO_BASE;
switch (_address) {
case KEYBOARD_ADDRESS: {
return getChar();
}
case ROM_BANKED_OUT: {
return ram[IO_BASE + ROM_BANKED_OUT];
}
default:
break;
}
return 0;
} else {
return rom[address - RAM_SIZE - IO_SIZE];
}
}
void writeMemory(uint16_t address, uint8_t value, uint8_t *ram, uint8_t *rom) {
if (address < RAM_SIZE) {
ram[address] = value;
} else if (address < RAM_SIZE + IO_SIZE || address >= IO_BASE + IO_SIZE) { // FIXME: Expanded for debug
uint16_t _address = address - RAM_SIZE;
void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
if ((address < RAM_SIZE && address < IO_BASE) || address >= ROM_BASE) {
if (address < ROM_BASE && ram[IO_BASE + ROM_BANKED_OUT] != 0) {
ram[address] = value;
}
} else {
uint16_t _address = address - IO_BASE;
switch (_address) {
case SCREEN_ADDRESS: {
putChar(value);
break;
}
case ROM_BANKED_OUT: {
ram[IO_BASE + ROM_BANKED_OUT] = value;
break;
}
default:
break;
}
} else {
rom[address - RAM_SIZE - IO_SIZE] = value;
}
}
+8
View File
@@ -1,11 +1,19 @@
#include "ram.h"
#include "io.h"
#include <stdlib.h>
int createRAM(uint8_t **ram) {
*ram = (uint8_t *)malloc(RAM_SIZE);
if (*ram == NULL) return -1;
// Zero IO
for (size_t i = IO_BASE; i < IO_SIZE; i++) {
ram[i] = 0;
}
return 0;
}
+5 -13
View File
@@ -1,19 +1,11 @@
#include "rom.h"
#include "io.h"
uint8_t rom[ROM_SIZE] = {0};
void initRom(uint8_t *rom) {
rom[0] = 0xa9, // LDA
rom[1] = 'H', // H literal
rom[2] = 0x8d, // STA
rom[3] = (uint8_t)((IO_BASE + SCREEN_ADDRESS) & 0xFF), // Lower byte of screen
rom[4] = (uint8_t)((IO_BASE + SCREEN_ADDRESS) >> 8), // Upper byte of screen
rom[6] =
/* Reset Vector */
rom[0xFFFC - ROM_BASE] = 0x00, // Lower byte base of ROM
rom[0xFFFD - ROM_BASE] = 0x02, // Upper byte of base of ROM
rom[0xFFFE - ROM_BASE] = 0x00, // Lower byte base of ROM
rom[0xFFFF - ROM_BASE] = 0x00; // Upper byte of base of ROM
/* Reset Vector */
rom[0xFFFC - ROM_BASE] = 0x00; // Lower byte base of ROM
rom[0xFFFD - ROM_BASE] = 0x04; // Upper byte of base of ROM
}