1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-13 23:37:09 +00:00
aap.pdp6/test/dtconv.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;
}