diff --git a/README.md b/README.md index 1d98fef8..1c7af4c6 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ A list of [known ITS machines](doc/machines.md). - PHOTO, capture STY session output. - PORTS, display free network ports. - PR, print out various system documentation. + - PRINT, print long-named files. - PROBE, probe inside job and display various information about it. - PRUFD, list files on disk volume. - PTY, pseudo-tty diff --git a/build/build.tcl b/build/build.tcl index 2565116a..40b7cb87 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -749,6 +749,12 @@ expect ":KILL" respond "*" ":midas sys1;ts reatta_sysen2;reatta\r" expect ":KILL" +# print +respond "*" ":midas sys;ts print_sysen2;print\r" +expect ":KILL" +respond "*" ":link sys;ts copy,sys;ts print\r" +respond "*" ":link sys;ts listf,sys;ts print\r" + # timoon respond "*" ":midas sys1;ts timoon_syseng;timoon\r" expect ":KILL" diff --git a/src/sysen2/print.1 b/src/sysen2/print.1 new file mode 100755 index 00000000..68f91d7c --- /dev/null +++ b/src/sysen2/print.1 @@ -0,0 +1,306 @@ +;-*- Mode:MIDAS; Fonts: MEDFNT -*- + +TITLE PRINT - Print long-named file (yeeech) + +;;; We take a fully spec'd long filename as JCL, open the file in UAI +;;; mode, and print it out on the terminal. ^S works to flush it. +;;; Use ^Q to quote commas, nuls, linefeeds, etc., in a filename. + +;;; If XJNAME is ^F or LISTF, we append ;.FILE. (DIR) to the filename. +;;; This kludge should be fixed to use DIR: device if possible. + +;;; If XJNAME is $^R or COPY we take sourcefile, destfile as JCL. +;;; Maybe there should be a switch specifying to first copy into +;;; _COPY_ OUTPUT and then rename instead of copying directly? + +;;; It'll take lots of hacking to make ITS *really* support long filenames! + +PG$SIZ==2000 + +Z=0 ;Super temp +A=1 ;A-E general purpose, +B=2 ; always preserved +C=3 +D=4 +E=5 +CH=6 ;Character being hacked. +T=10 ;Temps +TT=T+1 +P=17 ;Stack pointer + +FOOO=13 ;Device output. +FOOI=14 ;Device input. +TTYO=15 ;Console typeout +TTYI=16 ;Console typein + + +DEFINE SYSCAL A,B + .CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))] +TERMIN + +CALL==: +RET==: +CALRET==:JRST +NOP==: + +DEFINE TMPLOC VAL,?ARG + %%%TLC==. + LOC VAL + ARG + LOC %%%TLC +TERMIN + + +DEFINE NORM7 AC + SKIPGE AC + SUB AC,[430000,,1] +TERMIN + + +DEFINE DECBP AC + ADD AC,[70000,,] + SKIPGE AC + SUB AC,[430000,,1] +TERMIN + + +DEFINE TYPE CH,&STRING + CALL [ MOVEI T,<.LENGTH STRING> + MOVE TT,[440700,,[ASCII STRING]] + SYSCAL SIOT,[%CLIMM,,CH ? TT ? T] + .LOSE %LSFIL + RET ] +TERMIN + + + +;;; Various returns. + +INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] + .LOSE %LSSYS + +POPJ1: AOS (P) ;Skip +CPOPJ: RET ;Return + +DEATH: SKIPE DEBUG + .VALUE + .LOGOUT 1, + + +;;; Interrupt vector. + +TMPLOC 42,{-LTSINT,,TSINT} ;New style interrupt handler. +INTACS==2+T_6 ;Protect T,TT for handlers. +TSINT: INTACS,,P + 0 ? 1_TTYI ? 0 ? <1_TTYO>\<1_TTYI> ? INTCHR + 0 ? 1_TTYO ? 0 ? 0 ? INTMOR +LTSINT==:.-TSINT + + +;;; INTCHR - Handler for console input interrupts. + +INTCHR: MOVEI T,TTYI ;Get interrupt character in T. + .ITYIC T, + JRST INTRET + CAIN T,^G ;^G flushes anything, even copy + JRST INTC10 + skipn copyp ;^S should not flush copying + CAIE T,^S + JRST INTRET +INTC10: .RESET TTYO, ;^G and ^S should echo on flushing. Do they? + SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TTYI] + .LOSE %LSSYS + .value [asciz/:!kill :î/] ;type ! + jrst death ;try again, just in case + +;;; INTMOR - Handler for **MORE** condition. + +INTMOR: TYPE TTYO,"--More--" + SYSCAL IOT,[%CLBIT,,%TIPEK ? %CLIMM,,TTYI ? %CLOUT,,T] + .LOSE %LSFIL + CAIE T,40 + CAIN T,177 + .IOT TTYI,T + CAIN T,40 + JRST [ TYPE TTYO,"A" + JRST INTRET ] + type ttyo,"Flushed " + .value [asciz/:kill /] ;type Flushed, leave cursor there. + .BREAK 16,64000 ;try again, supposedly silent + JRST DEATH ;what, still alive after all that??? + + +SUBTTL Main program + +GO: MOVE P,[-PDLLEN,,PDL-1] + SYSCAL OPEN,[%CLBIT,,<.UAO\%TJDIS> ? %CLIMM,,TTYO ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL OPEN,[%CLBIT,,.UAI ? %CLIMM,,TTYI ? [SIXBIT /TTY/]] + .LOSE %LSFIL + + ;; Set up TTY interrupts like DDT has. + SYSCAL TTYSET,[%CLIMM,,TTYI ? [222222,,222222] ? [230222,,220222]] + aos ttinit ;not really a TTY, don't clear screen + + MOVE A,[-8.,,[ .ROPTION ? TLO %OPINT\%OPOPC + .RMSK2 ? IOR [<1_TTYI>\<1_TTYO>] + .ROPTION ? MOVEM B + .RXJNAME ? MOVEM C]] + SYSCAL USRVAR,[ %CLIMM,,%JSELF ? A ] ;temp keep XJNAME in C. + .LOSE %LSSYS + setz tt + came c,[sixbit/COPY/] ;COPY command + camn c,[sixbit/$^R/] + aos tt ;wants a comma + movem tt,copyp + TLNN B,%OPCMD ;Require JCL. + JRST [ TYPE TTYO,"A Usage is :PT long filename to print + :PF long directory to list + :CY source, destination" + JRST DEATH ] + .CORE BUFPAG+1 ;Get buffer page. + JRST [ TYPE TTYO,"ACan't get core." + JRST DEATH ] + .BREAK 12,[..RJCL,,JCLBUF] ;Gobble JCL. + MOVE A,[440700,,JCLBUF] + MOVE B,[440700,,FNAME] ;Read filename from JCL. + movei ch,40 +JCLGET: ILDB T,A + cain t,", + jrst [ skipe copyp ;if not copy + skipe comma ;or too many commas + .lose %lssys+%ebdfn ;bad filename + movem b,comma + move b,[440700,,CNAME] + jrst jclget] + CAIE T,0 + CAIN T,33 + JRST jclend + CAIE T,^_ + CAIN T,^C + JRST jclend + CAIE T,^J + CAIN T,^M + JRST jclend + IDPB T,B + caie t,": + cain t,"; + movem b,devdir + caie t,40 + movem b,nonbl + caie t,^Q + jrst jclget + ildb t,a + idpb t,b + movem b,nonbl + JRST JCLGET + +jclend: came c,[sixbit/LISTF/] ;LISTF kludge + camn c,[sixbit/^F/] + skipa + jrst jclopn + move a,[440700,,[asciz/;.file. (dir)/]] + move b,nonbl + ldb t,b + cain t,"; + came b,devdir + skipa + ibp a ;already have an unquoted semicolon, don't append one +jcldir: ildb t,a + idpb t,b + jumpn t,jcldir + +jclopn: MOVE A,[440700,,FNAME] ;Open up the file. + SYSCAL SOPEN,[%CLBIT,,.UAI ? %CLERR,,B ? %CLIMM,,FOOI ? a ] + JRST OPNERR + + movei e,ttyo ;channel to output to + skipe copyp + jrst [movei e,fooo + move a,[440700,,cname] ;later use _COPY_ OUTPUT with RNFL. + syscal sopen,[%clbit,,.uao ? %clerr,,b ? e ? a ] + jrst opnerr + jrst .+1] + +LOOP: MOVE B,[440700,,BUFFER] ;Bp to buffer. + MOVEI D,BUFLEN*5 ;Chars buffer can hold. + MOVE C,D ;Ask for full buffer. + SYSCAL SIOT,[%CLIMM,,FOOI ? B ? C ] + .LOSE %LSFIL + SUB D,C ;D gets chars in buffer. + skipe copyp + jrst copy + MOVE T,B ;Get Bp to end of buffer. + NORM7 T +trim: LDB CH,T ;Get the possibly offensive character. + cain CH,^C ;If this is the magic EOF character + JRST [ DECBP T ; back up the bp + SOJN D,trim ; and decrement real length. + TYPE TTYO,"ANo data!" + JRST DEATH ] + aosn ttinit ;Once only + TYPE TTYO,"C" ;clear the screen. +copy: MOVE B,[440700,,BUFFER] + MOVE C,D + SYSCAL SIOT,[ E ? B ? C ] + .LOSE %LSFIL + CAIL D,BUFLEN ;If we received a full buffer of data + JRST LOOP ; go back and see if there is more. + skipn copyp ;Else reached EOF - wrap up. + JRST DEATH + syscal close,[ e ] ;RENMWO eventually + .lose %lsfil + .value [asciz/:kill :î/] ;type + jrst death ;in case ddt missed + +OPNERR: TYPE TTYO,"A" +OPNER1: ILDB T,A + CAIE T,0 + CAIN T,33 + JRST OPNER2 + CAIE T,^_ + CAIN T,^C + JRST OPNER2 + CAIE T,^J + CAIN T,^M + JRST OPNER2 + .IOT TTYO,T + JRST OPNER1 +OPNER2: SYSCAL OPEN,[%CLIMM,,FOOI ? [SIXBIT/ERR/] ? [4] ? B] + JRST DEATH + TYPE TTYO," - " +OPNER3: .IOT FOOI,T + CAIN T,^M + JRST OPNER4 + CAIE T,^L + CAIN T,^C + JRST OPNER4 + JUMPL T,OPNER4 + .IOT TTYO,T + JRST OPNER3 +OPNER4: JRST DEATH + +DEBUG: 0 + PDLLEN==512. +PDL: BLOCK PDLLEN ;The Stack. +PATCH: BLOCK 40 + +ttinit: -1 +copyp: 0 ;1 Iff COPY instead of PRINT + +comma: 0 ;BP to last , in JCL +devdir: 0 ;BP to last unquoted : or ; in FNAME +nonbl: 0 ;BP to last non-blank in FNAME + +JCLBUF: BLOCK 40. ;JCL buffer. +FNAME: BLOCK 100. ;input file name +CNAME: BLOCK 100. ;copy output file name + +CONSTANTS +VARIABLES + +BUFPAG==<.+1777>/PG$SIZ +BUFFER==BUFPAG*PG$SIZ +BUFLEN==PG$SIZ-1 + +END GO