diff options
Diffstat (limited to 'emu/memory.c')
-rw-r--r-- | emu/memory.c | 75 |
1 files changed, 43 insertions, 32 deletions
diff --git a/emu/memory.c b/emu/memory.c index 408e621..52332e3 100644 --- a/emu/memory.c +++ b/emu/memory.c @@ -1,52 +1,63 @@ #include "memory.h" #include <stdio.h> +#include <stdlib.h> -void memory_init( memory_t *memory, seg7_t *seg ) -{ - memory->read = memory_read; - memory->write = memory_write; - memory->seg = seg; -} +static device_vtable_t const memory_vtable = { + memory_read, + memory_write, + memory_deinit +}; -uint8_t memory_read( memory_t *memory, uint16_t addr ) +void memory_init( memory_t *memory, memory_type_t type, uint16_t addr, uint16_t size ) { - if( addr <= 0x3FFF ) { - // RAM access - return memory->cell[addr]; - } else if( addr <= 0x8000 ) { - return seg7_read( memory->seg, addr ); - } else { - // ROM access - return memory->cell[addr]; - } -} + device_init( &memory->base, ( type == MEMORY_ROM ) ? "ROM" : "RAM" ); -void memory_write( memory_t *memory, uint16_t addr, uint8_t data ) -{ - if( addr <= 0x3FFF ) { - // RAM access - memory->cell[addr] = data; - } else if( addr <= 0x8000 ) { - seg7_write( memory->seg, addr, data ); - } else { - // ignore writes to ROM - } + memory->type = type; + memory->addr = addr; + memory->size = size; + memory->cell = malloc( memory->size ); + memory->base.vtable = (device_vtable_t *)&memory_vtable; } -void memory_load( memory_t *memory, uint16_t addr, uint16_t size, const char *filename ) +void memory_load( memory_t *memory, const char *filename ) { - if( addr >= 0x8000 ) { + if( memory->type == MEMORY_ROM ) { FILE *f = fopen( filename, "rb" ); if( f == NULL ) { fprintf( stderr, "ERROR: Unable to open ROM file '%s'\n", filename ); exit( EXIT_FAILURE ); } - fread( &memory->cell[addr], size, 1, f ); + fread( &memory->cell[0], memory->size, 1, f ); fclose( f ); fprintf( stderr, "INFO: Loaded firware from '%s' of size %d starting on address %04X\n", - filename, size, addr ); + filename, memory->size, memory->addr ); } else { - fprintf( stderr, "ERROR: Cannot load firmware into RAM at address %04X\n", addr ); + fprintf( stderr, "ERROR: Cannot load firmware into RAM at address %04X\n", memory->addr ); } } + +uint8_t memory_read( void *obj, uint16_t addr ) +{ + memory_t *memory = (memory_t *)obj; + + return memory->cell[addr-memory->addr]; +} + +void memory_write( void *obj, uint16_t addr, uint8_t data ) +{ + memory_t *memory = (memory_t *)obj; + + if( memory->type && MEMORY_ROM ) { + // ignore writes to ROM + } else { + memory->cell[addr-memory->addr] = data; + } +} + +void memory_deinit( void *obj ) +{ + memory_t *memory = (memory_t *)obj; + + device_deinit( &memory->base ); +} |