Example #1
0
void ror()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  ror8(t);
  set_memb(a, t);
}
Example #2
0
void lsr()
{
  uint16_t a = GET_EAB;
  uint8_t v = get_memb(a);

  lsr8(v);
  set_memb(a, v);
}
Example #3
0
void neg()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  neg8(t);
  set_memb(a, t);
}
Example #4
0
void inc()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  inc8(t);
  set_memb(a, t);
}
Example #5
0
void dec()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  dec8(t);
  set_memb(a, t);
}
Example #6
0
void com()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  com8(t);
  set_memb(a, t);
}
Example #7
0
void asr()
{
  uint16_t a = GET_EAB;
  uint8_t t = get_memb(a);

  asr8(t);
  set_memb(a, t);
}
Example #8
0
unsigned int disassemble(unsigned int addr)
{
  int d = get_memb(addr);
  int s, i;
  tt_u8 pb;
  char reg;
  const unsigned char *map = NULL;

  // Default for most undefined opcodes
  unsigned char sm = 0x10; // size_mode byte
  unsigned char oi = OP_XX; // opcode index

  FILE *stream = &ser0stream;

  if (d == 0x10) {
    d = get_memb(addr + 1); 
    map = map1;
  }

  if (d == 0x11) {
    d = get_memb(addr + 1);
    map = map2;
  }

  if (map) {
    // Search for the opcode in map1 or map2
    map -= 3;
    do {
      map += 3;
      if (pgm_read_byte(map) == d) {
	oi = pgm_read_byte(++map);
	sm = pgm_read_byte(++map);
	break;
      }
    } while (*map < 255);
  } else {
    // Lookup directly in map0
    map = map0 + 2 * d;
    oi = pgm_read_byte(map++);
    sm = pgm_read_byte(map++);
  }

  s = sm >> 4;

  fprintf(stream, "%04X ", addr);

  for (i = 0; i < s; i++) {
    fputs(hex8str(get_memb(addr + i)), stream);
    fputc(' ', stream);
  }
  for (i = s; i < 4; i++) {
    fputs("   ", stream);
  }

  const char *ip = inst + oi * 4; 
  for (i = 0; i < 4; i++)
    fputc(pgm_read_byte(ip++), stream);

  fputs("  ", stream);

  
  switch(sm & 15) {
  case 1:             /* immediate */
    fputs("#$", stream);
    if (s == 2)
      fputs(hex8str(get_memb(addr + 1)), stream);
    else
      fputs(hex16str(get_memw(addr + s - 2)), stream);
    break;
  case 2:             /* direct */
    fputs("$", stream);
    fputs(hex8str(get_memb(addr + s - 1)), stream);
    break;
  case 3:             /* indexed */
    pb = get_memb(addr + s - 1);
    reg = regi[(pb >> 5) & 0x03];

    if (!(pb & 0x80)) {       /* n4,R */
      if (pb & 0x10)
	fprintf(stream, "-$%s,%c", hex8str(((pb & 0x0f) ^ 0x0f) + 1), reg);
      else
	fprintf(stream, "$%s,%c", hex8str(pb & 0x0f), reg);
    }
    else {
      if (pb & 0x10)
	fputc('[', stream);
      switch (pb & 0x0f) {
      case 0:                 /* ,R+ */
	fprintf(stream, ",%c+", reg);
	break;
      case 1:                 /* ,R++ */
	fprintf(stream, ",%c++", reg);
	break;
      case 2:                 /* ,-R */
	fprintf(stream, ",-%c", reg);
	break;
      case 3:                 /* ,--R */
	fprintf(stream, ",--%c", reg);
	break;
      case 4:                 /* ,R */
	fprintf(stream, ",%c", reg);
	break;
      case 5:                 /* B,R */
	fprintf(stream, "B,%c", reg);
	break;
      case 6:                 /* A,R */
	fprintf(stream, "A,%c", reg);
	break;
      case 8:                 /* n7,R */
	s += 1;
	fprintf(stream, "$%s,%c", hex8str(get_memb(addr + s - 1)), reg);
	break;
      case 9:                 /* n15,R */
	s += 2;
	fprintf(stream, "$%s,%c", hex16str(get_memw(addr + s - 2)), reg);
	break;
      case 11:                /* D,R */
	fprintf(stream, "D,%c", reg);
	break;
      case 12:                /* n7,PCR */
	s += 1;
	fprintf(stream, "$%s,PCR", hex8str(get_memb(addr + s - 1)));
	break;
      case 13:                /* n15,PCR */
	s += 2;
	fprintf(stream, "$%s,PCR", hex16str(get_memw(addr + s - 2)));
	break;
      case 15:                /* [n] */
	s += 2;
	fprintf(stream, "$%s", hex16str(get_memw(addr + s - 2)));
	break;
      default:
	fputs("??", stream);
	break; }
      if (pb & 0x10)
	fputc(']', stream);
    }
    break;
  case 4:          /* extended */
    fprintf(stream, "$%s", hex16str(get_memw(addr + s - 2)));
    break;
  case 5:          /* inherent */
    pb = get_memb(addr + 1);
    switch (d) {
    case 0x1e: case 0x1f:              /* exg tfr */
      fprintf(stream, "%s,%s", exgi[(pb >> 4) & 0x0f], exgi[pb & 0x0f]);
      break; 
    case 0x1a: case 0x1c: case 0x3c:   /* orcc andcc cwai */
      fprintf(stream, "#$%s=%s", hex8str(pb), ccstr(pb));
      break;
    case 0x34:                         /* pshs */
      {
	int p = 0;

	for (i = 0; i < 8; i++) {
	  if (pb & 0x80) {
	    if (p)
	      fputc(',', stream);
	    fputs(pshsregi[i], stream);
	    p = 1;
	  }
	  pb <<= 1;
	}
      }
      break;
    case 0x35:                         /* puls */
      {
	int p = 0;

	for (i = 7; i >= 0; i--) {
	  if (pb & 0x01) {
	    if (p)
	      fputc(',', stream);
	    fputs(pshsregi[i], stream);
	    p = 1;
	  }
	  pb >>= 1;
	}
      }
      break;
    case 0x36:                         /* pshu */
      {
	int p = 0;

	for (i = 0; i < 8; i++) {
	  if (pb & 0x80) {
	    if (p)
	      fputc(',', stream);
	    fputs(pshuregi[i], stream);
	    p = 1;
	  }
	  pb <<= 1;
	}
      }
      break;
    case 0x37:                         /* pulu */
      {
	int p = 0;

	for (i = 7; i >= 0; i--) {
	  if (pb & 0x01) {
	    if (p)
	      fputc(',', stream);
	    fputs(pshuregi[i], stream);
	    p = 1;
	  }
	  pb >>= 1;
	}
      }
      break;
    }
    break; 
  case 6:             /* relative */
    {
      tt_s16 v;

      if (s == 2)
	v = (tt_s16)(tt_s8)get_memb(addr + 1);
      else
	v = (tt_s16)get_memw(addr + s - 2);
      fprintf(stream, "$%s", hex16str(addr + (tt_u16)s + v));
      break;
    }
  }
  fputc('\n', stream);

  return addr + s;
}