summaryrefslogtreecommitdiff
path: root/emu/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/memory.c')
-rw-r--r--emu/memory.c75
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 );
+}