mirror of
https://github.com/livingcomputermuseum/cpus-pdp8.git
synced 2026-05-04 23:26:46 +00:00
changes for building tss8 variants
This commit is contained in:
9
utils/filer/Makefile
Normal file
9
utils/filer/Makefile
Normal file
@@ -0,0 +1,9 @@
|
||||
#
|
||||
|
||||
all: filer
|
||||
|
||||
filer: filer.c
|
||||
cc -o filer filer.c
|
||||
|
||||
clean:
|
||||
rm -rf filer
|
||||
27
utils/filer/NOTES.txt
Normal file
27
utils/filer/NOTES.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
.R CAT
|
||||
|
||||
DISK FILES FOR USER 0, 2 ON 1-JAN-85
|
||||
|
||||
NAME SIZE PROT DATE
|
||||
PALD .SAV 16 12 31-MAR-76
|
||||
LOADER.SAV 4 12 31-MAR-76
|
||||
FORT .SAV 6 12 31-MAR-76
|
||||
FOSL .SAV 6 12 31-MAR-76
|
||||
PIP .SAV 10 12 31-MAR-76
|
||||
TSTLPT.SAV 2 12 31-MAR-76
|
||||
LOGOUT.SAV 6 12 31-MAR-76
|
||||
SYSTAT.SAV 5 12 31-MAR-76
|
||||
EDIT .SAV 8 12 31-MAR-76
|
||||
FOCAL .SAV 16 12 31-MAR-76
|
||||
BASIC .SAV 38 12 31-MAR-76
|
||||
COPY .SAV 10 12 31-MAR-76
|
||||
CAT .SAV 6 12 31-MAR-76
|
||||
GRIPE .SAV 5 12 31-MAR-76
|
||||
LOGID .SAV 4 12 31-MAR-76
|
||||
PUTR .SAV 21 12 3-FEB-84
|
||||
ODTHI .SAV 2 12 29-FEB-84
|
||||
FLAP .SAV 1 12 7-APR-84
|
||||
PTLOAD.SAV 1 12 29-APR-84
|
||||
BLANK .SAV 1 12 9-JUN-84
|
||||
DTTEST.SAV 2 12 26-JUN-84
|
||||
INIT .SAV 17 12 29-JUL-84
|
||||
BIN
utils/filer/filer
Executable file
BIN
utils/filer/filer
Executable file
Binary file not shown.
357
utils/filer/filer.c
Normal file
357
utils/filer/filer.c
Normal file
@@ -0,0 +1,357 @@
|
||||
/*
|
||||
* tss/8 rf08 disk file system utility
|
||||
* list directory, copy files in/out
|
||||
* brad@heeltoe.com 1/2014
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef unsigned short u12;
|
||||
|
||||
unsigned char binfile[16*1024];
|
||||
|
||||
#define RFSIZE (1024*1024)
|
||||
u12 rf[RFSIZE];
|
||||
int rf_size;
|
||||
int rf_fd;
|
||||
int clear_flag;
|
||||
int debug;
|
||||
|
||||
#define MEMSIZE (32*1024)
|
||||
|
||||
int disk_load(char *filename)
|
||||
{
|
||||
int fd, ret;
|
||||
|
||||
if (clear_flag) {
|
||||
rf_size = 524288 / 2;
|
||||
memset((void *)rf, 0, sizeof(rf));
|
||||
printf("creating rf disk, word size %d\n", rf_size);
|
||||
|
||||
rf_fd = open(filename, O_CREAT | O_RDWR, 0666);
|
||||
if (rf_fd < 0) {
|
||||
perror(filename);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rf_fd = open(filename, O_RDWR);
|
||||
if (rf_fd < 0) {
|
||||
perror(filename);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
ret = read(rf_fd, rf, sizeof(rf));
|
||||
if (ret < 0) {
|
||||
perror(filename);
|
||||
} else {
|
||||
rf_size = ret / 2;
|
||||
printf("loaded rf disk, word size %d\n", rf_size);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (debug) printf("rf_fd %d\n", rf_fd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int disk_save(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printf("saving rf disk, word size %d\n", rf_size);
|
||||
|
||||
ret = (int)lseek(rf_fd, (off_t)0, SEEK_SET);
|
||||
if (ret != 0) {
|
||||
perror("seek");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = write(rf_fd, rf, rf_size*2);
|
||||
if (ret != rf_size*2) {
|
||||
printf("write failed; wrote %d, ret %d\n", rf_size*2, ret);
|
||||
perror("write");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int field_save(int field)
|
||||
{
|
||||
int i, offset;
|
||||
|
||||
printf("saving field %d\n", field);
|
||||
|
||||
offset = field * 4096;
|
||||
for (i = 0; i < 4096; i++) {
|
||||
if (filled[field][i]) {
|
||||
rf[offset+i] = fields[field][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int field_dump(int srcfield, char *filename)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
f = fopen(filename, "w");
|
||||
if (f == NULL) {
|
||||
perror(filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4096; i++) {
|
||||
fprintf(f, "%d%04o %04o\n", srcfield, i, fields[srcfield][i]);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
char sixbit(int six)
|
||||
{
|
||||
six &= 0x3f;
|
||||
return six + ' ';
|
||||
}
|
||||
|
||||
#define MAX_MFD 32
|
||||
|
||||
struct {
|
||||
int proj, pgmr;
|
||||
char pw[6];
|
||||
int next;
|
||||
int ptr;
|
||||
} mfd_entry[MAX_MFD];
|
||||
int mfd_count;
|
||||
|
||||
int show_ufd(int base, int w[])
|
||||
{
|
||||
int i, seg, dbase, o, b;
|
||||
|
||||
// 0400 words/segment
|
||||
b = 0;
|
||||
o = 0;
|
||||
|
||||
while (1) {
|
||||
seg = w[b+1];
|
||||
if (seg == 0)
|
||||
return;
|
||||
|
||||
dbase = base + ((seg-1) * 0400);
|
||||
//printf("show_ufd; base %o, seg %o dbase %o\n", base, seg, dbase);
|
||||
|
||||
{
|
||||
int w1, w2, w3, next, ptr, prot, scnt, adate, ext;
|
||||
char c[12];
|
||||
|
||||
w1 = rf[dbase+o+0];
|
||||
w2 = rf[dbase+o+1];
|
||||
w3 = rf[dbase+o+2];
|
||||
next = rf[dbase+o+3];
|
||||
prot = rf[dbase+o+4];
|
||||
scnt = rf[dbase+o+5];
|
||||
adate = rf[dbase+o+6];
|
||||
ptr = rf[dbase+o+7];
|
||||
|
||||
ext = prot >> 6;
|
||||
prot &= 077;
|
||||
|
||||
c[0] = sixbit(w1 >> 6);
|
||||
c[1] = sixbit(w1);
|
||||
c[2] = sixbit(w2 >> 6);
|
||||
c[3] = sixbit(w2);
|
||||
c[4] = sixbit(w3 >> 6);
|
||||
c[5] = sixbit(w3);
|
||||
c[6] = 0;
|
||||
|
||||
o = next % 0400;
|
||||
b = next / 0400;
|
||||
|
||||
if (o > 0) {
|
||||
printf("%s %o %4d prot %o next %o ptr %o ", c, ext, scnt, prot, next, ptr);
|
||||
printf("; -> %o[%o]\n", b, o);
|
||||
}
|
||||
|
||||
if (next == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int read_mfd(void)
|
||||
{
|
||||
int i, base, o;
|
||||
|
||||
base = 0310000;
|
||||
o = 0;
|
||||
for (i = 0; i < MAX_MFD; i++) {
|
||||
int w1, w2, w3, next, ptr, proj, pgmr;
|
||||
char c[12];
|
||||
|
||||
w1 = rf[base+o+0];
|
||||
w2 = rf[base+o+1];
|
||||
w3 = rf[base+o+2];
|
||||
next = rf[base+o+3];
|
||||
ptr = rf[base+o+7];
|
||||
|
||||
c[0] = sixbit(w1 >> 6);
|
||||
c[1] = sixbit(w1);
|
||||
c[2] = sixbit(w2 >> 6);
|
||||
c[3] = sixbit(w2);
|
||||
c[4] = sixbit(w3 >> 6);
|
||||
c[5] = sixbit(w3);
|
||||
c[6] = 0;
|
||||
|
||||
//printf("0%o 0x%x ", w1, w1);
|
||||
proj = w1 >> 6;
|
||||
pgmr = w1 & 077;
|
||||
|
||||
if (o > 0) {
|
||||
mfd_entry[mfd_count].proj = proj;
|
||||
mfd_entry[mfd_count].pgmr = pgmr;
|
||||
strcpy(mfd_entry[mfd_count].pw, c);
|
||||
mfd_entry[mfd_count].next = next;
|
||||
mfd_entry[mfd_count].ptr = ptr;
|
||||
mfd_count++;
|
||||
|
||||
printf("[%2o, %2o] %s next %o ptr %o\n", proj, pgmr, c+2, next, ptr);
|
||||
|
||||
while (1) {
|
||||
int j, w[8], n;
|
||||
for (j = 0; j < 8; j++) {
|
||||
w[j] = rf[base+ptr+j];
|
||||
}
|
||||
n = w[0];
|
||||
printf(" next %o; %o %o %o %o %o %o %o\n",
|
||||
w[0], w[1], w[2], w[3], w[4], w[5], w[6], w[7]);
|
||||
|
||||
show_ufd(base, w);
|
||||
if (n == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
o = next;
|
||||
if (next == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int show_dir(void)
|
||||
{
|
||||
read_mfd();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int eval_scriptline(char *line)
|
||||
{
|
||||
char word1[256], word2[256], word3[256];
|
||||
int count, fld;
|
||||
|
||||
count = sscanf(line, "%s %s %s", word1, word2, word3);
|
||||
|
||||
if (strcmp(word1, "clear") == 0) {
|
||||
rf_size = 524288 / 2;
|
||||
memset((void *)rf, 0, sizeof(rf));
|
||||
}
|
||||
|
||||
if (strcmp(word1, "disk") == 0) {
|
||||
if (count < 2) {
|
||||
fprintf(stderr, "missing disk arg\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return disk_load(word2);
|
||||
}
|
||||
|
||||
if (strcmp(word1, "dir") == 0) {
|
||||
show_dir();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(word1, "copy") == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(word1, "dump") == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(word1, "save") == 0) {
|
||||
if (disk_save())
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int eval_scriptfile(char *filename)
|
||||
{
|
||||
FILE *f;
|
||||
char line[1024];
|
||||
|
||||
f = fopen(filename, "r");
|
||||
if (f == NULL) {
|
||||
perror(filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (fgets(line, sizeof(line), f)) {
|
||||
eval_scriptline(line);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
char *scriptfile;
|
||||
|
||||
scriptfile = NULL/*"script"*/;
|
||||
clear_flag = 0;
|
||||
|
||||
while ((c = getopt(argc, argv, "cs:")) != -1) {
|
||||
switch (c) {
|
||||
case 'c':
|
||||
clear_flag++;
|
||||
break;
|
||||
case 's':
|
||||
scriptfile = strdup(optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc && scriptfile == NULL) {
|
||||
scriptfile = argv[optind];
|
||||
}
|
||||
|
||||
printf("scriptfile: %s\n", scriptfile);
|
||||
if (eval_scriptfile(scriptfile))
|
||||
exit(1);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* indent-tabs-mode:nil
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
*/
|
||||
3
utils/filer/script
Normal file
3
utils/filer/script
Normal file
@@ -0,0 +1,3 @@
|
||||
#
|
||||
disk tss8_rf.dsk
|
||||
dir
|
||||
BIN
utils/filer/tss8_rf.dsk
Normal file
BIN
utils/filer/tss8_rf.dsk
Normal file
Binary file not shown.
BIN
utils/filer/tss8_rf.dsk.orig
Normal file
BIN
utils/filer/tss8_rf.dsk.orig
Normal file
Binary file not shown.
Reference in New Issue
Block a user