Exemplo n.º 1
0
Arquivo: nop.c Projeto: nocrew/ostis
static void nop(struct cpu *cpu, WORD op)
{
  ENTER;

  ADD_CYCLE(4);
  cpu_prefetch();
}
Exemplo n.º 2
0
static void movep(struct cpu *cpu, WORD op)
{
  LONG d,a;
  int dr,ar;

  ENTER;

  ar = op&0x7;
  dr = (op&0xe00)>>9;
  a = bus_read_word(cpu->pc);
  if(a&0x8000) a |= 0xffff0000;
  a += cpu->a[ar];
  cpu->pc += 2;
    
  switch((op&0xc0)>>6) {
  case 0:
    d = (bus_read_byte(a)<<8)|bus_read_byte(a+2);
    cpu->d[dr] = (cpu->d[dr]&0xffff0000)|(d&0xffff);
    ADD_CYCLE(16);
    return;
  case 1:
    d = ((bus_read_byte(a)<<24)|
	 (bus_read_byte(a+2)<<16)|
	 (bus_read_byte(a+4)<<8)|
	 (bus_read_byte(a+6)));
    cpu->d[dr] = d;
    ADD_CYCLE(24);
    return;
  case 2:
    d = cpu->d[dr]&0xffff;
    cpu_prefetch();
    bus_write_byte(a, (BYTE)((d&0xff00)>>8));
    bus_write_byte(a+2, (BYTE)((d&0xff)));
    ADD_CYCLE(16);
    return;
  case 3:
    d = cpu->d[dr];
    cpu_prefetch();
    bus_write_byte(a, (BYTE)((d&0xff000000)>>24));
    bus_write_byte(a+2, (BYTE)((d&0xff0000)>>16));
    bus_write_byte(a+4, (BYTE)((d&0xff00)>>8));
    bus_write_byte(a+6, (BYTE)((d&0xff)));
    ADD_CYCLE(24);
    return;
  }
}
Exemplo n.º 3
0
Arquivo: jsr.c Projeto: nocrew/ostis
static void jsr(struct cpu *cpu, WORD op)
{
  LONG newpc;
  
  ENTER;

  ADD_CYCLE(12);
  cpu->cyclecomp = 1;
  newpc = ea_get_addr(cpu, op&0x3f);
  cpu->a[7] -= 4;
  cpu_prefetch();
  bus_write_long(cpu->a[7], cpu->pc);
  cpu->pc = newpc;
  if(newpc != cpu->a[7] && newpc != (cpu->a[7]+2)) {
    cpu_clear_prefetch();
    cpu_prefetch();
  }
  cprint_set_label(cpu->pc, NULL);
}
Exemplo n.º 4
0
Arquivo: jmp.c Projeto: nocrew/ostis
static void jmp(struct cpu *cpu, WORD op)
{
  ENTER;

  ADD_CYCLE(4);
  cpu->cyclecomp = 1;
  cpu->pc = ea_get_addr(cpu, op&0x3f);
  cprint_set_label(cpu->pc, NULL);
  cpu_prefetch();
}
Exemplo n.º 5
0
Arquivo: swap.c Projeto: nocrew/ostis
static void swap(struct cpu *cpu, WORD op)
{
  int r;

  r = op&0x7;

  cpu->d[r] = ((cpu->d[r]&0xffff0000)>>16)|((cpu->d[r]&0xffff)<<16);
  ADD_CYCLE(4);
  cpu_set_flags_move(cpu, cpu->d[r]&0x80000000, cpu->d[r]);
  cpu_prefetch();
}
Exemplo n.º 6
0
static void ori_to_ccr(struct cpu *cpu, WORD op)
{
  WORD d;

  ENTER;

  ADD_CYCLE(20);
  d = bus_read_word(cpu->pc)&0x1f;
  cpu->pc += 2;
  cpu_set_sr(cpu->sr|d);
  cpu_prefetch();
}
Exemplo n.º 7
0
Arquivo: unlk.c Projeto: nocrew/ostis
static void unlk(struct cpu *cpu, WORD op)
{
  int r;

  ENTER;

  r = op&0x7;

  cpu->a[7] = cpu->a[r];
  cpu->a[r] = bus_read_long(cpu->a[7]);
  cpu->a[7] += 4;

  ADD_CYCLE(12);
  cpu_prefetch();
}
Exemplo n.º 8
0
Arquivo: tst.c Projeto: nocrew/ostis
static void tst(struct cpu *cpu, WORD op)
{
  ENTER;

  switch((op&0xc0)>>6) {
  case 0:
    tst_b(cpu, op);
    break;
  case 1:
    tst_w(cpu, op);
    break;
  case 2:
    tst_l(cpu, op);
    break;
  }
  cpu_prefetch();
}
Exemplo n.º 9
0
Arquivo: negx.c Projeto: nocrew/ostis
static void negx(struct cpu *cpu, WORD op)
{
  ENTER;

  switch((op&0xc0)>>6) {
  case 0:
    negx_b(cpu, op);
    break;
  case 1:
    negx_w(cpu, op);
    break;
  case 2:
    negx_l(cpu, op);
    break;
  }
  if(!cpu->has_prefetched)
    cpu_prefetch();
}
Exemplo n.º 10
0
Arquivo: link.c Projeto: lokedhs/ostis
static void link(struct cpu *cpu, WORD op)
{
  int r;
  LONG d;

  ENTER;

  d = bus_read_word(cpu->pc);
  cpu->pc += 2;
  if(d&0x8000) d |= 0xffff0000;
  
  r = op&0x7;

  cpu->a[7] -= 4;
  cpu_prefetch();
  bus_write_long(cpu->a[7], cpu->a[r]);
  cpu->a[r] = cpu->a[7];
  cpu->a[7] += d;

  ADD_CYCLE(16);
}
Exemplo n.º 11
0
Arquivo: subx.c Projeto: nocrew/ostis
static void subx_b(struct cpu *cpu, WORD op)
{
  BYTE s,d,r;

  int rx,ry;

  rx = (op&0xe00)>>9;
  ry = op&0x7;

  if(op&0x8) {
    if(ry == 7)
      cpu->a[ry] -= 2;
    else
      cpu->a[ry] -= 1;
    s = bus_read_byte(cpu->a[ry]);
    if(rx == 7)
      cpu->a[rx] -= 2;
    else
      cpu->a[rx] -= 1;
    d = bus_read_byte(cpu->a[rx]);
    r = d-s;
    if(CHKX) r -= 1;
    cpu_prefetch();
    bus_write_byte(cpu->a[rx], r);
    ADD_CYCLE(18);
  } else {
    s = cpu->d[ry]&0xff;
    d = cpu->d[rx]&0xff;
    r = d-s;
    if(CHKX) r -= 1;
    cpu->d[rx] = (cpu->d[rx]&0xffffff00)|r;
    ADD_CYCLE(4);
  }

  cpu_set_flags_subx(cpu, s&0x80, d&0x80, r&0x80, r);
}
Exemplo n.º 12
0
Arquivo: bcc.c Projeto: nocrew/ostis
void bcc(struct cpu *cpu, WORD op)
{
  SLONG o;
  int w;

  ENTER;
  
  w = 0;
  o = (SLONG)(SBYTE)(op&0xff);
  if(!o) {
    o = bus_read_word(cpu->pc);
    if(o&0x8000) o |= 0xffff0000;
    o -= 2;
    cpu->pc += 2;
    w = 1;
  }
  switch((op&0xf00)>>8) {
  case 0: /* BRA */
    ADD_CYCLE(10);
    cpu->pc += o;
    break;
  case 1: /* BSR */
    ADD_CYCLE(18);
    cpu->a[7] -= 4;
    bus_write_long(cpu->a[7], cpu->pc);
    cpu->pc += o;
    break;
  case 2: /* BHI */
    if(!CHKC && !CHKZ) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 3: /* BLS */
    if(CHKC || CHKZ) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 4: /* BCC */
    if(!CHKC) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 5: /* BCS */
    if(CHKC) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 6: /* BNE */
    if(!CHKZ) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 7: /* BEQ */
    if(CHKZ) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 8: /* BVC */
    if(!CHKV) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 9: /* BVS */
    if(CHKV) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 10: /* BPL */
    if(!CHKN) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 11: /* BMI */
    if(CHKN) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 12: /* BGE */
    if((CHKN && CHKV) || (!CHKN && !CHKV)) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 13: /* BLT */
    if((CHKN && !CHKV) || (!CHKN && CHKV)) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 14: /* BGT */
    if((CHKN && CHKV && !CHKZ) || (!CHKN && !CHKV && !CHKZ)) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  case 15: /* BLE */
    if(CHKZ || (CHKN && !CHKV) || (!CHKN && CHKV)) {
      ADD_CYCLE(10);
      cpu->pc += o;
    } else {
      ADD_CYCLE(8);
      if(w) ADD_CYCLE(4);
    }
    break;
  }
  cpu_prefetch();
}
Exemplo n.º 13
0
Arquivo: scc.c Projeto: nocrew/ostis
void scc(struct cpu *cpu, WORD op)
{
  scc1(cpu, op);
  if(!cpu->has_prefetched)
    cpu_prefetch();
}