1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-22 02:26:05 +00:00
Eric Swenson c332058bfe Added PRINT.
Resolves #288.
2016-12-19 10:28:58 +01:00

307 lines
6.7 KiB
Groff
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*- 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==:<PUSHJ P,>
RET==:<POPJ P,>
CALRET==:JRST
NOP==:<JFCL>
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 :<16>/] ;type !<crlf><prompt>
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 :<16>/] ;type <crlf><prompt>
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