1.1 --- a/src/aica/armmem.c Mon Dec 26 10:48:20 2005 +0000
1.2 +++ b/src/aica/armmem.c Tue Mar 14 11:44:29 2006 +0000
1.5 - * $Id: armmem.c,v 1.6 2005-12-26 10:48:20 nkeynes Exp $
1.6 + * $Id: armmem.c,v 1.7 2006-01-10 13:56:54 nkeynes Exp $
1.8 * Implements the ARM's memory map.
1.16 char *arm_mem = NULL;
1.17 char *arm_mem_scratch = NULL;
1.19 return *(int32_t *)(arm_mem + addr);
1.20 /* Main sound ram */
1.23 switch( addr & 0xFFFFF000 ) {
1.25 - return mmio_region_AICA0_read(addr);
1.26 + val = mmio_region_AICA0_read(addr&0x0FFF);
1.27 + // DEBUG( "ARM long read from %08X => %08X", addr, val );
1.30 - return mmio_region_AICA1_read(addr);
1.31 + val = mmio_region_AICA1_read(addr&0x0FFF);
1.32 + // DEBUG( "ARM long read from %08X => %08X", addr, val );
1.35 - return mmio_region_AICA2_read(addr);
1.36 + val = mmio_region_AICA2_read(addr&0x0FFF);
1.37 + // DEBUG( "ARM long read from %08X => %08X", addr, val );
1.41 return *(int32_t *)(arm_mem_scratch + addr - 0x00803000);
1.44 switch( addr & 0xFFFFF000 ) {
1.46 - mmio_region_AICA0_write(addr, value);
1.47 + // DEBUG( "ARM long write to %08X <= %08X", addr, value );
1.48 + mmio_region_AICA0_write(addr&0x0FFF, value);
1.51 - mmio_region_AICA1_write(addr, value);
1.52 + // DEBUG( "ARM long write to %08X <= %08X", addr, value );
1.53 + mmio_region_AICA1_write(addr&0x0FFF, value);
1.56 - mmio_region_AICA2_write(addr, value);
1.57 + // DEBUG( "ARM long write to %08X <= %08X", addr, value );
1.58 + mmio_region_AICA2_write(addr&0x0FFF, value);
1.62 @@ -93,21 +104,42 @@
1.66 +uint32_t arm_combine_byte( uint32_t addr, uint32_t val, uint8_t byte )
1.68 + switch( addr & 0x03 ) {
1.70 + return (val & 0xFFFFFF00) | byte;
1.72 + return (val & 0xFFFF00FF) | (byte<<8);
1.74 + return (val & 0xFF00FFFF) | (byte<<16);
1.76 + return (val & 0x00FFFFFF) | (byte<<24);
1.80 void arm_write_byte( uint32_t addr, uint32_t value )
1.82 if( addr < 0x00200000 ) {
1.83 /* Main sound ram */
1.84 *(uint8_t *)(arm_mem + addr) = (uint8_t)value;
1.87 switch( addr & 0xFFFFF000 ) {
1.89 - mmio_region_AICA0_write(addr, value);
1.90 + tmp = MMIO_READ( AICA0, addr & 0x0FFC );
1.91 + value = arm_combine_byte( addr, tmp, value );
1.92 + mmio_region_AICA0_write(addr&0x0FFC, value);
1.95 - mmio_region_AICA1_write(addr, value);
1.96 + tmp = MMIO_READ( AICA1, addr & 0x0FFC );
1.97 + value = arm_combine_byte( addr, tmp, value );
1.98 + mmio_region_AICA1_write(addr&0x0FFC, value);
1.101 - mmio_region_AICA2_write(addr, value);
1.102 + tmp = MMIO_READ( AICA2, addr & 0x0FFC );
1.103 + value = arm_combine_byte( addr, tmp, value );
1.104 + mmio_region_AICA2_write(addr&0x0FFC, value);