1 "Interpreted output routines--used for echoing and NORMAL-OUT."
3 <SETG TABS <ISTRING 8>>
6 <DEFINE TTY-NORMAL-OUT (CHANNEL OPER CHRS
8 "AUX" (TC <CHANNEL-DATA .CHANNEL>) (TTY <TC-TTY .TC>)
10 #DECL ((CHANNEL) CHANNEL (CHRS) <OR STRING CHARACTER> (LENGTH) <OR FIX FALSE>
11 (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC)
12 <COND (<TEST-TC-MODE .TC ,TM-BADPOS>
13 ; "If we don't know where the cursor is, go to top of screen"
14 <HOME-CURSOR .CHANNEL .OPER>
15 <CLEAR-EOL .CHANNEL .OPER>)>
16 <COND (<TYPE? .CHRS CHARACTER>
17 <SET CHRS <1 <CHTYPE ,BUF1 STRING> .CHRS>>
20 <SET LENGTH <LENGTH .CHRS>>)
21 (<SET LENGTH <MIN .LENGTH <LENGTH .CHRS>>>)>
23 <REPEAT ((CT 0) CHR (LASTCHR <ASCII 0>))
24 #DECL ((CT) FIX (LASTCHR CHR) CHARACTER)
25 <SET CHR <CHTYPE <ANDB <1 .CHRS> *177*> CHARACTER>>
26 <SET CHRS <REST .CHRS>>
28 <COND (<NOT <OR <L? <ASCII .CHR> 32>
29 <==? <ASCII .CHR> 127>>>
31 <DO-CHAR .CHANNEL .TC .TTY .TD .CHR>)
32 (<==? .CHR <ASCII 27> ;"Char Alt">
33 <DO-CHAR .CHANNEL .TC .TTY .TD !\$>)
34 (<==? .CHR <ASCII 13> ;"Char C.R.">
35 <OUTPUT-RAW-STRING .CHANNEL .CHR>
37 <COND (<G? <TD-CRPAD .TD> 0>
38 <OUTPUT-PAD .CHANNEL .TD <TD-CRPAD .TD>>)>)
39 (<==? .CHR <ASCII 10> ;"Char L.F.">
40 <COND (<N==? .LASTCHR <ASCII 13> ;"Char C.R.">
41 <OUTPUT-RAW-STRING .CHANNEL <ASCII 13> ;"Char C.R.">
43 <COND (<G? <TD-CRPAD .TD> 0>
44 <OUTPUT-PAD .CHANNEL .TD <TD-CRPAD .TD>>)>)>
45 <DO-LF .CHANNEL .TC .TTY .TD>)
46 (<==? .CHR <ASCII 9> ;"Char Tab">
47 <PROG ((X <TT-X .TTY>) (LEN <- 8 <MOD .X 8>>))
48 <COND (<G? <SET X <+ .X .LEN>> <- <TD-WIDTH .TD> 1>>
49 <DO-CHAR .CHANNEL .TC .TTY .TD
50 !<REST ,TABS <- 8 .LEN>>>)
53 <OUTPUT-RAW-STRING .CHANNEL .CHR>)>>)
54 (<==? .CHR <ASCII 7> ;"Char Bell">
55 ; "Ring bell, don't move cursor"
56 <OUTPUT-RAW-STRING .CHANNEL .CHR>)
57 (<N==? .CHR <ASCII 127> ;"Char
\7f">
58 ; "Rubout is normally invisible, so ,NULL will work."
59 <DO-CHAR .CHANNEL .TC .TTY .TD !\^
60 <ASCII <ANDB <+ <ASCII .CHR> %<- <ASCII !\A> 1>>
63 <COND (<G=? .CT .LENGTH>
67 ; "Called with a tuple of chars to be dumped. Handles ! stuff, including
68 invocation of LF. Chars seen here need no special handlng."
69 <DEFINE DO-CHAR (CHANNEL TC TTY TD "TUPLE" CHARS "AUX" (X <TT-X .TTY>)
70 (WIDTH <- <TD-WIDTH .TD> 1>))
71 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC
72 (CHARS) <TUPLE [REST CHARACTER]> (X WIDTH) FIX)
75 #DECL ((CHR) CHARACTER)
76 <COND (<G? <SET X <+ .X 1>> .WIDTH>
78 <OUTPUT-RAW-STRING .CHANNEL !\!>
80 <TTY-NORMAL-OUT .CHANNEL NORMAL-OUT <ASCII 13> ;"Char C.R.">
82 ; "Go to next line -- may provoke --More-- and friends"
83 <DO-LF .CHANNEL .TC .TTY .TD>)>
85 <OUTPUT-RAW-STRING .CHANNEL .CHR>>
88 <DEFINE TTY-MORE-LIMIT (CHANNEL OPER "OPTIONAL" NEW
89 "AUX" (TC <CHANNEL-DATA .CHANNEL>) (TTY <TC-TTY .TC>))
90 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (NEW) <OR FIX FALSE>)
91 <COND (<NOT <ASSIGNED? NEW>>
94 <TT-MORE-LINES .TTY .NEW>)>>
96 <SETG MORE-TYPE-LIMIT 5>
97 <GDECL (MORE-TYPE-LIMIT) FIX>
98 <DEFINE DO-LF (CHANNEL TC TTY TD "AUX" (LIN <TT-LAST-IN .TTY>)
99 (Y <TT-Y .TTY>) (HEIGHT <TD-HEIGHT .TD>) (MODE <TC-MODE .TC>)
100 (MORE? <>) (MORE-LINES <COND (<NOT <TT-MORE-LINES .TTY>>
104 <TT-MORE-LINES .TTY>>)>))
105 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC
106 (Y LIN HEIGHT MODE) FIX (MORE?) <OR ATOM FALSE>)
107 <COND (<AND <TEST-MODE .MODE ,TM-PAGE>
108 <COND (<NOT <TEST-MODE .MODE ,TM-WRAP>>
109 <COND (<TEST-MODE .MODE ,TM-ITS>
110 <AND <G=? <TT-LAST-MORE .TTY> <- .HEIGHT 1>>
111 <G? <- .HEIGHT .LIN> .MORE-LINES>>)
113 <==? <+ .LIN 1> .HEIGHT>)>)
114 (<AND <TEST-MODE .MODE ,TM-WRAP>
115 <NOT <TEST-MODE .MODE ,TM-ITS>>>
116 <==? .Y <- .HEIGHT 1>>)
118 <AND <==? .Y <- .HEIGHT 2>>
122 <SET MORE? <DO-MORE .CHANNEL .TC .TTY .TD>>)>
124 <COND (<NOT <TEST-MODE .MODE ,TM-WRAP>>
125 ; "Not a more, but scrolling"
126 <TT-LAST-IN .TTY <MOD <+ .LIN 1> .HEIGHT>>
127 ; "Update last in, to trigger halt at screen bottom"
128 <TT-LAST-MORE .TTY <+ <TT-LAST-MORE .TTY> 1>>
129 <TT-Y .TTY <MIN <+ .Y 1> <- .HEIGHT 1>>>
130 <OUTPUT-RAW-STRING .CHANNEL <ASCII 10>>
131 ; "Pad only if scrolling"
132 <COND (<==? <TT-Y .TTY> <- .HEIGHT 1>>
133 <OUTPUT-PAD .CHANNEL .TD <TD-LFPAD .TD>>)>)
135 ; "Down cursor wraps if at bottom"
136 <DOWN-CURSOR .CHANNEL NORMAL-OUT>
137 <CLEAR-EOL .CHANNEL NORMAL-OUT>)>)>>
139 <DEFINE DO-MORE (CHANNEL TC TTY TD "AUX" ICHR (MODE <TC-MODE .TC>))
140 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC
141 (MODE) FIX (ICHR) CHARACTER)
142 <TT-LAST-MORE .TTY 0>
143 <COND (<TEST-MODE .MODE ,TM-ITS>
144 <BOTTOM-CURSOR .CHANNEL NORMAL-OUT>
145 <CLEAR-EOL .CHANNEL NORMAL-OUT>
146 <TTY-NORMAL-OUT .CHANNEL NORMAL-OUT "**More**">)
147 (<OUTPUT-RAW-STRING .CHANNEL <ASCII 7>>)>
148 <DUMP-WRITE-BUFFER .TC>
149 <COND (<TEST-MODE .MODE ,TM-ITS>
150 <READ-UNTIL .CHANNEL <> T %<STRING <ASCII 32> ;"Char Space"
151 <ASCII 127> ;"Char
\7f">>)
153 <READ-UNTIL .CHANNEL <ASCII 17> ;"Char Cntl-Q"
154 <> %<STRING <ASCII 17> ;"Char Cntl-Q"
155 <ASCII 19> ;"Char Cntl-S">>)>
156 <COND (<TEST-MODE .MODE ,TM-WRAP>
157 <HOR-POS-CURSOR .CHANNEL NORMAL-OUT 0>
160 <DEFINE READ-UNTIL (CHANNEL RETURNS CHECK-QUEUE? DONT
161 "AUX" (TC <CHANNEL-DATA .CHANNEL>) (OM <TC-MODE .TC>)
163 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL
164 (RETURNS) <OR FALSE CHARACTER STRING> (CHECK-QUEUE?) <OR ATOM FALSE>
165 (DONT Q) <OR CHARACTER STRING FALSE>)
168 <TC-MODE .TC <ANDB .OM %<XORB ,TM-ECHO -1>>>
169 <COND (<AND .CHECK-QUEUE?
170 <NOT <0? <TC-QCT .TC>>>>
172 <COND (<NOT <TYPE? <SET Q <TC-QUEUE .TC>> CHARACTER>>
174 <COND (<COND (<TYPE? .DONT CHARACTER>
177 <SET CHR <GET-QUEUE-CHAR .TC>>)>)>)
180 <SET CHR <TTY-READ-IMMEDIATE .CHANNEL READ-IMMEDIATE <> <>>>
182 <COND (<NOT <COND (<TYPE? .DONT CHARACTER>
184 (<MEMQ .CHR .DONT>)>>
185 <STORE-QUEUE-CHAR .TC .CHR>)>)>
186 <COND (<OR <NOT .RETURNS>
187 <AND <TYPE? .RETURNS CHARACTER>
189 <MEMQ .CHR .RETURNS>>
196 "Buffered input routines"
199 <MSETG BUF-CURRENT 2>
206 <DEFINE UPDATE-INPUT (TTY MODE)
207 #DECL ((TTY) TTY (MODE) FIX)
208 <COND (<NOT <TEST-MODE .MODE ,TM-WRAP>>
210 <COND (<NOT <TEST-MODE .MODE ,TM-ITS>>
214 <TT-LAST-IN .TTY <TT-LAST-MORE .TTY>>)>)
217 <TT-LAST-IN .TTY <TT-Y .TTY>>)>>
219 <DEFINE DO-RDTTY (CHANNEL TC BUF CONT END PROMPT "AUX" TOT AVAIL CBUF
221 (IMAGE? <TEST-MODE .MODE ,TM-IMAGE>)
222 (ECHO? <ECHO-ON? .MODE>)
223 (BUFFER <TUPLE "" "" 0 0 0 0 0>) (TTY <TC-TTY .TC>))
224 #DECL ((TC) TTY-CHANNEL (BUF CBUF END) STRING (TOT AVAIL CONT) FIX
225 (IMAGE? ECHO?) <OR ATOM FALSE> (CHANNEL) CHANNEL
226 (BUFFER) <TUPLE [2 STRING] [5 FIX]> (MODE) FIX
227 (PROMPT) <OR FALSE STRING>)
228 <SET AVAIL <- <LENGTH .BUF> .CONT>>
229 <COND (<L=? .AVAIL 0>
233 <SET CBUF <REST .BUF .TOT>>
234 <BUF-START .BUFFER .BUF>
235 <BUF-CURRENT .BUFFER .CBUF>
236 <BUF-AVAIL .BUFFER .AVAIL>
237 <BUF-TOT .BUFFER .TOT>
238 <BUF-X .BUFFER <TT-X .TTY>>
239 <BUF-Y .BUFFER <TT-Y .TTY>>
240 <BUF-CONT .BUFFER .CONT>
241 <DUMP-WRITE-BUFFER .TC>
242 <REPEAT (CHR (IJFN <TC-IJFN .TC>) (TTY <TC-TTY .TC>)
243 (ECHRS <TT-SPEC-CHARS .TTY>) RC TERM?)
244 #DECL ((RC) <OR FIX FALSE> (CHR) CHARACTER (IJFN) FIX
245 (ECHRS) STRING (TERM?) <OR STRING FALSE> (TTY) TTY)
246 <COND (<SET CHR <GET-BYTE .TC>>
248 <SET TERM? <MEMQ .CHR .END>>
249 <UPDATE-INPUT .TTY .MODE>
252 <AND <NOT <MEMQ .CHR .ECHRS>>
253 <N==? .CHR <ASCII 13>>
254 <N==? .CHR <ASCII 10>>>>>
255 ; "Echo char in these cases"
256 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
258 <DUMP-WRITE-BUFFER .TC>)>
259 ; "Done. Do this before checking for editing char"
261 <RETURN <+ .TOT 1>>)>
262 <COND (<OR <==? .CHR <TS-RUBOUT .ECHRS>>
263 <==? .CHR <TS-WORD .ECHRS>>
264 <==? .CHR <TS-KILL .ECHRS>>>
265 <BUF-CURRENT .BUFFER .CBUF>
266 <BUF-AVAIL .BUFFER .AVAIL>
267 <BUF-TOT .BUFFER .TOT>
268 <DO-RUBOUT .CHANNEL .TC .TTY .BUFFER
269 <COND (<==? .CHR <TS-RUBOUT .ECHRS>>
271 (<==? .CHR <TS-WORD .ECHRS>>
272 <ASCII 23> ;"Char Cntl-W")
273 (<==? .CHR <TS-KILL .ECHRS>>
274 <ASCII 21> ;"Char Cntl-U")>
276 <SET CBUF <BUF-CURRENT .BUFFER>>
277 <SET AVAIL <BUF-AVAIL .BUFFER>>
278 <SET TOT <BUF-TOT .BUFFER>>)
279 (<==? .CHR <ASCII 12> ;"Char Cntl-L">
280 <CLEAR-SCREEN .CHANNEL FILL-READ-BUFFER>
282 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
285 <BUF-X .BUFFER <TT-X .TTY>>
286 <BUF-Y .BUFFER <TT-Y .TTY>>; "Now know where we start"
287 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
289 (<==? .CHR <ASCII 4> ;"Char Cntl-D">
290 <FRESH-LINE .CHANNEL FILL-READ-BUFFER>
293 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
295 <BUF-X .BUFFER <TT-X .TTY>>
296 <BUF-Y .BUFFER <TT-Y .TTY>>
297 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
299 (<==? .CHR <TS-REPRINT .ECHRS>>
302 <COND (<OR <==? .CHR <ASCII 13>>
303 <==? .CHR <ASCII 10>>>
305 <SET CBUF <REST .CBUF>>
307 <SET AVAIL <- .AVAIL 1>>
311 <TTY-NORMAL-OUT .CHANNEL FILL-READ-BUFFER
314 <SET CBUF <REST .CBUF>>
315 <SET AVAIL <- .AVAIL 1>>
318 <DUMP-WRITE-BUFFER .TC>)>>)>>
320 <SETG CRLF-STRING <STRING <ASCII 13> <ASCII 10>>>
321 <SETG BREAKS <STRING <ASCII 32> ;"Char Space"
322 <ASCII 9> ;"Char Tab"
323 <ASCII 10> ;"Char L.F."
324 <ASCII 13> ;"Char C.R."
327 <ASCII 46> ;"Char .">>
328 ; "BUFFER is: initial buf, current buf, space left in buf,
330 <DEFINE DO-RUBOUT (CHANNEL TC TTY BUFFER WHICH PROMPT "AUX" KC (VERT 0)
332 #DECL ((CHANNEL) CHANNEL (TC) TTY-CHANNEL (TTY) TTY (WHICH) CHARACTER
333 (BUFFER) <TUPLE [2 STRING] [5 FIX]> (KC) CHARACTER (VERT) FIX
334 (PROMPT) <OR FALSE STRING>)
335 <COND (<0? <BUF-TOT .BUFFER>>
336 <TTY-IMAGE-OUT .CHANNEL FILL-READ-BUFFER <ASCII 7> ;"Char Bell">)
337 (<==? .WHICH <ASCII 127> ;"Char
\7f">
338 <BUF-CURRENT .BUFFER <BACK <BUF-CURRENT .BUFFER>>>
339 <SET KC <1 <BUF-CURRENT .BUFFER>>>
340 <BUF-AVAIL .BUFFER <+ <BUF-AVAIL .BUFFER> 1>>
341 <BUF-TOT .BUFFER <- <BUF-TOT .BUFFER> 1>>
342 <COND (<==? .KC <ASCII 10> ;"Char L.F.">
343 <COND (<AND <G? <BUF-TOT .BUFFER> 0>
344 <==? <1 <BACK <BUF-CURRENT .BUFFER>>>
345 <ASCII 13> ;"Char C.R.">>
346 <BUF-CURRENT .BUFFER <BACK <BUF-CURRENT .BUFFER>>>
347 <BUF-AVAIL .BUFFER <+ <BUF-AVAIL .BUFFER> 1>>
348 <BUF-TOT .BUFFER <- <BUF-TOT .BUFFER> 1>>)>
349 <UPDATE-CURSOR-POS .CHANNEL .BUFFER 1 T .PROMPT>)
350 (<OR <==? .KC <ASCII 9> ;"Char Tab">
351 <==? .KC <ASCII 13> ;"Char C.R.">>
352 <UPDATE-CURSOR-POS .CHANNEL .BUFFER 0 <> .PROMPT>
353 <COND (<==? <TT-Y .TTY> .OY>
354 <HOR-POS-CURSOR .CHANNEL FILL-READ-BUFFER
357 <MOVE-CURSOR .CHANNEL FILL-READ-BUFFER
358 <TT-X .TTY> <TT-Y .TTY>>)>
359 <CLEAR-EOL .CHANNEL FILL-READ-BUFFER>)
360 (<AND <L? <ASCII .KC> <ASCII !\ >>
361 <N==? .KC <ASCII 27> ;"Char Alt">>
362 <ERASE-CHAR .CHANNEL FILL-READ-BUFFER 2>)
364 <ERASE-CHAR .CHANNEL FILL-READ-BUFFER>)>)
365 (<==? .WHICH <ASCII 23> ;"Char Cntl-W">
366 <DELTOCH .CHANNEL .BUFFER ,BREAKS .PROMPT>)
367 (<==? .WHICH <ASCII 21> ;"Char Cntl-U">
368 <DELTOCH .CHANNEL .BUFFER ,CRLF-STRING .PROMPT>)>>
370 <DEFINE DELTOCH (CHANNEL BUFFER STOP PROMPT "AUX"
371 (CCT <BUF-TOT .BUFFER>) (CHRS <BUF-CURRENT .BUFFER>) (UP 0)
372 (NBREAKFLAG <>) (TC <CHANNEL-DATA .CHANNEL>) (TTY <TC-TTY .TC>)
373 (OX <TT-X .TTY>) (OY <TT-Y .TTY>) NX NY)
374 #DECL ((CHANNEL) CHANNEL (BUFFER) <TUPLE [2 STRING] [5 FIX]>
375 (CCT UP) FIX (STOP CHRS) STRING (TC) TTY-CHANNEL (TTY) TTY
376 (PROMPT) <OR FALSE STRING>)
381 <COND (<MEMQ <SET CHR <1 <SET CHRS <BACK .CHRS>>>> .STOP>
382 <COND (.NBREAKFLAG ; "Have we seen any non-breaks?"
383 <SET CHRS <REST .CHRS>>
388 <COND (<==? .CHR <ASCII 10> ;"Char L.F.">
389 ; "First, kill everything after the linefeed"
390 <BUF-CURRENT .BUFFER <REST .CHRS>>
391 <BUF-TOT .BUFFER <+ .CCT 1>>
392 <UPDATE-CURSOR-POS .CHANNEL .BUFFER .UP T .PROMPT>
393 <CLEAR-EOL .CHANNEL FILL-READ-BUFFER>
397 ; "Now, delete the CR if there"
398 <COND (<AND <G? .CCT 0>
399 <==? <1 <BACK .CHRS>> <ASCII 13> ;"Char C.R.">>
400 <SET CHRS <BACK .CHRS>>
401 <SET CCT <- .CCT 1>>)>)>>
402 ; "Update the buffer"
403 <BUF-CURRENT .BUFFER .CHRS>
404 <BUF-TOT .BUFFER .CCT>
405 ; "And do the delete"
406 <UPDATE-CURSOR-POS .CHANNEL .BUFFER .UP <> .PROMPT>
407 ; "Computes new cursor pos, but doesn't move cursor"
410 <COND (<N==? .OY .NY>
413 <MOVE-CURSOR .CHANNEL FILL-READ-BUFFER 0 .OY>
414 <CLEAR-EOL .CHANNEL FILL-READ-BUFFER>
416 <COND (<L? <SET OY <- .OY 1>> 0>
417 <SET OY <- <TD-HEIGHT <TT-DESC .TTY>> 1>>)>
419 <MOVE-CURSOR .CHANNEL FILL-READ-BUFFER .NX .NY>
422 <HOR-POS-CURSOR .CHANNEL FILL-READ-BUFFER .NX>)>
423 <CLEAR-EOL .CHANNEL FILL-READ-BUFFER>>
425 ; "Takes channel, buffer, # lines moved up. Positions screen cursor at
426 end of current buffer. If CONT is non-zero, and have erased into that,
427 and CONT doesn't start at beginning of line, will do wrong thing with
428 horizontal position. VERT is then used to find new vertical position."
429 <DEFINE UPDATE-CURSOR-POS (CHANNEL BUFFER VERT "OPT" (MOVE? T) (PROMPT <>)
430 "AUX" IH (VLOSER? <>)
431 (LINES 0) NEWY HEIGHT (TC <CHANNEL-DATA .CHANNEL>))
432 #DECL ((CHANNEL) CHANNEL (BUFFER) <TUPLE [2 STRING] [5 FIX]>
433 (HEIGHT NEWY VERT) FIX (MOVE? VLOSER?) <OR ATOM FALSE>
434 (PROMPT) <OR FALSE STRING> (TC) TTY-CHANNEL)
435 <COND (<G? <BUF-CONT .BUFFER> <BUF-TOT .BUFFER>>
436 ; "Sigh. Don't know where the text starts"
443 <SET IH <BUF-X .BUFFER>>)>
444 <REPEAT ((FLG? <AND .VLOSER? .PROMPT>)
445 (CT <COND (.FLG? <LENGTH .PROMPT>)
446 (T <BUF-TOT .BUFFER>)>)
447 CHR (BB <COND (.FLG? .PROMPT)
448 (T <BUF-START .BUFFER>)>)
449 (WIDTH <DO-TTY-PARM .TC PAGE-WIDTH>))
450 #DECL ((WIDTH CT) FIX (CHR) CHARACTER (BB) STRING)
453 <SET BB <BUF-START .BUFFER>>
454 <SET CT <BUF-TOT .BUFFER>>
462 <COND (<OR <AND <G=? <ASCII .CHR> 32>
463 <L? <ASCII .CHR> 127>>
464 <==? .CHR <ASCII 27> ;"Char Alt">>
466 (<==? .CHR <ASCII 13> ;"Char C.R.">
468 (<==? .CHR <ASCII 10> ;"Char L.F.">
469 <SET LINES <+ .LINES 1>>)
470 (<==? .CHR <ASCII 9> ;"Char Tab">
471 <SET IH <+ .IH <- 8 <MOD .IH 8>>>>)
472 (<SET IH <+ .IH 2>>)>
473 <COND (<G=? .IH <- .WIDTH 1>>
474 <SET LINES <+ .LINES 1>>
475 <SET IH <- .IH .WIDTH>>)>>
477 <L? <BUF-Y .BUFFER> 0>>
478 <SET NEWY <- <DO-TTY-PARM .TC PAGE-Y> .VERT>>)
479 (<SET NEWY <+ <BUF-Y .BUFFER> .LINES>>)>
480 <COND (<G=? .NEWY <SET HEIGHT <DO-TTY-PARM .TC PAGE-HEIGHT>>>
481 <SET NEWY <MOD .NEWY .HEIGHT>>)
483 <SET NEWY <- .HEIGHT <MOD <- .NEWY> .HEIGHT>>>)>
485 <COND (<N==? .NEWY <DO-TTY-PARM .TC PAGE-Y>>
486 <MOVE-CURSOR .CHANNEL FILL-READ-BUFFER .IH .NEWY>)
488 <HOR-POS-CURSOR .CHANNEL FILL-READ-BUFFER .IH>)>)
490 <DO-TTY-PARM .TC PAGE-X .IH>
491 <DO-TTY-PARM .TC PAGE-Y .NEWY>)>>