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