⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 armmem.c

📁 这是Skyeye 0.9 版本的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
      //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 + -