#include "memory/memory.h" #include "cpu/65el02.h" #include "display/display.h" #include "drive/drive.h" int memory_max = 0x2000; // ---------------------------------------------------------------------------- void mem_store(int ptr, unsigned char value) { int id = cpu.mmuRBA & 0xff; ptr &= 0xffff; // printf("%d %04x\n",cpu.mmuEnRB,cpu.mmuRBB); if ((cpu.mmuEnRB) && (ptr >= cpu.mmuRBB) && (ptr < cpu.mmuRBB + 256)) { ptr = ptr - cpu.mmuRBB; switch (peripherals[id]) { case 1: case 2: disp_store(id, ptr, value); break; case 3: drive_store(id, ptr, value); break; case 4: if (ptr == 2) ioextender[id].output = (ioextender[id].output & 0xff00) | value; if (ptr == 3) ioextender[id].output = (ioextender[id].output & 0xff) | value << 8; break; } } else { if (ptr < memory_max) ram[ptr] = value; } } // ---------------------------------------------------------------------------- unsigned char mem_load(int ptr) { int id = cpu.mmuRBA & 0xff; ptr &= 0xffff; if ((cpu.mmuEnRB) && (ptr >= cpu.mmuRBB) && (ptr < cpu.mmuRBB + 256)) { ptr = ptr - cpu.mmuRBB; switch (peripherals[id]) { case 1: case 2: return disp_load(id, ptr); break; case 3: return drive_load(id, ptr); break; case 4: if (ptr == 0) return ioextender[id].input & 0xff; if (ptr == 1) return (ioextender[id].input >> 8) & 0xff; if (ptr == 2) return ioextender[id].output & 0xff; if (ptr == 3) return (ioextender[id].output >> 8) & 0xff; break; } return 0; } else { if (ptr < memory_max) return ram[ptr]; else return 0; } } // ----------------------------------------------------------------------------