Add 8-byte memory access support, all 8-byte memory accesses executed byte-byte before.
This commit is contained in:
parent
e297df457a
commit
7ed117f0e0
@ -1,95 +1,78 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: iodebug.cc,v 1.19 2005-11-29 17:38:57 sshwarts Exp $
|
||||
// $Id: iodebug.cc,v 1.20 2006-03-03 12:55:37 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "iodev.h"
|
||||
#if BX_SUPPORT_IODEBUG
|
||||
|
||||
|
||||
#define BX_IODEBUG_THIS this->
|
||||
|
||||
bx_iodebug_c bx_iodebug;
|
||||
bx_iodebug_c *bx_iodebug_ptr;
|
||||
|
||||
struct bx_iodebug_s_type {
|
||||
bx_bool enabled;
|
||||
unsigned int register_select;
|
||||
unsigned register_select;
|
||||
Bit32u registers[2];
|
||||
Bit32u monitored_mem_areas_start[BX_IODEBUG_MAX_AREAS];
|
||||
Bit32u monitored_mem_areas_end[BX_IODEBUG_MAX_AREAS];
|
||||
} bx_iodebug_s;
|
||||
|
||||
|
||||
// Constructor
|
||||
bx_iodebug_c::bx_iodebug_c( void )
|
||||
bx_iodebug_c::bx_iodebug_c()
|
||||
{
|
||||
put("IODEBUG");
|
||||
settype(IODEBUGLOG);
|
||||
|
||||
}
|
||||
|
||||
// Destructor
|
||||
bx_iodebug_c::~bx_iodebug_c( void )
|
||||
{
|
||||
}
|
||||
|
||||
void bx_iodebug_c::init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
DEV_register_ioread_handler(this, read_handler, 0x8A00,"BOCHS IODEBUG", 7);
|
||||
DEV_register_iowrite_handler(this, write_handler, 0x8A00,"BOCHS IODEBUG", 7);
|
||||
DEV_register_iowrite_handler(this, write_handler, 0x8A01,"BOCHS IODEBUG", 7);
|
||||
// fprintf( stderr, "IODEBUG initialized\n");
|
||||
|
||||
bx_iodebug_s.enabled = 0;
|
||||
bx_iodebug_s.register_select = 0;
|
||||
for(i=0;i<BX_IODEBUG_MAX_AREAS;i++) {
|
||||
|
||||
for(int i=0;i<BX_IODEBUG_MAX_AREAS;i++) {
|
||||
bx_iodebug_s.monitored_mem_areas_start[i] = 0;
|
||||
bx_iodebug_s.monitored_mem_areas_end[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void bx_iodebug_c::reset(unsigned type)
|
||||
{
|
||||
}
|
||||
|
||||
Bit32u bx_iodebug_c::read_handler(void *this_ptr, Bit32u addr, unsigned io_len)
|
||||
{
|
||||
bx_iodebug_ptr = (bx_iodebug_c *) this_ptr;
|
||||
return( bx_iodebug_ptr->read(addr, io_len) );
|
||||
bx_iodebug_c bx_iodebug_ptr = (bx_iodebug_c *) this_ptr;
|
||||
return bx_iodebug_ptr->read(addr, io_len);
|
||||
}
|
||||
|
||||
Bit32u bx_iodebug_c::read( Bit32u addr, unsigned io_len )
|
||||
Bit32u bx_iodebug_c::read(Bit32u addr, unsigned io_len)
|
||||
{
|
||||
if(bx_iodebug_s.enabled) return(0x8A00);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
void bx_iodebug_c::write_handler(void *this_ptr, Bit32u addr, Bit32u dvalue, unsigned io_len)
|
||||
{
|
||||
bx_iodebug_c *class_ptr = (bx_iodebug_c *) this_ptr;
|
||||
class_ptr->write( addr, dvalue, io_len );
|
||||
bx_iodebug_c bx_iodebug_ptr = (bx_iodebug_c *) this_ptr;
|
||||
bx_iodebug_ptr->write(addr, dvalue, io_len);
|
||||
}
|
||||
|
||||
|
||||
void bx_iodebug_c::write( Bit32u addr, Bit32u dvalue, unsigned int io_len )
|
||||
void bx_iodebug_c::write(Bit32u addr, Bit32u dvalue, unsigned io_len)
|
||||
{
|
||||
// fprintf(stderr, "IODEBUG addr: %4x\tdvalue: %8x\tio_len: %8x\n", (unsigned int)addr, (unsigned int)dvalue, io_len);
|
||||
// fprintf(stderr, "IODEBUG addr: %4x\tdvalue: %8x\tio_len: %8x\n", (unsigned) addr, (unsigned) dvalue, io_len);
|
||||
|
||||
if( addr == 0x8A01 && io_len == 2 )
|
||||
if(addr == 0x8A01 && io_len == 2)
|
||||
{
|
||||
bx_iodebug_s.registers[bx_iodebug_s.register_select] =
|
||||
(bx_iodebug_s.registers[bx_iodebug_s.register_select] << 16) +
|
||||
(dvalue & 0x0000FFFF );
|
||||
(dvalue & 0xFFFF);
|
||||
}
|
||||
|
||||
if( (addr != 0x8A00) || (io_len != 2) ) return;
|
||||
if((addr != 0x8A00) || (io_len != 2)) return;
|
||||
|
||||
if( !bx_iodebug_s.enabled )
|
||||
if(! bx_iodebug_s.enabled)
|
||||
{
|
||||
if( dvalue == 0x8A00 )
|
||||
if(dvalue == 0x8A00)
|
||||
{
|
||||
bx_iodebug_s.enabled = 1;
|
||||
// fprintf(stderr, "IODEBUG enabled\n");
|
||||
@ -99,58 +82,55 @@ void bx_iodebug_c::write( Bit32u addr, Bit32u dvalue, unsigned int io_len )
|
||||
return;
|
||||
}
|
||||
|
||||
switch( dvalue )
|
||||
switch(dvalue)
|
||||
{
|
||||
case( 0x8A01 ):
|
||||
case 0x8A01:
|
||||
bx_iodebug_s.register_select = 0;
|
||||
// fprintf( stderr, "IODEBUG register 0 selected\n");
|
||||
// fprintf(stderr, "IODEBUG register 0 selected\n");
|
||||
break;
|
||||
|
||||
case( 0x8A02 ):
|
||||
case 0x8A02:
|
||||
bx_iodebug_s.register_select = 1;
|
||||
// fprintf( stderr, "IODEBUG register 1 selected\n");
|
||||
// fprintf(stderr, "IODEBUG register 1 selected\n");
|
||||
break;
|
||||
|
||||
case( 0x8A80 ):
|
||||
case 0x8A80:
|
||||
bx_iodebug_s.register_select = 0;
|
||||
bx_iodebug_c::add_range(
|
||||
bx_iodebug_s.registers[0],
|
||||
bx_iodebug_c::add_range(bx_iodebug_s.registers[0],
|
||||
bx_iodebug_s.registers[1]);
|
||||
bx_iodebug_s.registers[0] = 0;
|
||||
bx_iodebug_s.registers[1] = 0;
|
||||
break;
|
||||
|
||||
#if BX_DEBUGGER
|
||||
case( 0x8AE0 ):
|
||||
fprintf( stderr, "request return to dbg prompt received, 0x8AE0 command (iodebug)\n");
|
||||
case 0x8AE0:
|
||||
fprintf(stderr, "request return to dbg prompt received, 0x8AE0 command (iodebug)\n");
|
||||
bx_guard.interrupt_requested=1;
|
||||
break;
|
||||
|
||||
case( 0x8AE2):
|
||||
fprintf( stderr, "request made by the guest os to disable tracing, iodebug port 0x8A00->0x8AE2\n");
|
||||
case 0x8AE2:
|
||||
fprintf(stderr, "request made by the guest os to disable tracing, iodebug port 0x8A00->0x8AE2\n");
|
||||
BX_CPU(dbg_cpu)->trace = 0;
|
||||
break;
|
||||
|
||||
case( 0x8AE3 ):
|
||||
fprintf( stderr, "request made by the guest os to enable tracing, iodebug port 0x8A00->0x8AE3\n");
|
||||
case 0x8AE3:
|
||||
fprintf(stderr, "request made by the guest os to enable tracing, iodebug port 0x8A00->0x8AE3\n");
|
||||
BX_CPU(dbg_cpu)->trace = 1;
|
||||
break;
|
||||
|
||||
case( 0x8AE4 ):
|
||||
fprintf( stderr, "request made by the guest os to disable register tracing, iodebug port 0x8A00->0x8AE4\n");
|
||||
case 0x8AE4:
|
||||
fprintf(stderr, "request made by the guest os to disable register tracing, iodebug port 0x8A00->0x8AE4\n");
|
||||
BX_CPU(dbg_cpu)->trace_reg = 0;
|
||||
break;
|
||||
|
||||
case( 0x8AE5 ):
|
||||
fprintf( stderr, "request made by the guest os to enable register tracing, iodebug port 0x8A00->0x8AE5\n");
|
||||
case 0x8AE5:
|
||||
fprintf(stderr, "request made by the guest os to enable register tracing, iodebug port 0x8A00->0x8AE5\n");
|
||||
BX_CPU(dbg_cpu)->trace_reg = 1;
|
||||
break;
|
||||
|
||||
#endif
|
||||
|
||||
case( 0x8AFF ):
|
||||
case 0x8AFF:
|
||||
bx_iodebug_s.enabled = 0;
|
||||
// fprintf( stderr, "IODEBUG device deactivated\n");
|
||||
// fprintf(stderr, "IODEBUG device deactivated\n");
|
||||
// break;
|
||||
|
||||
// default:
|
||||
@ -160,46 +140,51 @@ void bx_iodebug_c::write( Bit32u addr, Bit32u dvalue, unsigned int io_len )
|
||||
|
||||
|
||||
// Static function
|
||||
void bx_iodebug_c::mem_write( BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
void bx_iodebug_c::mem_write(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
{
|
||||
unsigned int area;
|
||||
if( !bx_iodebug_s.enabled ) return;
|
||||
if(! bx_iodebug_s.enabled) return;
|
||||
|
||||
area = bx_iodebug_c::range_test( addr, len );
|
||||
unsigned area = bx_iodebug_c::range_test(addr, len);
|
||||
// Device is enabled, testing address ranges
|
||||
if( area )
|
||||
if(area)
|
||||
{
|
||||
area--;
|
||||
#if BX_DEBUGGER
|
||||
fprintf( stdout, "%s @ eip: " FMT_ADDRX " wrote at monitored memory location %8X\n", cpu->name, cpu->get_ip(), addr);
|
||||
fprintf(stdout, "%s @ eip: " FMT_ADDRX " wrote at monitored memory location %8X\n", cpu->name, cpu->get_ip(), addr);
|
||||
bx_guard.interrupt_requested=1;
|
||||
#else
|
||||
fprintf( stderr,
|
||||
fprintf(stderr,
|
||||
"IODEBUG write to monitored memory area: %2i\tby EIP:\t\t" FMT_ADDRX "\n\trange start: \t\t%08X\trange end:\t%08X\n\taddress accessed:\t%08X\tdata written:\t",
|
||||
area,
|
||||
cpu->get_ip(),
|
||||
bx_iodebug_s.monitored_mem_areas_start[area],
|
||||
bx_iodebug_s.monitored_mem_areas_end[area],
|
||||
(unsigned int)addr);
|
||||
|
||||
Bit32u data32 = * (Bit32u *)data;
|
||||
Bit16u data16 = (Bit16u)data32;
|
||||
Bit8u data8 = (Bit8u)data32;
|
||||
(unsigned) addr);
|
||||
|
||||
switch(len)
|
||||
{
|
||||
case(1):
|
||||
fprintf(stderr,"%02X\n", (unsigned int)data8);
|
||||
case 1: {
|
||||
Bit8u data8 = * ((Bit8u *) data);
|
||||
fprintf(stderr,"%02X\n", (unsigned) data8);
|
||||
break;
|
||||
|
||||
case(2):
|
||||
fprintf(stderr,"%04X\n", (unsigned int)data16);
|
||||
}
|
||||
case 2: {
|
||||
Bit16u data16 = * ((Bit16u *) data);
|
||||
fprintf(stderr,"%04X\n", (unsigned) data16);
|
||||
break;
|
||||
|
||||
case(4):
|
||||
fprintf(stderr,"%08X\n", (unsigned int)data32);
|
||||
}
|
||||
case 4: {
|
||||
Bit32u data32 = * ((Bit32u *) data);
|
||||
fprintf(stderr,"%08X\n", (unsigned) data32);
|
||||
break;
|
||||
|
||||
}
|
||||
case 8: {
|
||||
Bit64u data64 = * ((Bit64u *) data);
|
||||
fprintf(stderr,"%08X%08x\n",
|
||||
(unsigned) (data64 >> 32),
|
||||
(unsigned) (data64 & 0xffffffff));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
fprintf(stderr, "unsupported write size\n");
|
||||
}
|
||||
@ -207,78 +192,82 @@ void bx_iodebug_c::mem_write( BX_CPU_C *cpu, Bit32u addr, unsigned len, void *da
|
||||
}
|
||||
}
|
||||
|
||||
void bx_iodebug_c::mem_read( BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
void bx_iodebug_c::mem_read(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
{
|
||||
unsigned int area;
|
||||
if( !bx_iodebug_s.enabled ) return;
|
||||
if(! bx_iodebug_s.enabled) return;
|
||||
|
||||
area = bx_iodebug_c::range_test( addr, len );
|
||||
unsigned area = bx_iodebug_c::range_test(addr, len);
|
||||
// Device is enabled, testing address ranges
|
||||
if( area )
|
||||
if(area)
|
||||
{
|
||||
area--;
|
||||
#if BX_DEBUGGER
|
||||
fprintf( stdout, "%s @ eip: " FMT_ADDRX " wrote at monitored memory location %8X\n", cpu->name, cpu->get_ip(), addr);
|
||||
fprintf(stdout, "%s @ eip: " FMT_ADDRX " wrote at monitored memory location %8X\n", cpu->name, cpu->get_ip(), addr);
|
||||
bx_guard.interrupt_requested=1;
|
||||
#else
|
||||
fprintf( stderr,
|
||||
fprintf(stderr,
|
||||
"IODEBUG read to monitored memory area: %2i\tby EIP:\t\t" FMT_ADDRX "\n\trange start: \t\t%08X\trange end:\t%08X\n\taddress accessed:\t%08X\tdata written:\t",
|
||||
area,
|
||||
cpu->get_ip(),
|
||||
bx_iodebug_s.monitored_mem_areas_start[area],
|
||||
bx_iodebug_s.monitored_mem_areas_end[area],
|
||||
(unsigned int)addr);
|
||||
|
||||
Bit32u data32 = * (Bit32u *)data;
|
||||
Bit16u data16 = (Bit16u)data32;
|
||||
Bit8u data8 = (Bit8u)data32;
|
||||
(unsigned) addr);
|
||||
|
||||
switch(len)
|
||||
{
|
||||
case(1):
|
||||
fprintf(stderr,"%02X\n", (unsigned int)data8);
|
||||
case 1: {
|
||||
Bit8u data8 = * ((Bit8u *) data);
|
||||
fprintf(stderr,"%02X\n", (unsigned) data8);
|
||||
break;
|
||||
|
||||
case(2):
|
||||
fprintf(stderr,"%04X\n", (unsigned int)data16);
|
||||
}
|
||||
case 2: {
|
||||
Bit16u data16 = * ((Bit16u *) data);
|
||||
fprintf(stderr,"%04X\n", (unsigned) data16);
|
||||
break;
|
||||
|
||||
case(4):
|
||||
fprintf(stderr,"%08X\n", (unsigned int)data32);
|
||||
}
|
||||
case 4: {
|
||||
Bit32u data32 = * ((Bit32u *) data);
|
||||
fprintf(stderr,"%08X\n", (unsigned) data32);
|
||||
break;
|
||||
|
||||
}
|
||||
case 8: {
|
||||
Bit64u data64 = * ((Bit64u *) data);
|
||||
fprintf(stderr,"%08X%08x\n",
|
||||
(unsigned) (data64 >> 32),
|
||||
(unsigned) (data64 & 0xffffffff));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
fprintf(stderr, "unsupported write size\n");
|
||||
fprintf(stderr, "unsupported read size\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int bx_iodebug_c::range_test( Bit32u addr, unsigned int len )
|
||||
unsigned bx_iodebug_c::range_test(Bit32u addr, unsigned len)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for(i=0;i<BX_IODEBUG_MAX_AREAS;i++)
|
||||
for(unsigned i=0;i<BX_IODEBUG_MAX_AREAS;i++)
|
||||
{
|
||||
if( (bx_iodebug_s.monitored_mem_areas_start[i]!=0) ||
|
||||
(bx_iodebug_s.monitored_mem_areas_end[i]!=0) )
|
||||
if((bx_iodebug_s.monitored_mem_areas_start[i]!=0) ||
|
||||
(bx_iodebug_s.monitored_mem_areas_end[i]!=0))
|
||||
{
|
||||
if( (Bit32u)(addr+len-1) < bx_iodebug_s.monitored_mem_areas_start[i] )
|
||||
if((Bit32u)(addr+len-1) < bx_iodebug_s.monitored_mem_areas_start[i])
|
||||
continue;
|
||||
if( addr < bx_iodebug_s.monitored_mem_areas_end[i] )
|
||||
|
||||
if(addr < bx_iodebug_s.monitored_mem_areas_end[i])
|
||||
{
|
||||
return(++i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
void bx_iodebug_c::add_range( Bit32u addr_start, Bit32u addr_end )
|
||||
void bx_iodebug_c::add_range(Bit32u addr_start, Bit32u addr_end)
|
||||
{
|
||||
unsigned int i;
|
||||
for(i=0;i<BX_IODEBUG_MAX_AREAS;i++)
|
||||
for(unsigned i=0;i<BX_IODEBUG_MAX_AREAS;i++)
|
||||
{
|
||||
if( !bx_iodebug_s.monitored_mem_areas_start[i] &&
|
||||
!bx_iodebug_s.monitored_mem_areas_end[i] )
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: iodebug.h,v 1.7 2002-10-26 03:53:22 bdenney Exp $
|
||||
// $Id: iodebug.h,v 1.8 2006-03-03 12:55:37 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
#ifndef _BX_IODEBUG_H
|
||||
@ -7,29 +7,30 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define BX_IODEBUG_THIS this->
|
||||
#if BX_SUPPORT_IODEBUG
|
||||
|
||||
#define BX_IODEBUG_MAX_AREAS 30
|
||||
#define BX_IODEBUG_MAX_AREAS 30
|
||||
|
||||
class bx_iodebug_c : public bx_devmodel_c
|
||||
{
|
||||
class bx_iodebug_c : public bx_devmodel_c {
|
||||
public:
|
||||
bx_iodebug_c( void );
|
||||
~bx_iodebug_c( void );
|
||||
bx_iodebug_c();
|
||||
~bx_iodebug_c() {}
|
||||
virtual void init(void);
|
||||
virtual void reset (unsigned type);
|
||||
virtual void reset (unsigned type) {}
|
||||
static void mem_write( BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data);
|
||||
static void mem_read( BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data);
|
||||
|
||||
private:
|
||||
static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len);
|
||||
static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
|
||||
Bit32u read(Bit32u addr, unsigned int io_len);
|
||||
void write(Bit32u addr, Bit32u dvalue, unsigned int io_len);
|
||||
static unsigned int range_test(Bit32u addr, unsigned int len);
|
||||
static void add_range( Bit32u addr_start, Bit32u addr_end);
|
||||
|
||||
Bit32u read(Bit32u addr, unsigned io_len);
|
||||
void write(Bit32u addr, Bit32u dvalue, unsigned io_len);
|
||||
static unsigned range_test(Bit32u addr, unsigned len);
|
||||
static void add_range(Bit32u addr_start, Bit32u addr_end);
|
||||
};
|
||||
|
||||
extern bx_iodebug_c bx_iodebug;
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: memory.cc,v 1.47 2006-03-02 23:16:13 sshwarts Exp $
|
||||
// $Id: memory.cc,v 1.48 2006-03-03 12:55:37 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -34,15 +34,14 @@
|
||||
BX_MEM_C::writePhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
{
|
||||
Bit8u *data_ptr;
|
||||
Bit32u a20addr;
|
||||
Bit32u a20addr = A20ADDR(addr);
|
||||
|
||||
// Note: accesses should always be contained within a single page now.
|
||||
|
||||
#if BX_SUPPORT_IODEBUG
|
||||
bx_iodebug_c::mem_write(cpu, addr, len, data);
|
||||
bx_iodebug_c::mem_write(cpu, a20addr, len, data);
|
||||
#endif
|
||||
|
||||
a20addr = A20ADDR(addr);
|
||||
BX_INSTR_PHY_WRITE(cpu->which_cpu(), a20addr, len);
|
||||
|
||||
#if BX_DEBUGGER
|
||||
@ -83,6 +82,11 @@ BX_MEM_C::writePhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data
|
||||
if ( (a20addr + len) <= BX_MEM_THIS len ) {
|
||||
// all of data is within limits of physical memory
|
||||
if ( (a20addr & 0xfff80000) != 0x00080000 ) {
|
||||
if (len == 8) {
|
||||
WriteHostQWordToLittleEndian(&vector[a20addr], *(Bit64u*)data);
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
return;
|
||||
}
|
||||
if (len == 4) {
|
||||
WriteHostDWordToLittleEndian(&vector[a20addr], *(Bit32u*)data);
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
@ -189,13 +193,12 @@ inc_one:
|
||||
BX_MEM_C::readPhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
{
|
||||
Bit8u *data_ptr;
|
||||
Bit32u a20addr;
|
||||
Bit32u a20addr = A20ADDR(addr);
|
||||
|
||||
#if BX_SUPPORT_IODEBUG
|
||||
bx_iodebug_c::mem_read(cpu, addr, len, data);
|
||||
bx_iodebug_c::mem_read(cpu, a20addr, len, data);
|
||||
#endif
|
||||
|
||||
a20addr = A20ADDR(addr);
|
||||
BX_INSTR_PHY_READ(cpu->which_cpu(), a20addr, len);
|
||||
|
||||
#if BX_DEBUGGER
|
||||
@ -231,6 +234,10 @@ BX_MEM_C::readPhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)
|
||||
if ( (a20addr + len) <= BX_MEM_THIS len ) {
|
||||
// all of data is within limits of physical memory
|
||||
if ( (a20addr & 0xfff80000) != 0x00080000 ) {
|
||||
if (len == 8) {
|
||||
ReadHostQWordFromLittleEndian(&vector[a20addr], * (Bit64u*) data);
|
||||
return;
|
||||
}
|
||||
if (len == 4) {
|
||||
ReadHostDWordFromLittleEndian(&vector[a20addr], * (Bit32u*) data);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user