case TCON:
return sprint(p, "%lud", a->val);
case TREG:
case TREG|TH:
switch(a->len){
case 1:
return sprint(p, "%c%c", "ACDB"[a->reg], "LH"[(a->tag & TH) != 0]);
case 4:
*p++ = 'E';
case 2:
p += sprint(p, "%c%c",
"ACDBSBSDECSDFGIF"[a->reg],
"XXXXPPIISSSSSSPL"[a->reg]);
return p - s;
}
case TMEM:
break;
}
/* setup trap jump in case we dereference bad memory */
memmove(jmp, a->cpu->jmp, sizeof jmp);
if(setjmp(a->cpu->jmp)){
p += sprint(p, "<%.4lux:%.4lux>", a->seg, a->off);
goto out;
}
switch(a->atype){
default:
abort();
case AAp:
p += sprint(p, "[%.4lux:%.4lux]", a->seg, a->off);
break;
case AJb:
case AJv:
p += sprint(p, "[%.4lux]", a->off);
break;
case AIc:
p += sprint(p, "$%.2lx", ars(a));
break;
case AIb:
case AIw:
case AIv:
p += sprint(p, "$%.*lux", (int)a->len*2, ar(a));
break;
case AMp:
*p++ = '*';
case AEb:
case AEw:
case AEv:
case AM:
case AMa:
case AMa2:
case AOb:
case AOv:
if(i->sreg != RDS)
p += sprint(p, "%cS:", "ECSDFG"[i->sreg - RES]);
if(a->atype == AOb || a->atype == AOv || (i->mod == 0 &&
((i->alen == 2 && i->rm == 6) ||
(i->alen == 4 &&
((i->rm == 5) ||
(i->rm == 4 && i->index == 4 && i->base == 5)))))){
p += sprint(p, "[%.*lux]", (int)i->alen*2, a->off);
break;
}
*p++ = '[';
if(i->alen == 2)
p += sprint(p, "%s", memstr16[i->rm]);
else{
if(i->rm == 4){
if(i->index != 4)
p += sprint(p, "%c*%s+", "1248"[i->scale], memstr32[i->index]);
if(i->base != 5)
p += sprint(p, "%s", memstr32[i->base]);
else{
if(i->mod == 0)
p += sprint(p, "%.4lux", i->off);
else
p += sprint(p, "EBP");
}
} else
p += sprint(p, "%s", memstr32[i->rm]);
}
if(i->mod != 0)
p += sprint(p, "%+lx", i->disp);
*p++ = ']';
break;
case AXb:
case AXv:
if(a->sreg != RDS)
p += sprint(p, "%cS:", "ECSDFG"[a->sreg - RES]);
p += sprint(p, "[SI]");
break;
case AYb:
case AYv:
if(a->sreg != RDS)
p += sprint(p, "%cS:", "ECSDFG"[a->sreg - RES]);
p += sprint(p, "[DI]");
break;
}
if(i->op == OJUMP){
switch(i->code){
case 0xE3:
p += sprint(p, "%s ", "JCXZ");
break;
case 0xEB:
case 0xE9:
case 0xEA:
case 0xFF:
p += sprint(p, "%s ", "JMP");
break;
default:
p += sprint(p, "%s ", jmpstr[i->code&0xF]);
break;
}
} else
p += sprint(p, "%s ", opstr[i->op]);
for(;;){
if(i->a1 == nil)
break;
p += argconv(p, i, i->a1);
if(i->a2 == nil)
break;
*p++ = ',';
*p++ = ' ';
p += argconv(p, i, i->a2);
if(i->a3 == nil)
break;
*p++ = ',';
*p++ = ' ';
p += argconv(p, i, i->a3);
break;
}
*p = 0;
fmtstrcpy(fmt, buf);
return 0;
}