# HG changeset patch # User nkeynes # Date 1297635161 -36000 # Node ID 2cc6c50d0dd2c3f523d8132055df29ec58afb469 # Parent f405d42a9786c263be3ac4b7de94ec4953593c42 Add default read/write burst methods for IO regions. (There's almost certainly a bug somewhere if these are actually invoked, but try to do the right thing anyway rather than crashing) --- a/src/mem.c Fri Jan 28 16:14:57 2011 +1000 +++ b/src/mem.c Mon Feb 14 08:12:41 2011 +1000 @@ -83,6 +83,30 @@ /* No effect */ } +void FASTCALL default_write_burst( sh4addr_t addr, unsigned char *src ) +{ + mem_write_fn_t writefn = ext_address_space[(addr&0x1FFFFFFF)>>12]->write_long; + uint32_t *p = (uint32_t *)src; + sh4addr_t end = addr + 32; + while( addr < end ) { + writefn(addr, *p); + addr += 4; + p += 4; + } +} + +void FASTCALL default_read_burst( unsigned char *dest, sh4addr_t addr ) +{ + mem_read_fn_t readfn = ext_address_space[(addr&0x1FFFFFFF)>>12]->read_long; + uint32_t *p = (uint32_t *)dest; + sh4addr_t end = addr + 32; + while( addr < end ) { + *p = readfn(addr); + addr += 4; + p += 4; + } +} + struct mem_region_fn mem_region_unmapped = { unmapped_read_long, unmapped_write_long, unmapped_read_long, unmapped_write_long, @@ -400,6 +424,10 @@ io->save_mem = io->mem + LXDREAM_PAGE_SIZE; io->index = (struct mmio_port **)malloc(1024*sizeof(struct mmio_port *)); io->trace_flag = 0; + if( io->fn.write_burst == NULL ) + io->fn.write_burst = default_write_burst; + if( io->fn.read_burst == NULL ) + io->fn.read_burst = default_read_burst; memset( io->index, 0, 1024*sizeof(struct mmio_port *) ); for( i=0; io->ports[i].id != NULL; i++ ) { io->ports[i].val = (uint32_t *)(io->mem + io->ports[i].offset);