1 "Low-level TTY output routines: raw output, padding, do terminal ops"
3 "Perform simple tty ops--interpret specifications in tty-desc."
4 <DEFINE DO-TTY-OP (OPCODE CHANNEL "OPTIONAL" (NEWX <>) (NEWY <>)
6 "AUX" (TC <CHANNEL-DATA .CHANNEL>) (TTY <TC-TTY .TC>)
7 (TD <TT-DESC .TTY>) OD)
8 #DECL ((OPCODE) FIX (CHANNEL) CHANNEL (NEWX NEWY) <OR FALSE FIX>
9 (TC) TTY-CHANNEL (TTY) TTY (TD) TTY-DESC (SET?) <OR ATOM FALSE>)
12 <TT-X .TTY <SET NEWX <MIN .NEWX <- <TD-WIDTH .TD> 1>>>>)>)
13 (<SET NEWX <TT-X .TTY>>)>
16 <TT-Y .TTY <SET NEWY <MIN .NEWY <- <TD-HEIGHT .TD> 1>>>>)>)
17 (<SET NEWY <TT-Y .TTY>>)>
18 <TC-MODE .TC <ANDB <TC-MODE .TC> %<XORB ,TM-BADPOS -1>>>
19 <COND (.SET? <UPDATE-MC .CHANNEL .NEWX .NEWY>)>
20 <COND (<SET OD <AND <G=? <LENGTH <TD-PRIMOPS .TD>> .OPCODE>
21 <NTH <TD-PRIMOPS .TD> .OPCODE>>>
22 <OUTPUT-OP .OD .CHANNEL .TD .NEWX .NEWY>)>>
24 <DEFINE OUTPUT-OP (OD CHANNEL TD X Y "OPTIONAL" (PAD 0))
25 #DECL ((OD) TTY-OP (CHANNEL) CHANNEL (TD) TTY-DESC (X Y PAD) FIX)
26 <COND (<TYPE? .OD VECTOR>
29 <OUTPUT-OP .OC .CHANNEL .TD .X .Y>>
33 <COND (<TYPE? .OD TTY-OUT>
34 <SET PAD <TO-PAD .OD>>
35 <SET OD <TO-STRING .OD>>)>
36 <COND (<TYPE? .OD STRING>
37 <OUTPUT-RAW-STRING .CHANNEL .OD>)
40 <FUNCTION (ELT "AUX" VAL)
41 #DECL ((ELT) <OR FIX STRING> (VAL) FIX)
42 <COND (<TYPE? .ELT STRING>
43 <OUTPUT-RAW-STRING .CHANNEL .ELT>)
45 <COND (<0? <ANDB .ELT ,TTY-X/Y>>
48 <COND (<NOT <0? <ANDB .ELT ,TTY-INC-ARG>>>
49 <SET VAL <+ .VAL 1>>)>
50 <COND (<NOT <0? <ANDB .ELT ,TTY-BCD-ARG>>>
51 <SET VAL <+ <* 16 </ .VAL 10>>
53 <SET ELT <ANDB .ELT ,TTY-ARG-DESC>>
54 <COND (<==? .ELT ,TTY-LITERAL>
55 <OUTPUT-RAW-STRING .CHANNEL <ASCII .VAL>>)
57 <OUTPUT-RAW-STRING .CHANNEL
59 (<==? .ELT ,TTY-DECIMAL>
60 <OUTPUT-NUMBER .CHANNEL .VAL <>>)
62 <OUTPUT-NUMBER .CHANNEL .VAL <>>)
64 <OUTPUT-NUMBER .CHANNEL .VAL <>>)>)>>
66 <COND (<NOT <0? .PAD>>
67 <OUTPUT-PAD .CHANNEL .TD .PAD>)>
70 <SETG BUF1 <ISTRING 1>>
73 "Lowest level output routine--stuff uninterpreted characters out or into
75 <DEFINE OUTPUT-RAW-STRING (CHANNEL STR "OPTIONAL" (LENGTH <>)
76 "AUX" (TC <CHANNEL-DATA .CHANNEL>) OBUF)
77 #DECL ((CHANNEL) CHANNEL (STR) <OR CHARACTER STRING> (TC) TTY-CHANNEL
78 (LENGTH) <OR FIX FALSE> (OBUF) STRING)
79 <COND (<TYPE? .STR CHARACTER>
80 <SET STR <1 ,BUF1 .STR>>)>
82 <SET LENGTH <LENGTH .STR>>)>
83 <COND (<NOT <TC-OBUF .TC>>
84 <CALL SYSCALL WRITE <TC-OJFN .TC> .STR .LENGTH>
87 <SET OBUF <TC-OBUF .TC>>
88 <REPEAT ((WR 0) TRANS)
93 <DUMP-WRITE-BUFFER .TC>
94 <SET OBUF <TC-OBUF .TC>>)>
95 <SET TRANS <MIN <LENGTH .OBUF> .LENGTH>>
96 <SUBSTRUC .STR 0 .TRANS .OBUF>
97 <SET STR <REST .STR .TRANS>>
98 <TC-OBUF .TC <SET OBUF <REST .OBUF .TRANS>>>
99 <TC-OBC .TC <+ <TC-OBC .TC> .TRANS>>
100 <SET WR <+ .WR .TRANS>>
101 <SET LENGTH <- .LENGTH .TRANS>>>)>>
103 "Output a specifed amount of padding (time in milliseconds)"
104 <DEFINE OUTPUT-PAD (CHANNEL TD AMT "AUX" (TC <CHANNEL-DATA .CHANNEL>)
105 (OSPEED <TT-OSPEED <TC-TTY .TC>>) PC)
106 #DECL ((CHANNEL) CHANNEL (TD) TTY-DESC (AMT OSPEED) FIX (TC) TTY-CHANNEL)
108 <COND (<==? .OSPEED 0> <SET OSPEED 9600>)>
109 <SET AMT <FIX </ <* <FLOAT .OSPEED> <FLOAT .AMT>>
110 7000.0>>> ; "# chars to send"
111 <SET PC <TD-PADCHR .TD>> ; "Which char to send"
112 <COND (<NOT <TC-OBUF .TC>>
113 <REPEAT ((OJFN <TC-OJFN .TC>) (ST <STRING .PC>))
114 <COND (<0? .AMT> <RETURN>)>
115 <CALL SYSCALL WRITE .OJFN .ST 1>
116 <SET AMT <- .AMT 1>>>)
118 <REPEAT ((OBUF <TC-OBUF .TC>) (OC <TC-OBC .TC>))
119 #DECL ((OBUF) STRING (OC) FIX)
124 <COND (<EMPTY? .OBUF>
127 <DUMP-WRITE-BUFFER .TC>
128 <SET OBUF <TC-OBUF .TC>>
132 <SET OBUF <REST .OBUF>>
133 <SET AMT <- .AMT 1>>>)>)>>
135 <SETG NUMBUF <ISTRING 10>>
136 <GDECL (NUMBUF) STRING>
138 "Output a number in raw mode"
139 <DEFINE OUTPUT-NUMBER (CHANNEL NUM WIDTH "AUX" (BUF <REST ,NUMBUF 10>)
141 #DECL ((CHANNEL) CHANNEL (NUM) FIX (WIDTH) <OR FIX FALSE> (BUF) STRING)
143 <1 <SET BUF <BACK .BUF>> !\0>
150 <SET DIG <MOD .NUM 10>>
151 <SET NUM </ .NUM 10>>
152 <1 <SET BUF <BACK .BUF>> <ASCII <+ .DIG <ASCII !\0>>>>
155 <1 <SET BUF <BACK .BUF>> !\->)>
157 <SET CWIDTH <LENGTH .BUF>>
158 <COND (<AND .WIDTH <G? .WIDTH .CWIDTH>>
160 <1 <SET BUF <BACK .BUF>> !\ >
161 <COND (<L=? .WIDTH <SET CWIDTH <+ .CWIDTH 1>>>
163 <OUTPUT-RAW-STRING .CHANNEL .BUF .CWIDTH>>
165 "Dump the channel's output buffer"
166 <DEFINE DUMP-WRITE-BUFFER (TC "AUX" TOPB)
167 #DECL ((TC) TTY-CHANNEL (TOPB) STRING)
168 <COND (<G? <TC-OBC .TC> 0>
169 <CALL SYSCALL WRITE <TC-OJFN .TC>
170 <SET TOPB <TC-TOBUF .TC>> <TC-OBC .TC>>
172 <TC-OBUF .TC .TOPB>)>>