summaryrefslogtreecommitdiff
path: root/emu/6522.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/6522.c')
-rw-r--r--emu/6522.c68
1 files changed, 57 insertions, 11 deletions
diff --git a/emu/6522.c b/emu/6522.c
index df9144d..7cde206 100644
--- a/emu/6522.c
+++ b/emu/6522.c
@@ -22,14 +22,37 @@ void via_6522_init( via_6522_t *via, uint16_t addr, bool initialize )
if( initialize ) {
via->ddra = 0x00;
+ via->ddrb = 0x00;
+ via->pcr = 0x00;
+ via->ier = 0x00;
}
- bus_init( &via->bus );
+ bus_init( &via->busa );
+ bus_init( &via->busb );
}
-void via_6522_register( via_6522_t *via, device_t *device )
+void via_6522_reset( via_6522_t *via )
{
- bus_register( &via->bus, device, 0, 0 );
+ via->ddra = 0x00;
+ via->ddrb = 0x00;
+ via->pcr = 0x00;
+ via->ier = 0x00;
+}
+
+void via_6522_register( via_6522_t *via, int bus, device_t *device )
+{
+ switch( bus ) {
+ case PORTA:
+ bus_register( &via->busa, device, 0, 0 );
+ break;
+
+ case PORTB:
+ bus_register( &via->busb, device, 0, 0 );
+ break;
+
+ default:
+ fprintf( stderr, "ERROR: unable to register to VIA 6522 bus, use PORTA or PORTB\n" );
+ }
}
uint8_t via_6522_read( void *obj, uint16_t addr )
@@ -42,18 +65,38 @@ 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;
+ for( int i = 0; i < via->busa.nof_devices; i++ ) {
+ device_t *device = via->busa.devices[i].device;
device->vtable->write( device, 0, data );
}
break;
+
+ case PORTB:
+ data &= via->ddrb;
+ for( int i = 0; i < via->busb.nof_devices; i++ ) {
+ device_t *device = via->busb.devices[i].device;
+ device->vtable->write( device, 0, data );
+ }
+ break;
+
+ case DDRB:
+ via->ddrb = data;
+ break;
+
+ case DDRA:
+ via->ddra = data;
+ break;
+ case PCR:
+ via->pcr = data;
+ break;
+
+ case IER:
+ via->ier = data;
+ break;
+
default:
fprintf( stderr, "ERROR: VIA 6522 not implemented address '%04X', data: '%02X'\n", addr, data );
break;
@@ -65,7 +108,8 @@ 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 );
+ via->busa.base.vtable->draw( &via->busa, renderer );
+ via->busb.base.vtable->draw( &via->busb, renderer );
}
#endif
@@ -73,6 +117,8 @@ void via_6522_deinit( void *obj )
{
via_6522_t *via = (via_6522_t *)obj;
- bus_deinit( &via->bus );
+ bus_deinit( &via->busa );
+ bus_deinit( &via->busb );
+
device_deinit( &via->base );
}