--- a/src/aica/armmem.c Mon Dec 26 06:38:51 2005 +0000 +++ b/src/aica/armmem.c Mon Jan 02 14:49:29 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: armmem.c,v 1.5 2005-12-26 06:38:51 nkeynes Exp $ + * $Id: armmem.c,v 1.6 2005-12-26 10:48:20 nkeynes Exp $ * * Implements the ARM's memory map. * @@ -21,10 +21,11 @@ #include "mem.h" char *arm_mem = NULL; +char *arm_mem_scratch = NULL; void arm_mem_init() { arm_mem = mem_get_region_by_name( MEM_REGION_AUDIO ); - + arm_mem_scratch = mem_get_region_by_name( MEM_REGION_AUDIO_SCRATCH ); } int arm_has_page( uint32_t addr ) { @@ -40,17 +41,13 @@ switch( addr & 0xFFFFF000 ) { case 0x00800000: return mmio_region_AICA0_read(addr); - break; case 0x00801000: return mmio_region_AICA1_read(addr); - break; case 0x00802000: return mmio_region_AICA2_read(addr); - break; case 0x00803000: - break; case 0x00804000: - break; + return *(int32_t *)(arm_mem_scratch + addr - 0x00803000); } } ERROR( "Attempted long read to undefined page: %08X", @@ -60,44 +57,69 @@ } uint32_t arm_read_word( uint32_t addr ) { - if( addr < 0x00200000 ) { - return *(int16_t *)(arm_mem + addr); - /* Main sound ram */ - } else { - /* Undefined memory */ - ERROR( "Attempted word read to undefined page: %08X", - addr ); - return 0; - } - + return (uint32_t)(uint16_t)arm_read_long( addr ); } uint32_t arm_read_byte( uint32_t addr ) { - if( addr < 0x00200000 ) { - return (uint32_t)(*(uint8_t *)(arm_mem + addr)); - /* Main sound ram */ - } else { - /* Undefined memory */ - ERROR( "Attempted byte read to undefined page: %08X", - addr ); - return 0; - } + return (uint32_t)(uint8_t)arm_read_long( addr ); } void arm_write_long( uint32_t addr, uint32_t value ) { if( addr < 0x00200000 ) { + /* Main sound ram */ *(uint32_t *)(arm_mem + addr) = value; } else { + switch( addr & 0xFFFFF000 ) { + case 0x00800000: + mmio_region_AICA0_write(addr, value); + break; + case 0x00801000: + mmio_region_AICA1_write(addr, value); + break; + case 0x00802000: + mmio_region_AICA2_write(addr, value); + break; + case 0x00803000: + case 0x00804000: + *(uint32_t *)(arm_mem_scratch + addr - 0x00803000) = value; + break; + default: + ERROR( "Attempted long write to undefined address: %08X", + addr ); + /* Undefined memory */ + } } + return 0; } void arm_write_byte( uint32_t addr, uint32_t value ) { if( addr < 0x00200000 ) { - *(uint8_t *)(arm_mem+addr) = (uint8_t)value; + /* Main sound ram */ + *(uint8_t *)(arm_mem + addr) = (uint8_t)value; } else { + switch( addr & 0xFFFFF000 ) { + case 0x00800000: + mmio_region_AICA0_write(addr, value); + break; + case 0x00801000: + mmio_region_AICA1_write(addr, value); + break; + case 0x00802000: + mmio_region_AICA2_write(addr, value); + break; + case 0x00803000: + case 0x00804000: + *(uint8_t *)(arm_mem_scratch + addr - 0x00803000) = (uint8_t)value; + break; + default: + ERROR( "Attempted byte write to undefined address: %08X", + addr ); + /* Undefined memory */ + } } + return 0; } /* User translations - TODO */