diff options
Diffstat (limited to 'emu/memory.c')
-rw-r--r-- | emu/memory.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/emu/memory.c b/emu/memory.c index c9d953b..408e621 100644 --- a/emu/memory.c +++ b/emu/memory.c @@ -2,25 +2,51 @@ #include <stdio.h> -void memory_init( memory_t *memory ) +void memory_init( memory_t *memory, seg7_t *seg ) { memory->read = memory_read; memory->write = memory_write; + memory->seg = seg; } uint8_t memory_read( memory_t *memory, uint16_t addr ) { - return memory->cell[addr]; + 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]; + } } void memory_write( memory_t *memory, uint16_t addr, uint8_t data ) -{ - memory->cell[addr] = 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 + } } void memory_load( memory_t *memory, uint16_t addr, uint16_t size, const char *filename ) { - FILE *f = fopen( filename, "rb" ); - fread( &memory->cell[addr], size, 1, f ); - fclose( f ); + if( addr >= 0x8000 ) { + 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 ); + fclose( f ); + fprintf( stderr, "INFO: Loaded firware from '%s' of size %d starting on address %04X\n", + filename, size, addr ); + } else { + fprintf( stderr, "ERROR: Cannot load firmware into RAM at address %04X\n", addr ); + } } |