1*37da2899SCharles.Forsyth #include "lib9.h" 2*37da2899SCharles.Forsyth #include "isa.h" 3*37da2899SCharles.Forsyth #include "interp.h" 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsyth void decgen(int); 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsyth /* 8*37da2899SCharles.Forsyth * Force intermediate dereference of $o(o(reg)) modes to ensure intermediate 9*37da2899SCharles.Forsyth * pointer is valid. This is required if you want secure memory. 10*37da2899SCharles.Forsyth */ 11*37da2899SCharles.Forsyth #define SOFTMMU 0 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsyth void main(void)14*37da2899SCharles.Forsythmain(void) 15*37da2899SCharles.Forsyth { 16*37da2899SCharles.Forsyth int i; 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth print("/* Machine generated by decgen.c */\n\n"); 19*37da2899SCharles.Forsyth 20*37da2899SCharles.Forsyth print("#include \"lib9.h\"\n"); 21*37da2899SCharles.Forsyth print("#include \"isa.h\"\n"); 22*37da2899SCharles.Forsyth print("#include \"interp.h\"\n\n"); 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth print("#define DIND(reg, xxx) (uchar*)((*(ulong*)(R.reg+R.PC->xxx.i.f))+R.PC->xxx.i.s)\n"); 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth for(i = 0; i < 256; i++) 27*37da2899SCharles.Forsyth decgen(i); 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth print("\nvoid (*dec[])(void) =\n{\n"); 30*37da2899SCharles.Forsyth for(i = 0; i < 256; i++) 31*37da2899SCharles.Forsyth print("\tD%.2uX%c\n", i, i != 255 ? ',' : ' '); 32*37da2899SCharles.Forsyth print("};\n"); 33*37da2899SCharles.Forsyth } 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth void decgen(int addr)36*37da2899SCharles.Forsythdecgen(int addr) 37*37da2899SCharles.Forsyth { 38*37da2899SCharles.Forsyth int nodst; 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth print("static void\nD%.2uX(void)\n{\n", addr); 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth switch(USRC(addr)) { 43*37da2899SCharles.Forsyth case AMP: 44*37da2899SCharles.Forsyth print("\tR.s = R.MP+R.PC->s.ind;\n"); 45*37da2899SCharles.Forsyth break; 46*37da2899SCharles.Forsyth case AFP: 47*37da2899SCharles.Forsyth print("\tR.s = R.FP+R.PC->s.ind;\n"); 48*37da2899SCharles.Forsyth break; 49*37da2899SCharles.Forsyth case AIMM: 50*37da2899SCharles.Forsyth print("\tR.s = (uchar*)&R.PC->s.imm;\n"); 51*37da2899SCharles.Forsyth break; 52*37da2899SCharles.Forsyth case AMP|AIND: 53*37da2899SCharles.Forsyth if(SOFTMMU) { 54*37da2899SCharles.Forsyth print("R.s = R.MP+R.PC->s.i.f\n"); 55*37da2899SCharles.Forsyth print("R.s = *(WORD**)R.s\n"); 56*37da2899SCharles.Forsyth print("R.s = (uchar*)R.s + R.PC->s.i.s\n"); 57*37da2899SCharles.Forsyth } 58*37da2899SCharles.Forsyth else 59*37da2899SCharles.Forsyth print("\tR.s = DIND(MP, s);\n"); 60*37da2899SCharles.Forsyth break; 61*37da2899SCharles.Forsyth case AFP|AIND: 62*37da2899SCharles.Forsyth if(SOFTMMU) { 63*37da2899SCharles.Forsyth print("R.s = R.FP+R.PC->s.i.f\n"); 64*37da2899SCharles.Forsyth print("R.s = *(WORD**)R.s\n"); 65*37da2899SCharles.Forsyth print("R.s = (uchar*)R.s + R.PC->s.i.s\n"); 66*37da2899SCharles.Forsyth } 67*37da2899SCharles.Forsyth else 68*37da2899SCharles.Forsyth print("\tR.s = DIND(FP, s);\n"); 69*37da2899SCharles.Forsyth break; 70*37da2899SCharles.Forsyth } 71*37da2899SCharles.Forsyth nodst = 0; 72*37da2899SCharles.Forsyth switch(UDST(addr)) { 73*37da2899SCharles.Forsyth default: 74*37da2899SCharles.Forsyth nodst = 1; 75*37da2899SCharles.Forsyth break; 76*37da2899SCharles.Forsyth case AMP: 77*37da2899SCharles.Forsyth print("\tR.d = R.MP+R.PC->d.ind;\n"); 78*37da2899SCharles.Forsyth break; 79*37da2899SCharles.Forsyth case AFP: 80*37da2899SCharles.Forsyth print("\tR.d = R.FP+R.PC->d.ind;\n"); 81*37da2899SCharles.Forsyth break; 82*37da2899SCharles.Forsyth case AIMM: 83*37da2899SCharles.Forsyth print("\tR.d = (uchar*)&R.PC->d.imm;\n"); 84*37da2899SCharles.Forsyth break; 85*37da2899SCharles.Forsyth case AMP|AIND: 86*37da2899SCharles.Forsyth if(SOFTMMU) { 87*37da2899SCharles.Forsyth print("R.d = R.MP+R.PC->d.i.f\n"); 88*37da2899SCharles.Forsyth print("R.d = *(WORD**)R.d\n"); 89*37da2899SCharles.Forsyth print("R.d = (uchar*)R.d + R.PC->d.i.s\n"); 90*37da2899SCharles.Forsyth } 91*37da2899SCharles.Forsyth else 92*37da2899SCharles.Forsyth print("\tR.d = DIND(MP, d);\n"); 93*37da2899SCharles.Forsyth break; 94*37da2899SCharles.Forsyth case AFP|AIND: 95*37da2899SCharles.Forsyth if(SOFTMMU) { 96*37da2899SCharles.Forsyth print("R.d = R.FP+R.PC->d.i.f\n"); 97*37da2899SCharles.Forsyth print("R.d = *(WORD**)R.d\n"); 98*37da2899SCharles.Forsyth print("R.d = (uchar*)R.d + R.PC->d.i.s\n"); 99*37da2899SCharles.Forsyth } 100*37da2899SCharles.Forsyth else 101*37da2899SCharles.Forsyth print("\tR.d = DIND(FP, d);\n"); 102*37da2899SCharles.Forsyth break; 103*37da2899SCharles.Forsyth } 104*37da2899SCharles.Forsyth 105*37da2899SCharles.Forsyth if(nodst == 0) 106*37da2899SCharles.Forsyth switch(addr&ARM) { 107*37da2899SCharles.Forsyth case AXNON: 108*37da2899SCharles.Forsyth print("\tR.m = R.d;\n"); 109*37da2899SCharles.Forsyth break; 110*37da2899SCharles.Forsyth case AXIMM: 111*37da2899SCharles.Forsyth print("\tR.t = (short)R.PC->reg;\n"); 112*37da2899SCharles.Forsyth print("\tR.m = &R.t;\n"); 113*37da2899SCharles.Forsyth break; 114*37da2899SCharles.Forsyth case AXINF: 115*37da2899SCharles.Forsyth print("\tR.m = R.FP+R.PC->reg;\n"); 116*37da2899SCharles.Forsyth break; 117*37da2899SCharles.Forsyth case AXINM: 118*37da2899SCharles.Forsyth print("\tR.m = R.MP+R.PC->reg;\n"); 119*37da2899SCharles.Forsyth break; 120*37da2899SCharles.Forsyth } 121*37da2899SCharles.Forsyth print("}\n"); 122*37da2899SCharles.Forsyth } 123