#include #include "config.h" extern void scanKeyboard(); extern void writeVideo(); extern uint8_t readVideo(); extern uint8_t videoX; extern uint8_t videoY; extern uint8_t videoMode; extern uint8_t videoA; static int8_t ram[RAMSIZE + 1]; static int8_t rom[ROMSIZE + 1]; static uint8_t systemRegister; static uint8_t keyboardResult; uint8_t read6502(uint16_t address); void write6502(uint16_t address, uint8_t value); uint8_t read6502(uint16_t address){ switch (address){ case RAMLOC ... RAMLOC + RAMSIZE: return ram[address - RAMLOC]; break; case ROMLOC ... ROMLOC + ROMSIZE: return rom[address - ROMLOC]; break; case VIDADDRS ... VIDADDRS + PAGESIZE: if ((address - VIDADDRS) % 4 == 3) return readVideo(); else return 0; break; case 0xBD00: scanKeyboard(); return keyboardResult; break; default: return NOP; } } void write6502(uint16_t address, uint8_t value){ switch (address){ case RAMLOC ... RAMLOC + RAMSIZE: ram[address - RAMLOC] = value; break; case ROMLOC ... ROMLOC + ROMSIZE: rom[address - ROMLOC] = value; break; case VIDADDRS ... VIDADDRS + PAGESIZE: switch ((address - VIDADDRS) % 4){ case 0: /* Video X Register */ videoX = value & 0b01111111; break; case 1: /* Video Y Register */ videoY = value; break; case 2: /* Video M Register */ videoMode = value; break; case 3: /* Video A Register */ videoA = value; writeVideo(); break; } break; case 0xBC00: systemRegister = value; break; default: break; } }