From 9490b470f3c0ac2357b60a56a893ab86556af634 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 2 Jan 2021 20:23:52 +0100 Subject: added VIA added some more opcodes (SEI, CLI) --- emu/6522.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 11 deletions(-) (limited to 'emu/6522.c') 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 ); } -- cgit v1.2.3-54-g00ecf