LS7-Emulator/src/memory.c
2025-01-24 10:37:46 +01:00

81 lines
1.6 KiB
C

#include <stdint.h>
#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;
}
}