summaryrefslogtreecommitdiff
path: root/emu/6522.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/6522.c')
-rw-r--r--emu/6522.c78
1 files changed, 78 insertions, 0 deletions
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 <stdio.h>
+#include <stdbool.h>
+
+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 );
+}