summaryrefslogtreecommitdiff
path: root/emu/memory.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-11-27 20:04:18 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-11-27 20:04:18 +0100
commitf829f6893d94ed52044bf007bc447526c9d5e653 (patch)
treec1c98d8b9240b4507719aa8b78eb3ee03dd64ab5 /emu/memory.c
parent3d77f3f5ad41e931117425f58c74f49c9503bf7b (diff)
download6502-f829f6893d94ed52044bf007bc447526c9d5e653.tar.gz
6502-f829f6893d94ed52044bf007bc447526c9d5e653.tar.bz2
emulator uses a bus now in the cpu, ROM, RAM and VIA (7-seg) are devices connected to the bus
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 );
+}