home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume41 / pcvt / part06 < prev    next >
Encoding:
Internet Message Format  |  1994-03-02  |  89.4 KB

  1. From: hm@hcshh.hcs.de (Hellmuth Michaelis)
  2. Newsgroups: comp.sources.misc
  3. Subject: v41i145:  pcvt - Video Driver for 386BSD/NetBSD/FreeBSD, v3.00, Part06/13
  4. Date: 1 Mar 1994 17:10:17 -0600
  5. Organization: Sterling Software
  6. Sender: root@news.sterling.com
  7. Approved: kent@sparky.sterling.com
  8. Message-ID: <2l0i0p$5l9@sparky.sterling.com>
  9. X-Md4-Signature: 579316d31533d797614cc4d0487c9dae
  10.  
  11. Submitted-by: hm@hcshh.hcs.de (Hellmuth Michaelis)
  12. Posting-number: Volume 41, Issue 145
  13. Archive-name: pcvt/part06
  14. Environment: 386BSD, NETBSD, FREEBSD
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  pcvt/Doc/TestedHardware pcvt/Util/keycap/keycap.c
  21. #   pcvt/pcvt_tbl.h pcvt/pcvt_vtf.c
  22. # Wrapped by kent@sparky on Tue Mar  1 16:46:19 1994
  23. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 6 (of 13)."'
  26. if test -f 'pcvt/Doc/TestedHardware' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'pcvt/Doc/TestedHardware'\"
  28. else
  29.   echo shar: Extracting \"'pcvt/Doc/TestedHardware'\" \(2961 characters\)
  30.   sed "s/^X//" >'pcvt/Doc/TestedHardware' <<'END_OF_FILE'
  31. XTested Hardware List                  last edit-date: [Thu Dec  9 21:39:51 1993]
  32. X
  33. XThis is by no means a complete list of hardware pcvt runs on, it is just 
  34. Xcompiled from reports people sent in and from hardware owned/loaned !
  35. X
  36. X
  37. XTESTED VIDEO BOARDS (80 column operation)
  38. X--------------------------------------------------------------------------------
  39. X
  40. XManufacturer            Chipset        Monitor            Notes
  41. X------------------------------    --------------  ----------------------    --------
  42. X2theMax    (?)            ET4000        VGA Color
  43. XVideo7 Inc.            VEGA VGA    VGA Color/Mono        (2)
  44. XDiamond Stealth VRAM        S3        NEC 3FGx
  45. XTrident                TVGA 8800CS    NEC 3D
  46. XTrident                TVGA 9000B    VGA Color/Mono        (2)
  47. XData General            C&T P82C604    VGA Color
  48. XNoName Hercules            W86855AF    Mono
  49. XTandon Monochrome (Hercules)    TD3088A        Tandon Mono
  50. XKyocera ML III25 (Mainboard)    WD90C00        JVC VGA Color        (1)
  51. XKyocera ML III25 (Mainboard)    WD90C00        Nokia CED1 VGA Mono    (1)
  52. XKyocera ML IIII33 (Mainboard)    WD90C11        Nokia CED1 VGA Mono    (1)
  53. XNoName VGA            TVGA9000B    JVC VGA Color        (1,2)
  54. XTseng Labs            ET3000AX    JVC VGA Color        (2)
  55. XVideo7 Inc.            VEGA VGA    VGA Mono        (2)
  56. XVideo7 Inc.            1024i        VGA Mono        (2)
  57. XELSA GmbH            S3 928        VGA Mono/Color
  58. X
  59. XNotes:
  60. X(1) - slight display distortion when switching between screens
  61. X(2) - remakable display distortion and/or loss of sync while loading fonts
  62. X
  63. X
  64. XTESTED VIDEO BOARDS (132 column operation)
  65. X--------------------------------------------------------------------------------
  66. X
  67. XManufacturer            Chipset        Monitor            Notes
  68. X------------------------------    --------------  ----------------------    --------
  69. X2theMax    (?)            ET4000        VGA Color
  70. X2theMax    (?)            ET4000        Tandon VGA Mono
  71. XKyocera ML III33 (Mainboard)    WD90C11        Tandon VGA Mono        (1,2)
  72. XKyocera ML IIII33 (Mainboard)    WD90C11        Tandon VGA Mono        (1,2)
  73. XKyocera ML IIII33 (Mainboard)    WD90C11        VGA Color        (1,2)
  74. XTrident (?)            TVGA9000B    VGA Mono        (1,3)
  75. XTseng Labs (?)            ET3000        NEC 3D
  76. XELSA GmbH            S3 928        VGA Mono/Color
  77. X
  78. XNotes:
  79. X(1) - slight display distortion when switching between screens
  80. X(2) - all fonts must be loaded in ascending order prior to switching to 132 cols
  81. X(3) - remakable display distortion and/or loss of sync while loading fonts
  82. X
  83. X
  84. XTESTED KEYBOARDS
  85. X--------------------------------------------------------------------------------
  86. X
  87. XManufacturer            Type            Layout
  88. X------------------------------    ----------------------    ------------------------
  89. XCherry                MF II            US
  90. XCherry/Tandon            MF II            German
  91. XHewlett-Packard            MF II            US
  92. XHewlett-Packard            MF II            German
  93. XTatung                AT            German
  94. XKyocera                MF II            German
  95. X
  96. XThere is absolutely NO support for the ancient PC-keyboards (they had 83 keys).
  97. X
  98. XThere is only limited support for AT-keyboards (they have 84 keys, and a 
  99. Xseparate numeric keypad, they don't have F9-F12 keys) because the emulator
  100. Xneeds F9-F12 for control functions, and due to the current design of the
  101. Xkeyboard driver there is no (full) support for national keyboards because
  102. Xof the lack of a ALTGR key.
  103. X
  104. XMF-keyboards are fully supported, 101- and 102-key versions.
  105. X
  106. END_OF_FILE
  107.   if test 2961 -ne `wc -c <'pcvt/Doc/TestedHardware'`; then
  108.     echo shar: \"'pcvt/Doc/TestedHardware'\" unpacked with wrong size!
  109.   fi
  110.   # end of 'pcvt/Doc/TestedHardware'
  111. fi
  112. if test -f 'pcvt/Util/keycap/keycap.c' -a "${1}" != "-c" ; then 
  113.   echo shar: Will not clobber existing file \"'pcvt/Util/keycap/keycap.c'\"
  114. else
  115.   echo shar: Extracting \"'pcvt/Util/keycap/keycap.c'\" \(10205 characters\)
  116.   sed "s/^X//" >'pcvt/Util/keycap/keycap.c' <<'END_OF_FILE'
  117. X/*-
  118. X * Copyright (c) 1992, 1993 The Regents of the University of California.
  119. X * All rights reserved.
  120. X *
  121. X * This code is derived from software contributed to Berkeley by
  122. X * Holger Veit
  123. X *
  124. X * Redistribution and use in source and binary forms, with or without
  125. X * modification, are permitted provided that the following conditions
  126. X * are met:
  127. X * 1. Redistributions of source code must retain the above copyright
  128. X *    notice, this list of conditions and the following disclaimer.
  129. X * 2. Redistributions in binary form must reproduce the above copyright
  130. X *    notice, this list of conditions and the following disclaimer in the
  131. X *    documentation and/or other materials provided with the distribution.
  132. X * 3. All advertising materials mentioning features or use of this software
  133. X *    must display the following acknowledgement:
  134. X *    This product includes software developed by the University of
  135. X *    California, Berkeley and its contributors.
  136. X * 4. Neither the name of the University nor the names of its contributors
  137. X *    may be used to endorse or promote products derived from this software
  138. X *    without specific prior written permission.
  139. X *
  140. X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  141. X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  142. X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  143. X * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  144. X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  145. X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  146. X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  147. X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  148. X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  149. X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  150. X * SUCH DAMAGE.
  151. X *
  152. X */
  153. X
  154. Xstatic char *id =
  155. X    "@(#)keycap.c, 3.00, Last Edit-Date: [Sun Jan  2 14:00:27 1994]";
  156. X
  157. X/*---------------------------------------------------------------------------*
  158. X *
  159. X *    keycap.c    Keyboard capabilities database handling
  160. X *    -------------------------------------------------------
  161. X *
  162. X *    converted from printcap by Holger Veit (veit@du9ds3.uni-duisburg.de)
  163. X *
  164. X *    BUG:    Should use a "last" pointer in tbuf, so that searching
  165. X *        for capabilities alphabetically would not be a n**2/2
  166. X *        process when large numbers of capabilities are given.
  167. X *
  168. X *    Note:    If we add a last pointer now we will screw up the
  169. X *        tc capability. We really should compile termcap.
  170. X *
  171. X *    modified by Hellmuth Michaelis (hm@hcshh.hcs.de) to fit into the
  172. X *    vt220 driver pcvt 2.0 distribution
  173. X *
  174. X *    -hm    header conversion & cosmetic changes for pcvt 2.0 distribution
  175. X *    -hm    debugging remapping
  176. X *    -hm    cleaning up from termcap ....
  177. X *    -hm    split off header file keycap.h
  178. X *
  179. X *---------------------------------------------------------------------------*/
  180. X
  181. X#include <stdio.h>
  182. X#include <ctype.h>
  183. X
  184. X#include "keycap.h"
  185. X
  186. X#define    KEYCAP_BUFSIZ    1024
  187. X
  188. X#define MAXHOP    32        /* max number of tc= indirections */
  189. X
  190. Xchar    *getenv();
  191. X
  192. Xstatic    FILE *pfp = NULL;    /* keycap data base file pointer */
  193. Xstatic    char *tbuf;
  194. Xstatic    int hopcount;        /* detect infinite loops in keycap, init 0 */
  195. X
  196. Xstatic int knchktc();
  197. Xstatic int knamatch();
  198. Xstatic char *kdecode();
  199. X
  200. X/*---------------------------------------------------------------------------*
  201. X *    match a name
  202. X *---------------------------------------------------------------------------*/
  203. Xstatic char *nmatch(id,cstr)
  204. Xchar *id,*cstr;
  205. X{
  206. X    register n = strlen(id);
  207. X    register char *c = cstr+n;
  208. X
  209. X    if (strncmp(id,cstr,n)==0 &&
  210. X        (*c==':' || *c=='|' || *c=='=' || *c=='#') || *c=='@') 
  211. X            return c;
  212. X    return 0;
  213. X}
  214. X
  215. X/*---------------------------------------------------------------------------*
  216. X * Get an entry for keyboard name in buffer bp from the keycap file.
  217. X * Parse is very rudimentary, we just notice escaped newlines.
  218. X *---------------------------------------------------------------------------*/
  219. Xkgetent(bp, name)
  220. Xchar *bp, *name;
  221. X{
  222. X    register char *cp;
  223. X    register int c;
  224. X    register int i = 0, cnt = 0;
  225. X    char ibuf[KEYCAP_BUFSIZ];
  226. X    char *cp2;
  227. X    int tf;
  228. X
  229. X    tbuf = bp;
  230. X    tf = 0;
  231. X
  232. X    tf = open(KEYCAP_PATH, 0);
  233. X
  234. X    if (tf < 0)
  235. X        return (-1);
  236. X    for (;;) {
  237. X        cp = bp;
  238. X        for (;;) {
  239. X            if (i == cnt) {
  240. X                cnt = read(tf, ibuf, KEYCAP_BUFSIZ);
  241. X                if (cnt <= 0) {
  242. X                    close(tf);
  243. X                    return (0);
  244. X                }
  245. X                i = 0;
  246. X            }
  247. X            c = ibuf[i++];
  248. X            if (c == '\n') {
  249. X                if (cp > bp && cp[-1] == '\\'){
  250. X                    cp--;
  251. X                    continue;
  252. X                }
  253. X                break;
  254. X            }
  255. X            if (cp >= bp+KEYCAP_BUFSIZ) {
  256. X                write(2,"Keycap entry too long\n", 23);
  257. X                break;
  258. X            } else
  259. X                *cp++ = c;
  260. X        }
  261. X        *cp = 0;
  262. X
  263. X        /*
  264. X         * The real work for the match.
  265. X         */
  266. X        if (knamatch(name)) {
  267. X            close(tf);
  268. X            return(knchktc());
  269. X        }
  270. X    }
  271. X}
  272. X
  273. X/*---------------------------------------------------------------------------*
  274. X * knchktc: check the last entry, see if it's tc=xxx. If so, recursively
  275. X * find xxx and append that entry (minus the names) to take the place of
  276. X * the tc=xxx entry. Note that this works because of the left to right scan.
  277. X *---------------------------------------------------------------------------*/
  278. Xstatic int knchktc()
  279. X{
  280. X    register char *p, *q;
  281. X    char tcname[16];    /* name of similar keyboard */
  282. X    char tcbuf[KEYCAP_BUFSIZ];
  283. X    char *holdtbuf = tbuf;
  284. X    int l;
  285. X
  286. X    p = tbuf + strlen(tbuf) - 2;    /* before the last colon */
  287. X    while (*--p != ':')
  288. X        if (p<tbuf) {
  289. X            write(2, "Bad keycap entry\n", 18);
  290. X            return (0);
  291. X        }
  292. X    p++;
  293. X    /* p now points to beginning of last field */
  294. X    if (p[0] != 't' || p[1] != 'c')
  295. X        return(1);
  296. X    strcpy(tcname,p+3);
  297. X    q = tcname;
  298. X    while (q && *q != ':')
  299. X        q++;
  300. X    *q = 0;
  301. X    if (++hopcount > MAXHOP) {
  302. X        write(2, "Infinite tc= loop\n", 18);
  303. X        return (0);
  304. X    }
  305. X    if (kgetent(tcbuf, tcname) != 1)
  306. X        return(0);
  307. X    for (q=tcbuf; *q != ':'; q++)
  308. X        ;
  309. X    l = p - holdtbuf + strlen(q);
  310. X    if (l > KEYCAP_BUFSIZ) {
  311. X        write(2, "Keycap entry too long\n", 23);
  312. X        q[KEYCAP_BUFSIZ - (p-tbuf)] = 0;
  313. X    }
  314. X    strcpy(p, q+1);
  315. X    tbuf = holdtbuf;
  316. X    return(1);
  317. X}
  318. X
  319. X/*---------------------------------------------------------------------------*
  320. X * knamatch deals with name matching.  The first field of the keycap entry
  321. X * is a sequence of names separated by |'s, so we compare against each such
  322. X * name. The normal : terminator after the last name (before the first field)
  323. X * stops us.
  324. X *---------------------------------------------------------------------------*/
  325. Xstatic int knamatch(np)
  326. Xchar *np;
  327. X{
  328. X    register char *Np, *Bp;
  329. X
  330. X    Bp = tbuf;
  331. X    if (*Bp == '#' || *Bp == 0)
  332. X        return(0);
  333. X    for (;;) {
  334. X        for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
  335. X            continue;
  336. X        if (*Np == 0 && (*Bp == '|' || *Bp == ':' || *Bp == 0))
  337. X            return (1);
  338. X        while (*Bp && *Bp != ':' && *Bp != '|')
  339. X            Bp++;
  340. X        if (*Bp == 0 || *Bp == ':')
  341. X            return (0);
  342. X        Bp++;
  343. X    }
  344. X}
  345. X
  346. X/*---------------------------------------------------------------------------*
  347. X * Skip to the next field. Notice that this is very dumb, not knowing about
  348. X * \: escapes or any such. If necessary, :'s can be put into the keycap file
  349. X * in octal.
  350. X *---------------------------------------------------------------------------*/
  351. Xstatic char *kskip(bp)
  352. Xchar *bp;
  353. X{
  354. X    while (*bp && *bp != ':')
  355. X        bp++;
  356. X    if (*bp == ':')
  357. X        bp++;
  358. X    return (bp);
  359. X}
  360. X
  361. X/*---------------------------------------------------------------------------*
  362. X * Return the (numeric) option id. Numeric options look like 'li#80' i.e.
  363. X * the option string is separated from the numeric value by a # character.
  364. X * If the option is not found we return -1. Note that we handle octal
  365. X * numbers beginning with 0.
  366. X *---------------------------------------------------------------------------*/
  367. Xint kgetnum(id)
  368. Xchar *id;
  369. X{
  370. X    register int i, base;
  371. X    register char *bp = tbuf,*xp;
  372. X
  373. X    for (;;) {
  374. X        bp = kskip(bp);
  375. X        if (*bp == 0)
  376. X            return (-1);
  377. X        if ((xp=nmatch(id,bp)) == 0) 
  378. X            continue;
  379. X        bp = xp;    /* we have an entry */
  380. X        if (*bp == '@')
  381. X            return(-1);
  382. X        if (*bp != '#')
  383. X            continue;
  384. X        bp++;
  385. X        base = 10;
  386. X        if (*bp == '0')
  387. X            base = 8;
  388. X        i = 0;
  389. X        while (isdigit(*bp))
  390. X            i *= base, i += *bp++ - '0';
  391. X        return (i);
  392. X    }
  393. X}
  394. X
  395. X/*---------------------------------------------------------------------------*
  396. X * Handle a flag option. Flag options are given "naked", i.e. followed by
  397. X * a : or the end of the buffer.  Return 1 if we find the option, or 0 if
  398. X * it is not given.
  399. X *---------------------------------------------------------------------------*/
  400. Xint kgetflag(id)
  401. Xchar *id;
  402. X{
  403. X    register char *bp = tbuf,*xp;
  404. X
  405. X    for (;;) {
  406. X        bp = kskip(bp);
  407. X        if (!*bp)
  408. X            return (0);
  409. X        if ((xp=nmatch(id,bp)) != 0) {
  410. X            bp = xp;
  411. X            if (!*bp || *bp == ':')
  412. X                return (1);
  413. X            else if (*bp == '@')
  414. X                return(0);
  415. X        }
  416. X    }
  417. X}
  418. X
  419. X/*---------------------------------------------------------------------------*
  420. X * Get a string valued option. These are given as 'cl=^Z'. Much decoding
  421. X * is done on the strings, and the strings are placed in area, which is a
  422. X * ref parameter which is updated. No checking on area overflow.
  423. X *---------------------------------------------------------------------------*/
  424. Xchar *kgetstr(id, area)
  425. Xchar *id;
  426. Xchar **area;
  427. X{
  428. X    register char *bp = tbuf,*xp;
  429. X
  430. X    for (;;) {
  431. X        bp = kskip(bp);
  432. X        if (!*bp)
  433. X            return (0);
  434. X        if ((xp = nmatch(id,bp)) == 0)
  435. X            continue;
  436. X        bp = xp;
  437. X        if (*bp == '@')
  438. X            return(0);
  439. X        if (*bp != '=')
  440. X            continue;
  441. X        bp++;
  442. X        return (kdecode(bp, area));
  443. X    }
  444. X}
  445. X
  446. X/*---------------------------------------------------------------------------*
  447. X * kdecode does the grung work to decode the string capability escapes.
  448. X *---------------------------------------------------------------------------*/
  449. Xstatic char *kdecode(str, area)
  450. Xchar *str;
  451. Xchar **area;
  452. X{
  453. X    register char *cp;
  454. X    register int c;
  455. X    register char *dp;
  456. X    int i;
  457. X
  458. X    cp = *area;
  459. X    while ((c = *str++) && c != ':') {
  460. X        switch (c) {
  461. X
  462. X        case '^':
  463. X            c = *str++ & 037;
  464. X            break;
  465. X
  466. X        case '\\':
  467. X            dp = "E\033^^\\\\::n\nr\rt\tb\bf\f";
  468. X            c = *str++;
  469. Xnextc:
  470. X            if (*dp++ == c) {
  471. X                c = *dp++;
  472. X                break;
  473. X            }
  474. X            dp++;
  475. X            if (*dp)
  476. X                goto nextc;
  477. X            if (isdigit(c)) {
  478. X                c -= '0', i = 2;
  479. X                do
  480. X                    c <<= 3, c |= *str++ - '0';
  481. X                while (--i && isdigit(*str));
  482. X            }
  483. X            break;
  484. X        }
  485. X        *cp++ = c;
  486. X    }
  487. X    *cp++ = 0;
  488. X    str = *area;
  489. X    *area = cp;
  490. X    return (str);
  491. X}
  492. X
  493. X/*-------------------------------- EOF --------------------------------------*/
  494. END_OF_FILE
  495.   if test 10205 -ne `wc -c <'pcvt/Util/keycap/keycap.c'`; then
  496.     echo shar: \"'pcvt/Util/keycap/keycap.c'\" unpacked with wrong size!
  497.   fi
  498.   # end of 'pcvt/Util/keycap/keycap.c'
  499. fi
  500. if test -f 'pcvt/pcvt_tbl.h' -a "${1}" != "-c" ; then 
  501.   echo shar: Will not clobber existing file \"'pcvt/pcvt_tbl.h'\"
  502. else
  503.   echo shar: Extracting \"'pcvt/pcvt_tbl.h'\" \(21126 characters\)
  504.   sed "s/^X//" >'pcvt/pcvt_tbl.h' <<'END_OF_FILE'
  505. X/*
  506. X * Copyright (c) 1992,1993,1994 Hellmuth Michaelis
  507. X *
  508. X * All rights reserved.
  509. X *
  510. X * Redistribution and use in source and binary forms, with or without
  511. X * modification, are permitted provided that the following conditions
  512. X * are met:
  513. X * 1. Redistributions of source code must retain the above copyright
  514. X *    notice, this list of conditions and the following disclaimer.
  515. X * 2. Redistributions in binary form must reproduce the above copyright
  516. X *    notice, this list of conditions and the following disclaimer in the
  517. X *    documentation and/or other materials provided with the distribution.
  518. X * 3. All advertising materials mentioning features or use of this software
  519. X *    must display the following acknowledgement:
  520. X *    This product includes software developed by Hellmuth Michaelis
  521. X * 4. The name authors may not be used to endorse or promote products
  522. X *    derived from this software without specific prior written permission.
  523. X *
  524. X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
  525. X * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  526. X * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  527. X * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  528. X * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  529. X * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  530. X * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  531. X * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  532. X * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  533. X * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  534. X *
  535. X *
  536. X * @(#)pcvt_tbl.h, 3.00, Last Edit-Date: [Sun Feb 27 17:04:53 1994]
  537. X *
  538. X */
  539. X
  540. X/*---------------------------------------------------------------------------*
  541. X *
  542. X *    pcvt_tbl.h    VT220 Driver Character Set Conversion Tables
  543. X *    ------------------------------------------------------------
  544. X *    -hm    splitting off pccons_out.c
  545. X *    -hm    default tables for pure mda/hcg/cga
  546. X *
  547. X *    in pcvt_out.c, hooks are provided for the following charactersets:
  548. X *
  549. X *        HAVECS_BRITISH
  550. X *        HAVECS_ASCII
  551. X *        HAVECS_FINNISH
  552. X *        HAVECS_NORWEGIANDANISH
  553. X *        HAVECS_SWEDISH
  554. X *        HAVECS_GERMAN
  555. X *        HAVECS_FRENCHCANADA
  556. X *        HAVECS_FRENCH
  557. X *        HAVECS_ITALIAN
  558. X *        HAVECS_SPANISH
  559. X *        HAVECS_SPECIAL
  560. X *        HAVECS_ALTERNATEROM1
  561. X *        HAVECS_ALTERNATEROM2
  562. X *        HAVECS_ROMAN8
  563. X *        HAVECS_DUTCH
  564. X *        HAVECS_SUPPLEMENTAL
  565. X *        HAVECS_SWISS
  566. X *        HAVECS_TECHNICAL
  567. X *        HAVECS_ISOLATIN
  568. X *
  569. X *    to add support for a new charcterset, you have to provide the
  570. X *    table named "cs_<charset>",define the according "HAVECS_<CHARSET>"
  571. X *    and recompile everything. ref: pcvt_out.c, vt_designate()
  572. X *
  573. X *---------------------------------------------------------------------------*/
  574. X
  575. X/*===========================================================================*
  576. X *    DEFAULT TABLES FOR MDA/HCG/CGA
  577. X *===========================================================================*/
  578. X/*---------------------------------------------------------------------------*
  579. X *    ASCII Characterset
  580. X *---------------------------------------------------------------------------*/
  581. X#define HAVECSD_ASCII
  582. Xu_short csd_ascii[CSSIZE] = {
  583. X/* 20 */    0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL,
  584. X/* 24 */    0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL,
  585. X/* 28 */    0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL,
  586. X/* 2C */    0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL,
  587. X
  588. X/* 30 */    0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL,
  589. X/* 34 */    0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL,
  590. X/* 38 */    0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL,
  591. X/* 3C */    0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL,
  592. X
  593. X/* 40 */    0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL,
  594. X/* 44 */    0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL,
  595. X/* 48 */    0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL,
  596. X/* 4C */    0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL,
  597. X
  598. X/* 50 */    0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL,
  599. X/* 54 */    0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL,
  600. X/* 58 */    0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL,
  601. X/* 5C */    0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x5F | CSL,
  602. X
  603. X/* 60 */    0x60 | CSL, 0x61 | CSL, 0x62 | CSL, 0x63 | CSL,
  604. X/* 64 */    0x64 | CSL, 0x65 | CSL, 0x66 | CSL, 0x67 | CSL,
  605. X/* 68 */    0x68 | CSL, 0x69 | CSL, 0x6A | CSL, 0x6B | CSL,
  606. X/* 6C */    0x6C | CSL, 0x6D | CSL, 0x6E | CSL, 0x6F | CSL,
  607. X
  608. X/* 70 */    0x70 | CSL, 0x71 | CSL, 0x72 | CSL, 0x73 | CSL,
  609. X/* 74 */    0x74 | CSL, 0x75 | CSL, 0x76 | CSL, 0x77 | CSL,
  610. X/* 78 */    0x78 | CSL, 0x79 | CSL, 0x7A | CSL, 0x7B | CSL,
  611. X/* 7C */    0x7C | CSL, 0x7D | CSL, 0x7E | CSL, 0x7F | CSL,
  612. X};
  613. X
  614. X/*---------------------------------------------------------------------------*
  615. X *    DEC Supplemental Graphic Characterset
  616. X *---------------------------------------------------------------------------*/
  617. X#define HAVECSD_SUPPLEMENTAL
  618. Xu_short csd_supplemental[CSSIZE] = {
  619. X/* 20 */    0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL,
  620. X/* 24 */    0x20 | CSL, 0x9D | CSL, 0x20 | CSL, 0x20 | CSL,
  621. X/* 28 */    0x20 | CSL, 0x20 | CSL, 0xA6 | CSL, 0xAE | CSL,
  622. X/* 2C */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  623. X
  624. X/* 30 */    0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x20 | CSL,
  625. X/* 34 */    0x20 | CSL, 0xE6 | CSL, 0x20 | CSL, 0x20 | CSL,
  626. X/* 38 */    0x20 | CSL, 0x20 | CSL, 0xA7 | CSL, 0xAF | CSL,
  627. X/* 3C */    0xAC | CSL, 0xAB | CSL, 0x20 | CSL, 0xA8 | CSL,
  628. X
  629. X/* 40 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  630. X/* 44 */    0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL,
  631. X/* 48 */    0x20 | CSL, 0x90 | CSL, 0x20 | CSL, 0x20 | CSL,
  632. X/* 4C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  633. X
  634. X/* 50 */    0x20 | CSL, 0xA5 | CSL, 0x20 | CSL, 0x20 | CSL,
  635. X/* 54 */    0x20 | CSL, 0x20 | CSL, 0x99 | CSL, 0x20 | CSL,
  636. X/* 58 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  637. X/* 5C */    0x9A | CSL, 0x20 | CSL, 0x20 | CSL, 0xE1 | CSL,
  638. X
  639. X/* 60 */    0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x20 | CSL,
  640. X/* 64 */    0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL,
  641. X/* 68 */    0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL,
  642. X/* 6C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  643. X
  644. X/* 70 */    0x20 | CSL, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL,
  645. X/* 74 */    0x93 | CSL, 0x20 | CSL, 0x94 | CSL, 0x20 | CSL,
  646. X/* 78 */    0x20 | CSL, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL,
  647. X/* 7C */    0x81 | CSL, 0x98 | CSL, 0x20 | CSL, 0x20 | CSL
  648. X};
  649. X
  650. X/*---------------------------------------------------------------------------*
  651. X *    DEC Special Graphic Characterset
  652. X *---------------------------------------------------------------------------*/
  653. X#define HAVECSD_SPECIAL
  654. Xu_short csd_special[CSSIZE] = {
  655. X/* 20 */    0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL,
  656. X/* 24 */    0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL,
  657. X/* 28 */    0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL,
  658. X/* 2C */    0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL,
  659. X
  660. X/* 30 */    0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL,
  661. X/* 34 */    0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL,
  662. X/* 38 */    0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL,
  663. X/* 3C */    0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL,
  664. X
  665. X/* 40 */    0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL,
  666. X/* 44 */    0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL,
  667. X/* 48 */    0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL,
  668. X/* 4C */    0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL,
  669. X
  670. X/* 50 */    0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL,
  671. X/* 54 */    0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL,
  672. X/* 58 */    0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL,
  673. X/* 5C */    0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x20 | CSL,
  674. X
  675. X/* 60 */    0x20 | CSL, 0xB0 | CSL, 0x20 | CSL, 0x20 | CSL,
  676. X/* 64 */    0x20 | CSL, 0x20 | CSL, 0xF8 | CSL, 0xF1 | CSL,
  677. X/* 68 */    0x20 | CSL, 0x20 | CSL, 0xD9 | CSL, 0xBF | CSL,
  678. X/* 6C */    0xDA | CSL, 0xC0 | CSL, 0xC5 | CSL, 0x20 | CSL,
  679. X
  680. X/* 70 */    0x20 | CSL, 0xC4 | CSL, 0x20 | CSL, 0x20 | CSL,
  681. X/* 74 */    0xC3 | CSL, 0xB4 | CSL, 0xC1 | CSL, 0xC2 | CSL,
  682. X/* 78 */    0xB3 | CSL, 0xF3 | CSL, 0xF2 | CSL, 0xE3 | CSL,
  683. X/* 7C */    0x20 | CSL, 0x9C | CSL, 0x20 | CSL, 0x20 | CSL
  684. X};
  685. X
  686. X/*---------------------------------------------------------------------------*
  687. X *    DEC Technical Characterset
  688. X *---------------------------------------------------------------------------*/
  689. X#define HAVECSD_TECHNICAL
  690. Xu_short csd_technical[CSSIZE] = {
  691. X/* 20 */    0xFE | CSH, 0xFB | CSL, 0xDA | CSL, 0xC4 | CSL,
  692. X/* 24 */    0xF4 | CSL, 0xF5 | CSL, 0xB3 | CSL, 0xDA | CSL,
  693. X/* 28 */    0xC0 | CSL, 0xBF | CSL, 0xD9 | CSL, 0x20 | CSL,
  694. X/* 2C */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  695. X
  696. X/* 30 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  697. X/* 34 */    0x20 | CSL, 0xAA | CSL, 0xA9 | CSL, 0x3E | CSL,
  698. X/* 38 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  699. X/* 3C */    0xF3 | CSL, 0x20 | CSL, 0xF2 | CSL, 0x20 | CSL,
  700. X
  701. X/* 40 */    0x20 | CSL, 0x20 | CSL, 0xEC | CSL, 0xF6 | CSL,
  702. X/* 44 */    0x20 | CSL, 0x20 | CSL, 0xE8 | CSL, 0xE2 | CSL,
  703. X/* 48 */    0x20 | CSL, 0xF7 | CSL, 0xE9 | CSL, 0x78 | CSL,
  704. X/* 4C */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0xF0 | CSL,
  705. X
  706. X/* 50 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0xE4 | CSL,
  707. X/* 54 */    0x20 | CSL, 0x20 | CSL, 0xFB | CSL, 0xEA | CSL,
  708. X/* 58 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  709. X/* 5C */    0xEF | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  710. X
  711. X/* 60 */    0xAA | CSL, 0xE0 | CSL, 0xE1 | CSL, 0x20 | CSL,
  712. X/* 64 */    0xEB | CSL, 0x20 | CSL, 0xED | CSL, 0x59 | CSL,
  713. X/* 68 */    0x20 | CSL, 0x20 | CSL, 0xE9 | CSL, 0x20 | CSL,
  714. X/* 6C */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  715. X
  716. X/* 70 */    0xE3 | CSL, 0x20 | CSL, 0x20 | CSL, 0xE5 | CSL,
  717. X/* 74 */    0xE7 | CSL, 0x20 | CSL, 0x9F | CSL, 0x20 | CSL,
  718. X/* 78 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  719. X/* 7C */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL
  720. X};
  721. X
  722. X/*---------------------------------------------------------------------------*
  723. X *    ISO Latin-1 Characterset
  724. X *---------------------------------------------------------------------------*/
  725. X#define HAVECSD_ISOLATIN
  726. Xu_short csd_isolatin[CSSIZE] = {
  727. X/* 20 */    0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL,
  728. X/* 24 */    0x20 | CSL, 0x9D | CSL, 0x7C | CSL, 0x20 | CSL,
  729. X/* 28 */    0x22 | CSL, 0x20 | CSL, 0xA6 | CSL, 0xAE | CSL,
  730. X/* 2C */    0xAA | CSL, 0x2D | CSL, 0x20 | CSL, 0x2D | CSL,
  731. X
  732. X/* 30 */    0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x20 | CSL,
  733. X/* 34 */    0x27 | CSL, 0xE6 | CSL, 0x20 | CSL, 0x20 | CSL,
  734. X/* 38 */    0x20 | CSL, 0x20 | CSL, 0xA7 | CSL, 0xAF | CSL,
  735. X/* 3C */    0xAC | CSL, 0xAB | CSL, 0x20 | CSL, 0xA8 | CSL,
  736. X
  737. X/* 40 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  738. X/* 44 */    0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL,
  739. X/* 48 */    0x20 | CSL, 0x90 | CSL, 0x20 | CSL, 0x20 | CSL,
  740. X/* 4C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  741. X
  742. X/* 50 */    0x20 | CSL, 0xA5 | CSL, 0x20 | CSL, 0x20 | CSL,
  743. X/* 54 */    0x20 | CSL, 0x20 | CSL, 0x99 | CSL, 0x78 | CSL,
  744. X/* 58 */    0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL,
  745. X/* 5C */    0x9A | CSL, 0x20 | CSL, 0x20 | CSL, 0xE1 | CSL,
  746. X
  747. X/* 60 */    0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x20 | CSL,
  748. X/* 64 */    0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL,
  749. X/* 68 */    0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL,
  750. X/* 6C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  751. X
  752. X/* 70 */    0x20 | CSL, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL,
  753. X/* 74 */    0x93 | CSL, 0x20 | CSL, 0x94 | CSL, 0xF6 | CSL,
  754. X/* 78 */    0x20 | CSL, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL,
  755. X/* 7C */    0x81 | CSL, 0x20 | CSL, 0x20 | CSL, 0x98 | CSL
  756. X};
  757. X
  758. X/*===========================================================================*
  759. X *    EXTENDED TABLES FOR EGA/VGA
  760. X *===========================================================================*/
  761. X
  762. X/*---------------------------------------------------------------------------*
  763. X *    ASCII Characterset
  764. X *---------------------------------------------------------------------------*/
  765. X#define HAVECSE_ASCII
  766. Xu_short cse_ascii[CSSIZE] = {
  767. X/* 20 */    0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL,
  768. X/* 24 */    0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL,
  769. X/* 28 */    0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL,
  770. X/* 2C */    0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL,
  771. X
  772. X/* 30 */    0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL,
  773. X/* 34 */    0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL,
  774. X/* 38 */    0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL,
  775. X/* 3C */    0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL,
  776. X
  777. X/* 40 */    0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL,
  778. X/* 44 */    0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL,
  779. X/* 48 */    0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL,
  780. X/* 4C */    0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL,
  781. X
  782. X/* 50 */    0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL,
  783. X/* 54 */    0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL,
  784. X/* 58 */    0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL,
  785. X/* 5C */    0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x5F | CSL,
  786. X
  787. X/* 60 */    0x60 | CSL, 0x61 | CSL, 0x62 | CSL, 0x63 | CSL,
  788. X/* 64 */    0x64 | CSL, 0x65 | CSL, 0x66 | CSL, 0x67 | CSL,
  789. X/* 68 */    0x68 | CSL, 0x69 | CSL, 0x6A | CSL, 0x6B | CSL,
  790. X/* 6C */    0x6C | CSL, 0x6D | CSL, 0x6E | CSL, 0x6F | CSL,
  791. X
  792. X/* 70 */    0x70 | CSL, 0x71 | CSL, 0x72 | CSL, 0x73 | CSL,
  793. X/* 74 */    0x74 | CSL, 0x75 | CSL, 0x76 | CSL, 0x77 | CSL,
  794. X/* 78 */    0x78 | CSL, 0x79 | CSL, 0x7A | CSL, 0x7B | CSL,
  795. X/* 7C */    0x7C | CSL, 0x7D | CSL, 0x7E | CSL, 0xB0 | CSL,
  796. X};
  797. X
  798. X/*---------------------------------------------------------------------------*
  799. X *    DEC Supplemental Graphic Characterset
  800. X *---------------------------------------------------------------------------*/
  801. X#define HAVECSE_SUPPLEMENTAL
  802. Xu_short cse_supplemental[CSSIZE] = {
  803. X/* 20 */    0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL,
  804. X/* 24 */    0x9F | CSH, 0x67 | CSH, 0x9F | CSH, 0x15 | CSL,
  805. X/* 28 */    0x9D | CSH, 0x9C | CSH, 0xA6 | CSL, 0xAE | CSL,
  806. X/* 2C */    0x9F | CSH, 0x9F | CSH, 0x9F | CSH, 0x9F | CSH,
  807. X
  808. X/* 30 */    0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x9B | CSH,
  809. X/* 34 */    0x9F | CSH, 0xE6 | CSL, 0x14 | CSL, 0x99 | CSH,
  810. X/* 38 */    0x9F | CSH, 0x98 | CSH, 0xA7 | CSL, 0xAF | CSL,
  811. X/* 3C */    0xAC | CSL, 0xAB | CSL, 0x9F | CSH, 0xA8 | CSL,
  812. X
  813. X/* 40 */    0x97 | CSH, 0x96 | CSH, 0x95 | CSH, 0x94 | CSH,
  814. X/* 44 */    0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL,
  815. X/* 48 */    0x93 | CSH, 0x90 | CSL, 0x92 | CSH, 0x91 | CSH,
  816. X/* 4C */    0x90 | CSH, 0x8F | CSH, 0x8E | CSH, 0x8D | CSH,
  817. X
  818. X/* 50 */    0x9F | CSH, 0xA5 | CSL, 0x8C | CSH, 0x8B | CSH,
  819. X/* 54 */    0x8A | CSH, 0x89 | CSH, 0x99 | CSL, 0x88 | CSH,
  820. X/* 58 */    0x87 | CSH, 0x86 | CSH, 0x85 | CSH, 0x84 | CSH,
  821. X/* 5C */    0x9A | CSL, 0x83 | CSH, 0x9F | CSH, 0xE1 | CSL,
  822. X
  823. X/* 60 */    0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x82 | CSH,
  824. X/* 64 */    0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL,
  825. X/* 68 */    0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL,
  826. X/* 6C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  827. X
  828. X/* 70 */    0x9F | CSH, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL,
  829. X/* 74 */    0x93 | CSL, 0x81 | CSH, 0x94 | CSL, 0x80 | CSH,
  830. X/* 78 */    0x7F | CSH, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL,
  831. X/* 7C */    0x81 | CSL, 0x98 | CSL, 0x9F | CSH, 0x20 | CSL
  832. X};
  833. X
  834. X/*---------------------------------------------------------------------------*
  835. X *    DEC Special Graphic Characterset
  836. X *---------------------------------------------------------------------------*/
  837. X#define HAVECSE_SPECIAL
  838. Xu_short cse_special[CSSIZE] = {
  839. X/* 20 */    0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL,
  840. X/* 24 */    0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL,
  841. X/* 28 */    0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL,
  842. X/* 2C */    0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL,
  843. X
  844. X/* 30 */    0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL,
  845. X/* 34 */    0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL,
  846. X/* 38 */    0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL,
  847. X/* 3C */    0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL,
  848. X
  849. X/* 40 */    0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL,
  850. X/* 44 */    0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL,
  851. X/* 48 */    0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL,
  852. X/* 4C */    0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL,
  853. X
  854. X/* 50 */    0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL,
  855. X/* 54 */    0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL,
  856. X/* 58 */    0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL,
  857. X/* 5C */    0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x20 | CSL,
  858. X
  859. X/* 60 */    0x04 | CSL, 0xB0 | CSL, 0x09 | CSH, 0x0C | CSH,
  860. X/* 64 */    0x0D | CSH, 0x0A | CSH, 0xF8 | CSL, 0xF1 | CSL,
  861. X/* 68 */    0x00 | CSH, 0x0B | CSH, 0xD9 | CSL, 0xBF | CSL,
  862. X/* 6C */    0xDA | CSL, 0xC0 | CSL, 0xC5 | CSL, 0x7D | CSH,
  863. X
  864. X/* 70 */    0x7C | CSH, 0x7B | CSH, 0x7A | CSH, 0x79 | CSH,
  865. X/* 74 */    0xC3 | CSL, 0xB4 | CSL, 0xC1 | CSL, 0xC2 | CSL,
  866. X/* 78 */    0xB3 | CSL, 0xF3 | CSL, 0xF2 | CSL, 0xE3 | CSL,
  867. X/* 7C */    0x78 | CSH, 0x9C | CSL, 0x99 | CSH, 0x20 | CSL
  868. X};
  869. X
  870. X/*---------------------------------------------------------------------------*
  871. X *    DEC Technical Characterset
  872. X *---------------------------------------------------------------------------*/
  873. X#define HAVECSE_TECHNICAL
  874. Xu_short cse_technical[CSSIZE] = {
  875. X/* 20 */    0x20 | CSL, 0x65 | CSH, 0xDA | CSL, 0xC4 | CSL,
  876. X/* 24 */    0xF4 | CSL, 0xF5 | CSL, 0xB3 | CSL, 0xDA | CSL,
  877. X/* 28 */    0xC0 | CSL, 0xBF | CSL, 0xD9 | CSL, 0x61 | CSH,
  878. X/* 2C */    0x62 | CSH, 0x63 | CSH, 0x64 | CSH, 0x5F | CSH,
  879. X
  880. X/* 30 */    0x60 | CSH, 0x5E | CSH, 0x5D | CSH, 0x5C | CSH,
  881. X/* 34 */    0x5B | CSH, 0xAA | CSL, 0xA9 | CSL, 0x3E | CSL,
  882. X/* 38 */    0x9F | CSH, 0x9F | CSH, 0x9F | CSH, 0x9F | CSH,
  883. X/* 3C */    0xF3 | CSL, 0x78 | CSH, 0xF2 | CSL, 0x5A | CSH,
  884. X
  885. X/* 40 */    0x59 | CSH, 0x58 | CSH, 0xEC | CSL, 0xF6 | CSL,
  886. X/* 44 */    0x57 | CSH, 0x56 | CSH, 0xE8 | CSL, 0xE2 | CSL,
  887. X/* 48 */    0x77 | CSH, 0x55 | CSH, 0x54 | CSH, 0x6E | CSH,
  888. X/* 4C */    0x53 | CSH, 0x52 | CSH, 0x51 | CSH, 0xF0 | CSL,
  889. X
  890. X/* 50 */    0x50 | CSH, 0x4F | CSH, 0x9F | CSH, 0xE4 | CSL,
  891. X/* 54 */    0x9F | CSH, 0x9F | CSH, 0xFB | CSL, 0xEA | CSL,
  892. X/* 58 */    0x4E | CSH, 0x4D | CSH, 0x4C | CSH, 0x4B | CSH,
  893. X/* 5C */    0xEF | CSL, 0x4A | CSH, 0x49 | CSH, 0x48 | CSH,
  894. X
  895. X/* 60 */    0xAA | CSL, 0xE0 | CSL, 0xE1 | CSL, 0x47 | CSH,
  896. X/* 64 */    0xEB | CSL, 0x46 | CSH, 0xED | CSL, 0x59 | CSL,
  897. X/* 68 */    0x45 | CSH, 0x44 | CSH, 0xE9 | CSL, 0x9E | CSH,
  898. X/* 6C */    0x43 | CSH, 0x9F | CSH, 0x76 | CSL, 0x42 | CSH,
  899. X
  900. X/* 70 */    0xE3 | CSL, 0x41 | CSH, 0x40 | CSH, 0xE5 | CSL,
  901. X/* 74 */    0xE7 | CSL, 0x9F | CSH, 0x9F | CSL, 0x66 | CSH,
  902. X/* 78 */    0x68 | CSH, 0x7E | CSH, 0x9A | CSH, 0x1B | CSL,
  903. X/* 7C */    0x18 | CSL, 0x1A | CSL, 0x19 | CSL, 0x20 | CSL
  904. X};
  905. X
  906. X/*---------------------------------------------------------------------------*
  907. X *    ISO Latin-1 Characterset
  908. X *---------------------------------------------------------------------------*/
  909. X#define HAVECSE_ISOLATIN
  910. Xu_short cse_isolatin[CSSIZE] = {
  911. X/* 20 */    0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL,
  912. X/* 24 */    0x9D | CSH, 0x9D | CSL, 0x7C | CSL, 0x15 | CSL,
  913. X/* 28 */    0x77 | CSH, 0x9C | CSH, 0xA6 | CSL, 0xAE | CSL,
  914. X/* 2C */    0x76 | CSH, 0x75 | CSH, 0x74 | CSH, 0x73 | CSH,
  915. X
  916. X/* 30 */    0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x9B | CSH,
  917. X/* 34 */    0x72 | CSH, 0xE6 | CSL, 0x14 | CSL, 0x99 | CSH,
  918. X/* 38 */    0x71 | CSH, 0x98 | CSH, 0xA7 | CSL, 0xAF | CSL,
  919. X/* 3C */    0xAC | CSL, 0xAB | CSL, 0x70 | CSH, 0xA8 | CSL,
  920. X
  921. X/* 40 */    0x97 | CSH, 0x96 | CSH, 0x95 | CSH, 0x94 | CSH,
  922. X/* 44 */    0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL,
  923. X/* 48 */    0x93 | CSH, 0x90 | CSL, 0x92 | CSH, 0x91 | CSH,
  924. X/* 4C */    0x90 | CSH, 0x8F | CSH, 0x8E | CSH, 0x8D | CSH,
  925. X
  926. X/* 50 */    0x6F | CSH, 0xA5 | CSL, 0x8C | CSH, 0x8B | CSH,
  927. X/* 54 */    0x8A | CSH, 0x89 | CSH, 0x99 | CSL, 0x6E | CSH,
  928. X/* 58 */    0x87 | CSH, 0x86 | CSH, 0x85 | CSH, 0x84 | CSH,
  929. X/* 5C */    0x9A | CSL, 0x6D | CSH, 0x6C | CSH, 0xE1 | CSL,
  930. X
  931. X/* 60 */    0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x82 | CSH,
  932. X/* 64 */    0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL,
  933. X/* 68 */    0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL,
  934. X/* 6C */    0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL,
  935. X
  936. X/* 70 */    0x6B | CSH, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL,
  937. X/* 74 */    0x93 | CSL, 0x81 | CSH, 0x94 | CSL, 0xF6 | CSL,
  938. X/* 78 */    0x7F | CSH, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL,
  939. X/* 7C */    0x81 | CSL, 0x69 | CSL, 0x6A | CSH, 0x98 | CSL
  940. X};
  941. X
  942. X/*---------------------------------------------------------------------------*
  943. X *    Downloadable Characterset
  944. X *---------------------------------------------------------------------------*/
  945. X#define HAVECSE_DOWNLOADABLE
  946. Xu_short cse_downloadable[CSSIZE] = {
  947. X/* 20 */    0xA0 | CSH, 0xA1 | CSH, 0xA2 | CSH, 0xA3 | CSH,
  948. X/* 24 */    0xA4 | CSH, 0xA5 | CSH, 0xA6 | CSH, 0xA7 | CSH,
  949. X/* 28 */    0xA8 | CSH, 0xA9 | CSH, 0xAA | CSH, 0xAB | CSH,
  950. X/* 2C */    0xAC | CSH, 0xAD | CSH, 0xAE | CSH, 0xAF | CSH,
  951. X
  952. X/* 30 */    0xB0 | CSH, 0xB1 | CSH, 0xB2 | CSH, 0xB3 | CSH,
  953. X/* 34 */    0xB4 | CSH, 0xB5 | CSH, 0xB6 | CSH, 0xB7 | CSH,
  954. X/* 38 */    0xB8 | CSH, 0xB9 | CSH, 0xBA | CSH, 0xBB | CSH,
  955. X/* 3C */    0xBC | CSH, 0xBD | CSH, 0xBE | CSH, 0xBF | CSH,
  956. X
  957. X/* 40 */    0xC0 | CSH, 0xC1 | CSH, 0xC2 | CSH, 0xC3 | CSH,
  958. X/* 44 */    0xC4 | CSH, 0xC5 | CSH, 0xC6 | CSH, 0xC7 | CSH,
  959. X/* 48 */    0xC8 | CSH, 0xC9 | CSH, 0xCA | CSH, 0xCB | CSH,
  960. X/* 4C */    0xCC | CSH, 0xCD | CSH, 0xCE | CSH, 0xCF | CSH,
  961. X
  962. X/* 50 */    0xD0 | CSH, 0xD1 | CSH, 0xD2 | CSH, 0xD3 | CSH,
  963. X/* 54 */    0xD4 | CSH, 0xD5 | CSH, 0xD6 | CSH, 0xD7 | CSH,
  964. X/* 58 */    0xD8 | CSH, 0xD9 | CSH, 0xDA | CSH, 0xDB | CSH,
  965. X/* 5C */    0xDC | CSH, 0xDD | CSH, 0xDE | CSH, 0xDF | CSH,
  966. X
  967. X/* 60 */    0xE0 | CSH, 0xE1 | CSH, 0xE2 | CSH, 0xE3 | CSH,
  968. X/* 64 */    0xE4 | CSH, 0xE5 | CSH, 0xE6 | CSH, 0xE7 | CSH,
  969. X/* 68 */    0xE8 | CSH, 0xE9 | CSH, 0xEA | CSH, 0xEB | CSH,
  970. X/* 6C */    0xEC | CSH, 0xED | CSH, 0xEE | CSH, 0xEF | CSH,
  971. X
  972. X/* 70 */    0xF0 | CSH, 0xF1 | CSH, 0xF2 | CSH, 0xF3 | CSH,
  973. X/* 74 */    0xF4 | CSH, 0xF5 | CSH, 0xF6 | CSH, 0xF7 | CSH,
  974. X/* 78 */    0xF8 | CSH, 0xF9 | CSH, 0xFA | CSH, 0xFB | CSH,
  975. X/* 7C */    0xFC | CSH, 0xFD | CSH, 0xFE | CSH, 0xFF | CSH,
  976. X};
  977. X
  978. X/* ------------------------- E O F ------------------------------------------*/
  979. END_OF_FILE
  980.   if test 21126 -ne `wc -c <'pcvt/pcvt_tbl.h'`; then
  981.     echo shar: \"'pcvt/pcvt_tbl.h'\" unpacked with wrong size!
  982.   fi
  983.   # end of 'pcvt/pcvt_tbl.h'
  984. fi
  985. if test -f 'pcvt/pcvt_vtf.c' -a "${1}" != "-c" ; then 
  986.   echo shar: Will not clobber existing file \"'pcvt/pcvt_vtf.c'\"
  987. else
  988.   echo shar: Extracting \"'pcvt/pcvt_vtf.c'\" \(51018 characters\)
  989.   sed "s/^X//" >'pcvt/pcvt_vtf.c' <<'END_OF_FILE'
  990. X/*
  991. X * Copyright (c) 1992,1993,1994 Hellmuth Michaelis, Brian Dunford-Shore
  992. X *                              and Joerg Wunsch.
  993. X *
  994. X * All rights reserved.
  995. X *
  996. X * This code is derived from software contributed to Berkeley by
  997. X * William Jolitz and Don Ahn.
  998. X *
  999. X * Redistribution and use in source and binary forms, with or without
  1000. X * modification, are permitted provided that the following conditions
  1001. X * are met:
  1002. X * 1. Redistributions of source code must retain the above copyright
  1003. X *    notice, this list of conditions and the following disclaimer.
  1004. X * 2. Redistributions in binary form must reproduce the above copyright
  1005. X *    notice, this list of conditions and the following disclaimer in the
  1006. X *    documentation and/or other materials provided with the distribution.
  1007. X * 3. All advertising materials mentioning features or use of this software
  1008. X *    must display the following acknowledgement:
  1009. X *    This product includes software developed by Hellmuth Michaelis,
  1010. X *    Brian Dunford-Shore and Joerg Wunsch.
  1011. X * 4. The name authors may not be used to endorse or promote products
  1012. X *    derived from this software without specific prior written permission.
  1013. X *
  1014. X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
  1015. X * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  1016. X * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  1017. X * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  1018. X * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  1019. X * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  1020. X * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  1021. X * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  1022. X * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  1023. X * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  1024. X *
  1025. X *
  1026. X * @(#)pcvt_vtf.c, 3.00, Last Edit-Date: [Sun Feb 27 17:04:53 1994]
  1027. X */
  1028. X
  1029. X/*---------------------------------------------------------------------------*
  1030. X *
  1031. X *    pcvt_vtf.c    VT220 Terminal Emulator Functions
  1032. X *    -------------------------------------------------
  1033. X *    -hm    splitting off from pcvt_out.c
  1034. X *    -jw/hm    all ifdef's converted to if's 
  1035. X *    -hm    patch from Joerg: PCVT_INHIBIT_NUMLOCK
  1036. X *    -hm    ------------ Release 3.00 --------------
  1037. X *
  1038. X *---------------------------------------------------------------------------*/
  1039. X
  1040. X#include "vt.h"
  1041. X#if NVT > 0
  1042. X
  1043. X#include "pcvt_hdr.h"        /* global include */
  1044. X#include "pcvt_tbl.h"        /* character set conversion tables */
  1045. X
  1046. Xstatic void clear_dld ( struct video_state *svsp );
  1047. Xstatic void init_dld ( struct video_state *svsp );
  1048. Xstatic void init_udk ( struct video_state *svsp );
  1049. Xstatic void respond ( struct video_state *svsp );
  1050. Xstatic void roll_down ( struct video_state *svsp );
  1051. Xstatic void roll_up ( struct video_state *svsp );
  1052. Xstatic void selective_erase ( struct video_state *svsp, u_short *pcrtat,
  1053. X                  int length );
  1054. Xstatic void swcsp ( struct video_state *svsp, u_short *ctp );
  1055. X
  1056. X/*---------------------------------------------------------------------------*
  1057. X *    DECSTBM - set top and bottom margins
  1058. X *---------------------------------------------------------------------------*/
  1059. Xvoid
  1060. Xvt_stbm(struct video_state *svsp)
  1061. X{
  1062. X    /* both 0 => scrolling region = entire screen */
  1063. X    
  1064. X    if((svsp->parms[0] == 0) && (svsp->parms[1] == 0))
  1065. X    {
  1066. X        svsp->cur_offset = 0;
  1067. X        svsp->scrr_beg = 0;
  1068. X        svsp->scrr_len = svsp->screen_rows-1;
  1069. X        svsp->col = 0;
  1070. X        return;
  1071. X    }
  1072. X
  1073. X    if(svsp->parms[1] <= svsp->parms[0])
  1074. X        return;
  1075. X
  1076. X    /* range parm 1 */
  1077. X    
  1078. X    if(svsp->parms[0] < 1)
  1079. X        svsp->parms[0] = 1;
  1080. X    else if(svsp->parms[0] > svsp->screen_rows-1)
  1081. X        svsp->parms[0] = svsp->screen_rows-1;
  1082. X
  1083. X    /* range parm 2 */
  1084. X        
  1085. X    if(svsp->parms[1] < 2)
  1086. X        svsp->parms[1] = 2;
  1087. X    else if(svsp->parms[1] > svsp->screen_rows)
  1088. X        svsp->parms[1] = svsp->screen_rows;
  1089. X
  1090. X    svsp->scrr_beg = svsp->parms[0]-1;        /* begin of scrolling region */
  1091. X    svsp->scrr_len = svsp->parms[1] - svsp->parms[0];    /* no of lines */
  1092. X    if(svsp->m_om)
  1093. X        svsp->cur_offset = svsp->scrr_beg * svsp->maxcol;    /* cursor to first pos */
  1094. X    else
  1095. X        svsp->cur_offset = 0;            /* cursor to first pos */
  1096. X    svsp->col = 0;
  1097. X}
  1098. X
  1099. X/*---------------------------------------------------------------------------*
  1100. X *    SGR - set graphic rendition
  1101. X *---------------------------------------------------------------------------*/
  1102. Xvoid
  1103. Xvt_sgr(struct video_state *svsp)
  1104. X{
  1105. X    register int i = 0;
  1106. X    u_short setcolor = 0;
  1107. X    char colortouched = 0;
  1108. X    
  1109. X    do
  1110. X    {
  1111. X        switch(svsp->parms[i++])
  1112. X        {
  1113. X            case 0:        /* reset to normal attributes */
  1114. X                svsp->vtsgr = VT_NORMAL;
  1115. X                break;
  1116. X
  1117. X            case 1:        /* bold */
  1118. X                svsp->vtsgr |= VT_BOLD;
  1119. X                break;
  1120. X                
  1121. X            case 4:        /* underline */
  1122. X                svsp->vtsgr |= VT_UNDER;
  1123. X                break;
  1124. X                
  1125. X            case 5:        /* blinking */
  1126. X                svsp->vtsgr |= VT_BLINK;
  1127. X                break;
  1128. X                
  1129. X            case 7:        /* reverse */
  1130. X                svsp->vtsgr |= VT_INVERSE;
  1131. X                break;
  1132. X
  1133. X            case 22:    /* not bold */
  1134. X                svsp->vtsgr &= ~VT_BOLD;
  1135. X                break;
  1136. X                
  1137. X            case 24:    /* not underlined */
  1138. X                svsp->vtsgr &= ~VT_UNDER;
  1139. X                break;
  1140. X                
  1141. X            case 25:    /* not blinking */
  1142. X                svsp->vtsgr &= ~VT_BLINK;
  1143. X                break;
  1144. X                
  1145. X            case 27:    /* not reverse */
  1146. X                svsp->vtsgr &= ~VT_INVERSE;
  1147. X                break;
  1148. X            
  1149. X            case 30:    /* foreground colors */
  1150. X            case 31:
  1151. X            case 32:
  1152. X            case 33:
  1153. X            case 34:
  1154. X            case 35:
  1155. X            case 36:
  1156. X            case 37:
  1157. X                if(color)
  1158. X                {
  1159. X                 colortouched = 1;
  1160. X                 setcolor |= ((fgansitopc[(svsp->parms[i-1]-30) & 7]) << 8);
  1161. X                }
  1162. X                break;
  1163. X                
  1164. X            case 40:    /* background colors */
  1165. X            case 41:
  1166. X            case 42:
  1167. X            case 43:
  1168. X            case 44:
  1169. X            case 45:
  1170. X            case 46:
  1171. X            case 47:
  1172. X                if(color)
  1173. X                {
  1174. X                 colortouched = 1;
  1175. X                 setcolor |= ((bgansitopc[(svsp->parms[i-1]-40) & 7]) << 8);
  1176. X                }
  1177. X                break;
  1178. X        }
  1179. X    }
  1180. X    while(i <= svsp->parmi);
  1181. X    if(color)
  1182. X    {
  1183. X        if(colortouched)
  1184. X            svsp->c_attr = setcolor;
  1185. X        else
  1186. X            svsp->c_attr = ((sgr_tab_color[svsp->vtsgr]) << 8);
  1187. X    }
  1188. X    else
  1189. X    {
  1190. X        if(adaptor_type == MDA_ADAPTOR)
  1191. X            svsp->c_attr = ((sgr_tab_imono[svsp->vtsgr]) << 8);
  1192. X        else
  1193. X            svsp->c_attr = ((sgr_tab_mono[svsp->vtsgr]) << 8);
  1194. X    }
  1195. X}
  1196. X
  1197. X/*---------------------------------------------------------------------------*
  1198. X *    CUU - cursor up
  1199. X *---------------------------------------------------------------------------*/
  1200. Xvoid
  1201. Xvt_cuu(struct video_state *svsp)
  1202. X{
  1203. X    register int p = svsp->parms[0];
  1204. X
  1205. X    if(svsp->row <= svsp->scrr_beg)    /* cursor above scrolling region  ? */
  1206. X        return;
  1207. X        
  1208. X    if(p <= 0)                /* parameter min */
  1209. X        p = 1;
  1210. X        
  1211. X    if(p >= (svsp->row - svsp->scrr_beg))    /* parameter max */
  1212. X        p = svsp->row - svsp->scrr_beg;
  1213. X
  1214. X    svsp->cur_offset -= (svsp->maxcol * p);
  1215. X}
  1216. X
  1217. X/*---------------------------------------------------------------------------*
  1218. X *    CUD - cursor down
  1219. X *---------------------------------------------------------------------------*/
  1220. Xvoid
  1221. Xvt_cud(struct video_state *svsp)
  1222. X{
  1223. X    register int p = svsp->parms[0];
  1224. X    
  1225. X    if(svsp->row >= (svsp->scrr_beg + svsp->scrr_len))    /* already at end of screen */
  1226. X        return;
  1227. X        
  1228. X    if(p <= 0)            /* parameter min */
  1229. X        p = 1;
  1230. X
  1231. X    if(p >= (svsp->scrr_beg+svsp->scrr_len-svsp->row))    /* parameter max */
  1232. X        p = svsp->scrr_beg+svsp->scrr_len-svsp->row;
  1233. X
  1234. X    svsp->cur_offset += (svsp->maxcol * p);
  1235. X}
  1236. X
  1237. X/*---------------------------------------------------------------------------*
  1238. X *    CUF - cursor forward
  1239. X *---------------------------------------------------------------------------*/
  1240. Xvoid
  1241. Xvt_cuf(struct video_state *svsp)
  1242. X{
  1243. X    register int p = svsp->parms[0];    
  1244. X
  1245. X    if(svsp->col == ((svsp->maxcol)-1))        /* already at right margin */
  1246. X        return;
  1247. X    if(p <= 0)            /* parameter min = 1 */
  1248. X        p = 1;
  1249. X    else if(p > ((svsp->maxcol)-1))        /* parameter max = 79 */
  1250. X        p = ((svsp->maxcol)-1);
  1251. X    if((svsp->col + p) > ((svsp->maxcol)-1))        /* not more than right margin */
  1252. X        p = ((svsp->maxcol)-1) - svsp->col;
  1253. X    svsp->cur_offset += p;
  1254. X    svsp->col += p;
  1255. X}
  1256. X
  1257. X/*---------------------------------------------------------------------------*
  1258. X *    CUB - cursor backward
  1259. X *---------------------------------------------------------------------------*/
  1260. Xvoid
  1261. Xvt_cub(struct video_state *svsp)
  1262. X{
  1263. X    register int p = svsp->parms[0];    
  1264. X
  1265. X    if(svsp->col == 0)            /* already at left margin ? */
  1266. X        return;
  1267. X    if(p <= 0)            /* parameter min = 1 */
  1268. X        p = 1;
  1269. X    else if(p > ((svsp->maxcol)-1))        /* parameter max = 79 */
  1270. X        p = ((svsp->maxcol)-1);
  1271. X    if((svsp->col - p) <= 0)        /* not more than left margin */
  1272. X        p = svsp->col;
  1273. X    svsp->cur_offset -= p;
  1274. X    svsp->col -= p;
  1275. X}
  1276. X
  1277. X/*---------------------------------------------------------------------------*
  1278. X *    ED - erase in display
  1279. X *---------------------------------------------------------------------------*/
  1280. Xvoid
  1281. Xvt_clreos(struct video_state *svsp)
  1282. X{
  1283. X    switch(svsp->parms[0])
  1284. X    {
  1285. X        case 0:
  1286. X            fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset),
  1287. X                 svsp->Crtat + (svsp->maxcol * svsp->screen_rows) - (svsp->Crtat + svsp->cur_offset));
  1288. X            break;
  1289. X        case 1:
  1290. X            fillw(user_attr | ' ', svsp->Crtat, (svsp->Crtat + svsp->cur_offset) - svsp->Crtat + 1 );
  1291. X            break;
  1292. X        case 2:                
  1293. X            fillw(user_attr | ' ', svsp->Crtat, svsp->maxcol * svsp->screen_rows);
  1294. X            break;
  1295. X    }
  1296. X}
  1297. X
  1298. X/*---------------------------------------------------------------------------*
  1299. X *    EL - erase in line
  1300. X *---------------------------------------------------------------------------*/
  1301. Xvoid
  1302. Xvt_clreol(struct video_state *svsp)
  1303. X{
  1304. X    switch(svsp->parms[0])
  1305. X    {
  1306. X        case 0:
  1307. X            fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset), svsp->maxcol-svsp->col);
  1308. X            break;
  1309. X        case 1:
  1310. X            fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset)-svsp->col, svsp->col + 1);
  1311. X            break;
  1312. X        case 2:
  1313. X            fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset)-svsp->col, svsp->maxcol);
  1314. X            break;
  1315. X    }
  1316. X}
  1317. X
  1318. X/*---------------------------------------------------------------------------*
  1319. X *    CUP - cursor position / HVP - horizontal & vertical position
  1320. X *---------------------------------------------------------------------------*/
  1321. Xvoid
  1322. Xvt_curadr(struct video_state *svsp)
  1323. X{
  1324. X    if(svsp->m_om)    /* relative to scrolling region */
  1325. X    {
  1326. X        if((svsp->parms[0] == 0) && (svsp->parms[1] == 0)) 
  1327. X        {
  1328. X            svsp->cur_offset = svsp->scrr_beg * svsp->maxcol;
  1329. X            svsp->col = 0;
  1330. X            return;
  1331. X        }
  1332. X        
  1333. X        if(svsp->parms[0] <= 0)
  1334. X            svsp->parms[0] = 1;
  1335. X        else if(svsp->parms[0] > (svsp->scrr_len + 1))
  1336. X            svsp->parms[0] = svsp->scrr_len + 1;
  1337. X    
  1338. X        if(svsp->parms[1] <= 0 )
  1339. X            svsp->parms[1] = 1;
  1340. X        if(svsp->parms[1] > svsp->maxcol)
  1341. X            svsp->parms[1] = svsp->maxcol;
  1342. X    
  1343. X        svsp->cur_offset = (svsp->scrr_beg * svsp->maxcol) + ((svsp->parms[0] - 1) * svsp->maxcol) + svsp->parms[1] - 1;
  1344. X        svsp->col = svsp->parms[1] - 1;
  1345. X    }
  1346. X    else    /* relative to screen start */
  1347. X    {
  1348. X        if((svsp->parms[0] == 0) && (svsp->parms[1] == 0)) 
  1349. X        {
  1350. X            svsp->cur_offset = 0;
  1351. X            svsp->col = 0;
  1352. X            return;
  1353. X        }
  1354. X        
  1355. X        if(svsp->parms[0] <= 0)
  1356. X            svsp->parms[0] = 1;
  1357. X        else if(svsp->parms[0] > svsp->screen_rows)
  1358. X            svsp->parms[0] = svsp->screen_rows;
  1359. X    
  1360. X        if(svsp->parms[1] <= 0 )
  1361. X            svsp->parms[1] = 1;
  1362. X        if(svsp->parms[1] > svsp->maxcol)            /* col */
  1363. X            svsp->parms[1] = svsp->maxcol;
  1364. X    
  1365. X        svsp->cur_offset = (((svsp->parms[0]-1)*svsp->maxcol)+(svsp->parms[1]-1));
  1366. X        svsp->col = svsp->parms[1]-1;
  1367. X    }
  1368. X}
  1369. X
  1370. X/*---------------------------------------------------------------------------*
  1371. X *    RIS - reset to initial state (hard emulator runtime reset)
  1372. X *---------------------------------------------------------------------------*/
  1373. Xvoid
  1374. Xvt_ris(struct video_state *svsp)
  1375. X{
  1376. X    fillw(user_attr | ' ', svsp->Crtat, svsp->maxcol * svsp->screen_rows);
  1377. X    svsp->cur_offset = 0;        /* cursor upper left corner */
  1378. X    svsp->col = 0;
  1379. X    svsp->row = 0;    
  1380. X    svsp->lnm = 0;            /* CR only */
  1381. X    clear_dld(svsp);        /* clear download charset */
  1382. X    vt_clearudk(svsp);        /* clear user defined keys */
  1383. X    svsp->selchar = 0;        /* selective attribute off */
  1384. X    vt_str(svsp);            /* and soft terminal reset */
  1385. X}
  1386. X
  1387. X/*---------------------------------------------------------------------------*
  1388. X *    DECSTR - soft terminal reset (SOFT emulator runtime reset)
  1389. X *---------------------------------------------------------------------------*/
  1390. Xvoid 
  1391. Xvt_str(struct video_state *svsp)
  1392. X{
  1393. X    int i;
  1394. X    
  1395. X    clr_parms(svsp);            /* escape parameter init */
  1396. X    svsp->state = STATE_INIT;        /* initial state */
  1397. X
  1398. X    init_ufkl(svsp);            /* init user fkey labels */
  1399. X    init_sfkl(svsp);            /* init system fkey labels */  
  1400. X
  1401. X    svsp->sc_flag = 0;            /* save cursor position */
  1402. X    svsp->transparent = 0;            /* enable control code processing */
  1403. X
  1404. X    for(i = 0; i < MAXTAB; i++)        /* setup tabstops */
  1405. X    {
  1406. X        if(!(i % 8))
  1407. X            svsp->tab_stops[i] = 1;
  1408. X        else
  1409. X            svsp->tab_stops[i] = 0;
  1410. X    }
  1411. X
  1412. X    svsp->irm = 0;                /* replace mode */
  1413. X    svsp->m_om = 0;                /* origin mode */
  1414. X    svsp->m_awm = 1;            /* auto wrap mode */
  1415. X#if PCVT_INHIBIT_NUMLOCK
  1416. X    svsp->num_lock = 0;            /* keypad application mode */
  1417. X#else
  1418. X    svsp->num_lock = 1;            /* keypad numeric mode */
  1419. X#endif
  1420. X    svsp->ckm = 1;                /* cursor key mode = "normal" ... */
  1421. X    svsp->scrr_beg = 0;            /* start of scrolling region */
  1422. X    svsp->scrr_len = svsp->screen_rows-1;    /* no. of lines in scrolling region */
  1423. X
  1424. X    if(adaptor_type == EGA_ADAPTOR || adaptor_type == VGA_ADAPTOR)
  1425. X    {
  1426. X        svsp->G0 = cse_ascii;        /* G0 = ascii    */
  1427. X        svsp->G1 = cse_ascii;        /* G1 = ascii    */
  1428. X        svsp->G2 = cse_supplemental;    /* G2 = supplemental */
  1429. X        svsp->G3 = cse_supplemental;    /* G3 = supplemental */
  1430. X        svsp->GL = svsp->G0;        /* GL = G0 */
  1431. X        svsp->GR = svsp->G2;        /* GR = G2 */
  1432. X    }
  1433. X    else
  1434. X    {
  1435. X        svsp->G0 = csd_ascii;        /* G0 = ascii    */
  1436. X        svsp->G1 = csd_ascii;        /* G1 = ascii    */
  1437. X        svsp->G2 = csd_supplemental;    /* G2 = supplemental */
  1438. X        svsp->G3 = csd_supplemental;    /* G3 = supplemental */
  1439. X        svsp->GL = svsp->G0;        /* GL = G0 */
  1440. X        svsp->GR = svsp->G2;        /* GR = G2 */
  1441. X    }
  1442. X
  1443. X    svsp->vtsgr = VT_NORMAL;        /* no attributes */
  1444. X    svsp->c_attr = user_attr;        /* reset sgr to normal */
  1445. X
  1446. X    svsp->selchar = 0;            /* selective attribute off */
  1447. X    vt_initsel(svsp);
  1448. X}
  1449. X
  1450. X/*---------------------------------------------------------------------------*
  1451. X *    RI - reverse index, move cursor up
  1452. X *---------------------------------------------------------------------------*/
  1453. Xvoid 
  1454. Xvt_ri(struct video_state *svsp)
  1455. X{
  1456. X    if(svsp->cur_offset >= ((svsp->scrr_beg * svsp->maxcol) + svsp->maxcol))
  1457. X        svsp->cur_offset -= svsp->maxcol;
  1458. X    else
  1459. X        roll_down(svsp);
  1460. X}
  1461. X
  1462. X/*---------------------------------------------------------------------------*
  1463. X *    IND - index, move cursor down
  1464. X *---------------------------------------------------------------------------*/
  1465. Xvoid
  1466. Xvt_ind(struct video_state *svsp)
  1467. X{
  1468. X    if(svsp->cur_offset <= ((svsp->scrr_beg + svsp->scrr_len) * svsp->maxcol))
  1469. X        svsp->cur_offset += svsp->maxcol;
  1470. X    else
  1471. X        roll_up(svsp);
  1472. X}
  1473. X
  1474. X/*---------------------------------------------------------------------------*
  1475. X *    NEL - next line, first pos of next line
  1476. X *---------------------------------------------------------------------------*/
  1477. Xvoid
  1478. Xvt_nel(struct video_state *svsp)
  1479. X{                    
  1480. X    if(svsp->cur_offset <= ((svsp->scrr_beg + svsp->scrr_len) * svsp->maxcol))
  1481. X    {
  1482. X        svsp->cur_offset += (svsp->maxcol-svsp->col);
  1483. X        svsp->col = 0;
  1484. X    }
  1485. X    else
  1486. X    {
  1487. X        roll_up(svsp);
  1488. X        svsp->cur_offset -= svsp->col;
  1489. X        svsp->col = 0;
  1490. X    }
  1491. X}
  1492. X
  1493. X/*---------------------------------------------------------------------------*
  1494. X *    set dec private modes, esc [ ? x h
  1495. X *---------------------------------------------------------------------------*/
  1496. Xvoid
  1497. Xvt_set_dec_priv_qm(struct video_state *svsp)
  1498. X{
  1499. X    switch(svsp->parms[0])
  1500. X    {
  1501. X        case 0:        /* error, ignored */
  1502. X        case 1:        /* CKM - cursor key mode */
  1503. X            svsp->ckm = 1;
  1504. X            break;
  1505. X
  1506. X        case 2:        /* ANM - ansi/vt52 mode */
  1507. X            break;
  1508. X            
  1509. X        case 3:        /* COLM - column mode */
  1510. X            vt_col(svsp, SCR_COL132);
  1511. X            break;
  1512. X            
  1513. X        case 4:        /* SCLM - scrolling mode */
  1514. X        case 5:        /* SCNM - screen mode */
  1515. X            break;
  1516. X            
  1517. X        case 6:        /* OM - origin mode */
  1518. X            svsp->m_om = 1;
  1519. X            break;
  1520. X
  1521. X        case 7:        /* AWM - auto wrap mode */
  1522. X            svsp->m_awm = 1;
  1523. X            swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp);
  1524. X            break;
  1525. X
  1526. X        case 8:        /* ARM - auto repeat mode */
  1527. X            kbrepflag = 1;
  1528. X            break;
  1529. X            
  1530. X        case 9:        /* INLM - interlace mode */
  1531. X        case 10:    /* EDM - edit mode */
  1532. X        case 11:    /* LTM - line transmit mode */
  1533. X        case 12:    /* */
  1534. X        case 13:    /* SCFDM - space compression / field delimiting */
  1535. X        case 14:    /* TEM - transmit execution mode */
  1536. X        case 15:    /* */
  1537. X        case 16:    /* EKEM - edit key execution mode */
  1538. X            break;
  1539. X
  1540. X        case 25:    /* TCEM - text cursor enable mode */
  1541. X            if(vsp == svsp)
  1542. X                sw_cursor(1);    /* cursor on */
  1543. X            svsp->cursor_on = 1;
  1544. X            break;
  1545. X            
  1546. X        case 42:    /* NRCM - 7bit NRC characters */
  1547. X            break;
  1548. X    }
  1549. X}
  1550. X
  1551. X/*---------------------------------------------------------------------------*
  1552. X *    reset dec private modes, esc [ ? x l
  1553. X *---------------------------------------------------------------------------*/
  1554. Xvoid
  1555. Xvt_reset_dec_priv_qm(struct video_state *svsp)
  1556. X{
  1557. X    switch(svsp->parms[0])
  1558. X    {
  1559. X        case 0:        /* error, ignored */
  1560. X        case 1:        /* CKM - cursor key mode */
  1561. X            svsp->ckm = 0;
  1562. X            break;
  1563. X
  1564. X        case 2:        /* ANM - ansi/vt52 mode */
  1565. X            break;
  1566. X            
  1567. X        case 3:        /* COLM - column mode */
  1568. X            vt_col(svsp, SCR_COL80);
  1569. X            break;
  1570. X
  1571. X        case 4:        /* SCLM - scrolling mode */
  1572. X        case 5:        /* SCNM - screen mode */
  1573. X            break;
  1574. X            
  1575. X        case 6:        /* OM - origin mode */
  1576. X            svsp->m_om = 0;
  1577. X            break;
  1578. X
  1579. X        case 7:        /* AWM - auto wrap mode */
  1580. X            svsp->m_awm = 0;
  1581. X            swritefkl(7,(u_char *)"AUTOWRAPENABLE  ",svsp);
  1582. X            break;
  1583. X
  1584. X        case 8:        /* ARM - auto repeat mode */
  1585. X            kbrepflag = 0;
  1586. X            break;
  1587. X        
  1588. X        case 9:        /* INLM - interlace mode */
  1589. X        case 10:    /* EDM - edit mode */
  1590. X        case 11:    /* LTM - line transmit mode */
  1591. X        case 12:    /* */
  1592. X        case 13:    /* SCFDM - space compression / field delimiting */
  1593. X        case 14:    /* TEM - transmit execution mode */
  1594. X        case 15:    /* */
  1595. X        case 16:    /* EKEM - edit key execution mode */
  1596. X            break;
  1597. X
  1598. X        case 25:    /* TCEM - text cursor enable mode */
  1599. X            if(vsp == svsp)
  1600. X                sw_cursor(0);    /* cursor off */
  1601. X            svsp->cursor_on = 0;
  1602. X            break;
  1603. X        
  1604. X        case 42:    /* NRCM - 7bit NRC characters */
  1605. X            break;
  1606. X    }
  1607. X}
  1608. X
  1609. X/*---------------------------------------------------------------------------*
  1610. X *    set ansi modes, esc [ x
  1611. X *---------------------------------------------------------------------------*/
  1612. Xvoid
  1613. Xvt_set_ansi(struct video_state *svsp)
  1614. X{
  1615. X    switch(svsp->parms[0])
  1616. X    {
  1617. X        case 0:        /* error, ignored */
  1618. X        case 1:        /* GATM - guarded area transfer mode */
  1619. X        case 2:        /* KAM - keyboard action mode */
  1620. X        case 3:        /* CRM - Control Representation mode */
  1621. X            break;
  1622. X            
  1623. X        case 4:        /* IRM - insert replacement mode */
  1624. X            svsp->irm = 1; /* Insert mode */
  1625. X            break;
  1626. X
  1627. X        case 5:        /* SRTM - status report transfer mode */
  1628. X        case 6:        /* ERM - erasue mode */
  1629. X        case 7:        /* VEM - vertical editing mode */
  1630. X        case 10:    /* HEM - horizontal editing mode */
  1631. X        case 11:    /* PUM - position unit mode */
  1632. X        case 12:    /* SRM - send-receive mode */
  1633. X        case 13:    /* FEAM - format effector action mode */
  1634. X        case 14:    /* FETM - format effector transfer mode */
  1635. X        case 15:    /* MATM - multiple area transfer mode */
  1636. X        case 16:    /* TTM - transfer termination */
  1637. X        case 17:    /* SATM - selected area transfer mode */
  1638. X        case 18:    /* TSM - tabulation stop mode */
  1639. X        case 19:    /* EBM - editing boundary mode */
  1640. X            break;
  1641. X            
  1642. X        case 20:    /* LNM - line feed / newline mode */
  1643. X            svsp->lnm = 1;
  1644. X            break;
  1645. X    }
  1646. X}
  1647. X
  1648. X/*---------------------------------------------------------------------------*
  1649. X *    reset ansi modes, esc [ x
  1650. X *---------------------------------------------------------------------------*/
  1651. Xvoid
  1652. Xvt_reset_ansi(struct video_state *svsp)
  1653. X{
  1654. X    switch(svsp->parms[0])
  1655. X    {
  1656. X        case 0:        /* error, ignored */
  1657. X        case 1:        /* GATM - guarded area transfer mode */
  1658. X        case 2:        /* KAM - keyboard action mode */
  1659. X        case 3:        /* CRM - Control Representation mode */
  1660. X            break;
  1661. X            
  1662. X        case 4:        /* IRM - insert replacement mode */
  1663. X            svsp->irm = 0;  /* Replace mode */
  1664. X            break;
  1665. X            
  1666. X        case 5:        /* SRTM - status report transfer mode */
  1667. X        case 6:        /* ERM - erasue mode */
  1668. X        case 7:        /* VEM - vertical editing mode */
  1669. X        case 10:    /* HEM - horizontal editing mode */
  1670. X        case 11:    /* PUM - position unit mode */
  1671. X        case 12:    /* SRM - send-receive mode */
  1672. X        case 13:    /* FEAM - format effector action mode */
  1673. X        case 14:    /* FETM - format effector transfer mode */
  1674. X        case 15:    /* MATM - multiple area transfer mode */
  1675. X        case 16:    /* TTM - transfer termination */
  1676. X        case 17:    /* SATM - selected area transfer mode */
  1677. X        case 18:    /* TSM - tabulation stop mode */
  1678. X        case 19:    /* EBM - editing boundary mode */
  1679. X            break;
  1680. X            
  1681. X        case 20:    /* LNM - line feed / newline mode */
  1682. X            svsp->lnm = 0;
  1683. X            break;
  1684. X    }
  1685. X}
  1686. X
  1687. X/*---------------------------------------------------------------------------*
  1688. X *    clear tab stop(s)
  1689. X *---------------------------------------------------------------------------*/
  1690. Xvoid 
  1691. Xvt_clrtab(struct video_state *svsp)
  1692. X{
  1693. X    int i;
  1694. X
  1695. X    if(svsp->parms[0] == 0)
  1696. X        svsp->tab_stops[svsp->col] = 0;
  1697. X    else if(svsp->parms[0] == 3)
  1698. X    {
  1699. X        for(i=0; i<MAXTAB; i++)
  1700. X            svsp->tab_stops[i] = 0;
  1701. X    }
  1702. X}
  1703. X
  1704. X/*---------------------------------------------------------------------------*
  1705. X *    DECSC - save cursor & attributes
  1706. X *---------------------------------------------------------------------------*/
  1707. Xvoid
  1708. Xvt_sc(struct video_state *svsp)
  1709. X{
  1710. X    svsp->sc_flag = 1;
  1711. X    svsp->sc_row = svsp->row;
  1712. X    svsp->sc_col = svsp->col;
  1713. X    svsp->sc_cur_offset = svsp->cur_offset;
  1714. X    svsp->sc_attr = svsp->c_attr;
  1715. X    svsp->sc_awm = svsp->m_awm;
  1716. X    svsp->sc_om = svsp->m_om;
  1717. X    svsp->sc_G0 = svsp->G0;
  1718. X    svsp->sc_G1 = svsp->G1;
  1719. X    svsp->sc_G2 = svsp->G2;    
  1720. X    svsp->sc_G3 = svsp->G3;
  1721. X    svsp->sc_GL = svsp->GL;
  1722. X    svsp->sc_GR = svsp->GR;        
  1723. X    svsp->sc_sel = svsp->selchar;
  1724. X    svsp->sc_vtsgr = svsp->vtsgr;
  1725. X}
  1726. X
  1727. X/*---------------------------------------------------------------------------*
  1728. X *    DECRC - restore cursor & attributes
  1729. X *---------------------------------------------------------------------------*/
  1730. Xvoid
  1731. Xvt_rc(struct video_state *svsp)
  1732. X{
  1733. X    if(svsp->sc_flag == 1)
  1734. X    {
  1735. X        svsp->sc_flag = 0;
  1736. X        svsp->row = svsp->sc_row;
  1737. X        svsp->col = svsp->sc_col;
  1738. X        svsp->cur_offset = svsp->sc_cur_offset;
  1739. X        svsp->c_attr = svsp->sc_attr;
  1740. X        svsp->m_awm = svsp->sc_awm;
  1741. X        svsp->m_om = svsp->sc_om;
  1742. X        svsp->G0 = svsp->sc_G0;
  1743. X        svsp->G1 = svsp->sc_G1;
  1744. X        svsp->G2 = svsp->sc_G2;
  1745. X        svsp->G3 = svsp->sc_G3;
  1746. X        svsp->GL = svsp->sc_GL;
  1747. X        svsp->GR = svsp->sc_GR;
  1748. X        svsp->selchar = svsp->sc_sel;
  1749. X        svsp->vtsgr = svsp->sc_vtsgr;
  1750. X    }
  1751. X}
  1752. X
  1753. X/*---------------------------------------------------------------------------*
  1754. X *    designate a character set as G0, G1, G2 or G3 for 94/96 char sets
  1755. X *---------------------------------------------------------------------------*/
  1756. Xvoid
  1757. Xvt_designate(struct video_state *svsp)
  1758. X{
  1759. X    u_short *ctp = NULL;
  1760. X    u_char ch;
  1761. X    
  1762. X    if(svsp->whichi == 1)
  1763. X        ch = svsp->which[0];
  1764. X    else
  1765. X    {
  1766. X        int i;
  1767. X
  1768. X        if(svsp->dld_id[0] == '\0')
  1769. X            return;
  1770. X            
  1771. X        if(!(((adaptor_type == EGA_ADAPTOR) || (adaptor_type == VGA_ADAPTOR)) &&
  1772. X            (vgacs[svsp->vga_charset].secondloaded)))
  1773. X            return;
  1774. X
  1775. X        for(i = (svsp->whichi)-1; i >= 0; i--)
  1776. X        {
  1777. X             if(svsp->which[i] != svsp->dld_id[i])
  1778. X                return;
  1779. X        }
  1780. X#ifdef HAVECSE_DOWNLOADABLE
  1781. X        ctp = cse_downloadable;
  1782. X        swcsp(svsp, ctp);
  1783. X#endif        
  1784. X        return;
  1785. X    }
  1786. X    
  1787. X    if(((adaptor_type == EGA_ADAPTOR) || (adaptor_type == VGA_ADAPTOR)) &&
  1788. X       (vgacs[svsp->vga_charset].secondloaded))
  1789. X    {
  1790. X        if((ch == svsp->dld_id[0]) && (svsp->dld_id[1] == '\0'))
  1791. X        {
  1792. X#ifdef HAVECSE_DOWNLOADABLE
  1793. X            ctp = cse_downloadable;
  1794. X            swcsp(svsp, ctp);
  1795. X#endif            
  1796. X            return;
  1797. X        }
  1798. X            
  1799. X        switch(ch)
  1800. X        {
  1801. X            case 'A': /* British or ISO-Latin-1 */
  1802. X                switch(svsp->state)
  1803. X                {
  1804. X                    case STATE_BROPN:    /* designate G0 */
  1805. X                    case STATE_BRCLO:    /* designate G1 */
  1806. X                    case STATE_STAR:    /* designate G2 */
  1807. X                    case STATE_PLUS:    /* designate G3 */
  1808. X#ifdef HAVECSE_BRITISH
  1809. X                        ctp = cse_british;
  1810. X#endif
  1811. X                        break;
  1812. X    
  1813. X                    case STATE_MINUS:    /* designate G1 (96) */
  1814. X                    case STATE_DOT:        /* designate G2 (96) */
  1815. X                    case STATE_SLASH:    /* designate G3 (96) */
  1816. X#ifdef HAVECSE_ISOLATIN
  1817. X                        ctp = cse_isolatin;
  1818. X#endif
  1819. X                        break;
  1820. X                }
  1821. X                break;
  1822. X                
  1823. X            case 'B': /* USASCII */
  1824. X#ifdef HAVECSE_ASCII
  1825. X                ctp = cse_ascii;
  1826. X#endif            
  1827. X                break;
  1828. X
  1829. X            case 'C': /* Finnish */
  1830. X            case '5': /* Finnish */
  1831. X#ifdef HAVECSE_FINNISH
  1832. X                ctp = cse_finnish;
  1833. X#endif
  1834. X                break;
  1835. X
  1836. X            case 'E': /* Norwegian/Danish */
  1837. X            case '6': /* Norwegian/Danish */
  1838. X#ifdef HAVECSE_NORWEGIANDANISH
  1839. X                ctp = cse_norwegiandanish;
  1840. X#endif
  1841. X                break;
  1842. X
  1843. X            case 'H': /* Swedish */
  1844. X            case '7': /* Swedish */
  1845. X#ifdef HAVECSE_SWEDISH
  1846. X                ctp = cse_swedish;
  1847. X#endif            
  1848. X                break;
  1849. X    
  1850. X            case 'K': /* German */
  1851. X#ifdef HAVECSE_GERMAN
  1852. X                ctp = cse_german;
  1853. X#endif            
  1854. X                break;
  1855. X                
  1856. X            case 'Q': /* French Canadien */
  1857. X#ifdef HAVECSE_FRENCHCANADA
  1858. X                ctp = cse_frenchcanada;
  1859. X#endif            
  1860. X                break;
  1861. X
  1862. X            case 'R': /* French */
  1863. X#ifdef HAVECSE_FRENCH
  1864. X                ctp = cse_french;
  1865. X#endif            
  1866. X                break;
  1867. X
  1868. X            case 'Y': /* Italian */
  1869. X#ifdef HAVECSE_ITALIAN
  1870. X                ctp = cse_italian;
  1871. X#endif            
  1872. X                break;
  1873. X
  1874. X            case 'Z': /* Spanish */
  1875. X#ifdef HAVECSE_SPANISH
  1876. X                ctp = cse_spanish;
  1877. X#endif            
  1878. X                break;
  1879. X                
  1880. X            case '0': /* special graphics */
  1881. X#ifdef HAVECSE_SPECIAL
  1882. X                ctp = cse_special;
  1883. X#endif            
  1884. X                break;
  1885. X
  1886. X            case '1': /* alternate ROM */
  1887. X#ifdef HAVECSE_ALTERNATEROM1
  1888. X                ctp = cse_alternaterom1;
  1889. X#endif            
  1890. X                break;
  1891. X
  1892. X            case '2': /* alt ROM, spec graphics */
  1893. X#ifdef HAVECSE_ALTERNATEROM2
  1894. X                ctp = cse_alternaterom2;
  1895. X#endif            
  1896. X                break;
  1897. X
  1898. X            case '3': /* HP Roman 8, upper 128 chars*/
  1899. X#ifdef HAVECSE_ROMAN8
  1900. X                ctp = cse_roman8;
  1901. X#endif            
  1902. X                break;
  1903. X
  1904. X            case '4': /* Dutch */
  1905. X#ifdef HAVECSE_DUTCH
  1906. X                ctp = cse_dutch;
  1907. X#endif            
  1908. X                break;
  1909. X
  1910. X            case '<': /* DEC Supplemental */
  1911. X#ifdef HAVECSE_SUPPLEMENTAL
  1912. X                ctp = cse_supplemental;
  1913. X#endif            
  1914. X                break;
  1915. X
  1916. X            case '=': /* Swiss */
  1917. X#ifdef HAVECSE_SWISS
  1918. X                ctp = cse_swiss;
  1919. X#endif            
  1920. X                break;
  1921. X
  1922. X            case '>': /* DEC Technical */
  1923. X#ifdef HAVECSE_TECHNICAL
  1924. X                ctp = cse_technical;
  1925. X#endif            
  1926. X                break;
  1927. X    
  1928. X            default:
  1929. X                break;
  1930. X        }
  1931. X    }
  1932. X    else
  1933. X    {
  1934. X        switch(ch)
  1935. X        {
  1936. X            case 'A': /* British or ISO-Latin-1 */
  1937. X                switch(svsp->state)
  1938. X                {
  1939. X                    case STATE_BROPN:    /* designate G0 */
  1940. X                    case STATE_BRCLO:    /* designate G1 */
  1941. X                    case STATE_STAR:    /* designate G2 */
  1942. X                    case STATE_PLUS:    /* designate G3 */
  1943. X#ifdef HAVECSD_BRITISH
  1944. X                        ctp = csd_british;
  1945. X#endif
  1946. X                        break;
  1947. X    
  1948. X                    case STATE_MINUS:    /* designate G1 (96) */
  1949. X                    case STATE_DOT:        /* designate G2 (96) */
  1950. X                    case STATE_SLASH:    /* designate G3 (96) */
  1951. X#ifdef HAVECSD_ISOLATIN
  1952. X                        ctp = csd_isolatin;
  1953. X#endif
  1954. X                        break;
  1955. X                }
  1956. X                break;
  1957. X                
  1958. X            case 'B': /* USASCII */
  1959. X#ifdef HAVECSD_ASCII
  1960. X                ctp = csd_ascii;
  1961. X#endif            
  1962. X                break;
  1963. X
  1964. X            case 'C': /* Finnish */
  1965. X            case '5': /* Finnish */
  1966. X#ifdef HAVECSD_FINNISH
  1967. X                ctp = csd_finnish;
  1968. X#endif
  1969. X                break;
  1970. X
  1971. X            case 'E': /* Norwegian/Danish */
  1972. X            case '6': /* Norwegian/Danish */
  1973. X#ifdef HAVECSD_NORWEGIANDANISH
  1974. X                ctp = csd_norwegiandanish;
  1975. X#endif
  1976. X                break;
  1977. X
  1978. X            case 'H': /* Swedish */
  1979. X            case '7': /* Swedish */
  1980. X#ifdef HAVECSD_SWEDISH
  1981. X                ctp = csd_swedish;
  1982. X#endif            
  1983. X                break;
  1984. X    
  1985. X            case 'K': /* German */
  1986. X#ifdef HAVECSD_GERMAN
  1987. X                ctp = csd_german;
  1988. X#endif            
  1989. X                break;
  1990. X                
  1991. X            case 'Q': /* French Canadien */
  1992. X#ifdef HAVECSD_FRENCHCANADA
  1993. X                ctp = csd_frenchcanada;
  1994. X#endif            
  1995. X                break;
  1996. X
  1997. X            case 'R': /* French */
  1998. X#ifdef HAVECSD_FRENCH
  1999. X                ctp = csd_french;
  2000. X#endif            
  2001. X                break;
  2002. X
  2003. X            case 'Y': /* Italian */
  2004. X#ifdef HAVECSD_ITALIAN
  2005. X                ctp = csd_italian;
  2006. X#endif            
  2007. X                break;
  2008. X
  2009. X            case 'Z': /* Spanish */
  2010. X#ifdef HAVECSD_SPANISH
  2011. X                ctp = csd_spanish;
  2012. X#endif            
  2013. X                break;
  2014. X                
  2015. X            case '0': /* special graphics */
  2016. X#ifdef HAVECSD_SPECIAL
  2017. X                ctp = csd_special;
  2018. X#endif            
  2019. X                break;
  2020. X
  2021. X            case '1': /* alternate ROM */
  2022. X#ifdef HAVECSD_ALTERNATEROM1
  2023. X                ctp = csd_alternaterom1;
  2024. X#endif            
  2025. X                break;
  2026. X
  2027. X            case '2': /* alt ROM, spec graphics */
  2028. X#ifdef HAVECSD_ALTERNATEROM2
  2029. X                ctp = csd_alternaterom2;
  2030. X#endif            
  2031. X                break;
  2032. X
  2033. X            case '3': /* HP Roman 8, upper 128 chars*/
  2034. X#ifdef HAVECSD_ROMAN8
  2035. X                ctp = csd_roman8;
  2036. X#endif            
  2037. X                break;
  2038. X
  2039. X            case '4': /* Dutch */
  2040. X#ifdef HAVECSD_DUTCH
  2041. X                ctp = csd_dutch;
  2042. X#endif            
  2043. X                break;
  2044. X
  2045. X            case '<': /* DEC Supplemental */
  2046. X#ifdef HAVECSD_SUPPLEMENTAL
  2047. X                ctp = csd_supplemental;
  2048. X#endif            
  2049. X                break;
  2050. X
  2051. X            case '=': /* Swiss */
  2052. X#ifdef HAVECSD_SWISS
  2053. X                ctp = csd_swiss;
  2054. X#endif            
  2055. X                break;
  2056. X
  2057. X            case '>': /* DEC Technical */
  2058. X#ifdef HAVECSD_TECHNICAL
  2059. X                ctp = csd_technical;
  2060. X#endif            
  2061. X                break;
  2062. X    
  2063. X            default:
  2064. X                break;
  2065. X        }
  2066. X    }
  2067. X    swcsp(svsp, ctp);
  2068. X}
  2069. X        
  2070. X/*---------------------------------------------------------------------------*
  2071. X *    device attributes
  2072. X *---------------------------------------------------------------------------*/
  2073. Xvoid
  2074. Xvt_da(struct video_state *svsp)
  2075. X{
  2076. X    static u_char *response = (u_char *)DA_VT220;
  2077. X    
  2078. X    svsp->report_chars = response;
  2079. X    svsp->report_count = 18;
  2080. X    respond(svsp);
  2081. X}
  2082. X
  2083. X/*---------------------------------------------------------------------------*
  2084. X *    screen alignment display
  2085. X *---------------------------------------------------------------------------*/
  2086. Xvoid
  2087. Xvt_aln(struct video_state *svsp)
  2088. X{
  2089. X    register int i;
  2090. X
  2091. X    svsp->cur_offset = 0;
  2092. X    svsp->col = 0;
  2093. X
  2094. X    for(i=0; i < (svsp->screen_rows*svsp->maxcol); i++)
  2095. X    {
  2096. X        *(svsp->Crtat + svsp->cur_offset) = user_attr | 'E';
  2097. X        vt_selattr(svsp);
  2098. X        svsp->cur_offset++;
  2099. X        svsp->col++;
  2100. X    }
  2101. X
  2102. X    svsp->cur_offset = 0;    /* reset everything ! */
  2103. X    svsp->col = 0;
  2104. X    svsp->row = 0;    
  2105. X}
  2106. X
  2107. X/*---------------------------------------------------------------------------*
  2108. X *    request terminal parameters
  2109. X *---------------------------------------------------------------------------*/
  2110. Xvoid 
  2111. Xvt_reqtparm(struct video_state *svsp)
  2112. X{
  2113. X    static u_char *answr = (u_char *)"\033[3;1;1;120;120;1;0x";
  2114. X
  2115. X    svsp->report_chars = answr;
  2116. X    svsp->report_count = 20;
  2117. X    respond(svsp);
  2118. X}
  2119. X
  2120. X/*---------------------------------------------------------------------------*
  2121. X *    invoke selftest
  2122. X *---------------------------------------------------------------------------*/
  2123. Xvoid
  2124. Xvt_tst(struct video_state *svsp)
  2125. X{
  2126. X    clear_dld(svsp);
  2127. X}
  2128. X
  2129. X/*---------------------------------------------------------------------------*
  2130. X *    device status reports
  2131. X *---------------------------------------------------------------------------*/
  2132. Xvoid
  2133. Xvt_dsr(struct video_state *svsp)
  2134. X{
  2135. X    static u_char *answr = (u_char *)"\033[0n";
  2136. X    static u_char *panswr = (u_char *)"\033[?13n"; /* Printer Unattached */
  2137. X    static u_char *udkanswr = (u_char *)"\033[?21n"; /* UDK Locked */
  2138. X    static u_char *langanswr = (u_char *)"\033[?27;1n"; /* North American*/
  2139. X    static u_char buffer[16];
  2140. X    int i = 0;
  2141. X    
  2142. X    switch(svsp->parms[0])
  2143. X    {
  2144. X        case 5:        /* return status */
  2145. X            svsp->report_chars = answr;
  2146. X            svsp->report_count = 4;
  2147. X            respond(svsp);
  2148. X            break;
  2149. X
  2150. X        case 6:        /* return cursor position */
  2151. X            buffer[i++] = 0x1b;
  2152. X            buffer[i++] = '[';
  2153. X            if((svsp->row+1) > 10)
  2154. X                buffer[i++] = ((svsp->row+1) / 10) + '0';
  2155. X            buffer[i++] = ((svsp->row+1) % 10) + '0';
  2156. X            buffer[i++] = ';';    
  2157. X            if((svsp->col+1) > 10)
  2158. X                buffer[i++] = ((svsp->col+1) / 10) + '0';
  2159. X            buffer[i++] = ((svsp->col+1) % 10) + '0';
  2160. X            buffer[i++] = 'R';
  2161. X            buffer[i++] = '\0';
  2162. X        
  2163. X            svsp->report_chars = buffer;
  2164. X            svsp->report_count = i;
  2165. X            respond(svsp);
  2166. X            break;
  2167. X
  2168. X        case 15:    /* return printer status */
  2169. X            svsp->report_chars = panswr;
  2170. X            svsp->report_count = 6;
  2171. X            respond(svsp);
  2172. X            break;
  2173. X
  2174. X        case 25:    /* return udk status */
  2175. X            svsp->report_chars = udkanswr;
  2176. X            svsp->report_count = 6;
  2177. X            respond(svsp);
  2178. X            break;
  2179. X
  2180. X        case 26:    /* return language status */
  2181. X            svsp->report_chars = langanswr;
  2182. X            svsp->report_count = 8;
  2183. X            respond(svsp);
  2184. X            break;
  2185. X
  2186. X        default:    /* nothing else valid */
  2187. X            break;
  2188. X    }
  2189. X}
  2190. X
  2191. X/*---------------------------------------------------------------------------*
  2192. X *    IL - insert line 
  2193. X *---------------------------------------------------------------------------*/
  2194. Xvoid 
  2195. Xvt_il(struct video_state *svsp)
  2196. X{
  2197. X    register int p = svsp->parms[0];
  2198. X    
  2199. X    if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_beg + svsp->scrr_len))
  2200. X    {
  2201. X        if(p <= 0)
  2202. X            p = 1;
  2203. X        else if(p > svsp->scrr_beg + svsp->scrr_len - svsp->row)
  2204. X            p = svsp->scrr_beg + svsp->scrr_len - svsp->row;
  2205. X
  2206. X        svsp->cur_offset -= svsp->col;
  2207. X        svsp->col = 0;
  2208. X        while(p--)
  2209. X        {
  2210. X            ovbcopy((svsp->Crtat + svsp->cur_offset),
  2211. X                (svsp->Crtat + svsp->cur_offset) + svsp->maxcol,
  2212. X                 svsp->maxcol * (svsp->scrr_beg + svsp->scrr_len - svsp->row) * CHR );
  2213. X            fillw(    user_attr | ' ',
  2214. X                (svsp->Crtat + svsp->cur_offset),
  2215. X                svsp->maxcol);
  2216. X        }
  2217. X    }
  2218. X}
  2219. X
  2220. X/*---------------------------------------------------------------------------*
  2221. X *    ICH - insert character
  2222. X *---------------------------------------------------------------------------*/
  2223. Xvoid
  2224. Xvt_ic(struct video_state *svsp)
  2225. X{
  2226. X    register int p = svsp->parms[0];
  2227. X
  2228. X    if(p <= 0)
  2229. X        p = 1;
  2230. X    else if(p > svsp->maxcol-svsp->col)
  2231. X        p = svsp->maxcol-svsp->col;
  2232. X    
  2233. X    while(p--)
  2234. X    {
  2235. X        ovbcopy((svsp->Crtat + svsp->cur_offset), (svsp->Crtat + svsp->cur_offset) + 1,(((svsp->maxcol)-1)-svsp->col) * CHR);
  2236. X        *(svsp->Crtat + svsp->cur_offset) = user_attr | ' ';
  2237. X        vt_selattr(svsp);
  2238. X    }
  2239. X}
  2240. X
  2241. X/*---------------------------------------------------------------------------*
  2242. X *    DL - delete line
  2243. X *---------------------------------------------------------------------------*/
  2244. Xvoid
  2245. Xvt_dl(struct video_state *svsp)
  2246. X{
  2247. X    register int p = svsp->parms[0];
  2248. X    
  2249. X    if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_beg + svsp->scrr_len))
  2250. X    {
  2251. X        if(p <= 0)
  2252. X            p = 1;
  2253. X        else if(p > svsp->scrr_beg + svsp->scrr_len - svsp->row)
  2254. X            p = svsp->scrr_beg + svsp->scrr_len - svsp->row;
  2255. X
  2256. X        svsp->cur_offset -= svsp->col;
  2257. X        svsp->col = 0;
  2258. X        while(p--)
  2259. X        {
  2260. X            bcopyb(    svsp->Crtat + svsp->cur_offset + svsp->maxcol,
  2261. X                svsp->Crtat + svsp->cur_offset,
  2262. X                svsp->maxcol * (svsp->scrr_beg + svsp->scrr_len - svsp->row) * CHR );
  2263. X            fillw(    user_attr | ' ',
  2264. X                svsp->Crtat + ((svsp->scrr_beg + svsp->scrr_len) * svsp->maxcol),
  2265. X                svsp->maxcol);
  2266. X        }
  2267. X    }        
  2268. X}
  2269. X
  2270. X/*---------------------------------------------------------------------------*
  2271. X *    DCH - delete character
  2272. X *---------------------------------------------------------------------------*/
  2273. Xvoid
  2274. Xvt_dch(struct video_state *svsp)
  2275. X{
  2276. X    register int p = svsp->parms[0];
  2277. X
  2278. X    if(p <= 0)
  2279. X        p = 1;
  2280. X    else if(p > svsp->maxcol-svsp->col)
  2281. X        p = svsp->maxcol-svsp->col;
  2282. X    
  2283. X    while(p--)
  2284. X    {
  2285. X        bcopyb((svsp->Crtat + svsp->cur_offset)+1 , (svsp->Crtat + svsp->cur_offset),(((svsp->maxcol)-1) - svsp->col)* CHR );
  2286. X        *((svsp->Crtat + svsp->cur_offset)+((svsp->maxcol)-1)-svsp->col) = user_attr | ' ';
  2287. X    }
  2288. X}
  2289. X
  2290. X/*---------------------------------------------------------------------------*
  2291. X *    scroll up
  2292. X *---------------------------------------------------------------------------*/
  2293. Xvoid
  2294. Xvt_su(struct video_state *svsp)
  2295. X{
  2296. X    register int p = svsp->parms[0];
  2297. X    
  2298. X    if(p <= 0)
  2299. X        p = 1;
  2300. X    else if(p > svsp->screen_rows-1)
  2301. X        p = svsp->screen_rows-1;
  2302. X    
  2303. X    while(p--)
  2304. X        roll_up(svsp);
  2305. X}
  2306. X
  2307. X/*---------------------------------------------------------------------------*
  2308. X *    scroll down
  2309. X *---------------------------------------------------------------------------*/
  2310. Xvoid
  2311. Xvt_sd(struct video_state *svsp)
  2312. X{
  2313. X    register int p = svsp->parms[0];
  2314. X    
  2315. X    if(p <= 0)
  2316. X        p = 1;
  2317. X    else if(p > svsp->screen_rows-1)
  2318. X        p = svsp->screen_rows-1;
  2319. X    
  2320. X    while(p--)
  2321. X        roll_down(svsp);
  2322. X}
  2323. X
  2324. X/*---------------------------------------------------------------------------*
  2325. X *    ECH - erase character
  2326. X *---------------------------------------------------------------------------*/
  2327. Xvoid
  2328. Xvt_ech(struct video_state *svsp)
  2329. X{
  2330. X    register int p = svsp->parms[0];
  2331. X
  2332. X    if(p <= 0)
  2333. X        p = 1;
  2334. X    else if(p > svsp->maxcol-svsp->col)
  2335. X        p = svsp->maxcol-svsp->col;
  2336. X    
  2337. X    fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset), p);
  2338. X}
  2339. X
  2340. X/*---------------------------------------------------------------------------*
  2341. X *    media copy    (NO PRINTER AVAILABLE IN KERNEL ...)
  2342. X *---------------------------------------------------------------------------*/
  2343. Xvoid
  2344. Xvt_mc(struct video_state *svsp)
  2345. X{
  2346. X}
  2347. X
  2348. X/*---------------------------------------------------------------------------*
  2349. X *    Device Control String State Machine Entry for:
  2350. X *
  2351. X *    DECUDK - user-defined keys    and
  2352. X *    DECDLD - downloadable charset
  2353. X *
  2354. X *---------------------------------------------------------------------------*/
  2355. Xvoid
  2356. Xvt_dcsentry(U_char ch, struct video_state *svsp)
  2357. X{
  2358. X    switch(svsp->dcs_state)
  2359. X    {
  2360. X        case DCS_INIT:
  2361. X            switch(ch)
  2362. X            {
  2363. X                case '0':
  2364. X                case '1':
  2365. X                case '2':
  2366. X                case '3':
  2367. X                case '4':
  2368. X                case '5':
  2369. X                case '6':
  2370. X                case '7':
  2371. X                case '8':
  2372. X                case '9':    /* parameters */
  2373. X                    svsp->parms[svsp->parmi] *= 10;
  2374. X                    svsp->parms[svsp->parmi] += (ch -'0');
  2375. X                    break;
  2376. X    
  2377. X                case ';':    /* next parameter */
  2378. X                    svsp->parmi = 
  2379. X                        (svsp->parmi+1 < MAXPARMS) ?
  2380. X                        svsp->parmi+1 : svsp->parmi;
  2381. X                    break;
  2382. X
  2383. X                case '|':    /* DECUDK */
  2384. X                    svsp->transparent = 1;
  2385. X                    init_udk(svsp);
  2386. X                    svsp->dcs_state = DCS_AND_UDK;
  2387. X                    break;
  2388. X
  2389. X                case '{':    /* DECDLD */
  2390. X                    svsp->transparent = 1;
  2391. X                    init_dld(svsp);
  2392. X                    svsp->dcs_state = DCS_DLD_DSCS;
  2393. X                    break;
  2394. X
  2395. X                default:     /* failsafe */
  2396. X                    svsp->transparent = 0;
  2397. X                    svsp->state = STATE_INIT;
  2398. X                    svsp->dcs_state = DCS_INIT;
  2399. X                    break;
  2400. X            }
  2401. X            break;
  2402. X
  2403. X        case DCS_AND_UDK:     /* DCS ... | */
  2404. X            switch(ch)
  2405. X            {
  2406. X                case '0':
  2407. X                case '1':
  2408. X                case '2':
  2409. X                case '3':
  2410. X                case '4':
  2411. X                case '5':
  2412. X                case '6':
  2413. X                case '7':
  2414. X                case '8':
  2415. X                case '9':    /* fkey number */
  2416. X                    svsp->udk_fnckey *= 10;
  2417. X                    svsp->udk_fnckey += (ch -'0');
  2418. X                    break;
  2419. X
  2420. X                case '/':    /* Key */
  2421. X                    svsp->dcs_state = DCS_UDK_DEF;
  2422. X                    break;
  2423. X
  2424. X                case 0x1b:     /* ESC */
  2425. X                    svsp->dcs_state = DCS_UDK_ESC;
  2426. X                    break;
  2427. X    
  2428. X                default:
  2429. X                    svsp->transparent = 0;
  2430. X                    svsp->state = STATE_INIT;
  2431. X                    svsp->dcs_state = DCS_INIT;
  2432. X                    break;
  2433. X            }
  2434. X            break;
  2435. X
  2436. X        case DCS_UDK_DEF:     /* DCS ... | fnckey / */
  2437. X            switch(ch)
  2438. X            {
  2439. X                case '0':
  2440. X                case '1':
  2441. X                case '2':
  2442. X                case '3':
  2443. X                case '4':
  2444. X                case '5':
  2445. X                case '6':
  2446. X                case '7':
  2447. X                case '8':
  2448. X                case '9':
  2449. X                    if(svsp->udk_deflow)    /* low nibble */
  2450. X                    {
  2451. X                        svsp->udk_def[svsp->udk_defi] |= (ch -'0');
  2452. X                        svsp->udk_deflow = 0;
  2453. X                        svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
  2454. X                        svsp->udk_defi : svsp->udk_defi+1;
  2455. X                    }
  2456. X                    else            /* high nibble */
  2457. X                    {
  2458. X                        svsp->udk_def[svsp->udk_defi] = ((ch -'0') << 4);
  2459. X                        svsp->udk_deflow = 1;
  2460. X                    }
  2461. X                    break;
  2462. X
  2463. X                case 'a':
  2464. X                case 'b':
  2465. X                case 'c':
  2466. X                case 'd':
  2467. X                case 'e':
  2468. X                case 'f':
  2469. X                    if(svsp->udk_deflow)     /* low nibble */
  2470. X                    {
  2471. X                        svsp->udk_def[svsp->udk_defi] |= (ch - 'a' + 10);
  2472. X                        svsp->udk_deflow = 0;
  2473. X                        svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
  2474. X                        svsp->udk_defi : svsp->udk_defi+1;
  2475. X                    }
  2476. X                    else            /* high nibble */
  2477. X                    {
  2478. X                        svsp->udk_def[svsp->udk_defi] = ((ch - 'a' + 10) << 4);
  2479. X                        svsp->udk_deflow = 1;
  2480. X                    }
  2481. X                    break;
  2482. X
  2483. X
  2484. X
  2485. X                case 'A':
  2486. X                case 'B':
  2487. X                case 'C':
  2488. X                case 'D':
  2489. X                case 'E':
  2490. X                case 'F':
  2491. X                    if(svsp->udk_deflow)     /* low nibble */
  2492. X                    {
  2493. X                        svsp->udk_def[svsp->udk_defi] |= (ch - 'A' + 10);
  2494. X                        svsp->udk_deflow = 0;
  2495. X                        svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
  2496. X                        svsp->udk_defi : svsp->udk_defi+1;
  2497. X                    }
  2498. X                    else            /* high nibble */
  2499. X                    {
  2500. X                        svsp->udk_def[svsp->udk_defi] = ((ch - 'A' + 10) << 4);
  2501. X                        svsp->udk_deflow = 1;
  2502. X                    }
  2503. X                    break;
  2504. X
  2505. X                case ';':    /* next function key */
  2506. X                    vt_udk(svsp);
  2507. X                    svsp->dcs_state = DCS_AND_UDK;
  2508. X                    break;
  2509. X
  2510. X                case 0x1b:     /* ESC */
  2511. X                    svsp->dcs_state = DCS_UDK_ESC;
  2512. X                    break;
  2513. X    
  2514. X                default:
  2515. X                    svsp->transparent = 0;
  2516. X                    svsp->state = STATE_INIT;
  2517. X                    svsp->dcs_state = DCS_INIT;
  2518. X                    break;
  2519. X            }
  2520. X            break;
  2521. X        
  2522. X        case DCS_UDK_ESC:     /* DCS ... | fkey/def ... ESC */
  2523. X            switch(ch)
  2524. X            {
  2525. X                case '\\':    /* ST */
  2526. X                    vt_udk(svsp);
  2527. X                    svsp->transparent = 0;
  2528. X                    svsp->state = STATE_INIT;
  2529. X                    svsp->dcs_state = DCS_INIT;
  2530. X                    break;
  2531. X
  2532. X                default:
  2533. X                    svsp->transparent = 0;
  2534. X                    svsp->state = STATE_INIT;
  2535. X                    svsp->dcs_state = DCS_INIT;
  2536. X                    break;
  2537. X            }
  2538. X            break;
  2539. X                            
  2540. X
  2541. X        case DCS_DLD_DSCS:     /* got DCS ... { */
  2542. X            if(ch >= ' ' && ch <= '/')    /* intermediates ... */
  2543. X            {
  2544. X                svsp->dld_dscs[svsp->dld_dscsi] = ch;
  2545. X                svsp->dld_id[svsp->dld_dscsi] = ch;        
  2546. X                if(svsp->dld_dscsi >= DSCS_LENGTH)
  2547. X                {
  2548. X                    svsp->transparent = 0;
  2549. X                    svsp->state = STATE_INIT;
  2550. X                    svsp->dcs_state = DCS_INIT;
  2551. X                    svsp->dld_id[0] = '\0';
  2552. X                }
  2553. X                else
  2554. X                {
  2555. X                    svsp->dld_dscsi++;
  2556. X                }
  2557. X            }
  2558. X            else if(ch >= '0' && ch <= '~')    /* final .... */
  2559. X            {
  2560. X                svsp->dld_dscs[svsp->dld_dscsi] = ch;
  2561. X                svsp->dld_id[svsp->dld_dscsi++] = ch;
  2562. X                svsp->dld_id[svsp->dld_dscsi] = '\0';
  2563. X                svsp->dcs_state = DCS_DLD_DEF;
  2564. X            }
  2565. X            else
  2566. X            {
  2567. X                svsp->transparent = 0;
  2568. X                svsp->state = STATE_INIT;
  2569. X                svsp->dcs_state = DCS_INIT;
  2570. X                svsp->dld_id[0] = '\0';
  2571. X            }
  2572. X            break;
  2573. X
  2574. X        case DCS_DLD_DEF:     /* DCS ... { dscs */
  2575. X            switch(ch)
  2576. X            {
  2577. X                case 0x1b:     /* ESC */
  2578. X                    svsp->dcs_state = DCS_DLD_ESC;
  2579. X                    break;
  2580. X    
  2581. X                case '/':     /* sixel upper / lower divider */
  2582. X                    svsp->dld_sixel_lower = 1;
  2583. X                    break;
  2584. X    
  2585. X                case ';':     /* character divider */
  2586. X                    vt_dld(svsp);
  2587. X                    svsp->parms[1]++;    /* next char */
  2588. X                    break;
  2589. X    
  2590. X                 default:
  2591. X                    if (svsp->dld_sixel_lower)
  2592. X                    {
  2593. X                        if(ch >= '?' && ch <= '~')
  2594. X                            svsp->sixel.lower[svsp->dld_sixelli] = ch - '?';
  2595. X                        svsp->dld_sixelli =
  2596. X                         (svsp->dld_sixelli+1 < MAXSIXEL) ?
  2597. X                         svsp->dld_sixelli+1 : svsp->dld_sixelli;
  2598. X                    }
  2599. X                    else
  2600. X                    {
  2601. X                        if(ch >= '?' && ch <= '~')
  2602. X                            svsp->sixel.upper[svsp->dld_sixelui] = ch - '?';
  2603. X                        svsp->dld_sixelui =
  2604. X                         (svsp->dld_sixelui+1 < MAXSIXEL) ?
  2605. X                         svsp->dld_sixelui+1 : svsp->dld_sixelui;
  2606. X                    }
  2607. X                    break;
  2608. X            }
  2609. X            break;
  2610. X
  2611. X        case DCS_DLD_ESC:     /* DCS ... { dscs ... / ... ESC */
  2612. X            switch(ch)
  2613. X            {
  2614. X                case '\\':    /* String Terminator ST */
  2615. X                    vt_dld(svsp);
  2616. X                    svsp->transparent = 0;
  2617. X                    svsp->state = STATE_INIT;
  2618. X                    svsp->dcs_state = DCS_INIT;
  2619. X                    break;
  2620. X
  2621. X                 default:
  2622. X                    svsp->transparent = 0;
  2623. X                    svsp->state = STATE_INIT;
  2624. X                    svsp->dcs_state = DCS_INIT;
  2625. X                    svsp->dld_id[0] = '\0';
  2626. X                    break;
  2627. X            }
  2628. X            break;
  2629. X
  2630. X        default:
  2631. X            svsp->transparent = 0;
  2632. X            svsp->state = STATE_INIT;
  2633. X            svsp->dcs_state = DCS_INIT;
  2634. X            break;
  2635. X    }
  2636. X}
  2637. X
  2638. X/*---------------------------------------------------------------------------*
  2639. X *    User Defineable Keys
  2640. X *---------------------------------------------------------------------------*/
  2641. Xvoid
  2642. Xvt_udk(struct video_state *svsp)
  2643. X{
  2644. X    int key, start, max, i;
  2645. X    int usedff = 0;
  2646. X    
  2647. X    if(svsp->parms[0] != 1)        /* clear all ? */
  2648. X    {
  2649. X        vt_clearudk(svsp);
  2650. X        svsp->parms[0] = 1;
  2651. X    }
  2652. X
  2653. X    if(svsp->udk_fnckey < 17 || svsp->udk_fnckey > 34)
  2654. X    {
  2655. X        init_udk(svsp);
  2656. X        return;
  2657. X    }
  2658. X
  2659. X    key = svsp->udk_fnckey - 17;    /* index into table */
  2660. X    
  2661. X    if(svsp->ukt.length[key] == 0)            /* never used ? */
  2662. X    {
  2663. X        if(svsp->udkff < MAXUDKDEF-2)        /* space available ? */
  2664. X        {
  2665. X            start = svsp->udkff;        /* next sequential */
  2666. X            max = MAXUDKDEF - svsp->udkff;    /* space available */
  2667. X            svsp->ukt.first[key] = start;    /* start entry */
  2668. X            usedff = 1;            /* flag to update later */
  2669. X        }
  2670. X        else                    /* no space */
  2671. X        {
  2672. X            init_udk(svsp);
  2673. X            return;
  2674. X        }
  2675. X    }
  2676. X    else                        /* in use, redefine */
  2677. X    {
  2678. X        start = svsp->ukt.first[key];        /* start entry */
  2679. X        max = svsp->ukt.length[key];        /* space available */
  2680. X    }
  2681. X
  2682. X    if(max < 2)                /* hmmm .. */
  2683. X    {
  2684. X        init_udk(svsp);
  2685. X        return;
  2686. X    }
  2687. X
  2688. X    max--;        /* adjust for tailing '\0' */
  2689. X    
  2690. X    for(i = 0; i < max && i < svsp->udk_defi; i++)
  2691. X        svsp->udkbuf[start++] = svsp->udk_def[i];
  2692. X
  2693. X    svsp->udkbuf[start] = '\0';    /* make it a string, see pcvt_kbd.c */
  2694. X    svsp->ukt.length[key] = i+1;    /* count for tailing '\0' */
  2695. X    if(usedff)
  2696. X        svsp->udkff += (i+2);    /* new start location */
  2697. X    
  2698. X    init_udk(svsp);
  2699. X}
  2700. X
  2701. X/*---------------------------------------------------------------------------*
  2702. X *    clear all User Defineable Keys
  2703. X *---------------------------------------------------------------------------*/
  2704. Xvoid
  2705. Xvt_clearudk(struct video_state *svsp)
  2706. X{
  2707. X    register int i;
  2708. X
  2709. X    for(i = 0; i < MAXUDKEYS; i++)
  2710. X    {
  2711. X        svsp->ukt.first[i] = 0;
  2712. X        svsp->ukt.length[i] = 0;
  2713. X    }
  2714. X    svsp->udkff = 0;
  2715. X}
  2716. X
  2717. X/*---------------------------------------------------------------------------*
  2718. X *    Down line LoaDable Fonts
  2719. X *---------------------------------------------------------------------------*/
  2720. Xvoid
  2721. Xvt_dld(struct video_state *svsp)
  2722. X{
  2723. X    unsigned char vgacharset;
  2724. X    unsigned char vgachar[16];
  2725. X    unsigned char vgacharb[16];
  2726. X
  2727. X    if(vgacs[svsp->vga_charset].secondloaded)
  2728. X        vgacharset = vgacs[svsp->vga_charset].secondloaded;
  2729. X    else
  2730. X        return;
  2731. X
  2732. X    svsp->parms[1] = (svsp->parms[1] < 1) ? 1 : 
  2733. X        ((svsp->parms[1] > 0x7E) ? 0x7E : svsp->parms[1]);
  2734. X
  2735. X    if(svsp->parms[2] != 1)   /* Erase all characters ? */
  2736. X    {
  2737. X        clear_dld(svsp);
  2738. X        svsp->parms[2] = 1;   /* Only erase all characters once per sequence */
  2739. X    }
  2740. X
  2741. X    sixel_vga(&(svsp->sixel),vgachar);
  2742. X
  2743. X    switch(vgacs[vgacharset].char_scanlines & 0x1F)
  2744. X    {
  2745. X        case 7:
  2746. X            vga10_vga8(vgachar,vgacharb);
  2747. X            break;
  2748. X
  2749. X        case 9:
  2750. X        default:
  2751. X            vga10_vga10(vgachar,vgacharb);
  2752. X            break;
  2753. X
  2754. X        case 13:
  2755. X            vga10_vga14(vgachar,vgacharb);
  2756. X            break;
  2757. X
  2758. X        case 15:
  2759. X            vga10_vga16(vgachar,vgacharb);
  2760. X            break;
  2761. X    }
  2762. X
  2763. X    loadchar(vgacharset, svsp->parms[1] + 0xA0, 16, vgacharb);
  2764. X
  2765. X    init_dld(svsp);
  2766. X}
  2767. X
  2768. X/*---------------------------------------------------------------------------*
  2769. X *    select character attributes
  2770. X *---------------------------------------------------------------------------*/
  2771. Xvoid
  2772. Xvt_sca(struct video_state *svsp)
  2773. X{
  2774. X    switch(svsp->parms[0])
  2775. X    {
  2776. X        case 1:
  2777. X            svsp->selchar = 1;
  2778. X            break;
  2779. X        case 0:
  2780. X        case 2:
  2781. X        default:
  2782. X            svsp->selchar = 0;
  2783. X            break;
  2784. X    }
  2785. X}
  2786. X
  2787. X#define INT_BITS    (sizeof(unsigned int) * 8)
  2788. X#define INT_INDEX(n)    ((n) / INT_BITS)
  2789. X#define BIT_INDEX(n)    ((n) % INT_BITS)
  2790. X
  2791. X/*---------------------------------------------------------------------------*
  2792. X *    initalize selective attribute bit array
  2793. X *---------------------------------------------------------------------------*/
  2794. Xvoid
  2795. Xvt_initsel(struct video_state *svsp)
  2796. X{
  2797. X    register int i;
  2798. X    
  2799. X    for(i = 0;i < MAXDECSCA;i++)
  2800. X        svsp->decsca[i] = 0;
  2801. X}
  2802. X
  2803. X/*---------------------------------------------------------------------------*
  2804. X *    set selective attribute if appropriate
  2805. X *---------------------------------------------------------------------------*/
  2806. Xvoid
  2807. Xvt_selattr(struct video_state *svsp)
  2808. X{
  2809. X    int i;
  2810. X
  2811. X    i = (svsp->Crtat + svsp->cur_offset) - svsp->Crtat;
  2812. X
  2813. X    if(svsp->selchar)
  2814. X        svsp->decsca[INT_INDEX(i)] |=  (1 << BIT_INDEX(i));
  2815. X    else
  2816. X        svsp->decsca[INT_INDEX(i)] &= ~(1 << BIT_INDEX(i));
  2817. X}
  2818. X
  2819. X/*---------------------------------------------------------------------------*
  2820. X *    DECSEL - selective erase in line
  2821. X *---------------------------------------------------------------------------*/
  2822. Xvoid
  2823. Xvt_sel(struct video_state *svsp)
  2824. X{
  2825. X    switch(svsp->parms[0])
  2826. X    {
  2827. X        case 0:
  2828. X            selective_erase(svsp, (svsp->Crtat + svsp->cur_offset), svsp->maxcol-svsp->col);
  2829. X            break;
  2830. X
  2831. X        case 1:
  2832. X            selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-svsp->col, svsp->col + 1);
  2833. X            break;
  2834. X
  2835. X        case 2:
  2836. X            selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-svsp->col, svsp->maxcol);
  2837. X            break;
  2838. X    }
  2839. X}
  2840. X
  2841. X/*---------------------------------------------------------------------------*
  2842. X *    DECSED - selective erase in display
  2843. X *---------------------------------------------------------------------------*/
  2844. Xvoid
  2845. Xvt_sed(struct video_state *svsp)
  2846. X{
  2847. X    switch(svsp->parms[0])
  2848. X    {
  2849. X        case 0:
  2850. X            selective_erase(svsp, (svsp->Crtat + svsp->cur_offset), svsp->Crtat + (svsp->maxcol * svsp->screen_rows) - (svsp->Crtat + svsp->cur_offset));
  2851. X            break;
  2852. X
  2853. X        case 1:
  2854. X            selective_erase(svsp, svsp->Crtat, (svsp->Crtat + svsp->cur_offset) - svsp->Crtat + 1 );
  2855. X            break;
  2856. X
  2857. X        case 2:                
  2858. X            selective_erase(svsp, svsp->Crtat, svsp->maxcol * svsp->screen_rows);
  2859. X            break;
  2860. X    }
  2861. X}
  2862. X
  2863. X/* ====================== */
  2864. X/* module local functions */
  2865. X/* ====================== */
  2866. X
  2867. X/*---------------------------------------------------------------------------*
  2868. X *    scroll screen one line up
  2869. X *---------------------------------------------------------------------------*/
  2870. Xstatic void
  2871. Xroll_up(struct video_state *svsp)
  2872. X{
  2873. X    bcopyb(    svsp->Crtat + (svsp->scrr_beg * svsp->maxcol) + svsp->maxcol,
  2874. X        svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
  2875. X        svsp->maxcol * svsp->scrr_len * CHR );
  2876. X        
  2877. X    fillw(    user_attr | ' ',
  2878. X        svsp->Crtat + ((svsp->scrr_beg + svsp->scrr_len) * svsp->maxcol),
  2879. X        svsp->maxcol);
  2880. X
  2881. X/*XXX*/    if(svsp->scroll_lock && svsp->openf && curproc)
  2882. X        tsleep((caddr_t)&(svsp->scroll_lock), PUSER, "scrlck", 0);
  2883. X}
  2884. X
  2885. X/*---------------------------------------------------------------------------*
  2886. X *    scroll screen one line down
  2887. X *---------------------------------------------------------------------------*/
  2888. Xstatic void
  2889. Xroll_down(struct video_state *svsp)
  2890. X{
  2891. X    ovbcopy(svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
  2892. X        svsp->Crtat + (svsp->scrr_beg * svsp->maxcol) + svsp->maxcol,
  2893. X        svsp->maxcol * svsp->scrr_len * CHR );
  2894. X        
  2895. X    fillw(    user_attr | ' ',
  2896. X        svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
  2897. X        svsp->maxcol);
  2898. X
  2899. X/*XXX*/    if(svsp->scroll_lock && svsp->openf && curproc)
  2900. X        tsleep((caddr_t)&(svsp->scroll_lock), PUSER, "scrlck", 0);
  2901. X}
  2902. X
  2903. X/*---------------------------------------------------------------------------*
  2904. X *    switch charset pointers
  2905. X *---------------------------------------------------------------------------*/
  2906. Xstatic void
  2907. Xswcsp(struct video_state *svsp, u_short *ctp)
  2908. X{
  2909. X    if(ctp == NULL)
  2910. X        return;
  2911. X        
  2912. X    switch(svsp->state)
  2913. X    {
  2914. X        case STATE_BROPN:    /* designate G0 */
  2915. X            svsp->G0 = ctp;
  2916. X            break;
  2917. X
  2918. X        case STATE_BRCLO:    /* designate G1 */
  2919. X        case STATE_MINUS:    /* designate G1 (96) */
  2920. X            svsp->G1 = ctp;
  2921. X            break;
  2922. X
  2923. X        case STATE_STAR:    /* designate G2 */
  2924. X        case STATE_DOT:        /* designate G2 (96) */
  2925. X            svsp->G2 = ctp;
  2926. X            break;
  2927. X
  2928. X        case STATE_PLUS:    /* designate G3 */
  2929. X        case STATE_SLASH:    /* designate G3 (96) */
  2930. X            svsp->G3 = ctp;
  2931. X            break;
  2932. X    }
  2933. X}
  2934. X
  2935. X/*---------------------------------------------------------------------------*
  2936. X *    process terminal responses
  2937. X *---------------------------------------------------------------------------*/
  2938. Xstatic void
  2939. Xrespond(struct video_state *svsp)
  2940. X{
  2941. X        if(!(svsp->openf))              /* are we opened ? */
  2942. X                return;
  2943. X
  2944. X        while (*svsp->report_chars && svsp->report_count > 0)
  2945. X        {
  2946. X        (*linesw[svsp->vs_tty->t_line].l_rint)
  2947. X            (*svsp->report_chars++ & 0xff, svsp->vs_tty);
  2948. X        svsp->report_count--;
  2949. X        }
  2950. X}
  2951. X
  2952. X/*---------------------------------------------------------------------------*
  2953. X *    Initialization for User Defineable Keys
  2954. X *---------------------------------------------------------------------------*/
  2955. Xstatic void
  2956. Xinit_udk(struct video_state *svsp)
  2957. X{
  2958. X    svsp->udk_defi = 0;
  2959. X    svsp->udk_deflow = 0;
  2960. X    svsp->udk_fnckey = 0;
  2961. X}
  2962. X
  2963. X/*---------------------------------------------------------------------------*
  2964. X *    Clear loaded downloadable (DLD) character set
  2965. X *---------------------------------------------------------------------------*/
  2966. Xstatic void
  2967. Xclear_dld(struct video_state *svsp)
  2968. X{
  2969. X    register int i;
  2970. X    unsigned char vgacharset;
  2971. X    unsigned char vgachar[16];
  2972. X
  2973. X    if(vgacs[svsp->vga_charset].secondloaded)
  2974. X        vgacharset = vgacs[svsp->vga_charset].secondloaded;
  2975. X    else
  2976. X        return;
  2977. X    
  2978. X    for(i=0;i < 16;i++)  /* A zeroed character, vt220 has inverted '?' */
  2979. X        vgachar[i] = 0x00;
  2980. X
  2981. X    for(i=1;i <= 94;i++) /* Load (erase) all characters */
  2982. X        loadchar(vgacharset, i + 0xA0, 16, vgachar);
  2983. X}
  2984. X
  2985. X/*---------------------------------------------------------------------------*
  2986. X *    Initialization for Down line LoaDable Fonts
  2987. X *---------------------------------------------------------------------------*/
  2988. Xstatic void
  2989. Xinit_dld(struct video_state *svsp)
  2990. X{
  2991. X    register int i;
  2992. X
  2993. X    svsp->dld_dscsi = 0;
  2994. X    svsp->dld_sixel_lower = 0;
  2995. X    svsp->dld_sixelli = 0;
  2996. X    svsp->dld_sixelui = 0;
  2997. X
  2998. X    for(i = 0;i < MAXSIXEL;i++)
  2999. X        svsp->sixel.lower[i] = svsp->sixel.upper[i] = 0;
  3000. X}
  3001. X
  3002. X
  3003. X/*---------------------------------------------------------------------------*
  3004. X *    selective erase a region
  3005. X *---------------------------------------------------------------------------*/
  3006. Xstatic void
  3007. Xselective_erase(struct video_state *svsp, u_short *pcrtat, int length)
  3008. X{
  3009. X    register int i, j;
  3010. X    
  3011. X    for(j = pcrtat - svsp->Crtat, i = 0;i < length;i++,pcrtat++)
  3012. X    {
  3013. X        if(!(svsp->decsca[INT_INDEX(j+i)] & (1 << BIT_INDEX(j+i))))
  3014. X        {
  3015. X            *pcrtat &= 0xFF00; /* Keep the video character attributes */
  3016. X            *pcrtat += ' ';       /* Erase the character */
  3017. X        }
  3018. X    }
  3019. X}
  3020. X
  3021. X#endif    /* NVT > 0 */
  3022. X
  3023. X/* ------------------------- E O F ------------------------------------------*/
  3024. X
  3025. END_OF_FILE
  3026.   if test 51018 -ne `wc -c <'pcvt/pcvt_vtf.c'`; then
  3027.     echo shar: \"'pcvt/pcvt_vtf.c'\" unpacked with wrong size!
  3028.   fi
  3029.   # end of 'pcvt/pcvt_vtf.c'
  3030. fi
  3031. echo shar: End of archive 6 \(of 13\).
  3032. cp /dev/null ark6isdone
  3033. MISSING=""
  3034. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 ; do
  3035.     if test ! -f ark${I}isdone ; then
  3036.     MISSING="${MISSING} ${I}"
  3037.     fi
  3038. done
  3039. if test "${MISSING}" = "" ; then
  3040.     echo You have unpacked all 13 archives.
  3041.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3042. else
  3043.     echo You still must unpack the following archives:
  3044.     echo "        " ${MISSING}
  3045. fi
  3046. exit 0
  3047. exit 0 # Just in case...
  3048.