📄 armmem.c
字号:
//SKYEYE_OUTREGS(stderr);
//exit(-1);
}
}
void
mem_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
//chy 2003-07-10 chy: lyh change
// bank_ptr(addr)->write_word(state, addr, data);
//mem_bank_t *mbp = bank_ptr(addr);
global_mbp = bank_ptr (addr);
//if (mbp && mbp->write_word){
if (global_mbp && global_mbp->write_word)
{
/*ywc 2005-03-31 */
/*ywc 2005-04-22 move it to real_write_word */
/*
if(!skyeye_config.no_dbct){
//teawater add for arm2x86 2005.03.18----------------------------------
tb_setdirty(state, addr, mbp);
//AJ2D----------------------------------------------------------
}
*/
//mbp->write_word(state, addr, data);
global_mbp->write_word (state, addr, data);
}
else
{
//fprintf(stderr, "SKYEYE:NumInstrs %llu, mem_write_word addr = %x no bank\n",state->NumInstrs, addr);
//chy 2003-09-03
//SKYEYE_OUTREGS(stderr);
//exit(-1);
}
}
/* if you want a wanring about strange accesses put this on the region */
ARMword
warn_read_word (ARMul_State * state, ARMword addr)
{
fprintf (stderr, "WARNING: illegal read from 0x%x @ 0x%x\n", addr,
state->pc);
return (0xffffffff);
}
void
warn_write_byte (ARMul_State * state, ARMword addr, ARMword data)
{
fprintf (stderr,
"SKYEYE: WARNING: illegal write byte to 0x%x of 0x%x @ 0x%x\n",
addr, data, state->pc);
}
void
warn_write_halfword (ARMul_State * state, ARMword addr, ARMword data)
{
fprintf (stderr,
"SKYEYE: WARNING: illegal write halfword to 0x%x of 0x%x @ 0x%x\n",
addr, data, state->pc);
}
void
warn_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
fprintf (stderr,
"SKYEYE: WARNING: illegal write word to 0x%x of 0x%x @ 0x%x\n",
addr, data, state->pc);
}
/* Accesses that map to gaps in the memory map go here: */
ARMword
fail_read_word (ARMul_State * state, ARMword addr)
{
fprintf (stderr, "illegal read from 0x%x\n", addr);
ARMul_Debug (state, 0, 0);
return (0xffffffff);
}
void
fail_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
fprintf (stderr, "illegal write to 0x%x of 0x%x\n", addr, data);
ARMul_Debug (state, 0, 0);
}
ARMword
_read_word (ARMul_State * state, ARMword addr)
{
fprintf (stderr, "undefined read from 0x%x\n", addr);
return (0xffffffff);
}
void
_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
fprintf (stderr, "undefined write to 0x%x of 0x%x\n", addr, data);
}
ARMword
real_read_byte (ARMul_State * state, ARMword addr)
{
ARMword data, offset;
/*
mem_bank_t *mbp = bank_ptr(addr);
if(!mbp)
{
fprintf(stderr, "real_read_byte. No bank at address 0x%x", addr);
return 0;
}
*/
//data = state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2];
data =
state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2];
offset = (((ARMword) state->bigendSig * 3) ^ (addr & 3)) << 3; /* bit offset into the word */
return (data >> offset & 0xffL);
}
ARMword
real_read_halfword (ARMul_State * state, ARMword addr)
{
ARMword data, offset;
/*
mem_bank_t *mbp = bank_ptr(addr);
if(!mbp)
{
fprintf(stderr, "real_read_halfword. No bank at address 0x%x", addr);
return 0;
}
*/
//data = state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2];
data =
state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2];
offset = (((ARMword) state->bigendSig * 2) ^ (addr & 2)) << 3; /* bit offset into the word */
return (data >> offset) & 0xffff;
}
ARMword
real_read_word (ARMul_State * state, ARMword addr)
{
ARMword data;
/*
mem_bank_t *mbp = bank_ptr(addr);
if(!mbp)
{
fprintf(stderr, "real_read_word. No bank at address 0x%x", addr);
return 0;
}
*/
//data = state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2];
data =
state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2];
#if 0
//chy 2003-09-02 for test ????
if (addr >= 0xa01c8000 && addr <= 0xa01c8020)
{
printf ("SKYEYE:real_read_word: addr %x, data %x, R15 %x\n", addr, data,
state->Reg[15]);
}
#endif
return data;
}
void
real_write_byte (ARMul_State * state, ARMword addr, ARMword data)
{
ARMword *temp, offset;
/*
mem_bank_t *mbp = bank_ptr(addr);
if(!mbp)
{
fprintf(stderr, "real_write_byte. No bank at address 0x%x", addr);
return;
}
*/
/*ywc 2005-04-22, I move it from mem_write_byte to here */
#ifndef NO_DBCT
if (!skyeye_config.no_dbct)
{
//teawater add for arm2x86 2005.03.18----------------------------------
//tb_setdirty(state, addr, mbp);
tb_setdirty (state, addr, global_mbp);
//AJ2D----------------------------------------------------------
}
#endif
//temp = &state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2];
temp =
&state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2];
offset = (((ARMword) state->bigendSig * 3) ^ (addr & 3)) << 3; /* bit offset into the word */
//printf(stderr,"SKYEYE real_write_byte 1: temp %x,tempval %x,offset %x, addr %x, data %x\n",temp,*temp,offset,addr,data);
*temp = (*temp & ~(0xffL << offset)) | ((data & 0xffL) << offset);
//printf(stderr,"SKYEYE real_write_byte 2: temp %x,tempval %x,offset %x, addr %x, data %x\n",temp,*temp,offset,addr,data);
//chy 2004-03-11: add lcd test
//chy 2004-03-17 fix a bug: didn't test skyeye_config.no_lcd
//chy 2004-09-29 disable blow lines
/*
if((!skyeye_config.no_lcd) && *(state->mach_io.lcd_is_enable) && addr >= *(state->mach_io.lcd_addr_begin) && addr <= *(state->mach_io.lcd_addr_end)){
//fprintf(stderr, "SKYEYE,lcd enabled write byte lcd memory addr %x, data %x\n",addr,*temp);
skyeye_config.mach->mach_lcd_write(state,addr,*temp);
}
*/
}
void
real_write_halfword (ARMul_State * state, ARMword addr, ARMword data)
{
ARMword *temp, offset;
/*
mem_bank_t *mbp = bank_ptr(addr);
if (!mbp)
{
fprintf(stderr, "real_write_halfword error. No bank at address 0x%x.\n", addr);
return;
}
*/
/*ywc 2005-04-22, I move it from mem_write_byte to here */
#ifndef NO_DBCT
if (!skyeye_config.no_dbct)
{
//teawater add for arm2x86 2005.03.18----------------------------------
//tb_setdirty(state, addr, mbp);
tb_setdirty (state, addr, global_mbp);
//AJ2D----------------------------------------------------------
}
#endif
//temp = &state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2];
temp =
&state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2];
offset = (((ARMword) state->bigendSig * 2) ^ (addr & 2)) << 3; /* bit offset into the word */
*temp = (*temp & ~(0xffffL << offset)) | ((data & 0xffffL) << offset);
//chy 2004-03-11: add lcd test
//chy 2004-03-17 fix a bug: didn't test skyeye_config.no_lcd
//chy 2004-09-29 disable blow lines
/*
if((!skyeye_config.no_lcd) && *(state->mach_io.lcd_is_enable) && addr >= *(state->mach_io.lcd_addr_begin) && addr <= *(state->mach_io.lcd_addr_end)){
//fprintf(stderr, "SKYEYE,lcd enabled write byte lcd memory addr %x, data %x\n",addr,*temp);
skyeye_config.mach->mach_lcd_write(state,addr,*temp);
}
*/
}
void
real_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
/*
mem_bank_t *mbp = bank_ptr(addr);
if(!mbp)
{
fprintf(stderr, "real_write_word. No bank at address 0x%x", addr);
return ;
}
*/
/*ywc 2005-04-22, I move it from mem_write_byte to here */
#ifndef NO_DBCT
if (!skyeye_config.no_dbct)
{
//teawater add for arm2x86 2005.03.18----------------------------------
//tb_setdirty(state, addr, mbp);
tb_setdirty (state, addr, global_mbp);
//AJ2D----------------------------------------------------------
}
#endif
//state->mem.rom[mbp - skyeye_config.mem.mem_banks][(addr - mbp->addr) >> 2] = data;
state->mem.rom[global_mbp -
skyeye_config.mem.mem_banks][(addr -
global_mbp->addr) >> 2] = data;
//chy 2004-03-11: add lcd test
//chy 2004-03-17 fix a bug: didn't test skyeye_config.no_lcd
//chy 2004-09-29 disable blow lines
/*
if((!skyeye_config.no_lcd) && *(state->mach_io.lcd_is_enable) && addr >= *(state->mach_io.lcd_addr_begin) && addr <= *(state->mach_io.lcd_addr_end)){
//fprintf(stderr, "SKYEYE,lcd enabled write byte lcd memory addr %x, data %x\n",addr,*temp);
skyeye_config.mach->mach_lcd_write(state,addr,data);
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -