コード例 #1
0
void test_ldw_x_shortoff_sp(void){
  SET_SP(0X2B11);
  uint8_t instr[] = {0XFB, 0X11};
  
  MEM_WRITE_WORD(0X2B22 , 0xAE11);  //0x2B11 + 0X11 = 0X2B22
  
  TEST_ASSERT_EQUAL_INT8(2, ldw_x_shortoff_sp(instr));  
  TEST_ASSERT_EQUAL_INT16(0xAE11, X);
}
コード例 #2
0
void test_ldw_x_shortmem(void){
  uint8_t shortMEM    = 0xAD;
  MEM_WRITE_WORD(shortMEM, 0xAE11);
  
  uint8_t instr[] = {0XBB, shortMEM};
  
  TEST_ASSERT_EQUAL_INT8(2, ldw_x_shortmem(instr));
  TEST_ASSERT_EQUAL_INT16(0xAE11, X);
}
コード例 #3
0
void test_ldw_x_longoff_x(void){
  SET_X(0X2B11);
  uint8_t instr[] = {0XFB, 0X11, 0x11};
  
  MEM_WRITE_WORD(0X3c22 , 0xAE11);  //0x2B11 + 0X1111 = 0X3c22
  
  TEST_ASSERT_EQUAL_INT8(3, ldw_x_longoff_x(instr)); 
  TEST_ASSERT_EQUAL_INT8(0xAE11, X );
}
コード例 #4
0
void test_ldw_x_longmem(void){
  uint16_t longmem = 0x1101;
  MEM_WRITE_WORD(longmem, 0xAE11);
  
  uint8_t instr[] = {0XBB, 0x11, 0x01};

  TEST_ASSERT_EQUAL_INT8(3, ldw_x_longmem(instr));
  TEST_ASSERT_EQUAL_INT8(0xAE11, X );
}
コード例 #5
0
void test_ldw_y_shortoff_y(void){
  SET_Y(0X2B11);
  uint8_t instr[] = {0XFB, 0X11};
  
  MEM_WRITE_WORD(0X2B22 , 0xAE11);  //0x2B11 + 0X11 = 0X2B22
  
  TEST_ASSERT_EQUAL_INT8(3, ldw_y_shortoff_y(instr));  
  TEST_ASSERT_EQUAL_INT8(0xAE11, Y );
}
コード例 #6
0
void test_ldw_x_shortptr_w(void){
  uint8_t instr[] = {0XFB, 0X13};
  
  MEM_WRITE_BYTE(0X13 , 0xAA );  
  MEM_WRITE_BYTE(0X14 , 0xBB);  
  MEM_WRITE_WORD(0xAABB , 0xAE11);  
  
  TEST_ASSERT_EQUAL_INT8(3, ldw_x_shortptr_w(instr));  
  TEST_ASSERT_EQUAL_INT8(0xAE11, X );
}
コード例 #7
0
void test_ldw_x_x(void){
  SET_X(0X102B);
  
  uint8_t instr[] = {0XFB};

  MEM_WRITE_WORD(0X102B , 0xAE11);
  
  TEST_ASSERT_EQUAL_INT8(1, ldw_x_x(instr));
  TEST_ASSERT_EQUAL_INT8(0xAE11, X );
}
コード例 #8
0
void test_ldw_y_y(void){
  SET_Y(0X102B);
  
  uint8_t instr[] = {0XFB};

  MEM_WRITE_WORD(0X102B , 0xAE11);
  
  TEST_ASSERT_EQUAL_INT8(2, ldw_y_y(instr));
  TEST_ASSERT_EQUAL_INT8(0xAE11, Y );
}
コード例 #9
0
void test_ldw_x_longptr_w(void){
  uint8_t instr[] = {0XFB, 0X13, 0X15};
  
  MEM_WRITE_BYTE(0X1315 , 0xAA );  
  MEM_WRITE_BYTE(0X1316 , 0xBB);  
  MEM_WRITE_WORD(0xAABB , 0xAE11);  
  
  TEST_ASSERT_EQUAL_INT8(4, ldw_x_longptr_w(instr)); 
  TEST_ASSERT_EQUAL_INT8(0xAE11, X );
}
コード例 #10
0
void test_ldw_y_shortptr_w_y(void){ 
  SET_Y(0X0011);
  uint8_t instr[] = {0XFB, 0X13};
  
  MEM_WRITE_BYTE(0X13 , 0x11);  
  MEM_WRITE_BYTE(0X14 , 0x11);  
  MEM_WRITE_WORD(0x1122 , 0xAE11);  // 0X1111 + 0X11 = 0X1122
  
  TEST_ASSERT_EQUAL_INT8(3, ldw_y_shortptr_w_y(instr));  
  TEST_ASSERT_EQUAL_INT16(0xAE11, Y);
}
コード例 #11
0
void test_ldw_x_longptr_w_x(void){
  SET_X(0X0011);
  uint8_t instr[] = {0XFB, 0X13, 0X00};
  
  MEM_WRITE_BYTE(0X1300 , 0xAA );  
  MEM_WRITE_BYTE(0X1301 , 0xBB);  
  MEM_WRITE_WORD(0xAACC , 0xAE11);  // 0XAABB + 0X11 = 0XAACC
  
  TEST_ASSERT_EQUAL_INT8(4, ldw_x_longptr_w_x(instr));  
  TEST_ASSERT_EQUAL_INT16(0xAE11, X );
}
コード例 #12
0
ファイル: sim-fast.c プロジェクト: plessl/zippy
/* load program into simulated state */
void
sim_load_prog(char *fname,		/* program to load */
	      int argc, char **argv,	/* program arguments */
	      char **envp)		/* program environment */
{
  /* load program text and data, set up environment, memory, and regs */
  ld_load_prog(fname, argc, argv, envp, &regs, mem, TRUE);

#ifdef TARGET_ALPHA
  /* pre-decode text segment */
  {
    unsigned i, num_insn = (ld_text_size + 3) / 4;

    fprintf(stderr, "** pre-decoding %u insts...", num_insn);

    /* allocate decoded text space */
    dec = mem_create("dec");

    for (i=0; i < num_insn; i++)
      {
	enum md_opcode op;
	md_inst_t inst;
	md_addr_t PC;

	/* compute PC */
	PC = ld_text_base + i * sizeof(md_inst_t);

	/* get instruction from memory */
	MD_FETCH_INST(inst, mem, PC);

	/* decode the instruction */
	MD_SET_OPCODE(op, inst);

	/* insert into decoded opcode space */
	MEM_WRITE_WORD(dec, PC << 1, (word_t)op);
	MEM_WRITE_WORD(dec, (PC << 1)+sizeof(word_t), inst);
      }
    fprintf(stderr, "done\n");
  }
#endif /* TARGET_ALPHA */
}
コード例 #13
0
ファイル: memory.c プロジェクト: palmerc/lab
/* generic memory access function, it's safe because alignments and permissions
   are checked, handles any natural transfer sizes; note, faults out if nbytes
   is not a power-of-two or larger then MD_PAGE_SIZE */
