#define BEGIN \ int lbl[4096],imm[1024],val[1024],pc,p=2;\ main(){\ do{\ p-=1; pc=1; #define END \ }while(p);\ } #define OP(op) \ if(!p)printf("%s\n",op);\ pc+=1; #define BR0(op,k) \ if(!p)printf("%s %d\n",op,lbl[k]-pc);\ pc+=1; #define BR1(op,k,a) \ AL1("TST",a);\ if(!p)printf("%s %d\n",op,lbl[k]-pc);\ pc+=1; #define BR2(op,k,a,b) \ AL2(0x26,a,b);\ if(!p)printf("%s %d\n",op,lbl[k]-pc);\ pc+=1; #define IMM(k) \ if(k>>12){\ if(!p)printf("IMM %d\n",k>>12);\ pc+=1;\ } #define AL1(op,a) \ if(imm[a]){\ IMM(val[a]);\ if(!p)printf("%sI %d\n",op,a&0xFFF);\ pc+=1;\ }else{\ if(!p)printf("%s r%d\n",op,a);\ pc+=1;\ } #define AL2(op,a,b) \ if(imm[b]){\ IMM(val[b]);\ if(!p)printf("%.4d: %.2X_%.3X_%.3X\n",pc,op^0x60,a,val[b]&0xFFF);\ pc+=1;\ }else{\ if(!p)printf("%.4d: %.2X_%.3X_%.3X\n",pc,op,a,b);\ pc+=1;\ } #define AL3(op,a,b,c) \ if(a==b){\ if(imm[c]){\ IMM(val[c]);\ if(!p)printf("%sI r%d %d\n",op,a,val[c]&0xFFF);\ pc+=1;\ }else{\ if(!p)printf("%s r%d r%d\n",op,a,c);\ pc+=1;\ }\ }else if(a==c){\ if(imm[b]){\ IMM(val[b]);\ if(!p)printf("%sRI r%d %d\n",op,a,val[b]&0xFFF);\ pc+=1;\ }else{\ if(!p)printf("%sR r%d r%d\n",op,a,b);\ pc+=1;\ }\ }else printf("****\n"); #define FNC(k) #define REG(a) imm[a]=0; #define PTR(a) imm[a]=0; #define ARR(a,b) imm[a]=0; #define INT(a,b) imm[a]=1;val[a]=b; #define CHR(a,b) imm[a]=0; #define LBL(k) lbl[k]=pc; #define RET OP("RET") #define CALL(k) BR0("CALL",k) #define BR(k) BR0("BR",k) #define BZ(k,a) BR1("BZ",k,a) #define BNZ(k,a) BR1("BNZ",k,a) #define BEQ(k,a,b) BR2("BEQ",k,a,b) #define BNE(k,a,b) BR2("BNE",k,a,b) #define BGE(k,a,b) BR2("BGE",k,a,b) #define BGT(k,a,b) BR2("BGT",k,a,b) #define BLE(k,a,b) BR2("BLE",k,a,b) #define BLT(k,a,b) BR2("BLT",k,a,b) #define LDD(a,b,c) AL3("LDD",a,b,c) #define STD(a,b,c) AL3("STD",a,b,c) #define LD(a,b) AL2(0x62,a,b); #define ST(a,b) AL2(0x66,a,b); #define MOV(a,b) AL2(0x25,a,b) #define NEG(a,b) AL1("NEG",a,b) #define COM(a,b) AL1("COM",a,b) #define ADD(a,b,c) AL3("ADD",a,b,c) #define SUB(a,b,c) AL3("SUB",a,b,c) #define AND(a,b,c) AL3("AND",a,b,c) #define OR(a,b,c) AL3("OR",a,b,c) #define XOR(a,b,c) AL3("XOR",a,b,c) #define ASL(a,b,c) AL3("ASL",a,b,c) #define ASR(a,b,c) AL3("ASR",a,b,c) #define MUL(a,b,c) AL3("MUL",a,b,c)