1 /*	$OpenBSD: tth19.c,v 1.5 2003/06/03 02:56:23 millert Exp $	*/
2 /*	$NetBSD: tth19.c,v 1.3 1995/09/28 10:34:47 tls Exp $	*/
3 
4 /*
5  * Copyright (c) 1983, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Edward Wang at The University of California, Berkeley.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)tth19.c	8.1 (Berkeley) 6/6/93";
39 #else
40 static char rcsid[] = "$OpenBSD: tth19.c,v 1.5 2003/06/03 02:56:23 millert Exp $";
41 #endif
42 #endif /* not lint */
43 
44 #include "ww.h"
45 #include "tt.h"
46 #include "char.h"
47 
48 /*
49 kb|h19|heath|h19-b|h19b|heathkit|heath-19|z19|zenith:
50 	cr=^M:nl=^J:bl=^G:al=1*\EL:am:le=^H:bs:cd=\EJ:ce=\EK:
51 	cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:dl=1*\EM:do=\EB:
52 	ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:ms:
53 	ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:
54 	kb=^h:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:
55 	kn#8:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:
56 	l6=blue:l7=red:l8=white:k6=\EP:k7=\EQ:k8=\ER:
57 	es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:
58 */
59 
60 #define NCOL	80
61 #define NROW	24
62 
63 #define G (WWM_GRP << WWC_MSHIFT)
64 short h19_frame[16] = {
65 	' ',	'`'|G,	'a'|G,	'e'|G,
66 	'`'|G,	'`'|G,	'f'|G,	'v'|G,
67 	'a'|G,	'd'|G,	'a'|G,	'u'|G,
68 	'c'|G,	't'|G,	's'|G,	'b'|G
69 };
70 
71 extern struct tt_str *gen_VS;
72 extern struct tt_str *gen_VE;
73 
74 int h19_msp10c;
75 
76 #define PAD(ms10) { \
77 	int i; \
78 	for (i = ((ms10) + 5) / h19_msp10c; --i >= 0;) \
79 		ttputc('\0'); \
80 }
81 #define ICPAD() PAD((NCOL - tt.tt_col) * 1)	/* 0.1 ms per char */
82 #define ILPAD() PAD((NROW - tt.tt_row) * 10)	/* 1 ms per char */
83 
84 #define H19_SETINSERT(m) ttesc((tt.tt_insert = (m)) ? '@' : 'O')
85 
h19_setmodes(new)86 h19_setmodes(new)
87 int new;
88 {
89 	int diff;
90 
91 	diff = new ^ tt.tt_modes;
92 	if (diff & WWM_REV)
93 		ttesc(new & WWM_REV ? 'p' : 'q');
94 	if (diff & WWM_GRP)
95 		ttesc(new & WWM_REV ? 'F' : 'G');
96 	tt.tt_modes = new;
97 }
98 
h19_insline(n)99 h19_insline(n)
100 {
101 	while (--n >= 0) {
102 		ttesc('L');
103 		ILPAD();
104 	}
105 }
106 
h19_delline(n)107 h19_delline(n)
108 {
109 	while (--n >= 0) {
110 		ttesc('M');
111 		ILPAD();
112 	}
113 }
114 
h19_putc(c)115 h19_putc(c)
116 char c;
117 {
118 	if (tt.tt_nmodes != tt.tt_modes)
119 		(*tt.tt_setmodes)(tt.tt_nmodes);
120 	if (tt.tt_insert)
121 		H19_SETINSERT(0);
122 	ttputc(c);
123 	if (++tt.tt_col == NCOL)
124 		tt.tt_col = NCOL - 1;
125 }
126 
h19_write(p,n)127 h19_write(p, n)
128 char *p;
129 int n;
130 {
131 	if (tt.tt_nmodes != tt.tt_modes)
132 		(*tt.tt_setmodes)(tt.tt_nmodes);
133 	if (tt.tt_insert)
134 		H19_SETINSERT(0);
135 	ttwrite(p, n);
136 	tt.tt_col += n;
137 	if (tt.tt_col == NCOL)
138 		tt.tt_col = NCOL - 1;
139 }
140 
h19_move(row,col)141 h19_move(row, col)
142 char row, col;
143 {
144 	if (tt.tt_row == row) {
145 		if (tt.tt_col == col)
146 			return;
147 		if (col == 0) {
148 			ttctrl('m');
149 			goto out;
150 		}
151 		if (tt.tt_col == col - 1) {
152 			ttesc('C');
153 			goto out;
154 		}
155 		if (tt.tt_col == col + 1) {
156 			ttctrl('h');
157 			goto out;
158 		}
159 	}
160 	if (tt.tt_col == col) {
161 		if (tt.tt_row == row + 1) {
162 			ttesc('A');
163 			goto out;
164 		}
165 		if (tt.tt_row == row - 1) {
166 			ttctrl('j');
167 			goto out;
168 		}
169 	}
170 	if (col == 0 && row == 0) {
171 		ttesc('H');
172 		goto out;
173 	}
174 	ttesc('Y');
175 	ttputc(' ' + row);
176 	ttputc(' ' + col);
177 out:
178 	tt.tt_col = col;
179 	tt.tt_row = row;
180 }
181 
h19_start()182 h19_start()
183 {
184 	if (gen_VS)
185 		ttxputs(gen_VS);
186 	ttesc('w');
187 	ttesc('E');
188 	tt.tt_col = tt.tt_row = 0;
189 	tt.tt_insert = 0;
190 	tt.tt_nmodes = tt.tt_modes = 0;
191 }
192 
h19_end()193 h19_end()
194 {
195 	if (tt.tt_insert)
196 		H19_SETINSERT(0);
197 	if (gen_VE)
198 		ttxputs(gen_VE);
199 	ttesc('v');
200 }
201 
h19_clreol()202 h19_clreol()
203 {
204 	ttesc('K');
205 }
206 
h19_clreos()207 h19_clreos()
208 {
209 	ttesc('J');
210 }
211 
h19_clear()212 h19_clear()
213 {
214 	ttesc('E');
215 }
216 
h19_inschar(c)217 h19_inschar(c)
218 char c;
219 {
220 	if (tt.tt_nmodes != tt.tt_modes)
221 		(*tt.tt_setmodes)(tt.tt_nmodes);
222 	if (!tt.tt_insert)
223 		H19_SETINSERT(1);
224 	ttputc(c);
225 	if (tt.tt_insert)
226 		ICPAD();
227 	if (++tt.tt_col == NCOL)
228 		tt.tt_col = NCOL - 1;
229 }
230 
h19_delchar(n)231 h19_delchar(n)
232 {
233 	while (--n >= 0)
234 		ttesc('N');
235 }
236 
h19_scroll_down(n)237 h19_scroll_down(n)
238 {
239 	h19_move(NROW - 1, 0);
240 	while (--n >= 0)
241 		ttctrl('j');
242 }
243 
h19_scroll_up(n)244 h19_scroll_up(n)
245 {
246 	h19_move(0, 0);
247 	while (--n >= 0)
248 		ttesc('I');
249 }
250 
tt_h19()251 tt_h19()
252 {
253 	float cpms = (float) wwbaud / 10000;	/* char per ms */
254 
255 	h19_msp10c = 10 / cpms;			/* ms per 10 char */
256 	gen_VS = ttxgetstr("vs");
257 	gen_VE = ttxgetstr("ve");
258 
259 	tt.tt_start = h19_start;
260 	tt.tt_end = h19_end;
261 
262 	tt.tt_insline = h19_insline;
263 	tt.tt_delline = h19_delline;
264 	tt.tt_inschar = h19_inschar;
265 	tt.tt_delchar = h19_delchar;
266 	tt.tt_clreol = h19_clreol;
267 	tt.tt_clreos = h19_clreos;
268 	tt.tt_clear = h19_clear;
269 	tt.tt_move = h19_move;
270 	tt.tt_write = h19_write;
271 	tt.tt_putc = h19_putc;
272 	tt.tt_scroll_down = h19_scroll_down;
273 	tt.tt_scroll_up = h19_scroll_up;
274 	tt.tt_setmodes = h19_setmodes;
275 
276 	tt.tt_ncol = NCOL;
277 	tt.tt_nrow = NROW;
278 	tt.tt_availmodes = WWM_REV|WWM_GRP;
279 	tt.tt_frame = h19_frame;
280 	return 0;
281 }
282