Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!network.ucsd.edu!ogicse!netnews.nwnet.net!news.clark.edu!spool.mu.edu!sdd.hp.com!apollo.hp.com!netnews
From: sommerfeld@apollo.hp.com (Bill Sommerfeld)
Newsgroups: comp.os.386bsd.development
Subject: syscons-0.2 patches for NetBSD 0.9
Message-ID: <SOMMERFELD.93Sep15154523@snarfblatt.apollo.hp.com>
Date: 15 Sep 93 19:45:22 GMT
Article-I.D.: snarfbla.SOMMERFELD.93Sep15154523
Sender: usenet@apollo.hp.com (Usenet News)
Organization: HP Apollo Systems Division, Chelmsford, MA.
Lines: 807
Nntp-Posting-Host: snarfblatt.ch.apollo.hp.com
syscons 0.2 is an alternate console driver for 386BSD which provides
for multiple virtual terminals on a PC display.
This is a patch to syscons 0.2 to
(a) get it to work on NetBSD 0.9,
(b) make it more emacs-friendly
- add real control key
- map BackSpace -> DEL
- map Control-Space to NUL
[Send flames that I should use iscreen instead to /dev/null.]
I believe that the old "alt" behavior is unchanged but I haven't
really tested it.
Installation: install as per the syscons installation instructions;
*however*, you also need to change all occurrances of:
#include "pc.h"
#if NPC > 0
...
#else
...
#endif
into
#include "pc.h"
#include "sc.h"
#if (NPC > 0) || (NSC > 0)
...
#else
...
#endif
In arch/i386/isa/conf.c, you need to change the "#if NPC > 0" stuff into:
#include "pc.h"
#include "sc.h"
#if (NPC > 0) || (NSC > 0)
int pcopen(),pcclose(),pcread(),pcwrite(),pcioctl(),pcmmap();
#if (NSC > 0)
#define pc_tty pccons
#endif
extern struct tty *pc_tty[];
#else
....
Anyhow, here are the diffs. Yes, I know the attach output messages
are grungy.. tough..
- Bill
===================================================================
RCS file: /usr/src/sys/arch/i386/isa/syscons.c,v
retrieving revision 1.1
diff -c -r1.1 syscons.c
*** 1.1 1993/09/10 02:38:06
--- syscons.c 1993/09/15 02:06:00
***************
*** 64,70 ****
--- 64,72 ----
#include "machine/psl.h"
#include "machine/frame.h"
#include "sc.h"
+ #if 0
#include "ddb.h"
+ #endif
#include "iso8859.font"
#include "kbdtables.h"
/*#include "asm.h"*/
***************
*** 82,89 ****
#define SWITCH_WAIT_ACQ 0x00080
/* virtual video memory addresses */
- #define MONO_BUF 0xFE0B0000
- #define CGA_BUF 0xFE0B8000
#define VGA_BUF 0xFE0A0000
#define VIDEOMEM 0x000A0000
--- 84,89 ----
***************
*** 99,105 ****
--- 99,107 ----
/* defines related to hardware addresses */
#define MONO_BASE 0x3B4 /* crt controller base mono */
+ #if 0
#define COLOR_BASE 0x3D4 /* crt controller base color */
+ #endif
#define ATC 0x3C0 /* attribute controller */
#define TSIDX 0x3C4 /* timing sequencer idx */
#define TSREG 0x3C5 /* timing sequencer data */
***************
*** 138,149 ****
static scr_stat cons_scr_stat[NCONS];
static scr_stat *cur_scr_stat = &cons_scr_stat[0];
static scr_stat *new_scp, *old_scp;
static int switch_in_progress = 0;
! u_short *Crtat = (u_short *)MONO_BUF;
static u_short *crtat = 0;
static u_int crtc_addr = MONO_BASE;
! static u_char shfts = 0, ctls = 0, alts = 0;
static char palette[3*256];
static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab);
static int cur_cursor_pos = -1;
--- 140,152 ----
static scr_stat cons_scr_stat[NCONS];
static scr_stat *cur_scr_stat = &cons_scr_stat[0];
static scr_stat *new_scp, *old_scp;
+ static int new_scr = 0;
static int switch_in_progress = 0;
! extern u_short *Crtat;
static u_short *crtat = 0;
static u_int crtc_addr = MONO_BASE;
! static u_char shfts = 0, ctls = 0, alts = 0, metas = 0;
static char palette[3*256];
static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab);
static int cur_cursor_pos = -1;
***************
*** 152,160 ****
static long blank_time = 0; /* screen saver timout value */
static scrmap_t scr_map;
! struct tty pccons[NCONS];
! struct tty *cur_pccons = &pccons[0];
! struct tty *new_pccons;
extern int hz;
extern struct timeval time;
--- 155,162 ----
static long blank_time = 0; /* screen saver timout value */
static scrmap_t scr_map;
! struct tty *pccons[NCONS];
! int pccons_cur, pccons_new;
extern int hz;
extern struct timeval time;
***************
*** 199,208 ****
static scr_stat *get_scr_stat(dev_t dev);
static int get_scr_num(scr_stat *scp);
static void cursor_shape(int start, int end);
! static void cursor_pos(void);
static void clear_screen(scr_stat *scp);
static switch_scr(u_int next_scr);
! static void exchange_scr(void);
static void move_crsr(scr_stat *scp, u_int x, u_int y);
static void move_up(u_short *s, u_short *d, u_int len);
static void move_down(u_short *s, u_short *d, u_int len);
--- 201,210 ----
static scr_stat *get_scr_stat(dev_t dev);
static int get_scr_num(scr_stat *scp);
static void cursor_shape(int start, int end);
! static void cursor_pos(caddr_t);
static void clear_screen(scr_stat *scp);
static switch_scr(u_int next_scr);
! static void exchange_scr(u_int next_scr);
static void move_crsr(scr_stat *scp, u_int x, u_int y);
static void move_up(u_short *s, u_short *d, u_int len);
static void move_down(u_short *s, u_short *d, u_int len);
***************
*** 297,313 ****
fillw(scp->attr | ' ', scp->scr, COL * ROW);
}
}
! cursor_pos();
}
static struct tty *get_pccons(dev_t dev)
{
int i = minor(dev);
!
if (i >= NCONS)
return(NULL);
! return(&pccons[i]);
}
--- 299,319 ----
fillw(scp->attr | ' ', scp->scr, COL * ROW);
}
}
! cursor_pos(0);
}
static struct tty *get_pccons(dev_t dev)
{
int i = minor(dev);
! struct tty *tp;
if (i >= NCONS)
return(NULL);
! tp = pccons[i];
! if (tp == NULL) {
! tp = pccons[i] = ttymalloc();
! }
! return(tp);
}
***************
*** 400,418 ****
{
int c, len;
u_char *cp;
!
scrn_saver(0);
c = sgetc(1);
if (c & 0x100)
return;
if (pcconsoftc.cs_flags & CSF_POLLING)
return;
if (c < 0x100)
! (*linesw[cur_pccons->t_line].l_rint)(c & 0xFF, cur_pccons);
! else if (cp = get_fstr((u_int)c, (u_int *)&len)) {
while (len-- > 0)
! (*linesw[cur_pccons->t_line].l_rint)
! (*cp++ & 0xFF, cur_pccons);
}
}
--- 406,430 ----
{
int c, len;
u_char *cp;
! struct tty *tp;
scrn_saver(0);
c = sgetc(1);
if (c & 0x100)
return;
if (pcconsoftc.cs_flags & CSF_POLLING)
return;
+ tp = get_pccons(pccons_cur);
if (c < 0x100)
! (*linesw[tp->t_line].l_rint)(c & 0xFF, tp);
! else if (c & FKEY) {
! if (cp = get_fstr((u_int)c, (u_int *)&len)) {
while (len-- > 0)
! (*linesw[tp->t_line].l_rint)
! (*cp++ & 0xFF, tp);
! }
! } else if (c & MKEY) {
! (*linesw[tp->t_line].l_rint)(27, tp); /* !!! ESC */
! (*linesw[tp->t_line].l_rint)(c & 0xFF, tp);
}
}
***************
*** 517,523 ****
case VT_TRUE: /* user has released screen, go on */
if (scp == old_scp && (scp->status & SWITCH_WAIT_REL)) {
scp->status &= ~SWITCH_WAIT_REL;
! exchange_scr();
if (new_scp->smode.mode == VT_PROCESS) {
new_scp->status |= SWITCH_WAIT_ACQ;
psignal(new_scp->proc,
--- 529,535 ----
case VT_TRUE: /* user has released screen, go on */
if (scp == old_scp && (scp->status & SWITCH_WAIT_REL)) {
scp->status &= ~SWITCH_WAIT_REL;
! exchange_scr(new_scr);
if (new_scp->smode.mode == VT_PROCESS) {
new_scp->status |= SWITCH_WAIT_ACQ;
psignal(new_scp->proc,
***************
*** 557,568 ****
if (*data == 0) {
if (scp == cur_scr_stat)
return 0;
! while ((error=tsleep(&scp->smode,
PZERO|PCATCH, "waitvt", 0))
== ERESTART) ;
}
else
! while ((error=tsleep(&cons_scr_stat[*data].smode,
PZERO|PCATCH, "waitvt", 0))
== ERESTART) ;
return error;
--- 569,580 ----
if (*data == 0) {
if (scp == cur_scr_stat)
return 0;
! while ((error=tsleep((caddr_t)&scp->smode,
PZERO|PCATCH, "waitvt", 0))
== ERESTART) ;
}
else
! while ((error=tsleep((caddr_t)&cons_scr_stat[*data].smode,
PZERO|PCATCH, "waitvt", 0))
== ERESTART) ;
return error;
***************
*** 798,810 ****
pcxint(dev_t dev)
{
! pccons[minor(dev)].t_state &= ~TS_BUSY;
pcconsoftc.cs_timo = 0;
! if (pccons[minor(dev)].t_line)
! (*linesw[pccons[minor(dev)].t_line].l_start)
! (&pccons[minor(dev)]);
else
! pcstart(&pccons[minor(dev)]);
}
--- 810,822 ----
pcxint(dev_t dev)
{
! struct tty *tp = get_pccons(dev);
! tp->t_state &= ~TS_BUSY;
pcconsoftc.cs_timo = 0;
! if (tp->t_line)
! (*linesw[tp->t_line].l_start) (tp);
else
! pcstart(tp);
}
***************
*** 816,838 ****
s = spltty();
if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)))
for (;;) {
! if (RB_LEN(&tp->t_out) <= tp->t_lowat) {
if (tp->t_state & TS_ASLEEP) {
tp->t_state &= ~TS_ASLEEP;
! wakeup((caddr_t)&tp->t_out);
}
! if (tp->t_wsel) {
! selwakeup(tp->t_wsel,
! tp->t_state & TS_WCOLL);
! tp->t_wsel = 0;
! tp->t_state &= ~TS_WCOLL;
! }
}
! if (RB_LEN(&tp->t_out) == 0)
break;
if (scp->status & SLKED)
break;
! c = getc(&tp->t_out);
splx(s);
ansi_put(scp, c);
s = spltty();
--- 828,845 ----
s = spltty();
if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)))
for (;;) {
! if (tp->t_outq.c_cc <= tp->t_lowat) {
if (tp->t_state & TS_ASLEEP) {
tp->t_state &= ~TS_ASLEEP;
! wakeup((caddr_t)&tp->t_outq);
}
! selwakeup(&tp->t_wsel);
}
! if (tp->t_outq.c_cc == 0)
break;
if (scp->status & SLKED)
break;
! c = getc(&tp->t_outq);
splx(s);
ansi_put(scp, c);
s = spltty();
***************
*** 852,858 ****
/* initialize required fields */
cp->cn_dev = makedev(maj, 0);
- cp->cn_tp = &pccons[0];
cp->cn_pri = CN_INTERNAL;
}
--- 859,864 ----
***************
*** 1005,1011 ****
}
! static void cursor_pos(void)
{
int pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
--- 1011,1017 ----
}
! static void cursor_pos(caddr_t mbz)
{
int pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
***************
*** 1044,1055 ****
switch_in_progress = 1;
old_scp = cur_scr_stat;
new_scp = &cons_scr_stat[next_scr];
! wakeup(&new_scp->smode);
if (new_scp == old_scp) {
switch_in_progress = 0;
return 0;
}
! new_pccons = &pccons[next_scr];
/* has controlling process died? */
if (old_scp->proc && (old_scp->proc != pfind(old_scp->pid)))
--- 1050,1061 ----
switch_in_progress = 1;
old_scp = cur_scr_stat;
new_scp = &cons_scr_stat[next_scr];
! wakeup((caddr_t)&new_scp->smode);
if (new_scp == old_scp) {
switch_in_progress = 0;
return 0;
}
! new_scr = next_scr;
/* has controlling process died? */
if (old_scp->proc && (old_scp->proc != pfind(old_scp->pid)))
***************
*** 1063,1069 ****
psignal(old_scp->proc, old_scp->smode.relsig);
}
else {
! exchange_scr();
if (new_scp->smode.mode == VT_PROCESS) {
new_scp->status |= SWITCH_WAIT_ACQ;
psignal(new_scp->proc, new_scp->smode.acqsig);
--- 1069,1075 ----
psignal(old_scp->proc, old_scp->smode.relsig);
}
else {
! exchange_scr(new_scr);
if (new_scp->smode.mode == VT_PROCESS) {
new_scp->status |= SWITCH_WAIT_ACQ;
psignal(new_scp->proc, new_scp->smode.acqsig);
***************
*** 1075,1087 ****
}
! static void exchange_scr(void)
{
bcopy(Crtat, old_scp->scr, old_scp->max_posx * old_scp->max_posy * 2);
old_scp->crt_base = old_scp->scr;
move_crsr(old_scp, old_scp->posx, old_scp->posy);
cur_scr_stat = new_scp;
! cur_pccons = new_pccons;
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
shfts = ctls = alts = 0;
update_leds(new_scp->status & LOCK_KEY_MASK);
--- 1081,1093 ----
}
! static void exchange_scr(u_int new_scr)
{
bcopy(Crtat, old_scp->scr, old_scp->max_posx * old_scp->max_posy * 2);
old_scp->crt_base = old_scp->scr;
move_crsr(old_scp, old_scp->posx, old_scp->posy);
cur_scr_stat = new_scp;
! pccons_cur = new_scr;
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
shfts = ctls = alts = 0;
update_leds(new_scp->status & LOCK_KEY_MASK);
***************
*** 1604,1610 ****
}
! void consinit(void)
{
u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
scr_stat *scp;
--- 1610,1616 ----
}
! void sysconsinit(void)
{
u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
scr_stat *scp;
***************
*** 1629,1635 ****
crtc_addr = MONO_BASE;
} else {
*cp = was;
! crtc_addr = COLOR_BASE;
Crtat = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short);
}
/* Extract cursor location */
--- 1635,1641 ----
crtc_addr = MONO_BASE;
} else {
*cp = was;
! crtc_addr = CGA_BASE;
Crtat = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short);
}
/* Extract cursor location */
***************
*** 1639,1663 ****
cursorat |= inb(crtc_addr+1);
crtat = Crtat+ cursorat;
!
! cons_scr_stat[0].crtat = crtat;
! cons_scr_stat[0].crt_base = Crtat;
! cons_scr_stat[0].posx = cursorat % COL;
! cons_scr_stat[0].posy = cursorat / COL;
! cons_scr_stat[0].esc = 0;
! cons_scr_stat[0].std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
! cons_scr_stat[0].rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
! cons_scr_stat[0].attr = (FG_LIGHTGREY | BG_BLACK) << 8;
! cons_scr_stat[0].border = BG_BLACK;;
! cons_scr_stat[0].max_posx = COL;
! cons_scr_stat[0].max_posy = ROW;
! cons_scr_stat[0].status = 0;
! cons_scr_stat[0].pid = 0;
! cons_scr_stat[0].proc = NULL;
! cons_scr_stat[0].smode.mode = VT_AUTO;
! cons_scr_stat[0].bell_pitch = 800;
! cons_scr_stat[0].bell_duration = 10;
! clear_screen(&cons_scr_stat[0]);
}
--- 1645,1669 ----
cursorat |= inb(crtc_addr+1);
crtat = Crtat+ cursorat;
! scp = &cons_scr_stat[0];
! scp->crtat = crtat;
! scp->crt_base = Crtat;
! scp->posx = cursorat % COL;
! scp->posy = cursorat / COL;
! scp->esc = 0;
! scp->std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
! scp->rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
! scp->attr = (FG_LIGHTGREY | BG_BLACK) << 8;
! scp->border = BG_BLACK;;
! scp->max_posx = COL;
! scp->max_posy = ROW;
! scp->status = 0;
! scp->pid = 0;
! scp->proc = NULL;
! scp->smode.mode = VT_AUTO;
! scp->bell_pitch = 800;
! scp->bell_duration = 10;
! clear_screen(scp);
}
***************
*** 1667,1673 ****
scr_stat *scp = &cons_scr_stat[0];
if (crtat == 0)
! consinit();
i = scp->attr;
scp->attr = ca << 8;
ansi_put(scp, c);
--- 1673,1679 ----
scr_stat *scp = &cons_scr_stat[0];
if (crtat == 0)
! sysconsinit();
i = scp->attr;
scp->attr = ca << 8;
ansi_put(scp, c);
***************
*** 1738,1749 ****
return dt;
/* Check for cntl-alt-del */
! if ((dt == 83) && ctls && alts)
cpu_reset();
! #if NDDB > 0
/* Check for cntl-alt-esc */
! if ((dt == 1) && ctls && alts) {
/* if debugger called, try to switch to console 0 */
if (cur_scr_stat->smode.mode == VT_AUTO &&
cons_scr_stat[0].smode.mode == VT_AUTO)
--- 1744,1755 ----
return dt;
/* Check for cntl-alt-del */
! if ((dt == 83) && ctls && (alts || metas))
cpu_reset();
! #ifdef DDB
/* Check for cntl-alt-esc */
! if ((dt == 1) && ctls && (alts || metas)) {
/* if debugger called, try to switch to console 0 */
if (cur_scr_stat->smode.mode == VT_AUTO &&
cons_scr_stat[0].smode.mode == VT_AUTO)
***************
*** 1824,1830 ****
dt = (dt & 0x80) | 0x68;
esc_flag = 0;
! state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0));
key = &key_map.key[dt & 0x7F];
if ( ((key->flgs & FLAG_LOCK_C) && (cur_scr_stat->status & CLKED))
|| ((key->flgs & FLAG_LOCK_N) && (cur_scr_stat->status & NLKED)) )
--- 1830,1836 ----
dt = (dt & 0x80) | 0x68;
esc_flag = 0;
! state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * ((alts || metas) ? 1 : 0));
key = &key_map.key[dt & 0x7F];
if ( ((key->flgs & FLAG_LOCK_C) && (cur_scr_stat->status & CLKED))
|| ((key->flgs & FLAG_LOCK_N) && (cur_scr_stat->status & NLKED)) )
***************
*** 1854,1859 ****
--- 1860,1871 ----
case RALT:
alts &= ~2;
break;
+ case LMETA:
+ metas &= ~1;
+ break;
+ case RMETA:
+ metas &= ~2;
+ break;
}
}
} else {
***************
*** 1878,1884 ****
case SLK:
if (cur_scr_stat->status & SLKED) {
cur_scr_stat->status &= ~SLKED;
! pcstart(&pccons[get_scr_num(cur_scr_stat)]);
}
else
cur_scr_stat->status |= SLKED;
--- 1890,1896 ----
case SLK:
if (cur_scr_stat->status & SLKED) {
cur_scr_stat->status &= ~SLKED;
! pcstart(get_pccons(get_scr_num(cur_scr_stat)));
}
else
cur_scr_stat->status |= SLKED;
***************
*** 1904,1921 ****
case RALT:
alts |= 2;
break;
default:
if (action >= F_SCR && action <= L_SCR) {
switch_scr(action - F_SCR);
break;
}
if (action >= F_FN && action <= L_FN) {
return(action | FKEY);
}
return(action);
}
}
! else return(action);
}
goto next_code;
}
--- 1916,1946 ----
case RALT:
alts |= 2;
break;
+ case LMETA:
+ metas |= 1;
+ break;
+ case RMETA:
+ metas |= 2;
+ break;
default:
if (action >= F_SCR && action <= L_SCR) {
switch_scr(action - F_SCR);
break;
}
+ if (metas) {
+ action |= MKEY;
+ }
if (action >= F_FN && action <= L_FN) {
return(action | FKEY);
}
return(action);
}
}
! else {
! if (metas)
! action |= MKEY;
! return(action);
! }
}
goto next_code;
}
***************
*** 2010,2016 ****
/* (re)activate cursor */
untimeout(cursor_pos, 0);
! cursor_pos();
}
--- 2035,2041 ----
/* (re)activate cursor */
untimeout(cursor_pos, 0);
! cursor_pos(0);
}
===================================================================
RCS file: /usr/src/sys/sys/console.h,v
retrieving revision 1.1
diff -c -r1.1 console.h
*** 1.1 1993/09/10 02:38:52
--- console.h 1993/09/15 01:30:16
***************
*** 173,178 ****
--- 173,180 ----
#define SLK 0x06
#define LALT 0x07
#define LCTR 0x09
+ #define LMETA 0x0a
+ #define RMETA 0x7a
#define RCTR 0x7b
#define RALT 0x7c
***************
*** 181,186 ****
--- 183,189 ----
#define F_FN 27 /* first function key */
#define L_FN 122 /* last function key */
#define FKEY 0x200 /* funtion key marker */
+ #define MKEY 0x400 /* meta key marker */
#define KB_DATA 0x60 /* kbd data port */
#define KB_STAT 0x64 /* kbd status port */
===================================================================
RCS file: /usr/src/sys/arch/i386/isa/kbdtables.h,v
retrieving revision 1.1
diff -c -r1.1 kbdtables.h
*** 1.1 1993/09/10 02:38:06
--- kbdtables.h 1993/09/15 01:39:15
***************
*** 151,157 ****
/* sc=0b */ '0', ')', NOP, NOP, '0', ')', NOP, NOP, 0x33, 0x00,
/* sc=0c */ '-', '_', 0x1F, 0x1F, '-', '_', 0x1F, 0x1F, 0x00, 0x00,
/* sc=0d */ '=', '+', NOP, NOP, '=', '+', NOP, NOP, 0x33, 0x00,
! /* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00,
/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x33, 0x00,
/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
--- 151,157 ----
/* sc=0b */ '0', ')', NOP, NOP, '0', ')', NOP, NOP, 0x33, 0x00,
/* sc=0c */ '-', '_', 0x1F, 0x1F, '-', '_', 0x1F, 0x1F, 0x00, 0x00,
/* sc=0d */ '=', '+', NOP, NOP, '=', '+', NOP, NOP, 0x33, 0x00,
! /* sc=0e */ 0x7f, 0x7f, 0x08, 0x08, 0x7f, 0x7f, 0x08, 0x08, 0x00, 0x00,
/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x33, 0x00,
/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
***************
*** 193,200 ****
/* sc=35 */ '/', '?', NOP, NOP, '/', '?', NOP, NOP, 0x33, 0x00,
/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
! /* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
! /* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
--- 193,200 ----
/* sc=35 */ '/', '?', NOP, NOP, '/', '?', NOP, NOP, 0x33, 0x00,
/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
! /* sc=38 */ LMETA, LMETA, LMETA, LMETA, LMETA, LMETA, LMETA, LMETA, 0xFF, 0x00,
! /* sc=39 */ ' ', ' ', 0x00, 0x00, ' ', ' ', 0x00, 0x00, 0x00, 0x00,
/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
***************
*** 230,236 ****
/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
/* sc=5b */ '/', '/', '/', '/', '/', '/', '/', '/', 0x00, 0x00,
/* sc=5c */ '*', '*', '*', '*', '*', '*', '*', '*', 0x00, 0x00,
! /* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
--- 230,236 ----
/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
/* sc=5b */ '/', '/', '/', '/', '/', '/', '/', '/', 0x00, 0x00,
/* sc=5c */ '*', '*', '*', '*', '*', '*', '*', '*', 0x00, 0x00,
! /* sc=5d */ RMETA, RMETA, RMETA, RMETA, RMETA, RMETA, RMETA, RMETA, 0xFF, 0x00,
/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,