nkeynes@939: /** nkeynes@940: * $Id$ nkeynes@939: * nkeynes@939: * Dreamcast main SDRAM - access methods and timing controls. This is fairly nkeynes@939: * directly coupled to the SH4 nkeynes@939: * nkeynes@939: * Copyright (c) 2005 Nathan Keynes. nkeynes@939: * nkeynes@939: * This program is free software; you can redistribute it and/or modify nkeynes@939: * it under the terms of the GNU General Public License as published by nkeynes@939: * the Free Software Foundation; either version 2 of the License, or nkeynes@939: * (at your option) any later version. nkeynes@939: * nkeynes@939: * This program is distributed in the hope that it will be useful, nkeynes@939: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@939: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@939: * GNU General Public License for more details. nkeynes@939: */ nkeynes@939: nkeynes@939: #include "lxdream.h" nkeynes@939: #include "mem.h" nkeynes@939: #include "dreamcast.h" nkeynes@991: #include "xlat/xltcache.h" nkeynes@939: #include nkeynes@939: nkeynes@939: nkeynes@939: static int32_t FASTCALL ext_sdram_read_long( sh4addr_t addr ) nkeynes@939: { nkeynes@939: return *((int32_t *)(dc_main_ram + (addr&0x00FFFFFF))); nkeynes@939: } nkeynes@939: static int32_t FASTCALL ext_sdram_read_word( sh4addr_t addr ) nkeynes@939: { nkeynes@939: return SIGNEXT16(*((int16_t *)(dc_main_ram + (addr&0x00FFFFFF)))); nkeynes@939: } nkeynes@939: static int32_t FASTCALL ext_sdram_read_byte( sh4addr_t addr ) nkeynes@939: { nkeynes@939: return SIGNEXT8(*((int16_t *)(dc_main_ram + (addr&0x00FFFFFF)))); nkeynes@939: } nkeynes@939: static void FASTCALL ext_sdram_write_long( sh4addr_t addr, uint32_t val ) nkeynes@939: { nkeynes@939: *(uint32_t *)(dc_main_ram + (addr&0x00FFFFFF)) = val; nkeynes@939: xlat_invalidate_long(addr); nkeynes@939: } nkeynes@939: static void FASTCALL ext_sdram_write_word( sh4addr_t addr, uint32_t val ) nkeynes@939: { nkeynes@939: *(uint16_t *)(dc_main_ram + (addr&0x00FFFFFF)) = (uint16_t)val; nkeynes@939: xlat_invalidate_word(addr); nkeynes@939: } nkeynes@939: static void FASTCALL ext_sdram_write_byte( sh4addr_t addr, uint32_t val ) nkeynes@939: { nkeynes@939: *(uint8_t *)(dc_main_ram + (addr&0x00FFFFFF)) = (uint8_t)val; nkeynes@939: xlat_invalidate_word(addr); nkeynes@939: } nkeynes@939: static void FASTCALL ext_sdram_read_burst( unsigned char *dest, sh4addr_t addr ) nkeynes@939: { nkeynes@939: memcpy( dest, dc_main_ram+(addr&0x00FFFFFF), 32 ); nkeynes@939: } nkeynes@939: static void FASTCALL ext_sdram_write_burst( sh4addr_t addr, unsigned char *src ) nkeynes@939: { nkeynes@939: memcpy( dc_main_ram+(addr&0x00FFFFFF), src, 32 ); nkeynes@939: } nkeynes@939: nkeynes@939: struct mem_region_fn mem_region_sdram = { ext_sdram_read_long, ext_sdram_write_long, nkeynes@939: ext_sdram_read_word, ext_sdram_write_word, nkeynes@939: ext_sdram_read_byte, ext_sdram_write_byte, nkeynes@939: ext_sdram_read_burst, ext_sdram_write_burst };