/* dtmdump: Multiple format DECtape dumper */ /* Dumps 4 words per line, in octal, 6-bit, 5x7-bit, and opcodes */ /* No args - straight stdin to stdout */ /* but input read 256 words at a time to allow reversed blocks */ #include int mangle (int k) { int i,n; n = 0; k = ~k; for (i=0;i<6;i++) { n = (n<<3)+(k&7); k = k>>3; } return n; } void six (int k) { k = k&63; if ((k&32)==0) k+=64; printf("%c",k); } void seven (int k) { k = k&127; if ((k==127)||(k<32)) k = '_'; printf("%c",k); } int op (int k) { static char *s[16]={ "CAL","DAC","JMS","DZM","LAC","XOR","ADD","TAD", "XCT","ISZ","AND","SAD","JMP","IOT","EAE","OPR"}; printf(" %s",s[(k>>14)&15]); if (k&020000) {printf("%c",'*'); return 0;} return 1; } void decode (int where, int a, int b, int c, int d) { static int oa,ob,oc,od,n=0; if ((where>=0)&&n&&(oa==a)&&(ob==b)&&(oc==c)&&(od==d)) { n++; return; } if (n>1) printf(" %d lines the same\n",n-1); if (where<0) {n = 0; return;} n = 1; oa = a; ob = b; oc = c; od = d; printf("%06o %06o %06o %06o %06o ",where&((1<<18)-1), a&((1<<18)-1),b&((1<<18)-1),c&((1<<18)-1),d&((1<<18)-1)); six(a>>12); six(a>>6); six(a); six(b>>12); six(b>>6); six(b); six(c>>12); six(c>>6); six(c); six(d>>12); six(d>>6); six(d); printf(" "); seven(a>>11); seven(a>>4); seven((a<<3)+((b>>15)&7)); seven(b>>8); seven(b>>1); seven(c>>11); seven(c>>4); seven((c<<3)+((d>>15)&7)); seven(d>>8); seven(d>>1); if (op(a)) printf(" "); if (op(b)) printf(" "); if (op(c)) printf(" "); op(d); printf("\n"); } main(){ int B[256]; int block,i,a,b; block=0; while (1) { i = fread(B,4,256,stdin); if (i==256) { printf("\nBlock %d/0%o - forwards\n\n",block,block); for (i=0;i<256;i+=4) decode((block<<8)+i,B[i],B[i+1],B[i+2],B[i+3]); decode(-1,0,0,0,0); printf("\nBlock %d/0%o - backwards\n\n",block,block); for (i=0;i<256;i+=4) decode((block<<8)+i, mangle(B[255-i]),mangle(B[254-i]),mangle(B[253-i]),mangle(B[252-i])); decode(-1,0,0,0,0); } else { if (i) printf("Block %d/0%o - too short (%d words)\n",block,block,i); exit(0); } block++; } }