From c164b2a51d34476435d186d7c64264f588cfdcfa Mon Sep 17 00:00:00 2001 From: brad Date: Fri, 1 Jan 2016 21:55:02 +0000 Subject: [PATCH] changes for building tss8 variants --- utils/filer/Makefile | 9 + utils/filer/NOTES.txt | 27 +++ utils/filer/filer | Bin 0 -> 12380 bytes utils/filer/filer.c | 357 +++++++++++++++++++++++++++++++++++ utils/filer/script | 3 + utils/filer/tss8_rf.dsk | Bin 0 -> 524288 bytes utils/filer/tss8_rf.dsk.orig | Bin 0 -> 524288 bytes utils/maker/maker.c | 69 ++++++- utils/maker/script | 1 + utils/maker/script2 | 9 + utils/maker/script3 | 10 + utils/maker/tss8.23.cmd | 5 + utils/maker/tss8.cmd | 2 +- utils/maker/tss8_uwm.cmd | 5 + 14 files changed, 486 insertions(+), 11 deletions(-) create mode 100644 utils/filer/Makefile create mode 100644 utils/filer/NOTES.txt create mode 100755 utils/filer/filer create mode 100644 utils/filer/filer.c create mode 100644 utils/filer/script create mode 100644 utils/filer/tss8_rf.dsk create mode 100644 utils/filer/tss8_rf.dsk.orig create mode 100644 utils/maker/script2 create mode 100644 utils/maker/script3 create mode 100644 utils/maker/tss8.23.cmd create mode 100644 utils/maker/tss8_uwm.cmd 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 0000000000000000000000000000000000000000..824dfbe4450b7f90a853e22cbc81c54742be7190 GIT binary patch literal 12380 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 F{s+t+`wjpA literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ec101f70980f14d6a1d008c144f831908408eda8 GIT binary patch literal 524288 zcmeFad3+T`z6V-e)u+0vs!umAp);#?b+F_B+E# z0!RRr%>fkT2%^v6gdJoj>`THHLPA&rB!s~G{`v%QymQ~Z_kG?U@4e6T`J6u8 z)z!89>bL)@>g4(vo-mngx?thqGQ~7AjJYwE6&v0m(N>?U?I`vJR!{gBmWbr@%Y z+00>gv388{ioj)evvOOqd)a-g9=o5_PZULGk4_KL>0cg$MV{^1zqVuU*J1>ph>sOH zE@F1w$i0zFf0FZ<)0q#oC$TYZ!^miRa->|ek93aQ8L96_*q+GMAU8M>{GAP8`^?3E zRlZe+^<(`R^9$|1k>9gFuuQRuN5p+%5Vx!hnQi?wa+jGK=_l@F4P*lz5BBI zBC|c$j&T=h@9Mb!I!CHV3Z`n8C;Ls1`j*b{>O0S>Ebk^~fLSJPh@{9AaTm)8#_1Gp z`KdBhWO!7r%WF9ect6n(=WMTD@Rh!YHM=Dj%KYw%u{FU;{g}F9nE#lH1J5+y&Tnq!R9%%ke@prgT4C(XRY zhO$q?PaLH!V|i=^i{rbNZDlLja+c3F;c9n?HBBV7Egd8G5#aTrX=P`7t%U2}x#8VDqAhVf533y69nsY0Rgx#&QZzGk=QqVORYOXOT$u8vtHuW~NyH9Bn0L zVXWhRL%_QMzlRU=7Mj2DT4+g}?G5Wroc7~q4cpE(vejWLSF#;w>2kF6&F}*I0NgeM*4<3pZw2gHrQg&U7L91CoeGR<%gi>vymQ+y0K=mMKBN@F+6|U3J{#a8PsVHMjkZK4PD*>k@yq{`1E5(+`Oz)2> z8+;+dyMhy!S^n5@k_&6+xEw`^W%OVqUY#_%_{y{f=ivZRP^DR|CfWtQpHUmxDK0 z1Y!HZo_>3ryP_XApoewP zkH4ygdZ9k6nE$le2smuUdyE~>jrl;lw-a|&hVBO8?pm3x`B3CMV%n)UO;^xfiR{GF zB)yjgt}zVH&Hy+69^4wqW9vh_Co0$t3|kNEUyaYokSf*!?-=MeiKPWgF(N6vUa%$P zAt_=IOK}>4Kjs95dZb5mlI`UNdv%H^z>~q?4~+q*R(5OtCg3wew-Q6xUA&dk6PVRT zT7DbeR<;H2Xd~jm65S?3bk)OegLv15j z%qKVxMhl2XTru77$wV7V)e?O*n&s6JA*MT&lER-*TlDL}U!oWRaPcPK8Mdm@t$9kP6xfGfSNUC_A82b(^@A5q$8x`UdIQK$#(n1+#He$Y#BmKkvLCj?3fX1?PEj8*dl%@Y93-ej=@Qa8xg0 zg&igpaN2l8yBFV$^$ns58btc`4oE9u|C+5kW3no`@_?fka9cF^WK zzYW9twsNvA2IT4m`vCPEoD(u&Ag+t_a61bl6bs)?_J`ZU0e!~m1zlAJC<{Fo0|BRj zfbeCVz^T6iDg*7aIsp^v_ed`$hRB%RKjfPj6Tm9Nv;113k!-|AdP8v!sfHGeHn;Op zz|>KYdGjFU@4(#);P`YuU5^5!p8#hY<;3-EJOx~lM)phX+Ac=XMQcVI%JXC7ah=46 z(x|q$UtgpLF~2@?<(WLT4WG53&y694GIq*IP~JAy3OV+geRi6mv7-;ecLUqPzQWZB zQ)W)`QnOACSEE%asNnjuOQyNojn_TjX^S9 z29NuX2=jO0t~)sIos1~`66ErEXhltUGVt~eUdea4O;FDcv|^WAV5*28h;zCbFkCtW z89J&%%6|k`^@14BkOM^~VJ%=W(9RUkAvLav#`x8A+cl;j`v|Neg^i;ycp2 z4czM~^FV|~c?~p}ZTO9&rHq}Hr0X2hr}=5wnx6qJ6yti2y~muc8M)K4gF2@7fsT6w z#P10^{?(D?_ErQ{!tb}i^GWkYzYo``l=2GIXZXStt1_B^Iuf-cm6Z-5TCA2_=a@+r~Z)nR|vpr32;U5D=~b3gj} zfH|&WW;WjKt%`VO<$#McfuwGT^1GOG{Q2l{6Vo}G^pA7Uqzzip2W>H+!SlMIeMIl# zZm=6;eXXrcpi%6^_a5MZ;iTu&6Ve@iu1a+?yx)v}ZH@He!A?VZcg#;$%xeZ5yiY6v z@7js>_kxB@l8UJMb(GTxElP(JYb8=Z*$vS8XMERb1bt|xCZ6#)B-ad-+)B)FWNBe(@_*p`CQl0HXu`zlx~Xi+H$&e!sW