/* cbin2bin - convert column binary format to binary format */ #include typedef struct Word36 Word36; struct Word36 { /* 36 bit word */ int left; /* as 2 half words */ int right; }; void load36(int *rowp, Word36 *word36); void print36(int *rowp); void opcode(Word36 *word36); void printTypeA(char *s, Word36 *word36); void printTypeB(char *s, Word36 *word36); main () { int card[12][80]; /* total bits on an 80 column card */ int c1,c2; int row,col; Word36 outwords[24]; /* words in a card */ int word; for (col = 0; col < 80; col++) { c1 = fgetc(stdin) & 077; c2 = fgetc(stdin) & 077; for (row = 0; row < 6; row++) { card[row][col] = (c1 >> (5 - row)) & 01; card[row+6][col] = (c2 >> (5 - row)) & 01; } } /* loop and print */ for (row = 0; row < 12; row++) { for (col = 0; col < 80; col++) { printf("%1d",card[row][col]); if ((col == 35) || (col == 71)) { printf(" "); } } printf("\n"); } printf("\n"); for (row = 11; row >= 0; row--) { load36(&card[row][0],&outwords[2*(11-row)]); load36(&card[row][36],&outwords[2*(11-row)+1]); } for (word = 0; word < 24; word++) { printf("%06o ",outwords[word].left); printf("%06o ",outwords[word].right); opcode(&outwords[word]); printf("\n"); } } void load36(int *rowp, Word36 *word36) { int i; word36->left = 0; word36->right = 0; for (i = 0; i < 18; i++) { //printf("rowp[i]: %1d rowp[i+18] %1d \n",rowp[i],rowp[i+18]); word36->left = (word36->left | rowp[i]); word36->right = (word36->right | rowp[i+18]); //printf("left: %06o right: %06o\n",word36->left,word36->right); if (i < 17) { word36->left = word36->left << 1; word36->right = word36->right << 1; } } } void opcode(Word36 *word36) { int temp; temp = (word36->left & 0300000); if ( temp > 0) { /* Type A instruction */ temp = (word36->left & 0700000) >> 15; switch (temp) { case 01: printTypeA("TXI",word36); break; case 02: printTypeA("TIX",word36); break; case 06: printTypeA("TNX",word36); break; case 03: printTypeA("TXH",word36); break; case 07: printTypeA("TXL",word36); break; default: printf("%01o unknown Type A opcode",temp); } } else { temp = (word36->left & 0777700) >> 6; switch(temp) { case 00000: printTypeB("HTR",word36); break; case 00020: printTypeB("TRA",word36); break; case 00021: printTypeB("TTR",word36); break; case 00040: printTypeB("TLQ",word36); break; case 00074: printTypeB("TSX",word36); break; case 00100: printTypeB("TZE",word36); break; case 04100: printTypeB("TNZ",word36); break; case 00120: printTypeB("TPL",word36); break; case 04120: printTypeB("TMI",word36); break; case 00140: printTypeB("TOV",word36); break; case 04140: printTypeB("TNO",word36); break; case 00161: printTypeB("TQO",word36); break; case 00162: printTypeB("TQP",word36); break; case 00200: printTypeB("MPY",word36); break; case 04200: printTypeB("MPR",word36); break; case 00220: printTypeB("DVH",word36); break; case 00221: printTypeB("DVP",word36); break; case 00240: printTypeB("FDH",word36); break; case 00241: printTypeB("FDP",word36); break; case 00260: printTypeB("FMP",word36); break; case 04260: printTypeB("UFM",word36); break; case 00300: printTypeB("FAD",word36); break; case 04300: printTypeB("UFA",word36); break; case 00302: printTypeB("FSB",word36); break; case 04302: printTypeB("UFS",word36); break; case 00320: printTypeB("ANS",word36); break; case 04320: printTypeB("ANA",word36); break; case 04340: printTypeB("CAS",word36); break; case 00361: printTypeB("ACL",word36); break; case 00400: printTypeB("ADD",word36); break; case 04400: printTypeB("SBM",word36); break; case 00401: printTypeB("ADM",word36); break; case 00402: printTypeB("SUB",word36); break; case 00420: printTypeB("HPR",word36); break; case 00460: printTypeB("LDA",word36); break; case 00500: printTypeB("CLA",word36); break; case 04500: printTypeB("CAL",word36); break; case 04501: printTypeB("ORA",word36); break; case 00502: printTypeB("CLS",word36); break; case 00534: printTypeB("LXA",word36); break; case 04534: printTypeB("LXD",word36); break; case 00560: printTypeB("LDQ",word36); break; case 04600: printTypeB("STQ",word36); break; case 00601: printTypeB("STO",word36); break; case 00602: printTypeB("SLW",word36); break; case 04602: printTypeB("ORS",word36); break; case 04620: printTypeB("SLQ",word36); break; case 00621: printTypeB("STA",word36); break; case 00622: printTypeB("STD",word36); break; case 00630: printTypeB("STP",word36); break; case 04634: printTypeB("SXD",word36); break; case 00700: printTypeB("CPY",word36); break; case 00734: printTypeB("PAX",word36); break; case 04734: printTypeB("PDX",word36); break; case 00760: temp = word36->right & 077777; if (temp > 012) { /* PSE */ printTypeB("PSE",word36); } else { switch(temp) { case 000: printf("CLM"); break; case 001: printf("LBT"); break; case 002: printf("CHS"); break; case 003: printf("SSP"); break; case 006: printf("COM"); break; case 007: printf("ETM"); break; case 010: printf("RND"); break; case 012: printf("DCT"); break; default: printf("00760 unknown PSE address: %05o",temp); } } break; case 04760: temp = word36->right & 077777; if (temp > 012) { /* PSE */ printTypeB("MSE",word36); } else { switch(temp) { case 001: printf("PBT"); break; case 003: printf("SSM"); break; case 007: printf("LTM"); break; case 011: printf("ETT"); break; case 012: printf("RTT"); break; default: printf("00761 unknown MSE address: %05o",temp); } } break; case 00761: printTypeB("NOP",word36); break; case 00762: printTypeB("RDS",word36); break; case 00764: printTypeB("BST",word36); break; case 00766: printTypeB("WRS",word36); break; case 00770: printTypeB("WEF",word36); break; case 00772: printTypeB("REW",word36); break; case 00763: printTypeB("LLS",word36); break; case 04763: printTypeB("LGL",word36); break; case 00765: printTypeB("LRS",word36); break; case 00767: printTypeB("ALS",word36); break; case 00771: printTypeB("ARS",word36); break; case 04773: printTypeB("RQL",word36); break; default: printf("%04o unknown Type B opcode",temp); } } } void printTypeA(char *s, Word36 *word36) { int address,tag,decrement; address = word36->right & 0077777; tag = (word36->right & 0700000) >> 15; decrement = word36->left & 0077777; printf("%3s %05d,%1o,%05d",s,address,tag,decrement); } void printTypeB(char *s, Word36 *word36) { int address,tag; address = word36->right & 0077777; tag = (word36->right & 0700000) >> 15; printf("%3s %05d,%1d",s,address,tag); } void print36(int *rowp) { int i; for (i = 0; i < 36; i++) { printf("%1d",rowp[i]); } printf("\n"); }