#include #include #include "dis.h" /* * Intel style target * * This target uses another mnemonics: * spr = spr1, spr2 * mov = set, seti * add = add, addi * jsr = jsr * ret = return * wait = break * jmp = jmp * setv = setvec * jnz = dbra * je, jne, jg, jge, jl, jle = si (=, !=, >, >=, <, <=) * pal = fade * vec = vec * page = setws * clr = clr * copy = copy * show = show * kill = bigend * text = text * sub = sub * and = andi * or = ori * shl = lsl * shr = lsr * snd = play * ld = load * mus = song */ void intel_printlabel(int i) { if(i != -1) { if(label[i].type != LT_JUMP && adr != 0) fputc('\n', fp); if(label[i].type == LT_CALL) fprintf(fp, "; Procedure code\n"); else if(label[i].type == LT_VEC) fprintf(fp, "; Task code\n"); fprintf(fp, "L%i:\n", i); } if(printadr) fprintf(fp, "/* %5u */", adr); fprintf(fp, "\t"); } void intel_printopcode(uint16_t op, uint16_t x, uint16_t y, uint16_t z, uint16_t w, int label) { char *s; char c1[16], c2[16], c3[16]; if(op & 0x80) { fprintf(fp, "spr\t[%xh], %u, %u\n", w, x, y); } else if(op & 0x40) { char *seg = ""; switch(op & 48) { case 0: snprintf(c1, 16, "%i", (int16_t)x); break; case 16: snprintf(c1, 16, "v%u", x); break; case 32: snprintf(c1, 16, "%u", x); break; case 48: snprintf(c1, 16, "%u", x+256); break; } switch(op & 12) { case 0: snprintf(c2, 16, "%i", (int16_t)y); break; case 4: snprintf(c2, 16, "v%u", y); break; case 8: case 12: snprintf(c2, 16, "%u", y); break; } switch(op & 3) { case 0: snprintf(c3, 16, "%u", z); break; case 1: snprintf(c3, 16, "v%u", z); break; case 2: snprintf(c3, 16, "%u", z); break; case 3: seg = "2:"; snprintf(c3, 16, "%u", z); break; } fprintf(fp, "spr\t[%s%xh], %s, %s, %s\n", seg, w, c1, c2, c3); } else { switch(op) { case 0x0: fprintf(fp, "mov\tv%u, %i\n", x, (int16_t)y); break; case 0x1: fprintf(fp, "mov\tv%u, v%u\n", x, y); break; case 0x2: fprintf(fp, "add\tv%u, v%u\n", x, y); break; case 0x3: fprintf(fp, "add\tv%u, %u\n", x, y); break; case 0x4: fprintf(fp, "jsr\tL%u\n", label); break; case 0x5: fprintf(fp, "ret\n"); break; case 0x6: fprintf(fp, "wait\n"); break; case 0x7: fprintf(fp, "jmp\tL%u\n", label); break; case 0x8: fprintf(fp, "setv\t%u, L%u\n", x, label); break; case 0x9: fprintf(fp, "jnz\tv%u, L%u\n", x, label); break; case 0xA: if(w & 0x80) snprintf(c1, 16, "v%u", y); else if(w & 0x40) snprintf(c1, 16, "%i", (int16_t)y); else snprintf(c1, 16, "%u", y); switch(w & 0x7) { case 0: s = "je"; break; case 1: s = "jne"; break; case 2: s = "jg"; break; case 3: s = "jge"; break; case 4: s = "jl"; break; case 5: s = "jle"; break; default: s = "unk_jmp"; } fprintf(fp, "%s\tv%u, %s, L%u\n", s, x, c1, label); break; case 0xB: fprintf(fp, "pal\t%u\n", x); break; case 0xC: fprintf(fp, "vec\t%u, %u, %u\n", x, y, z); break; case 0xD: fprintf(fp, "page\t%u\n", x); break; case 0xE: fprintf(fp, "clr\t%u, %u\n", x, y); break; case 0xF: fprintf(fp, "copy\t%u, %u\n", x, y); break; case 0x10: fprintf(fp, "show\t%u\n", x); break; case 0x11: fprintf(fp, "kill\n"); break; case 0x12: fprintf(fp, "text\t%u, %u, %u, %u\n", z, x, y, w); break; case 0x13: fprintf(fp, "sub\tv%u, v%u\n", x, y); break; case 0x14: fprintf(fp, "and\tv%u, %u\n", x, y); break; case 0x15: fprintf(fp, "or\tv%u, %u\n", x, y); break; case 0x16: fprintf(fp, "shl\tv%u, %u\n", x, y); break; case 0x17: fprintf(fp, "shr\tv%u, %u\n", x, y); break; case 0x18: fprintf(fp, "snd\t%u, %u, %u, %u\n", z, x, y, w); break; case 0x19: fprintf(fp, "ld\t%u\n", x); break; case 0x1A: fprintf(fp, "mus\t%u, %u, %u\n", x, y, z); break; default: fprintf(fp, "unk_%x\n", op); } } }