enum md_fault_type
mem_access(struct mem_t *mem,		/* memory space to access */
	   enum mem_cmd cmd,		/* Read (from sim mem) or Write */
	   md_addr_t addr,		/* target address to access */
	   void *vp,			/* host memory address to access */
	   int nbytes)			/* number of bytes to access */
{
  byte_t *p = vp;

  /* check alignments */
  if (/* check size */(nbytes & (nbytes-1)) != 0
      || /* check max size */nbytes > MD_PAGE_SIZE)
    return md_fault_access;

  if (/* check natural alignment */(addr & (nbytes-1)) != 0)
    return md_fault_alignment;

  /* perform the copy */
  switch (nbytes)
    {
    case 1:
      if (cmd == Read)
	*((byte_t *)p) = MEM_READ_BYTE(mem, addr);
      else
	MEM_WRITE_BYTE(mem, addr, *((byte_t *)p));
      break;

    case 2:
      if (cmd == Read)
	*((half_t *)p) = MEM_READ_HALF(mem, addr);
      else
	MEM_WRITE_HALF(mem, addr, *((half_t *)p));
      break;

    case 4:
      if (cmd == Read)
	*((word_t *)p) = MEM_READ_WORD(mem, addr);
      else
	MEM_WRITE_WORD(mem, addr, *((word_t *)p));
      break;

#ifdef HOST_HAS_QUAD
    case 8:
      if (cmd == Read)
	*((quad_t *)p) = MEM_READ_QUAD(mem, addr);
      else
	MEM_WRITE_QUAD(mem, addr, *((quad_t *)p));
      break;
#endif /* HOST_HAS_QUAD */

    default:
      {
	/* nbytes >= 8/16 and power of two */
	unsigned words = nbytes >> 2;

	if (cmd == Read)
	  {
	    while (words-- > 0)
	      {
		*((word_t *)p) = MEM_READ_WORD(mem, addr);
		p += sizeof(word_t);
		addr += sizeof(word_t);
	      }
	  }
	else
	  {
	    while (words-- > 0)
	      {
		MEM_WRITE_WORD(mem, addr, *((word_t *)p));
		p += sizeof(word_t);
		addr += sizeof(word_t);
	      }
	  }
      }
      break;
    }

  /* no fault... */
  return md_fault_none;
}