mirror of
https://github.com/aap/pdp6.git
synced 2026-01-13 23:37:09 +00:00
139 lines
2.6 KiB
C
139 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include "../tools/pdp6common.h"
|
|
|
|
#define nil NULL
|
|
typedef unsigned char uchar;
|
|
typedef uint64_t word;
|
|
|
|
enum
|
|
{
|
|
TapeEndF = 022,
|
|
TapeEndR = 055,
|
|
|
|
BlockSpace = 025,
|
|
|
|
BlockEndF = 026,
|
|
BlockEndR = 045,
|
|
|
|
DataSync = 032, /* rev guard */
|
|
BlockSync = 051, /* guard */
|
|
|
|
DataEndF = 073, /* pre-final, final, ck, rev lock */
|
|
DataEndR = 010, /* lock, rev ck, rev final, rev pre-final */
|
|
|
|
Data = 070,
|
|
|
|
DTSIZE = 922512
|
|
};
|
|
|
|
FILE*
|
|
mustopen(const char *name, const char *mode)
|
|
{
|
|
FILE *f;
|
|
if(f = fopen(name, mode), f == nil){
|
|
fprintf(stderr, "couldn't open file: %s\n", name);
|
|
exit(1);
|
|
}
|
|
return f;
|
|
}
|
|
|
|
void
|
|
writef(uchar **p, int mark, int *ck, int data)
|
|
{
|
|
int i;
|
|
uchar d;
|
|
if(ck){
|
|
*ck ^= ~data & 077;
|
|
*ck ^= ~data>>6 & 077;
|
|
*ck ^= ~data>>12 & 077;
|
|
}
|
|
for(i = 0; i < 6; i++){
|
|
if(mark)
|
|
d = !!(mark & 040) << 3;
|
|
else
|
|
d = !!(**p & 010) << 3;
|
|
if(data & 01000000)
|
|
d |= **p & 07;
|
|
else{
|
|
d |= (data & 0700000) >> 15;
|
|
data = (data << 3) & 0777777;
|
|
}
|
|
mark <<= 1;
|
|
**p = d;
|
|
(*p)++;
|
|
}
|
|
}
|
|
|
|
word datbuf[0200*01102];
|
|
|
|
void
|
|
prerecord(uchar *dtp)
|
|
{
|
|
word i, n;
|
|
int j;
|
|
int ck;
|
|
word *datp;
|
|
|
|
writef(&dtp, TapeEndR, nil, 0);
|
|
writef(&dtp, TapeEndR, nil, 0);
|
|
|
|
datp = datbuf;
|
|
for(i = 0; i < 01102; i++){
|
|
n = 0;
|
|
for(j = 0; j < 12; j++)
|
|
n |= ((i>>j*3) & 07) << (11-j)*3;
|
|
n ^= 0777777777777;
|
|
|
|
writef(&dtp, BlockSpace, nil, (i >> 18) & 0777777); // block mark
|
|
writef(&dtp, BlockEndF, nil, i & 0777777); // block mark
|
|
writef(&dtp, DataSync, nil, 0);
|
|
writef(&dtp, DataEndR, nil, 0);
|
|
ck = 0;
|
|
writef(&dtp, DataEndR, &ck, 0007777); // rev check
|
|
|
|
/* the data */
|
|
writef(&dtp, DataEndR, &ck, left(*datp));
|
|
writef(&dtp, DataEndR, &ck, right(*datp));
|
|
datp++;
|
|
for(j = 1; j < 127; j++){
|
|
writef(&dtp, Data, &ck, left(*datp));
|
|
writef(&dtp, Data, &ck, right(*datp));
|
|
datp++;
|
|
}
|
|
writef(&dtp, DataEndF, &ck, left(*datp));
|
|
writef(&dtp, DataEndF, &ck, right(*datp));
|
|
datp++;
|
|
writef(&dtp, DataEndF, nil, (ck & 077) << 12 | 07777); // check
|
|
writef(&dtp, DataEndF, nil, 0);
|
|
writef(&dtp, BlockSync, nil, 0);
|
|
writef(&dtp, BlockEndR, nil, (n >> 18) & 0777777); // rev block mark
|
|
writef(&dtp, BlockSpace, nil, n & 0777777); // rev block mark
|
|
}
|
|
|
|
writef(&dtp, TapeEndF, nil, 0);
|
|
writef(&dtp, TapeEndF, nil, 0);
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
FILE *dtf;
|
|
uchar dtbuf[DTSIZE];
|
|
int i, j;;
|
|
word *datp;
|
|
|
|
datp = datbuf;
|
|
for(i = 0; i < 01102; i++)
|
|
for(j = 0; j < 0200; j++)
|
|
*datp++ = fw(i, j);
|
|
|
|
prerecord(dtbuf);
|
|
|
|
dtf = mustopen("out.dt6", "w");
|
|
fwrite(dtbuf, 1, DTSIZE, dtf);
|
|
fclose(dtf);
|
|
return 0;
|
|
}
|