From aff63a211e9b1e397adb9dce726d8153beb96dcd Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Wed, 30 Dec 2020 16:55:06 +0100 Subject: - 7seg is a subdevice of the VIA 6522 now, registering to a small sub-bus --- emu/6522.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 emu/6522.c (limited to 'emu/6522.c') diff --git a/emu/6522.c b/emu/6522.c new file mode 100644 index 0000000..df9144d --- /dev/null +++ b/emu/6522.c @@ -0,0 +1,78 @@ +#include "6522.h" + +#include +#include + +static device_vtable_t const via_6522_vtable = { + via_6522_read, + via_6522_write, +#ifdef WITH_GUI + via_6522_draw, +#endif + via_6522_deinit +}; + +void via_6522_init( via_6522_t *via, uint16_t addr, bool initialize ) +{ + device_init( &via->base, "via_6522" ); + via->base.vtable = (device_vtable_t *)&via_6522_vtable; + + via->addr = addr; + via->debug = false; + + if( initialize ) { + via->ddra = 0x00; + } + + bus_init( &via->bus ); +} + +void via_6522_register( via_6522_t *via, device_t *device ) +{ + bus_register( &via->bus, device, 0, 0 ); +} + +uint8_t via_6522_read( void *obj, uint16_t addr ) +{ + return 0; +} + +void via_6522_write( void *obj, uint16_t addr, uint8_t data ) +{ + via_6522_t *via = (via_6522_t *)obj; + + switch( addr - via->addr ) { + case DDRA: + via->ddra = data; + break; + + case PORTA: + data &= via->ddra; + for( int i = 0; i < via->bus.nof_devices; i++ ) { + device_t *device = via->bus.devices[i].device; + device->vtable->write( device, 0, data ); + } + break; + + default: + fprintf( stderr, "ERROR: VIA 6522 not implemented address '%04X', data: '%02X'\n", addr, data ); + break; + } +} + +#ifdef WITH_GUI +void via_6522_draw( void *obj, SDL_Renderer *renderer ) +{ + via_6522_t *via = (via_6522_t *)obj; + + via->bus.base.vtable->draw( &via->bus, renderer ); +} +#endif + +void via_6522_deinit( void *obj ) +{ + via_6522_t *via = (via_6522_t *)obj; + + bus_deinit( &via->bus ); + device_deinit( &via->base ); +} -- cgit v1.2.3-54-g00ecf