Simplified MMIO and removed some dead code

This commit is contained in:
copy 2013-11-25 12:18:29 +01:00
parent 6bab31ada3
commit ae183866e4
3 changed files with 73 additions and 122 deletions

View file

@ -540,7 +540,7 @@ function cpu_init(settings)
}
// seabios expects the bios to be mapped to 0xFFF00000 also
memory.mmap_register(0xFFF00000, 0x100000, false,
memory.mmap_register(0xFFF00000, 0x100000,
function(addr)
{
return memory.mem8[addr];

View file

@ -39,13 +39,6 @@ function Memory(buffer, memory_size)
dbg_assert(typeof addr === "number");
dbg_assert(!isNaN(addr));
if((addr >= memory_size || addr < 0) && !memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
{
dbg_log("Read from unmapped memory space, addr=" + h(addr, 8) /*+ " at " + h(instruction_pointer, 8)*/, LOG_IO);
}
//dbg_assert(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]);
};
this.dump_all = function(start, end)
@ -124,136 +117,94 @@ function Memory(buffer, memory_size)
* Arbritary value, the minimum number of bytes that can be mapped
* by one device. This might be spec'd somewhere ...
*
* Written as a power of 2.
*
* @const
*/
MMAP_BLOCK_SIZE = 14,
MMAP_BLOCK_BITS = 14,
/** @const */
MMAP_BYTEWISE = 1,
MMAP_DWORDWISE = 4,
MMAP_BLOCK_SIZE = 1 << MMAP_BLOCK_BITS,
// this only supports a 32 bit address space
memory_map_registered = new Int8Array(1 << 32 - MMAP_BLOCK_SIZE),
memory_map_registered = new Int8Array(1 << (32 - MMAP_BLOCK_BITS)),
memory_map_read = [],
memory_map_write = [];
for(var i = 0; i < (1 << 32 - MMAP_BLOCK_SIZE); i++)
dbg_assert((memory_size & MMAP_BLOCK_SIZE - 1) === 0);
/**
* @param addr {number}
* @param size {number}
*
*/
this.mmap_register = function(addr, size, read_func, write_func)
{
dbg_log("mmap_register addr=" + h(addr, 8) + ": size=" + h(size, 8), LOG_IO);
dbg_assert((addr & MMAP_BLOCK_SIZE - 1) === 0);
dbg_assert(size && (size & MMAP_BLOCK_SIZE - 1) === 0);
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
for(; size > 0; aligned_addr++)
{
memory_map_registered[aligned_addr] = 1;
memory_map_read[aligned_addr] = do_read;
memory_map_write[aligned_addr] = do_write;
size -= MMAP_BLOCK_SIZE;
}
function do_read(read_addr)
{
return read_func(read_addr - addr | 0);
}
function do_write(write_addr, value)
{
write_func(write_addr - addr | 0, value);
}
};
for(var i = 0; (i << MMAP_BLOCK_BITS) < memory_size; i++)
{
// avoid sparse arrays
memory_map_read[i] = memory_map_write[i] = undefined;
}
/**
* @param addr {number}
* @param size {number}
* @param is_dword {boolean} true if the memory is addressed in dwords, otherwise byte
*
*/
this.mmap_register = function(addr, size, is_dword, read_func, write_func)
{
dbg_log("mmap_register32 " + h(addr, 8) + ": " + h(size, 8), LOG_IO);
dbg_assert((addr & (1 << MMAP_BLOCK_SIZE) - 1) === 0);
dbg_assert(size >= (1 << MMAP_BLOCK_SIZE) && (size & (1 << MMAP_BLOCK_SIZE) - 1) === 0);
var aligned_addr = addr >>> MMAP_BLOCK_SIZE,
unit_size = is_dword ? MMAP_DWORDWISE : MMAP_BYTEWISE;
for(; size > 0; aligned_addr++)
{
memory_map_registered[aligned_addr] = unit_size;
memory_map_read[aligned_addr] = function(read_addr)
{
return read_func(read_addr - addr | 0);
};
memory_map_write[aligned_addr] = function(write_addr, value)
{
write_func(write_addr - addr | 0, value);
}
size -= 1 << MMAP_BLOCK_SIZE;
}
};
this.mmap_register(memory_size, 0x100000000 - memory_size,
function(addr) {
addr += memory_size;
dbg_log("Read from unmapped memory space, addr=" + h(addr, 8), LOG_IO);
},
function(addr, value) {
addr += memory_size;
dbg_log("Write to unmapped memory space, addr=" + h(addr, 8) + " value=" + h(value, 2), LOG_IO);
});
function mmap_read8(addr)
{
var aligned_addr = addr >>> MMAP_BLOCK_SIZE,
registered = memory_map_read[aligned_addr];
//dbg_log("mmap_read8 " + h(addr, 8), LOG_IO);
if(memory_map_registered[aligned_addr] === MMAP_BYTEWISE)
{
return registered(addr);
}
else
{
return mmap_read32(addr & ~3) >> 8 * (addr & 3) & 0xFF;
}
return memory_map_read[addr >>> MMAP_BLOCK_BITS](addr);
};
function mmap_write8(addr, value)
{
var aligned_addr = addr >>> MMAP_BLOCK_SIZE,
registered = memory_map_write[addr >>> MMAP_BLOCK_SIZE];
//dbg_log("mmap_write8 " + h(addr, 8) + ": " + h(value, 2), LOG_IO);
if(memory_map_registered[aligned_addr] === MMAP_BYTEWISE)
{
registered(addr, value);
}
else
{
// impossible without reading. Maybe this should do nothing
dbg_assert(false);
}
memory_map_write[addr >>> MMAP_BLOCK_BITS](addr, value);
};
function mmap_read32(addr)
{
var registered = memory_map_read[addr >>> MMAP_BLOCK_SIZE];
//dbg_log("mmap_read32 " + h(addr, 8), LOG_IO);
//dbg_assert((addr & 3) === 0);
dbg_assert(registered);
if((addr & 3) === 0 &&
memory_map_registered[addr >>> MMAP_BLOCK_SIZE] === MMAP_DWORDWISE)
{
return registered(addr);
}
else
{
return mmap_read8(addr) | mmap_read8(addr + 1) << 8 |
mmap_read8(addr + 2) << 16 | mmap_read8(addr + 3) << 24;
}
return mmap_read8(addr) | mmap_read8(addr + 1) << 8 |
mmap_read8(addr + 2) << 16 | mmap_read8(addr + 3) << 24;
};
function mmap_write32(addr, value)
{
var registered = memory_map_write[addr >>> MMAP_BLOCK_SIZE];
//dbg_log("mmap_write32 " + h(addr, 8) + ": " + h(value, 8), LOG_IO);
//dbg_assert((addr & 3) === 0);
dbg_assert(registered);
if((addr & 3) === 0 &&
memory_map_registered[addr >>> MMAP_BLOCK_SIZE] === MMAP_DWORDWISE)
{
registered(addr, value);
}
else
{
mmap_write8(addr, value & 0xFF);
mmap_write8(addr + 1, value >> 8 & 0xFF);
mmap_write8(addr + 2, value >> 16 & 0xFF);
mmap_write8(addr + 3, value >> 24 & 0xFF);
}
mmap_write8(addr, value & 0xFF);
mmap_write8(addr + 1, value >> 8 & 0xFF);
mmap_write8(addr + 2, value >> 16 & 0xFF);
mmap_write8(addr + 3, value >>> 24);
};
/**
@ -263,7 +214,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 1);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read8(addr) << 24 >> 24;
}
@ -280,7 +231,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 1);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read8(addr);
}
@ -297,7 +248,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 2);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read8(addr) | mmap_read8(addr + 1) << 8;
}
@ -314,7 +265,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 2);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read8(addr) | mmap_read8(addr + 1) << 8;
}
@ -331,7 +282,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 4);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read32(addr) | 0;
}
@ -349,7 +300,7 @@ function Memory(buffer, memory_size)
{
debug_read(addr, 4);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
return mmap_read32(addr) | 0;
}
@ -367,7 +318,7 @@ function Memory(buffer, memory_size)
{
debug_write(addr, 1, value);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
mmap_write8(addr, value);
}
@ -385,7 +336,7 @@ function Memory(buffer, memory_size)
{
debug_write(addr, 2, value);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
mmap_write8(addr, value & 0xff);
mmap_write8(addr + 1, value >> 8 & 0xff);
@ -405,7 +356,7 @@ function Memory(buffer, memory_size)
{
debug_write(addr, 2, value);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
mmap_write8(addr, value & 0xff);
mmap_write8(addr + 1, value >> 8 & 0xff);
@ -424,7 +375,7 @@ function Memory(buffer, memory_size)
{
debug_write(addr, 4, value);
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
mmap_write32(addr, value);
}
@ -439,7 +390,7 @@ function Memory(buffer, memory_size)
this.write_aligned32 = function(addr, value)
{
if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE])
if(memory_map_registered[addr >>> MMAP_BLOCK_BITS])
{
mmap_write32(addr, value);
}

View file

@ -116,9 +116,9 @@ function VGAScreen(dev, adapter)
screen.set_size_text(80, 25);
screen.update_cursor_scanline();
memory.mmap_register(0xA0000, 0x20000, false, vga_memory_read, vga_memory_write);
memory.mmap_register(0xA0000, 0x20000, vga_memory_read, vga_memory_write);
memory.mmap_register(0xE0000000, SVGA_MEMORY_SIZE, false, svga_memory_read, svga_memory_write);
memory.mmap_register(0xE0000000, SVGA_MEMORY_SIZE, svga_memory_read, svga_memory_write);
}
function vga_memory_read(addr)