2 * $Id: armmem.c,v 1.6 2005-12-26 10:48:20 nkeynes Exp $
4 * Implements the ARM's memory map.
6 * Copyright (c) 2005 Nathan Keynes.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
24 char *arm_mem_scratch = NULL;
27 arm_mem = mem_get_region_by_name( MEM_REGION_AUDIO );
28 arm_mem_scratch = mem_get_region_by_name( MEM_REGION_AUDIO_SCRATCH );
31 int arm_has_page( uint32_t addr ) {
32 return ( addr < 0x00200000 ||
33 (addr >= 0x00800000 && addr <= 0x00805000 ) );
36 uint32_t arm_read_long( uint32_t addr ) {
37 if( addr < 0x00200000 ) {
38 return *(int32_t *)(arm_mem + addr);
41 switch( addr & 0xFFFFF000 ) {
43 return mmio_region_AICA0_read(addr);
45 return mmio_region_AICA1_read(addr);
47 return mmio_region_AICA2_read(addr);
50 return *(int32_t *)(arm_mem_scratch + addr - 0x00803000);
53 ERROR( "Attempted long read to undefined page: %08X",
55 /* Undefined memory */
59 uint32_t arm_read_word( uint32_t addr ) {
60 return (uint32_t)(uint16_t)arm_read_long( addr );
63 uint32_t arm_read_byte( uint32_t addr ) {
64 return (uint32_t)(uint8_t)arm_read_long( addr );
67 void arm_write_long( uint32_t addr, uint32_t value )
69 if( addr < 0x00200000 ) {
71 *(uint32_t *)(arm_mem + addr) = value;
73 switch( addr & 0xFFFFF000 ) {
75 mmio_region_AICA0_write(addr, value);
78 mmio_region_AICA1_write(addr, value);
81 mmio_region_AICA2_write(addr, value);
85 *(uint32_t *)(arm_mem_scratch + addr - 0x00803000) = value;
88 ERROR( "Attempted long write to undefined address: %08X",
90 /* Undefined memory */
96 void arm_write_byte( uint32_t addr, uint32_t value )
98 if( addr < 0x00200000 ) {
100 *(uint8_t *)(arm_mem + addr) = (uint8_t)value;
102 switch( addr & 0xFFFFF000 ) {
104 mmio_region_AICA0_write(addr, value);
107 mmio_region_AICA1_write(addr, value);
110 mmio_region_AICA2_write(addr, value);
114 *(uint8_t *)(arm_mem_scratch + addr - 0x00803000) = (uint8_t)value;
117 ERROR( "Attempted byte write to undefined address: %08X",
119 /* Undefined memory */
125 /* User translations - TODO */
127 uint32_t arm_read_long_user( uint32_t addr ) {
128 return arm_read_long( addr );
131 uint32_t arm_read_byte_user( uint32_t addr ) {
132 return arm_read_byte( addr );
135 void arm_write_long_user( uint32_t addr, uint32_t val ) {
136 arm_write_long( addr, val );
139 void arm_write_byte_user( uint32_t addr, uint32_t val )
141 arm_write_byte( addr, val );
.