mirror of
https://github.com/aap/pdp6.git
synced 2026-01-13 15:27:46 +00:00
started working on a linker
This commit is contained in:
parent
f2e9f77f69
commit
6311e92a7c
388
link/ld6.c
Normal file
388
link/ld6.c
Normal file
@ -0,0 +1,388 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include "pdp6common.h"
|
||||
|
||||
word fw(hword l, hword r) { return ((word)l << 18) | (word)r; }
|
||||
word point(word pos, word sz, hword p){ return (pos<<30)|(sz<<24)|p; }
|
||||
hword left(word w) { return (w >> 18) & 0777777; }
|
||||
hword right(word w) { return w & 0777777; }
|
||||
|
||||
/* just a subset here */
|
||||
enum ItemType
|
||||
{
|
||||
Nothing = 0,
|
||||
Code = 1,
|
||||
Symbols = 2,
|
||||
Entry = 4,
|
||||
End = 5,
|
||||
Name = 6,
|
||||
Start = 7,
|
||||
};
|
||||
|
||||
enum SymType
|
||||
{
|
||||
SymName = 000,
|
||||
SymGlobal = 004,
|
||||
SymLocal = 010,
|
||||
SymBlock = 014,
|
||||
SymGlobalH = 044, /* hidden
|
||||
SymLocalH = 050, */
|
||||
SymUndef = 060,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MAXSYM = 1000
|
||||
};
|
||||
|
||||
FILE*
|
||||
mustopen(const char *name, const char *mode)
|
||||
{
|
||||
FILE *f;
|
||||
if(f = fopen(name, mode), f == NULL){
|
||||
fprintf(stderr, "couldn't open file: %s\n", name);
|
||||
exit(1);
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
FILE *in;
|
||||
hword itemsz;
|
||||
|
||||
word mem[01000000];
|
||||
hword rel, loc;
|
||||
|
||||
int error;
|
||||
|
||||
/*
|
||||
* debugging helpers
|
||||
*/
|
||||
|
||||
void
|
||||
printinst(hword p)
|
||||
{
|
||||
printf("%06o: %06o %06o %s\n", p, left(mem[p]), right(mem[p]), disasm(mem[p]));
|
||||
}
|
||||
|
||||
void
|
||||
disasmrange(hword start, hword end)
|
||||
{
|
||||
for(; start < end; start++)
|
||||
printinst(start);
|
||||
}
|
||||
|
||||
/* emulate PDP-6 IBP instruction */
|
||||
word
|
||||
ibp(word bp)
|
||||
{
|
||||
word pos, sz, p;
|
||||
pos = (bp>>30)&077;
|
||||
sz = (bp>>24)&077;
|
||||
p = right(bp);
|
||||
if(pos >= sz)
|
||||
return point(pos-sz, sz, p);
|
||||
return point(36-sz, sz, p+1);
|
||||
}
|
||||
|
||||
/* emulate PDP-6 LDB instruction */
|
||||
word
|
||||
ldb(word bp)
|
||||
{
|
||||
word pos, sz, p;
|
||||
pos = (bp>>30)&077;
|
||||
sz = (bp>>24)&077;
|
||||
p = right(bp);
|
||||
return (mem[p]>>pos) & (1<<sz)-1;
|
||||
}
|
||||
|
||||
/* print an ASCII string in memory */
|
||||
void
|
||||
printascii(hword loc)
|
||||
{
|
||||
word bp;
|
||||
char c;
|
||||
bp = point(36, 7, loc);
|
||||
for(;;){
|
||||
c = ldb(bp = ibp(bp));
|
||||
if(c == 0)
|
||||
break;
|
||||
putchar(c);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
|
||||
word symtab[MAXSYM*2];
|
||||
word symp;
|
||||
|
||||
/* Get symbol by name */
|
||||
word*
|
||||
findsym(word name)
|
||||
{
|
||||
word p;
|
||||
word mask;
|
||||
mask = 0037777777777;
|
||||
for(p = 0; p < symp; p += 2)
|
||||
if((symtab[p]&mask) == (name&mask))
|
||||
return &symtab[p];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Extend a global request chain by writing hw at the end of
|
||||
* the chain beginning at p */
|
||||
void
|
||||
extendreq(hword p, hword hw)
|
||||
{
|
||||
while(right(mem[p]))
|
||||
p = right(mem[p]);
|
||||
mem[p] = fw(left(mem[p]), hw);
|
||||
}
|
||||
|
||||
/* Resolve a global request chain by writing hw to all locations */
|
||||
void
|
||||
resolvereq(hword p, hword hw)
|
||||
{
|
||||
hword next;
|
||||
do{
|
||||
next = right(mem[p]);
|
||||
mem[p] = fw(left(mem[p]), hw);
|
||||
p = next;
|
||||
}while(next);
|
||||
}
|
||||
|
||||
/* Insert a symbol into the symbol table. Handle linking. */
|
||||
void
|
||||
loadsym(word *newsym)
|
||||
{
|
||||
word *sym;
|
||||
int type, newtype;
|
||||
char name[8];
|
||||
|
||||
sym = findsym(newsym[0]);
|
||||
newtype = (newsym[0]>>30)&074;
|
||||
if(sym == NULL){
|
||||
/* Symbol not in table yet.
|
||||
* TODO: ignore locals? */
|
||||
// if(newtype == SymGlobal || newtype == SymGlobalH ||
|
||||
// newtype == SymUndef){
|
||||
assert(symp < MAXSYM);
|
||||
symtab[symp++] = newsym[0];
|
||||
symtab[symp++] = newsym[1];
|
||||
// }
|
||||
return;
|
||||
}
|
||||
type = unrad50(sym[0], name);
|
||||
|
||||
if(type == SymUndef){
|
||||
/* global request is in table */
|
||||
if(newtype == SymGlobal || newtype == SymGlobalH){
|
||||
/* found definition, resolve request chain
|
||||
* and insert definition into table */
|
||||
resolvereq(right(sym[1]), right(newsym[1]));
|
||||
sym[0] = newsym[0];
|
||||
sym[1] = newsym[1];
|
||||
}else if(newtype == SymUndef)
|
||||
/* extend request chain */
|
||||
extendreq(right(sym[1]), right(newsym[1]));
|
||||
}else if(type == SymGlobal || type == SymGlobalH){
|
||||
/* global definition is in table */
|
||||
if(newtype == SymGlobal || newtype == SymGlobalH){
|
||||
if(newtype == type &&
|
||||
newsym[1] == sym[1])
|
||||
return;
|
||||
fprintf(stderr, "Error: multiple definitions: %s\n", name);
|
||||
error = 1;
|
||||
}else if(newtype == SymUndef)
|
||||
/* just resolve request */
|
||||
resolvereq(right(newsym[1]), right(sym[1]));
|
||||
}
|
||||
}
|
||||
|
||||
/* print symbol table, not needed */
|
||||
void
|
||||
dumpsym(void)
|
||||
{
|
||||
int type;
|
||||
char name[8];
|
||||
word p;
|
||||
for(p = 0; p < symp; p += 2){
|
||||
type = unrad50(symtab[p], name);
|
||||
printf(" %02o %s %012lo\n", type, name, symtab[p+1]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure there are no undefined symbols left */
|
||||
void
|
||||
checkundef(void)
|
||||
{
|
||||
int type;
|
||||
char name[8];
|
||||
word p;
|
||||
for(p = 0; p < symp; p += 2){
|
||||
type = unrad50(symtab[p], name);
|
||||
if(type != SymUndef)
|
||||
continue;
|
||||
error = 1;
|
||||
printf(" Error: undefined: %s %012lo\n", name, symtab[p+1]);
|
||||
}
|
||||
}
|
||||
|
||||
word block[18];
|
||||
hword blocksz;
|
||||
|
||||
word
|
||||
getword(FILE *f)
|
||||
{
|
||||
int i, b;
|
||||
word w;
|
||||
w = 0;
|
||||
for(i = 0; i < 6; i++){
|
||||
if(b = getc(f), b == EOF)
|
||||
return ~0;
|
||||
w = (w << 6) | (b & 077);
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
void
|
||||
readblock(int mode)
|
||||
{
|
||||
word reloc;
|
||||
hword i;
|
||||
hword l, r;
|
||||
int bits;
|
||||
|
||||
blocksz = 0;
|
||||
if(itemsz == 0)
|
||||
return;
|
||||
|
||||
reloc = getword(in);
|
||||
i = 18;
|
||||
while(itemsz && i--){
|
||||
block[blocksz++] = getword(in);
|
||||
itemsz--;
|
||||
}
|
||||
|
||||
/* relocate block */
|
||||
for(i = 0; i < 18; i++){
|
||||
bits = (reloc >> 34) & 03;
|
||||
reloc <<= 2;
|
||||
if(mode == 1){
|
||||
l = left(block[i]);
|
||||
r = right(block[i]);
|
||||
if(bits & 1) r += rel;
|
||||
if(bits & 2) l += rel;
|
||||
block[i] = fw(l, r);
|
||||
/* This is weird but necessary for full word reloc */
|
||||
}else if(mode == 2){
|
||||
if(bits & 1)
|
||||
block[i] = (block[i] + rel) & 0777777777777;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
handlename(void)
|
||||
{
|
||||
word w;
|
||||
int id;
|
||||
char name[8];
|
||||
|
||||
readblock(0);
|
||||
w = block[0];
|
||||
while(itemsz)
|
||||
readblock(0);
|
||||
|
||||
id = unrad50(w, name);
|
||||
}
|
||||
|
||||
void
|
||||
handlecode(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
readblock(1);
|
||||
loc = right(block[0]);
|
||||
i = 1;
|
||||
if(i < blocksz) // hacky
|
||||
goto loop;
|
||||
while(itemsz){
|
||||
readblock(1);
|
||||
for(i = 0; i < blocksz; i++){
|
||||
loop:
|
||||
mem[loc] = block[i];
|
||||
loc++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
handlestart(void)
|
||||
{
|
||||
word w;
|
||||
readblock(1);
|
||||
w = block[0];
|
||||
while(itemsz)
|
||||
readblock(1);
|
||||
}
|
||||
|
||||
void
|
||||
handlesym(void)
|
||||
{
|
||||
int i;
|
||||
word w1, w2;
|
||||
|
||||
while(itemsz){
|
||||
readblock(2);
|
||||
i = 0;
|
||||
while(i < blocksz){
|
||||
loadsym(&block[i]);
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
skipitem(void)
|
||||
{
|
||||
while(itemsz)
|
||||
readblock(0);
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
word w;
|
||||
hword i, type;
|
||||
void (*typesw[8])(void) = {
|
||||
skipitem,
|
||||
handlecode,
|
||||
handlesym,
|
||||
skipitem,
|
||||
skipitem,
|
||||
skipitem,
|
||||
handlename,
|
||||
handlestart,
|
||||
};
|
||||
|
||||
// rel = 01000;
|
||||
in = mustopen("test.rel", "rb");
|
||||
while(w = getword(in), w != ~0){
|
||||
type = left(w);
|
||||
itemsz = right(w);
|
||||
typesw[type]();
|
||||
}
|
||||
fclose(in);
|
||||
|
||||
checkundef();
|
||||
if(error)
|
||||
return 1;
|
||||
|
||||
disasmrange(findsym(rad50(0, "LINKSR"))[1],
|
||||
findsym(rad50(0, "LINEP"))[1]);
|
||||
disasmrange(0600+rel, 0603+rel);
|
||||
|
||||
return 0;
|
||||
}
|
||||
321
link/pdp6common.c
Normal file
321
link/pdp6common.c
Normal file
@ -0,0 +1,321 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "pdp6common.h"
|
||||
|
||||
/* map ascii to radix50/squoze, also map lower to upper case */
|
||||
char
|
||||
ascii2rad(char c)
|
||||
{
|
||||
static char tab[] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
0, -1, -1, -1, 046, 047, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, 045, -1,
|
||||
001, 002, 003, 004, 005, 006, 007, 010,
|
||||
011, 012, -1, -1, -1, -1, -1, -1,
|
||||
-1, 013, 014, 015, 016, 017, 020, 021,
|
||||
022, 023, 024, 025, 026, 027, 030, 031,
|
||||
032, 033, 034, 035, 036, 037, 040, 041,
|
||||
042, 043, 044, -1, -1, -1, -1, -1,
|
||||
-1, 013, 014, 015, 016, 017, 020, 021,
|
||||
022, 023, 024, 025, 026, 027, 030, 031,
|
||||
032, 033, 034, 035, 036, 037, 040, 041,
|
||||
042, 043, 044, -1, -1, -1, -1, -1,
|
||||
};
|
||||
return tab[c&0177];
|
||||
}
|
||||
|
||||
/* map radix50/squoze to ascii */
|
||||
char
|
||||
rad2ascii(char c)
|
||||
{
|
||||
static char tab[] = {
|
||||
' ', '0', '1', '2', '3', '4', '5', '6',
|
||||
'7', '8', '9', 'A', 'B', 'C', 'D', 'E',
|
||||
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
|
||||
'V', 'W', 'X', 'Y', 'Z', '.', '$', '%'
|
||||
};
|
||||
return tab[c%050];
|
||||
}
|
||||
|
||||
/* convert ascii string + code to radix50 */
|
||||
word
|
||||
rad50(int n, const char *s)
|
||||
{
|
||||
word r;
|
||||
char c;
|
||||
int i;
|
||||
|
||||
r = 0;
|
||||
i = 0;
|
||||
for(i = 0; i < 6 && *s; i++){
|
||||
c = ascii2rad(*s++);
|
||||
if(c < 0)
|
||||
break;
|
||||
r = r*050 + c;
|
||||
}
|
||||
for(; i < 6; i++)
|
||||
r = r*050;
|
||||
r |= (word)(n&074) << 30;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* get null-terminated ascii string and code from radix50 */
|
||||
int
|
||||
unrad50(word r, char *s)
|
||||
{
|
||||
int i;
|
||||
int n;
|
||||
n = r>>30 & 074;
|
||||
r &= ~0740000000000;
|
||||
s += 6;
|
||||
*s-- = '\0';
|
||||
for(i = 0; i < 6; i++){
|
||||
*s-- = rad2ascii(r%050);
|
||||
r /= 050;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/* map ascii to sixbit, also map lower to upper case */
|
||||
char
|
||||
ascii2sixbit(char c)
|
||||
{
|
||||
static char tab[] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
000, 001, 002, 003, 004, 005, 006, 007,
|
||||
010, 011, 012, 013, 014, 015, 016, 017,
|
||||
020, 021, 022, 023, 024, 025, 026, 027,
|
||||
030, 031, 032, 033, 034, 035, 036, 037,
|
||||
040, 041, 042, 043, 044, 045, 046, 047,
|
||||
050, 051, 052, 053, 054, 055, 056, 057,
|
||||
060, 061, 062, 063, 064, 065, 066, 067,
|
||||
070, 071, 072, -1, -1, -1, -1, -1,
|
||||
-1, 041, 042, 043, 044, 045, 046, 047,
|
||||
050, 051, 052, 053, 054, 055, 056, 057,
|
||||
060, 061, 062, 063, 064, 065, 066, 067,
|
||||
070, 071, 072, -1, -1, -1, -1, -1,
|
||||
};
|
||||
return tab[c&0177];
|
||||
}
|
||||
|
||||
/* map sixbit to ascii */
|
||||
char
|
||||
sixbit2ascii(char c)
|
||||
{
|
||||
static char tab[] = {
|
||||
' ', '!', '"', '#', '$', '%', '&', '\'',
|
||||
'(', ')', '*', '+', ',', '-', '.', '/',
|
||||
'0', '1', '2', '3', '4', '5', '6', '7',
|
||||
'8', '9', ':', ';', '<', '=', '>', '?',
|
||||
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
|
||||
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
|
||||
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
|
||||
'X', 'Y', 'Z', '[', '\\', ']', '^', '_'
|
||||
|
||||
};
|
||||
return tab[c&077];
|
||||
}
|
||||
|
||||
/* convert ascii string to sixbit */
|
||||
word
|
||||
sixbit(const char *s)
|
||||
{
|
||||
word sx;
|
||||
char c;
|
||||
int i;
|
||||
sx = 0;
|
||||
i = 0;
|
||||
for(i = 0; i < 6 && *s; i++){
|
||||
c = ascii2sixbit(*s++);
|
||||
if(c < 0)
|
||||
break;
|
||||
sx = (sx<<6) + c;
|
||||
}
|
||||
sx <<= 6*(6-i);
|
||||
return sx;
|
||||
}
|
||||
|
||||
/* get null-terminated ascii string from sixbit */
|
||||
void
|
||||
unsixbit(word sx, char *s)
|
||||
{
|
||||
int i;
|
||||
s += 6;
|
||||
*s-- = '\0';
|
||||
for(i = 0; i < 6; i++){
|
||||
*s-- = sixbit2ascii(sx&077);
|
||||
sx >>= 6;
|
||||
}
|
||||
}
|
||||
|
||||
char *mnemonics[0700] = {
|
||||
"UUO00", "UUO01", "UUO02", "UUO03",
|
||||
"UUO04", "UUO05", "UUO06", "UUO07",
|
||||
"UUO10", "UUO11", "UUO12", "UUO13",
|
||||
"UUO14", "UUO15", "UUO16", "UUO17",
|
||||
"UUO20", "UUO21", "UUO22", "UUO23",
|
||||
"UUO24", "UUO25", "UUO26", "UUO27",
|
||||
"UUO30", "UUO31", "UUO32", "UUO33",
|
||||
"UUO34", "UUO35", "UUO36", "UUO37",
|
||||
"UUO40", "UUO41", "UUO42", "UUO43",
|
||||
"UUO44", "UUO45", "UUO46", "UUO47",
|
||||
"UUO50", "UUO51", "UUO52", "UUO53",
|
||||
"UUO54", "UUO55", "UUO56", "UUO57",
|
||||
"UUO60", "UUO61", "UUO62", "UUO63",
|
||||
"UUO64", "UUO65", "UUO66", "UUO67",
|
||||
"UUO70", "UUO71", "UUO72", "UUO73",
|
||||
"UUO74", "UUO75", "UUO76", "UUO77",
|
||||
|
||||
"XX100", "XX101", "XX102", "XX103",
|
||||
"XX104", "XX105", "XX106", "XX107",
|
||||
"XX110", "XX111", "XX112", "XX113",
|
||||
"XX114", "XX115", "XX116", "XX117",
|
||||
"XX120", "XX121", "XX122", "XX123",
|
||||
"XX124", "XX125", "XX126", "XX127",
|
||||
"XX130", "XX131", "FSC", "CAO",
|
||||
"LDCI", "LDC", "DPCI", "DPC",
|
||||
"FAD", "FADL", "FADM", "FADB",
|
||||
"FADR", "FADLR", "FADMR", "FADBR",
|
||||
"FSB", "FSBL", "FSBM", "FSBB",
|
||||
"FSBR", "FSBLR", "FSBMR", "FSBBR",
|
||||
"FMP", "FMPL", "FMPM", "FMPB",
|
||||
"FMPR", "FMPLR", "FMPMR", "FMPBR",
|
||||
"FDV", "FDVL", "FDVM", "FDVB",
|
||||
"FDVR", "FDVLR", "FDVMR", "FDVBR",
|
||||
|
||||
"MOVE", "MOVEI", "MOVEM", "MOVES",
|
||||
"MOVS", "MOVSI", "MOVSM", "MOVSS",
|
||||
"MOVN", "MOVNI", "MOVNM", "MOVNS",
|
||||
"MOVM", "MOVMI", "MOVMM", "MOVMS",
|
||||
"IMUL", "IMULI", "IMULM", "IMULB",
|
||||
"MUL", "MULI", "MULM", "MULB",
|
||||
"IDIV", "IDIVI", "IDIVM", "IDIVB",
|
||||
"DIV", "DIVI", "DIVM", "DIVB",
|
||||
"ASH", "ROT", "LSH", "XX243",
|
||||
"ASHC", "ROTC", "LSHC", "XX247",
|
||||
"EXCH", "BLT", "AOBJP", "AOBJN",
|
||||
"JRST", "JFCL", "XCT", "XX257",
|
||||
"PUSHJ", "PUSH", "POP", "POPJ",
|
||||
"JSR", "JSP", "JSA", "JRA",
|
||||
"ADD", "ADDI", "ADDM", "ADDB",
|
||||
"SUB", "SUBI", "SUBM", "SUBB",
|
||||
|
||||
"CAI", "CAIL", "CAIE", "CAILE",
|
||||
"CAIA", "CAIGE", "CAIN", "CAIG",
|
||||
"CAM", "CAML", "CAME", "CAMLE",
|
||||
"CAMA", "CAMGE", "CAMN", "CAMG",
|
||||
"JUMP", "JUMPL", "JUMPE", "JUMPLE",
|
||||
"JUMPA", "JUMPGE", "JUMPN", "JUMPG",
|
||||
"SKIP", "SKIPL", "SKIPE", "SKIPLE",
|
||||
"SKIPA", "SKIPGE", "SKIPN", "SKIPG",
|
||||
"AOJ", "AOJL", "AOJE", "AOJLE",
|
||||
"AOJA", "AOJGE", "AOJN", "AOJG",
|
||||
"AOS", "AOSL", "AOSE", "AOSLE",
|
||||
"AOSA", "AOSGE", "AOSN", "AOSG",
|
||||
"SOJ", "SOJL", "SOJE", "SOJLE",
|
||||
"SOJA", "SOJGE", "SOJN", "SOJG",
|
||||
"SOS", "SOSL", "SOSE", "SOSLE",
|
||||
"SOSA", "SOSGE", "SOSN", "SOSG",
|
||||
|
||||
"SETZ", "SETZI", "SETZM", "SETZB",
|
||||
"AND", "ANDI", "ANDM", "ANDB",
|
||||
"ANDCA", "ANDCAI", "ANDCAM", "ANDCAB",
|
||||
"SETM", "SETMI", "SETMM", "SETMB",
|
||||
"ANDCM", "ANDCMI", "ANDCMM", "ANDCMB",
|
||||
"SETA", "SETAI", "SETAM", "SETAB",
|
||||
"XOR", "XORI", "XORM", "XORB",
|
||||
"IOR", "IORI", "IORM", "IORB",
|
||||
"ANDCB", "ANDCBI", "ANDCBM", "ANDCBB",
|
||||
"EQV", "EQVI", "EQVM", "EQVB",
|
||||
"SETCA", "SETCAI", "SETCAM", "SETCAB",
|
||||
"ORCA", "ORCAI", "ORCAM", "ORCAB",
|
||||
"SETCM", "SETCMI", "SETCMM", "SETCMB",
|
||||
"ORCM", "ORCMI", "ORCMM", "ORCMB",
|
||||
"ORCB", "ORCBI", "ORCBM", "ORCBB",
|
||||
"SETO", "SETOI", "SETOM", "SETOB",
|
||||
|
||||
"HLL", "HLLI", "HLLM", "HLLS",
|
||||
"HRL", "HRLI", "HRLM", "HRLS",
|
||||
"HLLZ", "HLLZI", "HLLZM", "HLLZS",
|
||||
"HRLZ", "HRLZI", "HRLZM", "HRLZS",
|
||||
"HLLO", "HLLOI", "HLLOM", "HLLOS",
|
||||
"HRLO", "HRLOI", "HRLOM", "HRLOS",
|
||||
"HLLE", "HLLEI", "HLLEM", "HLLES",
|
||||
"HRLE", "HRLEI", "HRLEM", "HRLES",
|
||||
"HRR", "HRRI", "HRRM", "HRRS",
|
||||
"HLR", "HLRI", "HLRM", "HLRS",
|
||||
"HRRZ", "HRRZI", "HRRZM", "HRRZS",
|
||||
"HLRZ", "HLRZI", "HLRZM", "HLRZS",
|
||||
"HRRO", "HRROI", "HRROM", "HRROS",
|
||||
"HLRO", "HLROI", "HLROM", "HLROS",
|
||||
"HRRE", "HRREI", "HRREM", "HRRES",
|
||||
"HLRE", "HLREI", "HLREM", "HLRES",
|
||||
|
||||
"TRN", "TLN", "TRNE", "TLNE",
|
||||
"TRNA", "TLNA", "TRNN", "TLNN",
|
||||
"TDN", "TSN", "TDNE", "TSNE",
|
||||
"TDNA", "TSNA", "TDNN", "TSNN",
|
||||
"TRZ", "TLZ", "TRZE", "TLZE",
|
||||
"TRZA", "TLZA", "TRZN", "TLZN",
|
||||
"TDZ", "TSZ", "TDZE", "TSZE",
|
||||
"TDZA", "TSZA", "TDZN", "TSZN",
|
||||
"TRC", "TLC", "TRCE", "TLCE",
|
||||
"TRCA", "TLCA", "TRCN", "TLCN",
|
||||
"TDC", "TSC", "TDCE", "TSCE",
|
||||
"TDCA", "TSCA", "TDCN", "TSCN",
|
||||
"TRO", "TLO", "TROE", "TLOE",
|
||||
"TROA", "TLOA", "TRON", "TLON",
|
||||
"TDO", "TSO", "TDOE", "TSOE",
|
||||
"TDOA", "TSOA", "TDON", "TSON",
|
||||
};
|
||||
|
||||
char *iomnemonics[] = {
|
||||
"BLKI",
|
||||
"DATAI",
|
||||
"BLKO",
|
||||
"DATAO",
|
||||
"CONO",
|
||||
"CONI",
|
||||
"CONSZ",
|
||||
"CONSO"
|
||||
};
|
||||
|
||||
char*
|
||||
disasm(word w)
|
||||
{
|
||||
static char s[100];
|
||||
char *p;
|
||||
hword i, x, y;
|
||||
hword ac, dev;
|
||||
hword op;
|
||||
hword f;
|
||||
|
||||
y = w & 0777777;
|
||||
x = (w >> 18) & 017;
|
||||
i = (w >> 22) & 1;
|
||||
ac = (w >> 23) & 017;
|
||||
op = (w >> 27) & 0777;
|
||||
dev = (w >> 24) & 0774;
|
||||
f = ac & 07;
|
||||
p = s;
|
||||
if((op & 0700) == 0700){
|
||||
p += sprintf(p, "%s ", iomnemonics[f]);
|
||||
p += sprintf(p, "%o,", dev);
|
||||
}else{
|
||||
p += sprintf(p, "%s ", mnemonics[op]);
|
||||
p += sprintf(p, "%o,", ac);
|
||||
}
|
||||
if(i)
|
||||
p += sprintf(p, "@");
|
||||
p += sprintf(p, "%o", y);
|
||||
if(x)
|
||||
p += sprintf(p, "(%o)", x);
|
||||
return s;
|
||||
}
|
||||
12
link/pdp6common.h
Normal file
12
link/pdp6common.h
Normal file
@ -0,0 +1,12 @@
|
||||
typedef uint64_t word;
|
||||
typedef uint32_t hword;
|
||||
|
||||
char ascii2rad(char c);
|
||||
char rad2ascii(char c);
|
||||
word rad50(int n, const char *s);
|
||||
int unrad50(word r, char *s);
|
||||
char ascii2sixbit(char c);
|
||||
char sixbit2ascii(char c);
|
||||
word sixbit(const char *s);
|
||||
void unsixbit(word sx, char *s);
|
||||
char *disasm(word w);
|
||||
811
link/reltest.c
Normal file
811
link/reltest.c
Normal file
@ -0,0 +1,811 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "pdp6common.h"
|
||||
|
||||
word fw(hword l, hword r) { return ((word)l << 18) | (word)r; }
|
||||
hword left(word w) { return (w >> 18) & 0777777; }
|
||||
hword right(word w) { return w & 0777777; }
|
||||
|
||||
/* just a subset here */
|
||||
enum ItemType
|
||||
{
|
||||
Nothing = 0,
|
||||
Code = 1,
|
||||
Symbols = 2,
|
||||
Entry = 4,
|
||||
End = 5,
|
||||
Name = 6,
|
||||
Start = 7,
|
||||
};
|
||||
|
||||
enum SymType
|
||||
{
|
||||
SymName = 000,
|
||||
SymGlobal = 004,
|
||||
SymLocal = 010,
|
||||
SymBlock = 014,
|
||||
SymGlobalH = 044, /* hidden
|
||||
SymLocalH = 050, */
|
||||
SymUndef = 060,
|
||||
};
|
||||
|
||||
word item[01000000];
|
||||
hword itemp, headp;
|
||||
hword itemtype, itemsz;
|
||||
|
||||
hword relocp;
|
||||
word blockreloc;
|
||||
int blocksz;
|
||||
|
||||
void
|
||||
startblock(void)
|
||||
{
|
||||
if(blocksz){
|
||||
blockreloc <<= 2*(18-blocksz);
|
||||
item[relocp] = blockreloc;
|
||||
relocp = itemp++;
|
||||
}
|
||||
blockreloc = 0;
|
||||
blocksz = 0;
|
||||
}
|
||||
|
||||
void
|
||||
putword(word w, int reloc)
|
||||
{
|
||||
item[itemp++] = w;
|
||||
blockreloc = blockreloc<<2 | reloc;
|
||||
blocksz++;
|
||||
itemsz++;
|
||||
if(blocksz == 18)
|
||||
startblock();
|
||||
}
|
||||
|
||||
void
|
||||
startitem(hword it)
|
||||
{
|
||||
if(itemsz){
|
||||
item[headp] = fw(itemtype, itemsz);
|
||||
headp = itemp++;
|
||||
}
|
||||
itemtype = it;
|
||||
itemsz = 0;
|
||||
startblock();
|
||||
}
|
||||
|
||||
void
|
||||
dump(void)
|
||||
{
|
||||
hword i;
|
||||
for(i = 0; i < itemp-2; i++)
|
||||
printf("%06o: %012lo\n", i, item[i]);
|
||||
}
|
||||
|
||||
void
|
||||
dumpfile(FILE *f)
|
||||
{
|
||||
hword i;
|
||||
word w;
|
||||
int j;
|
||||
for(i = 0; i < itemp-2; i++){
|
||||
w = item[i] & 0777777777777;
|
||||
for(j = 5; j >= 0; j--)
|
||||
putc((w>>j*6)&077, f);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
/* init for first item */
|
||||
headp = itemp++;
|
||||
relocp = itemp++;
|
||||
|
||||
startitem(Name);
|
||||
putword(rad50(0, "PROG"), 0);
|
||||
|
||||
startitem(Code);
|
||||
putword(fw(0, 0100), 1);
|
||||
putword(fw(0000000, 0000000), 0);
|
||||
putword(fw(0515240, 0254000), 0);
|
||||
putword(fw(0201100, 0000000), 0);
|
||||
putword(fw(0554302, 0000000), 0);
|
||||
putword(fw(0540242, 0000103), 1);
|
||||
putword(fw(0200046, 0000001), 0);
|
||||
putword(fw(0202045, 0000001), 0);
|
||||
putword(fw(0202246, 0000001), 0);
|
||||
putword(fw(0365100, 0000103), 1);
|
||||
|
||||
putword(fw(0402000, 0000005), 0);
|
||||
putword(fw(0700200, 0010000), 0);
|
||||
putword(fw(0271240, 0002000), 0);
|
||||
putword(fw(0200105, 0000000), 0);
|
||||
putword(fw(0700340, 0010000), 0);
|
||||
putword(fw(0254000, 0000113), 1);
|
||||
putword(fw(0275240, 0000001), 0);
|
||||
putword(fw(0202240, 0000037), 0);
|
||||
putword(fw(0275240, 0000177), 0);
|
||||
putword(fw(0574100, 0000000), 0);
|
||||
putword(fw(0322100, 0000143), 1);
|
||||
putword(fw(0213000, 0000002), 0);
|
||||
putword(fw(0550040, 0000122), 1);
|
||||
putword(fw(0271042, 0000000), 0);
|
||||
putword(fw(0504040, 0000002), 0);
|
||||
putword(fw(0275241, 0000001), 0);
|
||||
putword(fw(0542240, 0000140), 1);
|
||||
putword(fw(0200100, 0000125), 1);
|
||||
putword(fw(0271105, 0000001), 0);
|
||||
putword(fw(0202100, 0000132), 1);
|
||||
putword(fw(0201100, 0000134), 1);
|
||||
putword(fw(0202100, 0000036), 0);
|
||||
putword(fw(0200101, 0777777), 0);
|
||||
putword(fw(0202101, 0000140), 1);
|
||||
putword(fw(0274040, 0000551), 1);
|
||||
putword(fw(0325040, 0000137), 1);
|
||||
|
||||
putword(fw(0200040, 0000552), 1);
|
||||
putword(fw(0251040, 0000057), 0);
|
||||
putword(fw(0200040, 0000147), 1);
|
||||
putword(fw(0202040, 0000101), 1);
|
||||
putword(fw(0254020, 0000100), 1);
|
||||
putword(fw(0000000, 0000000), 0);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000000), 0);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000153), 1);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000155), 1);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000157), 1);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000161), 1);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000163), 1);
|
||||
putword(fw(0264000, 0000000), 0);
|
||||
putword(fw(0265240, 0000165), 1);
|
||||
|
||||
putword(fw(0000000, 0000000), 0);
|
||||
putword(fw(0201040, 0777777), 1);
|
||||
putword(fw(0202040, 0000000), 0);
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0200140, 0000553), 1);
|
||||
putword(fw(0260140, 0000000), 0);
|
||||
putword(fw(0201040, 0000000), 0);
|
||||
putword(fw(0260140, 0000000), 0);
|
||||
putword(fw(0201040, 0000474), 1);
|
||||
putword(fw(0260140, 0000177), 1);
|
||||
putword(fw(0554040, 0000000), 0);
|
||||
putword(fw(0260140, 0000000), 0);
|
||||
putword(fw(0201040, 0000554), 1);
|
||||
putword(fw(0260140, 0000201), 1);
|
||||
putword(fw(0550040, 0000202), 1);
|
||||
putword(fw(0260140, 0000203), 1);
|
||||
putword(fw(0201040, 0000555), 1);
|
||||
putword(fw(0260140, 0000205), 1);
|
||||
putword(fw(0201040, 0000000), 0);
|
||||
putword(fw(0260140, 0000211), 1);
|
||||
putword(fw(0260140, 0000175), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
|
||||
putword(fw(0402000, 0000000), 0);
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000477), 1);
|
||||
putword(fw(0260140, 0000213), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
putword(fw(0260140, 0000376), 1);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0260140, 0000000), 0);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0332000, 0000002), 0);
|
||||
putword(fw(0303100, 0000014), 0);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0275100, 0000001), 0);
|
||||
putword(fw(0221100, 0000037), 0);
|
||||
putword(fw(0272100, 0000216), 1);
|
||||
putword(fw(0260140, 0000225), 1);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0332000, 0000002), 0);
|
||||
putword(fw(0303100, 0000037), 0);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0275100, 0000001), 0);
|
||||
putword(fw(0272100, 0000234), 1);
|
||||
putword(fw(0260140, 0000235), 1);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0301100, 0000101), 0);
|
||||
putword(fw(0303100, 0000143), 0);
|
||||
putword(fw(0254000, 0000216), 1);
|
||||
putword(fw(0275100, 0000100), 0);
|
||||
putword(fw(0221100, 0000564), 0);
|
||||
putword(fw(0272100, 0000243), 1);
|
||||
|
||||
putword(fw(0402000, 0000000), 0);
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000506), 1);
|
||||
putword(fw(0260140, 0000221), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
putword(fw(0260140, 0000376), 1);
|
||||
putword(fw(0254000, 0000254), 1);
|
||||
putword(fw(0134100, 0000001), 0);
|
||||
putword(fw(0275100, 0000060), 0);
|
||||
putword(fw(0331000, 0000002), 0);
|
||||
putword(fw(0303100, 0000002), 0);
|
||||
putword(fw(0254000, 0000254), 1);
|
||||
putword(fw(0220100, 0000556), 1);
|
||||
putword(fw(0272100, 0000254), 1);
|
||||
putword(fw(0134100, 0000001), 0);
|
||||
putword(fw(0275100, 0000060), 0);
|
||||
putword(fw(0331000, 0000002), 0);
|
||||
putword(fw(0303100, 0000011), 0);
|
||||
putword(fw(0254000, 0000254), 1);
|
||||
putword(fw(0221100, 0645700), 0);
|
||||
putword(fw(0272100, 0000271), 1);
|
||||
putword(fw(0260140, 0000244), 1);
|
||||
putword(fw(0254000, 0000254), 1);
|
||||
putword(fw(0303100, 0000073), 0);
|
||||
putword(fw(0254000, 0000254), 1);
|
||||
putword(fw(0221100, 0007020), 0);
|
||||
putword(fw(0272100, 0000300), 1);
|
||||
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000517), 1);
|
||||
putword(fw(0260140, 0000257), 1);
|
||||
putword(fw(0554300, 0000000), 0);
|
||||
putword(fw(0201040, 0000004), 0);
|
||||
putword(fw(0261140, 0000001), 0);
|
||||
putword(fw(0201040, 0000001), 0);
|
||||
putword(fw(0510206, 0000000), 0);
|
||||
putword(fw(0554306, 0000003), 0);
|
||||
putword(fw(0322300, 0000324), 1);
|
||||
putword(fw(0510106, 0000000), 0);
|
||||
putword(fw(0316100, 0000004), 0);
|
||||
putword(fw(0344040, 0000317), 1);
|
||||
putword(fw(0200340, 0000001), 0);
|
||||
putword(fw(0260140, 0000207), 1);
|
||||
putword(fw(0201600, 0000040), 0);
|
||||
putword(fw(0136600, 0000005), 0);
|
||||
putword(fw(0201600, 0000003), 0);
|
||||
putword(fw(0200440, 0000557), 1);
|
||||
putword(fw(0134100, 0000011), 0);
|
||||
putword(fw(0271100, 0000240), 0);
|
||||
putword(fw(0136100, 0000005), 0);
|
||||
putword(fw(0367600, 0000332), 1);
|
||||
putword(fw(0201040, 0000560), 1);
|
||||
putword(fw(0303340, 0000001), 0);
|
||||
putword(fw(0260140, 0000311), 1);
|
||||
putword(fw(0260140, 0000214), 1);
|
||||
putword(fw(0326300, 0000315), 1);
|
||||
putword(fw(0262140, 0000002), 0);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000524), 1);
|
||||
putword(fw(0260140, 0000340), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
putword(fw(0260140, 0000376), 1);
|
||||
putword(fw(0254000, 0000355), 1);
|
||||
putword(fw(0201040, 0000000), 0);
|
||||
putword(fw(0202040, 0000172), 1);
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000536), 1);
|
||||
putword(fw(0260140, 0000347), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
putword(fw(0260140, 0000376), 1);
|
||||
putword(fw(0254000, 0000365), 1);
|
||||
putword(fw(0200040, 0000000), 0);
|
||||
putword(fw(0552040, 0000354), 1);
|
||||
|
||||
putword(fw(0200240, 0000443), 1);
|
||||
putword(fw(0201040, 0000541), 1);
|
||||
putword(fw(0260140, 0000357), 1);
|
||||
putword(fw(0200040, 0000364), 1);
|
||||
putword(fw(0260140, 0000000), 0);
|
||||
putword(fw(0201040, 0000544), 1);
|
||||
putword(fw(0260140, 0000367), 1);
|
||||
putword(fw(0260140, 0000421), 1);
|
||||
putword(fw(0254020, 0000170), 1);
|
||||
|
||||
putword(fw(0200040, 0000443), 1);
|
||||
putword(fw(0201200, 0000000), 0);
|
||||
putword(fw(0712340, 0000040), 0);
|
||||
putword(fw(0254000, 0000400), 1);
|
||||
putword(fw(0712040, 0000002), 0);
|
||||
putword(fw(0712140, 0000002), 0);
|
||||
putword(fw(0136100, 0000001), 0);
|
||||
putword(fw(0405100, 0000177), 0);
|
||||
putword(fw(0306100, 0000177), 0);
|
||||
putword(fw(0254000, 0000000), 0);
|
||||
putword(fw(0302100, 0000015), 0);
|
||||
putword(fw(0344200, 0000400), 1);
|
||||
putword(fw(0712340, 0000020), 0);
|
||||
putword(fw(0254000, 0000412), 1);
|
||||
putword(fw(0201100, 0000012), 0);
|
||||
putword(fw(0712140, 0000002), 0);
|
||||
putword(fw(0200040, 0000443), 1);
|
||||
putword(fw(0326200, 0000000), 0);
|
||||
putword(fw(0263140, 0000000), 0);
|
||||
|
||||
putword(fw(0200040, 0000443), 1);
|
||||
putword(fw(0712040, 0000002), 0);
|
||||
putword(fw(0316040, 0000005), 0);
|
||||
putword(fw(0263140, 0000000), 0);
|
||||
putword(fw(0712300, 0000040), 0);
|
||||
putword(fw(0254000, 0000434), 1);
|
||||
putword(fw(0712300, 0000020), 0);
|
||||
putword(fw(0254000, 0000427), 1);
|
||||
putword(fw(0134100, 0000001), 0);
|
||||
putword(fw(0712140, 0000002), 0);
|
||||
putword(fw(0254000, 0000423), 1);
|
||||
putword(fw(0712300, 0000020), 0);
|
||||
putword(fw(0254000, 0000434), 1);
|
||||
putword(fw(0712140, 0000561), 1);
|
||||
putword(fw(0712300, 0000020), 0);
|
||||
putword(fw(0254000, 0000437), 1);
|
||||
putword(fw(0712140, 0000562), 1);
|
||||
putword(fw(0263140, 0000000), 0);
|
||||
putword(fw(0440700, 0000444), 1);
|
||||
|
||||
startitem(Code);
|
||||
putword(fw(0, 0474), 1);
|
||||
putword(fw(0202505, 0620246), 0);
|
||||
putword(fw(0271010, 0554212), 0);
|
||||
putword(fw(0415320, 0000000), 0);
|
||||
putword(fw(0064252, 0454640), 0);
|
||||
putword(fw(0425012, 0447610), 0);
|
||||
putword(fw(0406624, 0751500), 0);
|
||||
putword(fw(0422032, 0442500), 0);
|
||||
putword(fw(0406464, 0040604), 0);
|
||||
putword(fw(0476550, 0527032), 0);
|
||||
putword(fw(0050000, 0000000), 0);
|
||||
putword(fw(0064252, 0454640), 0);
|
||||
putword(fw(0425006, 0420210), 0);
|
||||
putword(fw(0446171, 0152100), 0);
|
||||
putword(fw(0472032, 0654500), 0);
|
||||
putword(fw(0522231, 0542520), 0);
|
||||
putword(fw(0301626, 0531500), 0);
|
||||
putword(fw(0446464, 0034564), 0);
|
||||
putword(fw(0325464, 0040632), 0);
|
||||
putword(fw(0245341, 0505000), 0);
|
||||
putword(fw(0064251, 0147500), 0);
|
||||
putword(fw(0416371, 0643222), 0);
|
||||
putword(fw(0436532, 0240650), 0);
|
||||
putword(fw(0446371, 0606424), 0);
|
||||
putword(fw(0000000, 0000000), 0);
|
||||
putword(fw(0064250, 0447500), 0);
|
||||
putword(fw(0546372, 0520256), 0);
|
||||
putword(fw(0406352, 0420246), 0);
|
||||
putword(fw(0546471, 0540626), 0);
|
||||
putword(fw(0242513, 0150212), 0);
|
||||
putword(fw(0202624, 0044614), 0);
|
||||
putword(fw(0202630, 0551530), 0);
|
||||
putword(fw(0416444, 0044614), 0);
|
||||
putword(fw(0202351, 0724576), 0);
|
||||
putword(fw(0064240, 0000000), 0);
|
||||
putword(fw(0064250, 0554212), 0);
|
||||
putword(fw(0415010, 0442250), 0);
|
||||
putword(fw(0374321, 0200000), 0);
|
||||
putword(fw(0064250, 0554212), 0);
|
||||
putword(fw(0415011, 0151500), 0);
|
||||
putword(fw(0000000, 0000000), 0);
|
||||
putword(fw(0202370, 0352202), 0);
|
||||
putword(fw(0461011, 0447606), 0);
|
||||
putword(fw(0406511, 0147634), 0);
|
||||
putword(fw(0515011, 0447634), 0);
|
||||
putword(fw(0435341, 0505000), 0);
|
||||
putword(fw(0000001, 0000001), 0);
|
||||
putword(fw(0000150, 0000040), 2);
|
||||
|
||||
putword(fw(0000010, 0000464), 1);
|
||||
putword(fw(0270000, 0000000), 0);
|
||||
putword(fw(0200000, 0000000), 0);
|
||||
putword(fw(0000000, 0106274), 0);
|
||||
putword(fw(0440600, 0000004), 0);
|
||||
putword(fw(0236460, 0000000), 0);
|
||||
putword(fw(0000000, 0000015), 0);
|
||||
putword(fw(0000000, 0000012), 0);
|
||||
|
||||
startitem(Symbols);
|
||||
putword(rad50(SymGlobal, "A"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymGlobal, "AC1"), 0);
|
||||
putword(0000015, 0);
|
||||
putword(rad50(SymGlobal, "AC2"), 0);
|
||||
putword(0000016, 0);
|
||||
putword(rad50(SymGlobal, "AC3"), 0);
|
||||
putword(0000017, 0);
|
||||
putword(rad50(SymGlobal, "AL"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "ASSCON"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "ASSPRG"), 0);
|
||||
putword(0200000, 0);
|
||||
putword(rad50(SymGlobal, "B"), 0);
|
||||
putword(0000014, 0);
|
||||
putword(rad50(SymGlobal, "BUFPNT"), 0);
|
||||
putword(0000012, 0);
|
||||
putword(rad50(SymGlobal, "BUFWRD"), 0);
|
||||
putword(0000013, 0);
|
||||
putword(rad50(SymLocal, "C"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymUndef, "CH1"), 0);
|
||||
putword(0000152, 1);
|
||||
putword(rad50(SymUndef, "CH2"), 0);
|
||||
putword(0000154, 1);
|
||||
putword(rad50(SymUndef, "CH3"), 0);
|
||||
putword(0000156, 1);
|
||||
putword(rad50(SymUndef, "CH4"), 0);
|
||||
putword(0000160, 1);
|
||||
putword(rad50(SymUndef, "CH5"), 0);
|
||||
putword(0000162, 1);
|
||||
putword(rad50(SymUndef, "CH6"), 0);
|
||||
putword(0000164, 1);
|
||||
putword(rad50(SymUndef, "CH7"), 0);
|
||||
putword(0000166, 1);
|
||||
putword(rad50(SymLocal, "CHL"), 0);
|
||||
putword(0000006, 0);
|
||||
putword(rad50(SymGlobal, "CLOSR"), 0);
|
||||
putword(0002000, 0);
|
||||
putword(rad50(SymGlobal, "CLSIN"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "CLSOUT"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymUndef, "CONFIG"), 0);
|
||||
putword(0000176, 1);
|
||||
putword(rad50(SymUndef, "CONMES"), 0);
|
||||
putword(0000373, 1);
|
||||
putword(rad50(SymUndef, "CPOPJ"), 0);
|
||||
putword(0000407, 1);
|
||||
putword(rad50(SymUndef, "CPOPJ1"), 0);
|
||||
putword(0000417, 1);
|
||||
putword(rad50(SymUndef, "CRLF"), 0);
|
||||
putword(0000341, 1);
|
||||
putword(rad50(SymGlobal, "D"), 0);
|
||||
putword(0000017, 0);
|
||||
putword(rad50(SymGlobal, "DAT"), 0);
|
||||
putword(0000005, 0);
|
||||
putword(rad50(SymLocal, "DATLOP"), 0);
|
||||
putword(0000216, 1);
|
||||
putword(rad50(SymGlobal, "DCL"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "DCW"), 0);
|
||||
putword(0020000, 0);
|
||||
putword(rad50(SymGlobal, "DDI"), 0);
|
||||
putword(0000007, 0);
|
||||
putword(rad50(SymGlobal, "DDO"), 0);
|
||||
putword(0000006, 0);
|
||||
putword(rad50(SymGlobal, "DDTMEM"), 0);
|
||||
putword(0000037, 0);
|
||||
putword(rad50(SymGlobal, "DDTSYM"), 0);
|
||||
putword(0000036, 0);
|
||||
putword(rad50(SymUndef, "DECIN"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymUndef, "DECIN1"), 0);
|
||||
putword(0000301, 1);
|
||||
putword(rad50(SymGlobal, "DEN"), 0);
|
||||
putword(0000004, 0);
|
||||
putword(rad50(SymLocal, "DEV1"), 0);
|
||||
putword(0000103, 1);
|
||||
putword(rad50(SymGlobal, "DEVADR"), 0);
|
||||
putword(0000007, 0);
|
||||
putword(rad50(SymGlobal, "DEVBUF"), 0);
|
||||
putword(0000006, 0);
|
||||
putword(rad50(SymGlobal, "DEVCHR"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "DEVCTR"), 0);
|
||||
putword(0000011, 0);
|
||||
putword(rad50(SymGlobal, "DEVDAT"), 0);
|
||||
putword(0000006, 0);
|
||||
putword(rad50(SymGlobal, "DEVIAD"), 0);
|
||||
putword(0000007, 0);
|
||||
putword(rad50(SymUndef, "DECINT"), 0);
|
||||
putword(0000104, 1);
|
||||
putword(rad50(SymGlobal, "DEVIOS"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "DEVLOG"), 0);
|
||||
putword(0000005, 0);
|
||||
putword(rad50(SymUndef, "DEVLST"), 0);
|
||||
putword(0000312, 1);
|
||||
putword(rad50(SymGlobal, "DEVMOD"), 0);
|
||||
putword(0000004, 0);
|
||||
putword(rad50(SymGlobal, "DEVNAM"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymGlobal, "DEVOAD"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "DEVPTR"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "DEVSER"), 0);
|
||||
putword(0000003, 0);
|
||||
putword(rad50(SymGlobal, "DGF"), 0);
|
||||
putword(0000012, 0);
|
||||
putword(rad50(SymGlobal, "DIN"), 0);
|
||||
putword(0000003, 0);
|
||||
putword(rad50(SymGlobal, "DLK"), 0);
|
||||
putword(0000005, 0);
|
||||
putword(rad50(SymGlobal, "DOU"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "DR"), 0);
|
||||
putword(0000016, 0);
|
||||
putword(rad50(SymGlobal, "DRL"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymGlobal, "DSI"), 0);
|
||||
putword(0000011, 0);
|
||||
putword(rad50(SymGlobal, "DSO"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "DTW"), 0);
|
||||
putword(0040000, 0);
|
||||
putword(rad50(SymGlobal, "DVAVAL"), 0);
|
||||
putword(0000040, 0);
|
||||
putword(rad50(SymGlobal, "DVCDR"), 0);
|
||||
putword(0100000, 0);
|
||||
putword(rad50(SymGlobal, "DVDIR"), 0);
|
||||
putword(0000004, 0);
|
||||
putword(rad50(SymGlobal, "DVDIR1"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "DVIN"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "DVLPT"), 0);
|
||||
putword(0040000, 0);
|
||||
putword(rad50(SymGlobal, "DVMTA"), 0);
|
||||
putword(0000020, 0);
|
||||
putword(rad50(SymGlobal, "DVOUT"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "DVTTY"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "ENTRB"), 0);
|
||||
putword(0020000, 0);
|
||||
putword(rad50(SymUndef, "ERNAM"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymUndef, "ERROR"), 0);
|
||||
putword(0000167, 1);
|
||||
putword(rad50(SymLocal, "EXECIS"), 0);
|
||||
putword(0000541, 1);
|
||||
putword(rad50(SymLocal, "GET1"), 0);
|
||||
putword(0000400, 1);
|
||||
putword(rad50(SymLocal, "GETLIN"), 0);
|
||||
putword(0000376, 1);
|
||||
putword(rad50(SymGlobal, "I"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "IB"), 0);
|
||||
putword(0000013, 0);
|
||||
putword(rad50(SymGlobal, "IBUFB"), 0);
|
||||
putword(0200000, 0);
|
||||
putword(rad50(SymGlobal, "INITB"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "INPB"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymLocal, "INT"), 0);
|
||||
putword(0000005, 0);
|
||||
putword(rad50(SymGlobal, "IO"), 0);
|
||||
putword(0000020, 0);
|
||||
putword(rad50(SymGlobal, "IOACT"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymGlobal, "IOREG"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "IORKTL"), 0);
|
||||
putword(0040000, 0);
|
||||
putword(rad50(SymGlobal, "IOCON"), 0);
|
||||
putword(0000040, 0);
|
||||
putword(rad50(SymLocal, "IOCONF"), 0);
|
||||
putword(0000517, 1);
|
||||
putword(rad50(SymGlobal, "IODEND"), 0);
|
||||
putword(0020000, 0);
|
||||
putword(rad50(SymGlobal, "IODERR"), 0);
|
||||
putword(0200000, 0);
|
||||
putword(rad50(SymGlobal, "IODISC"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "IODONE"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "IODTER"), 0);
|
||||
putword(0100000, 0);
|
||||
putword(rad50(SymGlobal, "IOEND"), 0);
|
||||
putword(0000040, 0);
|
||||
putword(rad50(SymGlobal, "IOFST"), 0);
|
||||
putword(0000004, 0);
|
||||
putword(rad50(SymGlobal, "IOIMPM"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "IONRCK"), 0);
|
||||
putword(0000100, 0);
|
||||
putword(rad50(SymGlobal, "IORDEL"), 0);
|
||||
putword(0000100, 0);
|
||||
putword(rad50(SymGlobal, "IORET"), 0);
|
||||
putword(0000020, 0);
|
||||
putword(rad50(SymGlobal, "IOS"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymGlobal, "IOSTRT"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymGlobal, "IOUSE"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "IOW"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "IOWC"), 0);
|
||||
putword(0000020, 0);
|
||||
putword(rad50(SymGlobal, "IOWS"), 0);
|
||||
putword(0400000, 0);
|
||||
putword(rad50(SymGlobal, "ITEM"), 0);
|
||||
putword(0000004, 0);
|
||||
putword(rad50(SymGlobal, "JBFADR"), 0);
|
||||
putword(0000000, 0);
|
||||
putword(rad50(SymGlobal, "JBFCTR"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "JBFPTR"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "JBUF"), 0);
|
||||
putword(0000005, 0);
|
||||
putword(rad50(SymGlobal, "JDAT"), 0);
|
||||
putword(0000011, 0);
|
||||
putword(rad50(SymGlobal, "JERR"), 0);
|
||||
putword(0002000, 0);
|
||||
putword(rad50(SymGlobal, "JIOW"), 0);
|
||||
putword(0100000, 0);
|
||||
putword(rad50(SymGlobal, "JNA"), 0);
|
||||
putword(0004000, 0);
|
||||
putword(rad50(SymUndef, "JORFF"), 0);
|
||||
putword(0000363, 1);
|
||||
putword(rad50(SymUndef, "JORSYM"), 0);
|
||||
putword(0000135, 1);
|
||||
putword(rad50(SymLocal, "JRSTI"), 0);
|
||||
putword(0000147, 1);
|
||||
putword(rad50(SymLocal, "JRSTI1"), 0);
|
||||
putword(0000143, 1);
|
||||
putword(rad50(SymLocal, "LENGTH"), 0);
|
||||
putword(0000544, 1);
|
||||
putword(rad50(SymLocal, "LINBUF"), 0);
|
||||
putword(0000444, 1);
|
||||
putword(rad50(SymLocal, "LINEP"), 0);
|
||||
putword(0000443, 1);
|
||||
putword(rad50(SymGlobal, "LINKSR"), 0);
|
||||
putword(0000100, 1);
|
||||
putword(rad50(SymLocal, "LOC40"), 0);
|
||||
putword(0000150, 1);
|
||||
putword(rad50(SymGlobal, "LOOKB"), 0);
|
||||
putword(0040000, 0);
|
||||
putword(rad50(SymUndef, "MAKEND"), 0);
|
||||
putword(0000353, 1);
|
||||
putword(rad50(SymGlobal, "MTW"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymUndef, "NDEVM1"), 0);
|
||||
putword(0000102, 1);
|
||||
putword(rad50(SymLocal, "NXM"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymGlobal, "OBUFB"), 0);
|
||||
putword(0100000, 0);
|
||||
putword(rad50(SymUndef, "OCTPNT"), 0);
|
||||
putword(0000371, 1);
|
||||
putword(rad50(SymGlobal, "ONCE"), 0);
|
||||
putword(0000170, 1);
|
||||
putword(rad50(SymLocal, "ONCE2"), 0);
|
||||
putword(0000355, 1);
|
||||
putword(rad50(SymLocal, "ONCE3"), 0);
|
||||
putword(0000365, 1);
|
||||
putword(rad50(SymLocal, "ONCE4"), 0);
|
||||
putword(0000317, 1);
|
||||
putword(rad50(SymLocal, "ONCE5"), 0);
|
||||
putword(0000315, 1);
|
||||
putword(rad50(SymLocal, "ONCE6"), 0);
|
||||
putword(0000324, 1);
|
||||
putword(rad50(SymLocal, "ONCE7"), 0);
|
||||
putword(0000332, 1);
|
||||
putword(rad50(SymLocal, "ONCEPD"), 0);
|
||||
putword(0000464, 1);
|
||||
putword(rad50(SymLocal, "ONCEPN"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymLocal, "OPOUT"), 0);
|
||||
putword(0000421, 1);
|
||||
putword(rad50(SymLocal, "OPOUT1"), 0);
|
||||
putword(0000423, 1);
|
||||
putword(rad50(SymLocal, "OPOUT2"), 0);
|
||||
putword(0000434, 1);
|
||||
putword(rad50(SymGlobal, "OUTPR"), 0);
|
||||
putword(0004000, 0);
|
||||
putword(rad50(SymGlobal, "PATCH"), 0);
|
||||
putword(0000000, 1);
|
||||
putword(rad50(SymGlobal, "PDP"), 0);
|
||||
putword(0000003, 0);
|
||||
putword(rad50(SymGlobal, "PICHN"), 0);
|
||||
putword(0000100, 0);
|
||||
putword(rad50(SymGlobal, "PROG"), 0);
|
||||
putword(0000007, 0);
|
||||
putword(rad50(SymUndef, "RADX10"), 0);
|
||||
putword(0000325, 1);
|
||||
putword(rad50(SymGlobal, "RUN"), 0);
|
||||
putword(0200000, 0);
|
||||
putword(rad50(SymGlobal, "RUNABL"), 0);
|
||||
putword(0204000, 0);
|
||||
putword(rad50(SymLocal, "STO1"), 0);
|
||||
putword(0000140, 1);
|
||||
putword(rad50(SymUndef, "SYSDAT"), 0);
|
||||
putword(0000212, 1);
|
||||
putword(rad50(SymLocal, "SYSDM"), 0);
|
||||
putword(0000536, 1);
|
||||
putword(rad50(SymGlobal, "SYSFIN"), 0);
|
||||
putword(0777777777777, 1);
|
||||
putword(rad50(SymLocal, "SYSM"), 0);
|
||||
putword(0000524, 1);
|
||||
putword(rad50(SymUndef, "SYSNUM"), 0);
|
||||
putword(0000206, 1);
|
||||
putword(rad50(SymUndef, "SYSSIZ"), 0);
|
||||
putword(0000370, 1);
|
||||
putword(rad50(SymLocal, "T"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "TAC"), 0);
|
||||
putword(0000001, 0);
|
||||
putword(rad50(SymGlobal, "TAC1"), 0);
|
||||
putword(0000002, 0);
|
||||
putword(rad50(SymGlobal, "TEM"), 0);
|
||||
putword(0000010, 0);
|
||||
putword(rad50(SymUndef, "THSDAT"), 0);
|
||||
putword(0000253, 1);
|
||||
putword(rad50(SymUndef, "TIME"), 0);
|
||||
putword(0000306, 1);
|
||||
putword(rad50(SymLocal, "TIMEM"), 0);
|
||||
putword(0000506, 1);
|
||||
putword(rad50(SymLocal, "TIMLOP"), 0);
|
||||
putword(0000254, 1);
|
||||
putword(rad50(SymLocal, "TODATE"), 0);
|
||||
putword(0000477, 1);
|
||||
putword(rad50(SymLocal, "TSEXEC"), 0);
|
||||
putword(0000474, 1);
|
||||
putword(rad50(SymGlobal, "TTYATC"), 0);
|
||||
putword(0020000, 0);
|
||||
putword(rad50(SymGlobal, "TTYUSE"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymGlobal, "USRMOD"), 0);
|
||||
putword(0010000, 0);
|
||||
putword(rad50(SymGlobal, "UUO"), 0);
|
||||
putword(0000014, 0);
|
||||
putword(rad50(SymUndef, "UUO0"), 0);
|
||||
putword(0000151, 1);
|
||||
|
||||
/* Testing */
|
||||
|
||||
startitem(Code);
|
||||
putword(fw(0, 0600), 1);
|
||||
putword(fw(0, 0), 0);
|
||||
putword(fw(0, 0), 0);
|
||||
putword(fw(0, 0600), 1);
|
||||
|
||||
startitem(Symbols);
|
||||
|
||||
|
||||
putword(rad50(SymGlobal, "ERROR"), 0);
|
||||
putword(0646464, 0);
|
||||
putword(rad50(SymUndef, "ERROR"), 0);
|
||||
putword(0000602, 1);
|
||||
|
||||
putword(rad50(SymGlobal, "UUO0"), 0);
|
||||
putword(04000, 0);
|
||||
putword(rad50(SymGlobal, "CH1"), 0);
|
||||
putword(04001, 0);
|
||||
putword(rad50(SymGlobal, "CH2"), 0);
|
||||
putword(04002, 0);
|
||||
putword(rad50(SymGlobal, "CH3"), 0);
|
||||
putword(04003, 0);
|
||||
putword(rad50(SymGlobal, "CH4"), 0);
|
||||
putword(04004, 0);
|
||||
putword(rad50(SymGlobal, "CH5"), 0);
|
||||
putword(04005, 0);
|
||||
putword(rad50(SymGlobal, "CH6"), 0);
|
||||
putword(04006, 0);
|
||||
putword(rad50(SymGlobal, "CH7"), 0);
|
||||
putword(04007, 0);
|
||||
|
||||
|
||||
startitem(Start);
|
||||
putword(0100, 0);
|
||||
|
||||
startitem(End);
|
||||
putword(0, 0);
|
||||
putword(0, 0);
|
||||
|
||||
startitem(Nothing);
|
||||
dump();
|
||||
|
||||
{
|
||||
FILE *f;
|
||||
if(f = fopen("test.rel", "wb"), f == NULL)
|
||||
return 1;
|
||||
dumpfile(f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user