#include #include #include "dis.h" /* * Eric Chahi's style target * i.e. native Another World script syntax */ void aw_printlabel(int i) { if(printadr) fprintf(fp, "%u\t", adr); if(i == -1) fprintf(fp, "\t"); else fprintf(fp, "L%i\t", i); } void aw_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, "spr1\t%u\t%u\t%u\n", w, x, y); } else if(op & 0x40) { char seg = '1'; 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, "64"); 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, "64"); break; } /* Maybe graphics segmet is changed using file name */ fprintf(fp, "spr%c\t%u\t%s\t%s\t%s\n", seg, w, c1, c2, c3); } else { switch(op) { case 0x0: fprintf(fp, "seti\tv%u\t%i\n", x, (int16_t)y); break; case 0x1: fprintf(fp, "set\tv%u\tv%u\n", x, y); break; case 0x2: fprintf(fp, "add\tv%u\tv%u\n", x, y); break; case 0x3: fprintf(fp, "addi\tv%u\t%u\n", x, y); break; case 0x4: fprintf(fp, "jsr\tL%u\n", label); break; case 0x5: fprintf(fp, "return\n"); break; case 0x6: fprintf(fp, "break\n"); break; case 0x7: fprintf(fp, "jmp\tL%u\n", label); break; case 0x8: fprintf(fp, "setvec\t%u\tL%u\n", x, label); break; case 0x9: fprintf(fp, "dbra\tv%u\tL%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 = "="; break; case 1: s = "<>"; break; case 2: s = ">"; break; case 3: s = ">="; break; case 4: s = "<"; break; case 5: s = "<="; break; default: s = "unk"; } fprintf(fp, "si\tv%u\t%s\t%s\tL%u\n", x, s, c1, label); break; case 0xB: fprintf(fp, "fade\t%u\n", x); break; case 0xC: fprintf(fp, "vec\t%u\t%u\t%u\n", x, y, z); break; case 0xD: fprintf(fp, "setws\t%u\n", x); break; case 0xE: fprintf(fp, "clr\t%u\t%u\n", x, y); break; case 0xF: fprintf(fp, "copy\t%u\t%u\n", x, y); break; case 0x10: fprintf(fp, "show\t%u\n", x); break; case 0x11: fprintf(fp, "bigend\n"); break; case 0x12: fprintf(fp, "text\t%u\t%u\t%u\t%u\n", z, x, y, w); break; case 0x13: fprintf(fp, "sub\tv%u\tv%u\n", x, y); break; case 0x14: fprintf(fp, "andi\tv%u\t%u\n", x, y); break; case 0x15: fprintf(fp, "ori\tv%u\t%u\n", x, y); break; case 0x16: fprintf(fp, "lsl\tv%u\t%u\n", x, y); break; case 0x17: fprintf(fp, "lsr\tv%u\t%u\n", x, y); break; case 0x18: fprintf(fp, "play\t%u\t%u\t%u\t%u\n", z, x, y, w); break; case 0x19: fprintf(fp, "load\t%u\n", x); break; case 0x1A: fprintf(fp, "song\t%u\t%u\t%u\n", x, y, z); break; default: fprintf(fp, "unk_%x\n", op); } } }