Skip to content

Commit

Permalink
changed some stuff on how devices work
Browse files Browse the repository at this point in the history
  • Loading branch information
tobbebia committed May 31, 2012
1 parent abee8fb commit cdb2ac7
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 37 deletions.
13 changes: 4 additions & 9 deletions dcpu16.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,10 @@ int dcpu16_install_device(dcpu16_t *computer, dcpu16_device_t *device)
return -1;
}

/* Calls the device's release function and then removes it from the computer. */
void dcpu16_release_device(dcpu16_t *computer, int slot)
/* Removes the device from the computer. */
void dcpu16_uninstall_device(dcpu16_t *computer, int slot)
{
if(computer->devices[slot]) {
if(computer->devices[slot]->release)
computer->devices[slot]->release();

computer->devices[slot] = 0;
}
}

/* Finds the device which is mapped to the specified memory address.
Expand Down Expand Up @@ -53,7 +48,7 @@ static inline void dcpu16_set(dcpu16_t *computer, DCPU16_WORD *where, DCPU16_WOR
// Check for hardware mapped RAM
dcpu16_device_t * dev = dcpu16_mapped_device(computer, ram_address);
if(dev) {
dev->write(ram_address - dev->ram_start_address, value);
dev->write(dev, ram_address - dev->ram_start_address, value);
} else {
// Call the callback function if address was not hardware mapped
if(computer->callback.unmapped_ram_changed)
Expand Down Expand Up @@ -82,7 +77,7 @@ static inline DCPU16_WORD dcpu16_get(dcpu16_t *computer, DCPU16_WORD *where)
// Check for hardware mapped RAM
dcpu16_device_t * dev = dcpu16_mapped_device(computer, ram_address);
if(dev) {
return dev->read(ram_address - dev->ram_start_address);
return dev->read(dev, ram_address - dev->ram_start_address);
} else {
// Read from RAM
return *where;
Expand Down
11 changes: 6 additions & 5 deletions dcpu16.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,11 @@ typedef struct _dcpu16_device_t
DCPU16_WORD ram_end_address;

// Function pointers
void (* initialize)(void);
void (* release)(void);
void (* write)(DCPU16_WORD relative_address, DCPU16_WORD value);
DCPU16_WORD (* read)(DCPU16_WORD relative_address);
void (* write)(struct _dcpu16_device_t * dev, DCPU16_WORD relative_address, DCPU16_WORD value);
DCPU16_WORD (* read)(struct _dcpu16_device_t * dev, DCPU16_WORD relative_address);

// Pointer to device specific structure
void * struct_ptr;

} dcpu16_device_t;

Expand Down Expand Up @@ -117,7 +118,7 @@ typedef struct _dcpu16_t

/* Declaration of "public" functions */
int dcpu16_install_device(dcpu16_t *computer, dcpu16_device_t *device);
void dcpu16_release_device(dcpu16_t *computer, int slot);
void dcpu16_uninstall_device(dcpu16_t *computer, int slot);
void dcpu16_init(dcpu16_t *computer);
int dcpu16_load_ram(dcpu16_t *computer, const char *file, char binary);
void dcpu16_run(dcpu16_t *computer);
Expand Down
32 changes: 11 additions & 21 deletions devices/screen/screen.c
Original file line number Diff line number Diff line change
@@ -1,43 +1,33 @@
#include "screen.h"

static void (* screen_changed_callback)(char x, char y, DCPU16_WORD value) = 0;
static DCPU16_WORD screen_buffer[SCREEN_COLUMNS * SCREEN_ROWS];

void screen_create_device(dcpu16_device_t * dev)
screen_t * screen_create_device(dcpu16_device_t * dev)
{
dev->ram_start_address = SCREEN_RAM_START_ADDRESS;
dev->ram_end_address = SCREEN_RAM_END_ADDRESS;

dev->initialize = screen_initialize;
dev->release = screen_release;
dev->write = screen_write;
dev->read = screen_read;
}

void screen_set_callback(void (* callback)(char x, char y, DCPU16_WORD value))
{
screen_changed_callback = callback;
}
dev->struct_ptr = malloc(sizeof(screen_t));

static void screen_initialize()
{
memset(screen_buffer, 0, sizeof(screen_buffer));
return dev.struct_ptr;
}

static void screen_release()
void screen_release_device(dcpu16_device_t * dev)
{
free(dev.struct_ptr);
}

static void screen_write(DCPU16_WORD address, DCPU16_WORD value)
static void screen_write(dcpu16_device_t * dev, DCPU16_WORD address, DCPU16_WORD value)
{
screen_buffer[address] = value;
dev->screen_buffer[address] = value;

if(screen_changed_callback)
screen_changed_callback(address / SCREEN_COLUMNS, address % SCREEN_COLUMNS, value);
if(dev->screen_changed_callback)
dev->screen_changed_callback(address / SCREEN_COLUMNS, address % SCREEN_COLUMNS, value);
}

static DCPU16_WORD screen_read(DCPU16_WORD address)
static DCPU16_WORD screen_read(dcpu16_device_t * dev, DCPU16_WORD address)
{
return screen_buffer[address];
return dev->screen_buffer[address];
}

10 changes: 8 additions & 2 deletions devices/screen/screen.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
#define SCREEN_RAM_START_ADDRESS // INSERT VALUE HERE
#define SCREEN_RAM_END_ADDRESS SCREEN_RAM_START_ADDRESS + SCREEN_COLUMNS * SCREEN_ROWS

void screen_create_device(dcpu16_device_t * dev);
void screen_set_callback(void (* callback)(char x, char y, DCPU16_WORD value));
screen_t * screen_create_device(dcpu16_device_t * dev);
void screen_release_device(dcpu16_device_t * dev);

typedef struct _screen_t
{
DCPU16_WORD screen_buffer[SCREEN_COLUMNS * SCREEN_ROWS];
void (* screen_changed_callback)(char x, char y, DCPU16_WORD value);
} screen_t;

#endif

0 comments on commit cdb2ac7

Please sign in to comment.