/* 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 <stdio.h>

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++;
}

}
