Interdata_v6/usr/source/cmds/od.c
int word[16];
char gbuf[512];
int fi;
int convt;
int base 010;
int basem 01000;
int max;
int gidx;
int gcnt;
int eof;
int addr[2];
int from[2];
int key;
int flag;
int nword 8;
main(argc, argv)
char **argv;
{
extern fout; /***/
int f, k, w, i, a[2];
char *p;
fout = dup(1); /***/
argv++;
if(argc > 1) {
p = *argv;
if(*p == '-') {
while((i = *p++) != '\0') {
switch(i) {
case 'o':
convt =| 001;
f = 6;
break;
case 'd':
convt =| 002;
f = 5;
break;
case 'a':
convt =| 004;
f = 4;
break;
case 'h':
convt =| 010;
f = 4;
break;
case 'c':
convt =| 020;
f = 5;
break;
case 'b':
convt =| 040;
f = 7;
break;
}
if(f > max)
max = f;
}
argc--;
argv++;
}
}
if(!convt) {
max = 6;
convt = 1;
}
if(argc > 1)
if(**argv != '+') {
fi = open(*argv, 0);
if(fi < 0) {
printf("cannot open %s\n", *argv);
goto done;
}
argv++;
argc--;
}
if(argc > 1)
offset(*argv);
loop:
f = 1;
a[0] = addr[0];
a[1] = addr[1];
for(i=0; i<nword; i++) {
w = getw();
if(eof)
break;
word[i] = w;
if(i)
f =& w==k; else
k = w;
}
if(i)
if(f && !eof) {
if(!(flag && k==key)) {
dupl();
key = k;
from[0] = a[0];
from[1] = a[1];
}
flag =+ i;
} else {
dupl();
line(a, word, i);
}
if(!eof)
goto loop;
puta(addr);
putchar('\n');
done:
flush();
}
dupl()
{
if(flag) {
flag = 0;
line(from, &key, 1);
}
}
puta(a)
int a[2];
{
putn(a[0], base, 4);
putn(a[1], base, 3);
putchar(' ');
}
line(a, w, n)
int w[];
{
int i, f, c;
f = 1;
for(c=1; c; c=+c) {
if((c&convt) == 0)
continue;
if(f) {
puta(a);
f = 0;
} else
for(i=0; i<8; i++)
putchar(' ');
for(i=0; i<n; i++) {
putx(w[i], c);
putchar(i==n-1? '\n': ' ');
}
}
}
putx(n, c)
{
switch(c) {
case 001:
pre(6);
putn(n, 8, 6);
break;
case 002:
pre(5);
putn(n, 10, 5);
break;
case 004:
pre(4);
putop(n);
break;
case 010:
pre(4);
putn(n, 16, 4);
break;
case 020:
pre(5);
/***/ putch(n>>8);
putchar(' ');
/***/ putch(n);
break;
case 040:
pre(7);
putn(n&0377, 8, 3);
putchar(' ');
putn((n>>8)&0377, 8, 3);
break;
}
}
getw()
{
int b1, b2;
b1 = getc();
if(b1 == -1) {
eof = 1;
return(0);
}
b2 = getc();
if(b2 == -1)
b2 = 0;
return(b2|(b1<<8)); /*** note: bytes reversed for pdp-11 ***/
}
getc()
{
if(gidx >= gcnt) {
gcnt = read(fi, gbuf, 512);
if(gcnt <= 0)
return(-1);
gidx = 0;
}
if(++addr[1] >= basem) {
addr[0]++;
addr[1] = 0;
}
return(gbuf[gidx++]&0377);
}
putch(c)
{
c =& 0377;
if(c>037 && c<0177 && c!='\\') {
putchar(' ');
putchar(c);
return;
}
putchar('\\');
switch(c) {
case '\0':
putchar('0');
break;
case '\n':
putchar('n');
break;
case '\\':
putchar('\\');
break;
case '\t':
putchar('t');
break;
default:
putchar('?');
}
}
putn(n, b, c)
{
if(!c)
return;
putn(ldiv(0,n,b),b,c-1);
if((n=lrem(0,n,b)) > 9)
putchar(n-10+'a'); else
putchar(n+'0');
}
pre(n)
{
int i;
for(i=n; i<max; i++)
putchar(' ');
}
offset(s)
char s[];
{
char *p;
int a[2], d, i, j, b;
p = s;
while(*p++);
i = p-s-1;
b = 0;
if(i > 0)
if(p[-2] == 'b') {
i--;
b++;
p--;
}
if(i > 0)
if(p[-2] == '.') {
i--;
base = 10;
basem = 1000;
}
a[0] = 0;
for(j=0; i-j>3; j++) {
d = s[j];
if(d>='0' && d<='9')
a[0] = a[0]*base + d-'0';
}
a[1] = 0;
for(; i-j>0; j++) {
d = s[j];
if(d>='0' && d<='9')
a[1] = a[1]*base + d-'0';
}
if(b) {
i = a[0]*basem+a[1];
a[0] = 0;
a[1] = 0;
while(i--) {
a[1] =+ 512;
while(a[1] >= basem) {
a[1] =- basem;
a[0]++;
}
}
}
i = 0;
while(a[0] > addr[0]+1) {
addr[1] =+ 512;
while(addr[1] >= basem) {
addr[1] =- basem;
addr[0]++;
}
i++;
}
seek(fi, i, 3);
while(a[0]!=addr[0] || a[1]!=addr[1])
if(getc() == -1)
break;
}
putop(n)
{
char *p;
int i, c;
p = getop(n);
for(i=0; (c = *p++) != '\0'; i++)
putchar(c);
for(; i<4; i++)
putchar(' ');
}
/* INTERDATA opcode mnemonics */
char nil[] "";
char *mnem[] {
nil,
"balr",
"btcr",
"bfcr",
"nr",
"clr",
"or",
"xr",
"lr",
"cr",
"ar",
"sr",
"mhr",
"dhr",
nil,
nil,
"srls",
"slls",
"chvr",
nil,
nil,
nil,
nil,
nil,
"lpsr",
nil,
nil,
nil,
"mr",
"dr",
nil,
nil,
"btbs",
"btfs",
"bfbs",
"bffs",
"lis",
"lcs",
"ais",
"sis",
"ler",
"cer",
"aer",
"ser",
"mer",
"der",
"fxr",
"flr",
nil,
nil,
nil,
nil,
"exhr",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"sth",
"bal",
"btc",
"bfc",
"nh",
"clh",
"oh",
"xh",
"lh",
"ch",
"ah",
"sh",
"mh",
"dh",
nil,
nil,
"st",
"am",
nil,
nil,
"n",
"cl",
"o",
"x",
"l",
"c",
"a",
"s",
"m",
"d",
"cr12",
"cr16",
"ste",
"ahm",
nil,
nil,
"atl",
"abl",
"rtl",
"rbl",
"le",
"ce",
"ae",
"se",
"me",
"de",
nil,
nil,
nil,
"stme",
"lme",
"lhl",
"tbt",
"sbt",
"rbt",
"cbt",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"srls",
"slls",
"stbr",
"lbr",
"exbr",
"epsr",
"wbr",
"rbr",
"whr",
"rhr",
"wdr",
"rdr",
nil,
"ssr",
"ocr",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"bxh",
"bxle",
"lpsw",
"thi",
"nhi",
"clhi",
"ohi",
"xhi",
"lhi",
"chi",
"ahi",
"shi",
"srhl",
"slhl",
"srha",
"slha",
"stm",
"lm",
"stb",
"lb",
"clb",
"al",
"wb",
"rb",
"wh",
"rh",
"wd",
"rd",
nil,
"ss",
"oc",
nil,
"ts",
"svc",
"sint",
"scp",
nil,
nil,
"la",
"tlat",
nil,
nil,
"rrl",
"rll",
"srl",
"sll",
"sra",
"sla",
nil,
nil,
nil,
"ti",
"ni",
"cli",
"oi",
"xi",
"li",
"ci",
"ai",
"si",
nil,
nil,
nil,
nil
};
getop(n)
{
return(mnem[n>>8]);
/*** pdp-11 deletions ***
switch(n&0170000)
{
case 0000000:
switch(n&0177000)
{
case 0004000:
return("jsr");
case 0077000:
return("sob");
}
switch(n&0177400)
{
case 0000400:
return("br");
case 0001000:
return("bne");
case 0001400:
return("beq");
case 0002000:
return("bge");
case 0002400:
return("blt");
case 0003000:
return("bgt");
case 0003400:
return("ble");
}
switch(n&0177700)
{
case 0000100:
return("jmp");
case 0000300:
return("swab");
case 0005000:
return("clr");
case 0005100:
return("com");
case 0005200:
return("inc");
case 0005300:
return("dec");
case 0005400:
return("neg");
case 0005500:
return("adc");
case 0005600:
return("sbc");
case 0005700:
return("tst");
case 0006000:
return("ror");
case 0006100:
return("rol");
case 0006200:
return("asr");
case 0006300:
return("asl");
case 0006400:
return("mark");
case 0006500:
return("mfpi");
case 0006600:
return("mtpi");
case 0006700:
return("sxt");
}
switch(n&0177740)
{
case 0000240:
return("flag");
}
switch(n&0177770)
{
case 0000200:
return("rts");
case 0000230:
return("spl");
}
switch(n&0177777)
{
case 0000000:
return("halt");
case 0000001:
return("wait");
case 0000002:
return("rti");
case 0000003:
return("bpt");
case 0000004:
return("iot");
case 0000005:
return("rset");
case 0000006:
return("rtt");
}
break;
case 0010000:
return("mov ");
case 0020000:
return("cmp");
case 0030000:
return("bit");
case 0040000:
return("bic");
case 0050000:
return("bis");
case 0060000:
return("add");
case 0070000:
switch(n&0177000)
{
case 0070000:
return("mul");
case 0071000:
return("div");
case 0072000:
return("ash");
case 0073000:
return("ashc");
case 0074000:
return("xor");
}
break;
case 0100000:
switch(n&0177400)
{
case 0100000:
return("bpl");
case 0100400:
return("bmi");
case 0101000:
return("bhi");
case 0101400:
return("blos");
case 0102000:
return("bvc");
case 0102400:
return("bvs");
case 0103000:
return("bhis");
case 0103400:
return("blo");
case 0104000:
return("emt");
case 0104400:
return("sys");
}
switch(n&0177700)
{
case 0105000:
return("clrb");
case 0105100:
return("comb");
case 0105200:
return("incb");
case 0105300:
return("decb");
case 0105400:
return("negb");
case 0105500:
return("adcb");
case 0105600:
return("sbcb");
case 0105700:
return("tstb");
case 0106000:
return("rorb");
case 0106100:
return("rolb");
case 0106200:
return("asrb");
case 0106300:
return("aslb");
case 0106500:
return("mfpd");
case 0106600:
return("mfpd");
}
break;
case 0110000:
return("movb");
case 0120000:
return("cmpb");
case 0130000:
return("bitb");
case 0140000:
return("bicb");
case 0150000:
return("bisb");
case 0160000:
return("sub");
case 0170000:
switch(n&01777000)
{
case 0:0;
}
break;
}
*** end of pdp-11 deletions ***/
}