"Interpreted output routines--used for echoing and NORMAL-OUT." > ) "AUX" (TC ) (TTY ) (TD )) #DECL ((CHANNEL) CHANNEL (CHRS) (LENGTH) (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC) ; "If we don't know where the cursor is, go to top of screen" )> .CHRS>> ) ( >) (>>)> )) #DECL ((CT) FIX (LASTCHR CHR) CHARACTER) *177*> CHARACTER>> > > 32> <==? 127>>> ; "Normal character" ) (<==? .CHR ;"Char Alt"> ) (<==? .CHR ;"Char C.R."> 0> >)>) (<==? .CHR ;"Char L.F."> ;"Char C.R."> ;"Char C.R."> 0> >)>)> ) (<==? .CHR ;"Char Tab"> ) (LEN <- 8 >)) > <- 1>> >>) (T )>>) (<==? .CHR ;"Char Bell"> ; "Ring bell, don't move cursor" ) ( ;"Char "> ; "Rubout is normally invisible, so ,NULL will work." %<- 1>> *177*>>>)> )>>) (.LENGTH)>> ; "Called with a tuple of chars to be dumped. Handles ! stuff, including invocation of LF. Chars seen here need no special handlng." ) (WIDTH <- 1>)) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC (CHARS) (X WIDTH) FIX) > .WIDTH> ; "Line overflow" ; "Stuff out a CR" ;"Char C.R."> ; "Go to next line -- may provoke --More-- and friends" )> > .CHARS>> ) (TTY )) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (NEW) ) > ) (T )>> ) (Y ) (HEIGHT ) (MODE ) (MORE? <>) (MORE-LINES > -1) (T >)>)) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC (Y LIN HEIGHT MODE) FIX (MORE?) ) > <- .HEIGHT 1>> .MORE-LINES>>) (T <==? <+ .LIN 1> .HEIGHT>)>) ( >> <==? .Y <- .HEIGHT 1>>) (T > .MORE-LINES>>)>> ; "Need a more" >)> > ; "Not a more, but scrolling" .HEIGHT>> ; "Update last in, to trigger halt at screen bottom" 1>> <- .HEIGHT 1>>> > ; "Pad only if scrolling" <- .HEIGHT 1>> >)>) (T ; "Down cursor wraps if at bottom" )>)>> )) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC (MODE) FIX (ICHR) CHARACTER) ) (>)> T % ;"Char Space" ;"Char ">>) (T ;"Char Cntl-Q" <> % ;"Char Cntl-Q" ;"Char Cntl-S">>)> <>)>> ) (OM ) CHR Q) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (RETURNS) (CHECK-QUEUE?) (DONT Q) ) >> >>> > CHARACTER>> >)> <==? .Q .DONT>) ()> >)>)>) (T <>>> <==? .DONT .CHR>) ()>> )>)> <==? .CHR .RETURNS>> > )>>)> .CHR> >> "Buffered input routines" > ; "Scroll mode" > ; "Normal mode" ) (T ; "ITS mode" >)>) (T ; "Wrap mode" >)>> ) (IMAGE? ) (ECHO? ) (BUFFER ) (TTY )) #DECL ((TC) TTY-CHANNEL (BUF CBUF END) STRING (TOT AVAIL CONT) FIX (IMAGE? ECHO?) (CHANNEL) CHANNEL (BUFFER) (MODE) FIX (PROMPT) ) .CONT>> ) (T > > > ) (TTY ) (ECHRS ) RC TERM?) #DECL ((RC) (CHR) CHARACTER (IJFN) FIX (ECHRS) STRING (TERM?) (TTY) TTY) > <1 .CBUF .CHR> > > > >>>> ; "Echo char in these cases" )> ; "Done. Do this before checking for editing char" >)> > <==? .CHR > <==? .CHR >> > ) (<==? .CHR > ;"Char Cntl-W") (<==? .CHR > ;"Char Cntl-U")> .PROMPT> > > >) (<==? .CHR ;"Char Cntl-L"> )> > >; "Now know where we start" ) (<==? .CHR ;"Char Cntl-D"> )> > > ) (<==? .CHR > ;"...") (T > <==? .CHR >> <1 .CBUF > > > > )> <1 .CBUF > )> > > > )>)> )>>)>> >> ;"Char Space" ;"Char Tab" ;"Char L.F." ;"Char C.R." ;"Char -" ;"Char /" ;"Char .">> ; "BUFFER is: initial buf, current buf, space left in buf, total chrs in buf" )) #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (WHICH) CHARACTER (BUFFER) (KC) CHARACTER (VERT) FIX (PROMPT) ) > ;"Char Bell">) (<==? .WHICH ;"Char "> >> >> 1>> 1>> ;"Char L.F."> 0> <==? <1 >> ;"Char C.R.">> >> 1>> 1>>)> ) ( ;"Char Tab"> <==? .KC ;"Char C.R.">> .PROMPT> .OY> >) (T >)> ) ( > ;"Char Alt">> ) (T )>) (<==? .WHICH ;"Char Cntl-W"> ) (<==? .WHICH ;"Char Cntl-U"> )>> ) (CHRS ) (UP 0) (NBREAKFLAG <>) (TC ) (TTY ) (OX ) (OY ) NX NY) #DECL ((CHANNEL) CHANNEL (BUFFER) (CCT UP) FIX (STOP CHRS) STRING (TC) TTY-CHANNEL (TTY) TTY (PROMPT) ) )> > >>> .STOP> > > )>) (T )> ;"Char L.F."> ; "First, kill everything after the linefeed" > > > > ; "Now, delete the CR if there" <==? <1 > ;"Char C.R.">> > >)>)>> ; "Update the buffer" ; "And do the delete" .PROMPT> ; "Computes new cursor pos, but doesn't move cursor" > > )> > 0> > 1>>)> )>>) (T )> > ; "Takes channel, buffer, # lines moved up. Positions screen cursor at end of current buffer. If CONT is non-zero, and have erased into that, and CONT doesn't start at beginning of line, will do wrong thing with horizontal position. VERT is then used to find new vertical position." ) "AUX" IH (VLOSER? <>) (LINES 0) NEWY HEIGHT (TC )) #DECL ((CHANNEL) CHANNEL (BUFFER) (HEIGHT NEWY VERT) FIX (MOVE? VLOSER?) (PROMPT) (TC) TTY-CHANNEL) > ; "Sigh. Don't know where the text starts" ) (T >)> ) (CT ) (T )>) CHR (BB )>) (WIDTH )) #DECL ((WIDTH CT) FIX (CHR) CHARACTER (BB) STRING) > > > ) (T )>)> > > > 32> 127>> <==? .CHR ;"Char Alt">> >) (<==? .CHR ;"Char C.R."> ) (<==? .CHR ;"Char L.F."> >) (<==? .CHR ;"Char Tab"> >>>) (>)> > > >)>> 0>> .VERT>>) ( .LINES>>)> >> >) ( .HEIGHT>>>)> > ) (T )>) (T )>>