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,