xref: /netbsd-src/sys/dev/wscons/wsemul_vt100_chars.c (revision 97aa58234891da72f1b6c7a1d99a8efc08f44dea)
1*97aa5823Smaya /* $NetBSD: wsemul_vt100_chars.c,v 1.15 2017/11/03 19:20:27 maya Exp $ */
2bbb4f765Sdrochner 
3bbb4f765Sdrochner /*
4bbb4f765Sdrochner  * Copyright (c) 1998
5bbb4f765Sdrochner  *	Matthias Drochner.  All rights reserved.
6bbb4f765Sdrochner  *
7bbb4f765Sdrochner  * Redistribution and use in source and binary forms, with or without
8bbb4f765Sdrochner  * modification, are permitted provided that the following conditions
9bbb4f765Sdrochner  * are met:
10bbb4f765Sdrochner  * 1. Redistributions of source code must retain the above copyright
11bbb4f765Sdrochner  *    notice, this list of conditions and the following disclaimer.
12bbb4f765Sdrochner  * 2. Redistributions in binary form must reproduce the above copyright
13bbb4f765Sdrochner  *    notice, this list of conditions and the following disclaimer in the
14bbb4f765Sdrochner  *    documentation and/or other materials provided with the distribution.
15bbb4f765Sdrochner  *
16bbb4f765Sdrochner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17bbb4f765Sdrochner  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18bbb4f765Sdrochner  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19bbb4f765Sdrochner  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20bbb4f765Sdrochner  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21bbb4f765Sdrochner  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22bbb4f765Sdrochner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23bbb4f765Sdrochner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24bbb4f765Sdrochner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25bbb4f765Sdrochner  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26bbb4f765Sdrochner  *
27bbb4f765Sdrochner  */
28bbb4f765Sdrochner 
29139747fbSlukem #include <sys/cdefs.h>
30*97aa5823Smaya __KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_chars.c,v 1.15 2017/11/03 19:20:27 maya Exp $");
31139747fbSlukem 
32bbb4f765Sdrochner #include <sys/param.h>
33bbb4f765Sdrochner #include <sys/systm.h>
3492f81ea7Sjmmv #include <dev/wscons/wsconsio.h>
35bbb4f765Sdrochner #include <dev/wscons/wsdisplayvar.h>
36bbb4f765Sdrochner #include <dev/wscons/wsksymvar.h>
37bbb4f765Sdrochner #include <dev/wscons/wsemulvar.h>
38bbb4f765Sdrochner #include <dev/wscons/wsemul_vt100var.h>
39cc294f2cSdrochner #include <dev/wscons/unicode.h>
40bbb4f765Sdrochner 
4134c8ae80Sjdolecek static const u_int16_t decspcgr2uni[128] = {
42bbb4f765Sdrochner 	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
43bbb4f765Sdrochner 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
44bbb4f765Sdrochner 	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
45bbb4f765Sdrochner 	0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
46bbb4f765Sdrochner /* 2 */	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
47bbb4f765Sdrochner 	0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
48bbb4f765Sdrochner 	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
49bbb4f765Sdrochner 	0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
50bbb4f765Sdrochner /* 4 */	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
51bbb4f765Sdrochner 	0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
52bbb4f765Sdrochner 	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
53bbb4f765Sdrochner 	0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x00a0,
54bbb4f765Sdrochner /* 6 */	0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
554faa4ba5Sdrochner 	_e006U, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba,
564faa4ba5Sdrochner 	0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
57bbb4f765Sdrochner 	0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x007f,
58bbb4f765Sdrochner };
59bbb4f765Sdrochner 
6034c8ae80Sjdolecek static const u_int16_t dectech2uni[128] = {
61bbb4f765Sdrochner 	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
62bbb4f765Sdrochner 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
63bbb4f765Sdrochner 	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
64bbb4f765Sdrochner 	0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
6533b1cd53Sdrochner /* 2 */	0x0020, 0x221a, 0x250c, 0x2212, 0x2320, 0x2321, 0x2502, 0x2308,
66cc294f2cSdrochner 	0x230a, 0x2309, 0x230b, _e007U, _e008U, _e009U, _e00aU, _e00bU,
67cc294f2cSdrochner 	_e00cU, _e00dU, _e00eU, 0x2216, 0x2215, 0x00ac, _e00fU, 0x232a,
68cc294f2cSdrochner 	_e000U, _e000U, _e000U, _e000U, 0x2264, 0x2260, 0x2265, 0x222b,
69bbb4f765Sdrochner /* 4 */	0x2234, 0x221d, 0x221e, 0x00f7, 0x2206, 0x2207, 0x03a6, 0x0393,
70bbb4f765Sdrochner 	0x223c, 0x2243, 0x0398, 0x00d7, 0x039b, 0x21d4, 0x21d2, 0x2261,
71cc294f2cSdrochner 	0x03a0, 0x03a8, _e000U, 0x03a3, _e000U, _e000U, 0x221a, 0x03a9,
72bbb4f765Sdrochner 	0x039e, 0x03a5, 0x2282, 0x2283, 0x2229, 0x222a, 0x2227, 0x2228,
73cc294f2cSdrochner /* 6 */	0x00ac, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x03b5, 0x03c6, 0x03b3,
74cc294f2cSdrochner 	0x03b7, 0x03b9, 0x03b8, 0x03ba, 0x03bb, _e000U, 0x03bd, 0x2202,
75cc294f2cSdrochner 	0x03c0, 0x03c8, 0x03c1, 0x03c3, 0x03c4, _e000U, 0x0192, 0x03c9,
76bbb4f765Sdrochner 	0x03be, 0x03c5, 0x03b6, 0x2190, 0x2191, 0x2192, 0x2193, 0x007f,
77bbb4f765Sdrochner };
78bbb4f765Sdrochner 
79bbb4f765Sdrochner void
vt100_initchartables(struct wsemul_vt100_emuldata * edp)8082e5e6abSaugustss vt100_initchartables(struct wsemul_vt100_emuldata *edp)
81bbb4f765Sdrochner {
82bbb4f765Sdrochner 	int i;
83265bc2e9Sdrochner 	struct vt100base_data *vd = &edp->bd;
84bbb4f765Sdrochner 
85bbb4f765Sdrochner 	for (i = 0; i < 128; i++)
86265bc2e9Sdrochner 		(*vd->emulops->mapchar)(vd->emulcookie, 128 + i,
87dbdaf916Sdrochner 					 &edp->isolatin1tab[i]);
88bbb4f765Sdrochner 	for (i = 0; i < 128; i++)
89265bc2e9Sdrochner 		(*vd->emulops->mapchar)(vd->emulcookie, decspcgr2uni[i],
90dbdaf916Sdrochner 					 &edp->decgraphtab[i]);
91bbb4f765Sdrochner 	for (i = 0; i < 128; i++)
92265bc2e9Sdrochner 		(*vd->emulops->mapchar)(vd->emulcookie, dectech2uni[i],
93dbdaf916Sdrochner 					 &edp->dectechtab[i]);
94bbb4f765Sdrochner 	vt100_setnrc(edp, 0);
95bbb4f765Sdrochner }
96bbb4f765Sdrochner 
9734c8ae80Sjdolecek static const int nrcovlpos[12] = {
98bbb4f765Sdrochner     0x23, 0x40, 0x5b, 0x5c, 0x5d, 0x5e,	/* #@[\]^ */
99bbb4f765Sdrochner     0x5f, 0x60, 0x7b, 0x7c, 0x7d, 0x7e	/* _`{|}~ */
100bbb4f765Sdrochner };
10134c8ae80Sjdolecek static const struct {
102bbb4f765Sdrochner 	u_int16_t c[12];
103bbb4f765Sdrochner } nrctable[] = {
104bbb4f765Sdrochner 	/* british */
105bbb4f765Sdrochner 	{{0x00a3, 0x0040, 0x005b, 0x005c, 0x005d, 0x005e,
106bbb4f765Sdrochner 	0x005f, 0x0060, 0x007b, 0x007c, 0x007d, 0x007e}},
107bbb4f765Sdrochner 	/* dutch */
108bbb4f765Sdrochner 	{{0x00a3, 0x00be, 0x00dc, 0x00ab, 0x007c, 0x005e,
109bbb4f765Sdrochner 	0x005f, 0x0060, 0x00a8, 0x0192, 0x00bc, 0x00b4}},
110bbb4f765Sdrochner 	/* finnish */
111bbb4f765Sdrochner 	{{0x0023, 0x0040, 0x00c4, 0x00d6, 0x00c5, 0x00dc,
112bbb4f765Sdrochner 	0x005f, 0x00e9, 0x00e4, 0x00f6, 0x00e5, 0x00fc}},
113bbb4f765Sdrochner 	/* french */
114bbb4f765Sdrochner 	{{0x00a3, 0x00e0, 0x00b0, 0x00e7, 0x00a7, 0x005e,
115bbb4f765Sdrochner 	0x005f, 0x0060, 0x00e9, 0x00f9, 0x00e8, 0x00a8}},
116bbb4f765Sdrochner 	/* french canadian */
117bbb4f765Sdrochner 	{{0x0023, 0x00e0, 0x00e2, 0x00e7, 0x00ea, 0x00ee,
118bbb4f765Sdrochner 	0x005f, 0x00f4, 0x00e9, 0x00f9, 0x00e8, 0x00fb}},
119bbb4f765Sdrochner 	/* german */
120bbb4f765Sdrochner 	{{0x0023, 0x00a7, 0x00c4, 0x00d6, 0x00dc, 0x005e,
121bbb4f765Sdrochner 	0x005f, 0x0060, 0x00e4, 0x00f6, 0x00fc, 0x00df}},
122bbb4f765Sdrochner 	/* italian */
123bbb4f765Sdrochner 	{{0x00a3, 0x00a7, 0x00b0, 0x00e7, 0x00e9, 0x005e,
124bbb4f765Sdrochner 	0x005f, 0x00f9, 0x00e0, 0x00f2, 0x00e8, 0x00ec}},
125bbb4f765Sdrochner 	/* norwegian /danish */
126bbb4f765Sdrochner 	{{0x0023, 0x0040, 0x00c6, 0x00d8, 0x00c5, 0x005e,
127bbb4f765Sdrochner 	0x005f, 0x0060, 0x00e6, 0x00f8, 0x00e5, 0x007e}},
1283c510e6bSsnj 	/* portuguese */
129bbb4f765Sdrochner 	{{0x0023, 0x0040, 0x00c3, 0x00c7, 0x00d5, 0x005e,
130bbb4f765Sdrochner 	0x005f, 0x0060, 0x00e3, 0x00e7, 0x00f5, 0x007e}},
131bbb4f765Sdrochner 	/* spanish */
132bbb4f765Sdrochner 	{{0x00a3, 0x00a7, 0x00a1, 0x00d1, 0x00bf, 0x005e,
133bbb4f765Sdrochner 	0x005f, 0x0060, 0x0060, 0x00b0, 0x00f1, 0x00e7}},
134bbb4f765Sdrochner 	/* swedish */
135bbb4f765Sdrochner 	{{0x0023, 0x00c9, 0x00c4, 0x00d6, 0x00c5, 0x00dc,
136bbb4f765Sdrochner 	0x005f, 0x00e9, 0x00e4, 0x00f6, 0x00e5, 0x00fc}},
137bbb4f765Sdrochner 	/* swiss */
138bbb4f765Sdrochner 	{{0x00f9, 0x00e0, 0x00e9, 0x00e7, 0x00ea, 0x00ee,
139bbb4f765Sdrochner 	0x00e8, 0x00f4, 0x00e4, 0x00f6, 0x00fc, 0x00fb}},
140bbb4f765Sdrochner };
141bbb4f765Sdrochner 
142bbb4f765Sdrochner void
vt100_setnrc(struct wsemul_vt100_emuldata * edp,int nrc)14382e5e6abSaugustss vt100_setnrc(struct wsemul_vt100_emuldata *edp, int nrc)
144bbb4f765Sdrochner {
145bbb4f765Sdrochner 	int i;
146265bc2e9Sdrochner 	struct vt100base_data *vd = &edp->bd;
147bbb4f765Sdrochner 
148*97aa5823Smaya 	KASSERT(nrc < __arraycount(nrctable));
149bbb4f765Sdrochner 
150bbb4f765Sdrochner 	for (i = 0; i < 128; i++)
151265bc2e9Sdrochner 		(*vd->emulops->mapchar)(vd->emulcookie, i, &edp->nrctab[i]);
152bbb4f765Sdrochner 	for (i = 0; i < 12; i++)
153265bc2e9Sdrochner 		(*vd->emulops->mapchar)(vd->emulcookie, nrctable[nrc].c[i],
154dbdaf916Sdrochner 					 &edp->nrctab[nrcovlpos[i]]);
155bbb4f765Sdrochner }
156