static struct cprint *bset_print(LONG addr, WORD op) { int b; struct cprint *ret; ret = cprint_alloc(addr); switch((op&0x100)>>8) { case 0: b = bus_read_word_print(addr+ret->size)&0x1f; ret->size += 2; if(op&0x38) { b &= 7; strcpy(ret->instr, "BSET.B"); } else { strcpy(ret->instr, "BSET.L"); } sprintf(ret->data, "#%d,", b); ea_print(ret, op&0x3f, 0); break; case 1: b = (op&0xe00)>>9; if(op&0x38) { strcpy(ret->instr, "BSET.B"); } else { strcpy(ret->instr, "BSET.L"); } sprintf(ret->data, "D%d,", b); ea_print(ret, op&0x3f, 0); break; } return ret; }
static struct cprint *not_print(LONG addr, WORD op) { int s; struct cprint *ret; ret = cprint_alloc(addr); s = (op&0xc0)>>6; switch(s) { case 0: strcpy(ret->instr, "NOT.B"); break; case 1: strcpy(ret->instr, "NOT.W"); break; case 2: strcpy(ret->instr, "NOT.L"); break; } ea_print(ret, op&0x3f, s); return ret; }
static struct cprint *addq_print(LONG addr, WORD op) { int s; struct cprint *ret; ret = cprint_alloc(addr); s = (op&0xe00)>>9; if(!s) s = 8; switch((op&0xc0)>>6) { case 0: strcpy(ret->instr, "ADDQ.B"); break; case 1: strcpy(ret->instr, "ADDQ.W"); break; case 2: strcpy(ret->instr, "ADDQ.L"); break; } sprintf(ret->data, "#%d,", s); ea_print(ret, op&0x3f, 0); return ret; }
static struct cprint *subi_print(LONG addr, WORD op) { int s; struct cprint *ret; ret = cprint_alloc(addr); s = (op&0xc0)>>6; switch(s) { case 0: strcpy(ret->instr, "SUBI.B"); sprintf(ret->data, "#$%x,", bus_read_word_print(addr+ret->size)&0xff); ret->size += 2; break; case 1: strcpy(ret->instr, "SUBI.W"); sprintf(ret->data, "#$%x,", bus_read_word_print(addr+ret->size)); ret->size += 2; break; case 2: strcpy(ret->instr, "SUBI.L"); sprintf(ret->data, "#$%x,", bus_read_long_print(addr+ret->size)); ret->size += 4; break; } ea_print(ret, op&0x3f, s); return ret; }
static struct cprint *jsr_print(LONG addr, WORD op) { struct cprint *ret; ret = cprint_alloc(addr); strcpy(ret->instr, "JSR"); ea_print(ret, op&0x3f, 0); return ret; }
static struct cprint *move_from_sr_print(LONG addr, WORD op) { struct cprint *ret; ret = cprint_alloc(addr); strcpy(ret->instr, "MOVE"); strcpy(ret->data, "SR,"); ea_print(ret, op&0x3f, 1); return ret; }
static struct cprint *adda_print(LONG addr, WORD op) { int r; struct cprint *ret; ret = cprint_alloc(addr); r = (op&0xe00)>>9; if(op&0x100) { strcpy(ret->instr, "ADDA.L"); ea_print(ret, op&0x3f, 2); sprintf(ret->data, "%s,A%d", ret->data, r); } else { strcpy(ret->instr, "ADDA.W"); ea_print(ret, op&0x3f, 1); sprintf(ret->data, "%s,A%d", ret->data, r); } return ret; }
static struct cprint *addi_print(LONG addr, WORD op) { BYTE b; WORD w; LONG l; int s,r; struct cprint *ret; ret = cprint_alloc(addr); s = (op&0xc0)>>6; switch(s) { case 0: strcpy(ret->instr, "ADDI.B"); b = bus_read_word_print(addr+ret->size)&0xff; r = b; if(r&0x80) r |= 0xffffff00; if((r >= -128) && (r <= 127)) sprintf(ret->data, "#%d,", r); else sprintf(ret->data, "#$%x,", r); ret->size += 2; break; case 1: strcpy(ret->instr, "ADDI.W"); w = bus_read_word_print(addr+ret->size); r = w; if(r&0x8000) r |= 0xffff0000; if((r >= -128) && (r <= 127)) sprintf(ret->data, "#%d,", r); else sprintf(ret->data, "#$%x,", r); ret->size += 2; break; case 2: strcpy(ret->instr, "ADDI.L"); l = bus_read_long_print(addr+ret->size); r = (int)*((SLONG *)&l); if((r >= -128) && (r <= 127)) sprintf(ret->data, "#%d,", r); else sprintf(ret->data, "#$%x,", r); ret->size += 4; break; } ea_print(ret, op&0x3f, s); return ret; }
static struct cprint *scc_print(LONG addr, WORD op) { static char *cond[16] = { "ST", "SF", "SHI", "SLS", "SCC", "SCS", "SNE", "SEQ", "SVC", "SVS", "SPL", "SMI", "SGE", "SLT", "SGT", "SLE" }; struct cprint *ret; ret = cprint_alloc(addr); strcpy(ret->instr, cond[(op&0xf00)>>8]); ea_print(ret, op&0x3f, 0); return ret; }
static struct cprint *mulu_print(LONG addr, WORD op) { int r; struct cprint *ret; ret = cprint_alloc(addr); r = (op&0xe00)>>9; strcpy(ret->instr, "MULU"); ea_print(ret, op&0x3f, 1); sprintf(ret->data, "%s,D%d", ret->data, r); return ret; }
static struct cprint *tst_print(LONG addr, WORD op) { struct cprint *ret; ret = cprint_alloc(addr); switch((op&0xc0)>>6) { case 0: strcpy(ret->instr, "TST.B"); break; case 1: strcpy(ret->instr, "TST.W"); break; case 2: strcpy(ret->instr, "TST.L"); break; } ea_print(ret, op&0x3f, 0); return ret; }