diff --git a/utils/filer/Makefile b/utils/filer/Makefile new file mode 100644 index 0000000..e32e7d2 --- /dev/null +++ b/utils/filer/Makefile @@ -0,0 +1,9 @@ +# + +all: filer + +filer: filer.c + cc -o filer filer.c + +clean: + rm -rf filer diff --git a/utils/filer/NOTES.txt b/utils/filer/NOTES.txt new file mode 100644 index 0000000..fe643d1 --- /dev/null +++ b/utils/filer/NOTES.txt @@ -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 diff --git a/utils/filer/filer b/utils/filer/filer new file mode 100755 index 0000000..824dfbe Binary files /dev/null and b/utils/filer/filer differ diff --git a/utils/filer/filer.c b/utils/filer/filer.c new file mode 100644 index 0000000..a80cca2 --- /dev/null +++ b/utils/filer/filer.c @@ -0,0 +1,357 @@ +/* + * tss/8 rf08 disk file system utility + * list directory, copy files in/out + * brad@heeltoe.com 1/2014 + */ + +#include +#include +#include +#include + +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: +*/ diff --git a/utils/filer/script b/utils/filer/script new file mode 100644 index 0000000..d2256a1 --- /dev/null +++ b/utils/filer/script @@ -0,0 +1,3 @@ +# +disk tss8_rf.dsk +dir diff --git a/utils/filer/tss8_rf.dsk b/utils/filer/tss8_rf.dsk new file mode 100644 index 0000000..ec101f7 Binary files /dev/null and b/utils/filer/tss8_rf.dsk differ diff --git a/utils/filer/tss8_rf.dsk.orig b/utils/filer/tss8_rf.dsk.orig new file mode 100644 index 0000000..6d55d56 Binary files /dev/null and b/utils/filer/tss8_rf.dsk.orig differ diff --git a/utils/maker/maker.c b/utils/maker/maker.c index 974c966..ba62d42 100644 --- a/utils/maker/maker.c +++ b/utils/maker/maker.c @@ -7,6 +7,7 @@ #include #include #include +#include typedef unsigned short u12; @@ -19,6 +20,9 @@ char filled[7][4096]; u12 rf[RFSIZE]; int rf_size; int rf_fd; +int clear_flag; +int patch_flag; +int debug; #define MEMSIZE (32*1024) @@ -26,10 +30,24 @@ int disk_load(char *filename) { int fd, ret; - rf_fd = open(filename, O_RDWR); - if (rf_fd < 0) { - perror(filename); - return -1; + 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)); @@ -41,7 +59,7 @@ int disk_load(char *filename) ret = 0; } - printf("rf_fd %d\n", rf_fd); + if (debug) printf("rf_fd %d\n", rf_fd); return ret; } @@ -171,6 +189,9 @@ int field_load(int dstfield, char *filename) csum = 0; bad = 0; + field = -1; + newfield = dstfield; + for (o = 0; o < binfile_size && !done; o++) { ch = binfile[o]; @@ -220,7 +241,7 @@ int field_load(int dstfield, char *filename) int ignore, allow; if (field > 7 || origin >= MEMSIZE) { - printf("%s: too big\n", filename); + printf("%s: too big; field %o, origin %o\n", filename, field, origin); bad++; } @@ -296,6 +317,11 @@ int eval_scriptline(char *line) 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"); @@ -305,6 +331,10 @@ int eval_scriptline(char *line) return disk_load(word2); } + if (strcmp(word1, "patch") == 0) { + patch_flag++; + } + if (strcmp(word1, "field") == 0) { if (count < 3) { fprintf(stderr, "missing field arg\n"); @@ -317,7 +347,8 @@ int eval_scriptline(char *line) } field_load(fld, word3); - field_patch(fld); + if (patch_flag) + field_patch(fld); field_save(fld); if (fld == 3) field_save(4); @@ -372,15 +403,33 @@ int eval_scriptfile(char *filename) return 0; } +extern char *optarg; +extern int optind; + main(int argc, char **argv) { + int c; char *scriptfile; - scriptfile = "script"; + scriptfile = NULL/*"script"*/; + clear_flag = 0; - if (argc > 1) - scriptfile = argv[1]; + 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); diff --git a/utils/maker/script b/utils/maker/script index d1e98e4..7050fa5 100644 --- a/utils/maker/script +++ b/utils/maker/script @@ -1,5 +1,6 @@ # disk tss8_rf.dsk +patch field 0 ../../tss8.2/si.bin field 1 ../../tss8.2/fip.bin field 2 ../../tss8.2/init.bin diff --git a/utils/maker/script2 b/utils/maker/script2 new file mode 100644 index 0000000..3dbfcaa --- /dev/null +++ b/utils/maker/script2 @@ -0,0 +1,9 @@ +# +disk tss8_rf_uwm.dsk +field 0 ../../tss8_uwm/si.bin +field 1 ../../tss8_uwm/fip.bin +field 2 ../../tss8_uwm/init.bin +field 2 ../../tss8_uwm/INIT.XD.bin +field 3 ../../tss8_uwm/ts8.bin +field 4 ../../tss8_uwm/ts8ii.bin +save diff --git a/utils/maker/script3 b/utils/maker/script3 new file mode 100644 index 0000000..30e9379 --- /dev/null +++ b/utils/maker/script3 @@ -0,0 +1,10 @@ +# +disk tss8_rf_23.dsk +#clear +field 0 ../../tss8.23/si.bin +field 1 ../../tss8.23/fip.bin +field 2 ../../tss8.23/init.bin +field 2 ../../tss8.23/INIT.XD.bin +field 3 ../../tss8.23/ts8.bin +field 4 ../../tss8.23/ts8ii.bin +save diff --git a/utils/maker/tss8.23.cmd b/utils/maker/tss8.23.cmd new file mode 100644 index 0000000..d400abe --- /dev/null +++ b/utils/maker/tss8.23.cmd @@ -0,0 +1,5 @@ +load ../../tss8.23/init.bin +set df disabled +set rf enabled +att rf tss8_rf_23.dsk +run 24200 diff --git a/utils/maker/tss8.cmd b/utils/maker/tss8.cmd index 8952031..61590f2 100644 --- a/utils/maker/tss8.cmd +++ b/utils/maker/tss8.cmd @@ -1,4 +1,4 @@ -load ../tss8.2/init.bin +load ../../tss8.2/init.bin set df disabled set rf enabled att rf tss8_rf.dsk diff --git a/utils/maker/tss8_uwm.cmd b/utils/maker/tss8_uwm.cmd new file mode 100644 index 0000000..3416a5b --- /dev/null +++ b/utils/maker/tss8_uwm.cmd @@ -0,0 +1,5 @@ +load ../../tss8_uwm/init.bin +set df disabled +set rf enabled +att rf tss8_rf_uwm.dsk +run 24200