From d37d4342285eeacee3dd020c61d9729817b51273 Mon Sep 17 00:00:00 2001 From: Kilian Hofmann Date: Mon, 31 Aug 2026 04:43:52 +0200 Subject: [PATCH] Fix run on linux --- .vscode/launch.json | 52 +++++++++++-- .../6502_decimal_test.a65 | 21 +++-- .../6502_functional_test.a65 | 4 +- CMakelists.txt | 6 +- inc/io.h | 6 +- inc/memoryMap.h | 2 +- inc/ram.h | 4 +- inc/rom.h | 8 +- src/cpu.c | 78 +++++++++---------- src/main.c | 9 +-- src/memoryMap.c | 33 +++++--- src/ram.c | 8 ++ src/rom.c | 18 ++--- 13 files changed, 151 insertions(+), 98 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 678b632..4a74027 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,11 +1,47 @@ { "configurations": [ - { - "name": "(lldb) Anfügen", - "type": "cppdbg", - "request": "attach", - "program": "${workspaceFolder}/build/6502PC", - "MIMode": "lldb" - } + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/6502PC", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/build", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + }, + { + "name": "(lldb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/6502PC", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/build", + "environment": [], + "externalConsole": false, + "MIMode": "lldb", + "setupCommands": [ + { + "description": "Set Disassembly Flavor to Intel", + "text": "settings set target.x86-disassembly-flavor intel", + "ignoreFailures": true + } + ] + } ] -} \ No newline at end of file +} diff --git a/6502_65C02_functional_tests/6502_decimal_test.a65 b/6502_65C02_functional_tests/6502_decimal_test.a65 index 3a15610..539ca51 100644 --- a/6502_65C02_functional_tests/6502_decimal_test.a65 +++ b/6502_65C02_functional_tests/6502_decimal_test.a65 @@ -66,6 +66,8 @@ N2H ds 2 code org $200 + lda #1 + sta $dc02 TEST ldy #1 ; initialize Y (used to loop through carry flag values) sty ERROR ; store 1 in ERROR until the test passes lda #0 ; initialize N1 and N2 @@ -111,24 +113,33 @@ LOOP2 lda N1 ; N1L = N1 & $0F bne DONE NEXT1 inc N1 ; [5] see text bne LOOP2 ; loop through all 256 values of N1 -NEXT2 inc N2 ; [6] see text +NEXT2 lda #'*' + sta $dc00 + inc N2 ; [6] see text bne LOOP1 ; loop through all 256 values of N2 dey bpl LOOP1 ; loop through both values of the carry flag lda #0 ; test passed, so store 0 in ERROR sta ERROR DONE + lda #0 + jsr RCHAR lda #1 cmp ERROR beq _E lda #'P' - sta $dc00 jmp _E2 _E lda #'F' - sta $dc00 -_E2 +_E2 jsr RCHAR end_of_test - + +RCHAR sta $dc00 + lda #'\r' + sta $dc00 + lda #'\n' + sta $dc00 + rts + ; Calculate the actual decimal mode accumulator and flags, the accumulator ; and flag results when N1 is added to N2 using binary arithmetic, the ; predicted accumulator result, the predicted carry flag, and the predicted diff --git a/6502_65C02_functional_tests/6502_functional_test.a65 b/6502_65C02_functional_tests/6502_functional_test.a65 index 02533b2..dbbe74f 100644 --- a/6502_65C02_functional_tests/6502_functional_test.a65 +++ b/6502_65C02_functional_tests/6502_functional_test.a65 @@ -735,7 +735,9 @@ data_bss_end code org code_segment -start cld +start lda #1 + sta $dc02 + cld ldx #$ff txs lda #0 ;*** test 0 = initialize diff --git a/CMakelists.txt b/CMakelists.txt index b539f88..fc8fdad 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -10,7 +10,11 @@ enable_language(C) add_executable(${CMAKE_PROJECT_NAME}) -target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic) +if(MSVC) + target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /W4) +else() + target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic) +endif() target_sources(${CMAKE_PROJECT_NAME} PRIVATE "src/main.c" diff --git a/inc/io.h b/inc/io.h index 95cca3f..e33f2b7 100644 --- a/inc/io.h +++ b/inc/io.h @@ -1,16 +1,14 @@ #ifndef IO_H #define IO_H -#include "ram.h" - #include #define IO_SIZE (1 * 1024) // 1KiB - -#define IO_BASE (RAM_SIZE) // 55KiB RAM +#define IO_BASE (55 * 1024) // 55KiB RAM, hard coded #define SCREEN_ADDRESS 0 #define KEYBOARD_ADDRESS 1 +#define ROM_BANKED_OUT 2 int putChar(uint8_t c); int getChar(void); diff --git a/inc/memoryMap.h b/inc/memoryMap.h index ad324bc..bd6017b 100644 --- a/inc/memoryMap.h +++ b/inc/memoryMap.h @@ -8,7 +8,7 @@ #include uint8_t readMemory(uint16_t address, uint8_t *ram, uint8_t *rom); -void writeMemory(uint16_t address, uint8_t value, uint8_t *ram, uint8_t *rom); +void writeMemory(uint16_t address, uint8_t value, uint8_t *ram); uint8_t readStack(uint8_t address, uint8_t *ram); void writeStack(uint8_t address, uint8_t value, uint8_t *ram); diff --git a/inc/ram.h b/inc/ram.h index fd80f26..9c460c5 100644 --- a/inc/ram.h +++ b/inc/ram.h @@ -3,9 +3,7 @@ #include "stdint.h" -#define RAM_SIZE (55 * 1024) // 55KiB -//#define RAM_SIZE (64 * 1024) // Full range, DEBUG mode - +#define RAM_SIZE (64 * 1024) // 55KiB #define RAM_BASE (0x00) // 0 int createRAM(uint8_t **ram); diff --git a/inc/rom.h b/inc/rom.h index 57135a7..dc3de75 100644 --- a/inc/rom.h +++ b/inc/rom.h @@ -1,14 +1,12 @@ #ifndef ROM_H #define ROM_H -#include "io.h" - #include -#define ROM_SIZE (8 * 1024) // 8KiB -#define ROM_BASE (IO_BASE + IO_SIZE) // 55KiB RAM + 1KiB IO +#define ROM_SIZE (8 * 1024) // 8KiB +#define ROM_BASE (56 * 1024) // 55KiB RAM + 1KiB IO, hard coded -uint8_t rom[ROM_SIZE]; +extern uint8_t rom[ROM_SIZE]; void initRom(uint8_t *rom); diff --git a/src/cpu.c b/src/cpu.c index af10589..3fda804 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -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; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index d707c17..96ff6f1 100644 --- a/src/main.c +++ b/src/main.c @@ -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; diff --git a/src/memoryMap.c b/src/memoryMap.c index 4307147..70917e6 100644 --- a/src/memoryMap.c +++ b/src/memoryMap.c @@ -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; } } diff --git a/src/ram.c b/src/ram.c index 01d8ac6..c147d00 100644 --- a/src/ram.c +++ b/src/ram.c @@ -1,11 +1,19 @@ #include "ram.h" +#include "io.h" + #include 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; } diff --git a/src/rom.c b/src/rom.c index 7457b1d..0fea814 100644 --- a/src/rom.c +++ b/src/rom.c @@ -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 } \ No newline at end of file