#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 ); }