Initial revision

This commit is contained in:
Ben Gras
2005-04-21 14:53:53 +00:00
commit 9865aeaa79
2264 changed files with 411685 additions and 0 deletions

56
drivers/tty/Makefile Normal file
View File

@@ -0,0 +1,56 @@
# Makefile for terminal driver (TTY)
DRIVER = tty
# directories
u = /usr
i = $u/include
s = $i/sys
m = $i/minix
b = $i/ibm
d = $u/src/drivers
# programs, flags, etc.
MAKE = exec make
CC = exec cc
CFLAGS = -I$i
LDFLAGS = -i
LIBS = -lsys -lutils -ltimers
OBJ = tty.o console.o vidcopy.o keyboard.o
# rs232.o
# build local binary
all build: $(DRIVER)
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
$(DRIVER): $(OBJ)
$(CC) -o $@ $(LDFLAGS) $(OBJ) $(LIBS)
install -S 256w $(DRIVER)
# install with other drivers
install: /usr/sbin/drivers/$(DRIVER)
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
/usr/sbin/drivers/$(DRIVER): $(DRIVER)
install -o root -cs $? $@
# clean up local files
clean:
cd keymaps && $(MAKE) -$(MAKEFLAGS) $@
rm -f $(DRIVER) *.o *.bak
# dependencies
a = $d/drivers.h $b/interrupt.h $b/bios.h \
$i/ansi.h $i/string.h $i/limits.h $i/stddef.h $i/errno.h \
$m/config.h $m/type.h $m/com.h $m/callnr.h $m/const.h $s/types.h \
$m/syslib.h $s/types.h \
$m/utils.h $m/serverassert.h $m/devio.h
tty.o: $a
console.o: $a
vidcopy.o: # nothing
keyboard.o: $a
rs232.o: $a $i/termios.h $i/signal.h

1083
drivers/tty/console.c Normal file

File diff suppressed because it is too large Load Diff

600
drivers/tty/keyboard.c Normal file
View File

@@ -0,0 +1,600 @@
/* Keyboard driver for PC's and AT's.
*
* Changes:
* Jul 13, 2004 processes can observe function keys (Jorrit N. Herder)
* Jun 15, 2004 removed wreboot(), except panic dumps (Jorrit N. Herder)
* Feb 04, 1994 loadable keymaps (Marcus Hampel)
*/
#include "../drivers.h"
#include <termios.h>
#include <signal.h>
#include <unistd.h>
#include <minix/callnr.h>
#include <minix/com.h>
#include <minix/keymap.h>
#include "tty.h"
#include "keymaps/us-std.src"
#include "../../kernel/kernel.h"
#include "../../kernel/proc.h"
/* Standard and AT keyboard. (PS/2 MCA implies AT throughout.) */
#define KEYBD 0x60 /* I/O port for keyboard data */
/* AT keyboard. */
#define KB_COMMAND 0x64 /* I/O port for commands on AT */
#define KB_STATUS 0x64 /* I/O port for status on AT */
#define KB_ACK 0xFA /* keyboard ack response */
#define KB_OUT_FULL 0x01 /* status bit set when keypress char pending */
#define KB_IN_FULL 0x02 /* status bit set when not ready to receive */
#define LED_CODE 0xED /* command to keyboard to set LEDs */
#define MAX_KB_ACK_RETRIES 0x1000 /* max #times to wait for kb ack */
#define MAX_KB_BUSY_RETRIES 0x1000 /* max #times to loop while kb busy */
#define KBIT 0x80 /* bit used to ack characters to keyboard */
/* Miscellaneous. */
#define ESC_SCAN 0x01 /* reboot key when panicking */
#define SLASH_SCAN 0x35 /* to recognize numeric slash */
#define RSHIFT_SCAN 0x36 /* to distinguish left and right shift */
#define HOME_SCAN 0x47 /* first key on the numeric keypad */
#define INS_SCAN 0x52 /* INS for use in CTRL-ALT-INS reboot */
#define DEL_SCAN 0x53 /* DEL for use in CTRL-ALT-DEL reboot */
#define CONSOLE 0 /* line number for console */
#define KB_IN_BYTES 32 /* size of keyboard input buffer */
PRIVATE char ibuf[KB_IN_BYTES]; /* input buffer */
PRIVATE char *ihead = ibuf; /* next free spot in input buffer */
PRIVATE char *itail = ibuf; /* scan code to return to TTY */
PRIVATE int icount; /* # codes in buffer */
PRIVATE int esc; /* escape scan code detected? */
PRIVATE int alt_l; /* left alt key state */
PRIVATE int alt_r; /* right alt key state */
PRIVATE int alt; /* either alt key */
PRIVATE int ctrl_l; /* left control key state */
PRIVATE int ctrl_r; /* right control key state */
PRIVATE int ctrl; /* either control key */
PRIVATE int shift_l; /* left shift key state */
PRIVATE int shift_r; /* right shift key state */
PRIVATE int shift; /* either shift key */
PRIVATE int num_down; /* num lock key depressed */
PRIVATE int caps_down; /* caps lock key depressed */
PRIVATE int scroll_down; /* scroll lock key depressed */
PRIVATE int locks[NR_CONS]; /* per console lock keys state */
/* Lock key active bits. Chosen to be equal to the keyboard LED bits. */
#define SCROLL_LOCK 0x01
#define NUM_LOCK 0x02
#define CAPS_LOCK 0x04
PRIVATE char numpad_map[] =
{'H', 'Y', 'A', 'B', 'D', 'C', 'V', 'U', 'G', 'S', 'T', '@'};
/* Variables and definition for observed function keys. */
PRIVATE int fkey_obs[12]; /* observers for F1-F12 */
PRIVATE int sfkey_obs[12]; /* observers for SHIFT F1-F12 */
FORWARD _PROTOTYPE( int kb_ack, (void) );
FORWARD _PROTOTYPE( int kb_wait, (void) );
FORWARD _PROTOTYPE( int func_key, (int scode) );
FORWARD _PROTOTYPE( int scan_keyboard, (void) );
FORWARD _PROTOTYPE( unsigned make_break, (int scode) );
FORWARD _PROTOTYPE( void set_leds, (void) );
FORWARD _PROTOTYPE( void kb_read, (struct tty *tp) );
FORWARD _PROTOTYPE( unsigned map_key, (int scode) );
/*===========================================================================*
* map_key0 *
*===========================================================================*/
/* Map a scan code to an ASCII code ignoring modifiers. */
#define map_key0(scode) \
((unsigned) keymap[(scode) * MAP_COLS])
/*===========================================================================*
* map_key *
*===========================================================================*/
PRIVATE unsigned map_key(scode)
int scode;
{
/* Map a scan code to an ASCII code. */
int caps, column, lk;
u16_t *keyrow;
if (scode == SLASH_SCAN && esc) return '/'; /* don't map numeric slash */
keyrow = &keymap[scode * MAP_COLS];
caps = shift;
lk = locks[ccurrent];
if ((lk & NUM_LOCK) && HOME_SCAN <= scode && scode <= DEL_SCAN) caps = !caps;
if ((lk & CAPS_LOCK) && (keyrow[0] & HASCAPS)) caps = !caps;
if (alt) {
column = 2;
if (ctrl || alt_r) column = 3; /* Ctrl + Alt == AltGr */
if (caps) column = 4;
} else {
column = 0;
if (caps) column = 1;
if (ctrl) column = 5;
}
return keyrow[column] & ~HASCAPS;
}
/*===========================================================================*
* kbd_hw_int *
*===========================================================================*/
PUBLIC void do_interrupt(m_ptr)
message *m_ptr;
{
/* A keyboard interrupt has occurred. Process it. */
int scode;
static timer_t timer; /* timer must be static! */
/* Fetch the character from the keyboard hardware and acknowledge it. */
scode = scan_keyboard();
/* Store the scancode in memory so the task can get at it later. */
if (icount < KB_IN_BYTES) {
*ihead++ = scode;
if (ihead == ibuf + KB_IN_BYTES) ihead = ibuf;
icount++;
tty_table[ccurrent].tty_events = 1;
}
}
/*==========================================================================*
* kb_read *
*==========================================================================*/
PRIVATE void kb_read(tp)
tty_t *tp;
{
/* Process characters from the circular keyboard buffer. */
char buf[3];
int scode;
unsigned ch;
tp = &tty_table[ccurrent]; /* always use the current console */
while (icount > 0) {
scode = *itail++; /* take one key scan code */
if (itail == ibuf + KB_IN_BYTES) itail = ibuf;
icount--;
/* Function keys are being used for debug dumps. */
if (func_key(scode)) continue;
/* Perform make/break processing. */
ch = make_break(scode);
if (ch <= 0xFF) {
/* A normal character. */
buf[0] = ch;
(void) in_process(tp, buf, 1);
} else
if (HOME <= ch && ch <= INSRT) {
/* An ASCII escape sequence generated by the numeric pad. */
buf[0] = ESC;
buf[1] = '[';
buf[2] = numpad_map[ch - HOME];
(void) in_process(tp, buf, 3);
} else
if (ch == ALEFT) {
/* Choose lower numbered console as current console. */
select_console(ccurrent - 1);
set_leds();
} else
if (ch == ARIGHT) {
/* Choose higher numbered console as current console. */
select_console(ccurrent + 1);
set_leds();
} else
if (AF1 <= ch && ch <= AF12) {
/* Alt-F1 is console, Alt-F2 is ttyc1, etc. */
select_console(ch - AF1);
set_leds();
} else
if (CF1 <= ch && ch <= CF12) {
switch(ch) {
case CF3: toggle_scroll(); break; /* hardware <-> software */
case CF7: sigchar(&tty_table[CONSOLE], SIGQUIT); break;
case CF8: sigchar(&tty_table[CONSOLE], SIGINT); break;
case CF9: sigchar(&tty_table[CONSOLE], SIGKILL); break;
}
}
}
}
/*===========================================================================*
* make_break *
*===========================================================================*/
PRIVATE unsigned make_break(scode)
int scode; /* scan code of key just struck or released */
{
/* This routine can handle keyboards that interrupt only on key depression,
* as well as keyboards that interrupt on key depression and key release.
* For efficiency, the interrupt routine filters out most key releases.
*/
int ch, make, escape;
static int CAD_count = 0;
/* Check for CTRL-ALT-DEL, and if found, halt the computer. This would
* be better done in keyboard() in case TTY is hung, except control and
* alt are set in the high level code.
*/
if (ctrl && alt && (scode == DEL_SCAN || scode == INS_SCAN))
{
if (++CAD_count == 3) sys_abort(RBT_HALT);
sys_kill(INIT_PROC_NR, SIGABRT);
return -1;
}
/* High-order bit set on key release. */
make = (scode & KEY_RELEASE) == 0; /* true if pressed */
ch = map_key(scode &= ASCII_MASK); /* map to ASCII */
escape = esc; /* Key is escaped? (true if added since the XT) */
esc = 0;
switch (ch) {
case CTRL: /* Left or right control key */
*(escape ? &ctrl_r : &ctrl_l) = make;
ctrl = ctrl_l | ctrl_r;
break;
case SHIFT: /* Left or right shift key */
*(scode == RSHIFT_SCAN ? &shift_r : &shift_l) = make;
shift = shift_l | shift_r;
break;
case ALT: /* Left or right alt key */
*(escape ? &alt_r : &alt_l) = make;
alt = alt_l | alt_r;
break;
case CALOCK: /* Caps lock - toggle on 0 -> 1 transition */
if (caps_down < make) {
locks[ccurrent] ^= CAPS_LOCK;
set_leds();
}
caps_down = make;
break;
case NLOCK: /* Num lock */
if (num_down < make) {
locks[ccurrent] ^= NUM_LOCK;
set_leds();
}
num_down = make;
break;
case SLOCK: /* Scroll lock */
if (scroll_down < make) {
locks[ccurrent] ^= SCROLL_LOCK;
set_leds();
}
scroll_down = make;
break;
case EXTKEY: /* Escape keycode */
esc = 1; /* Next key is escaped */
return(-1);
default: /* A normal key */
if (make) return(ch);
}
/* Key release, or a shift type key. */
return(-1);
}
/*===========================================================================*
* set_leds *
*===========================================================================*/
PRIVATE void set_leds()
{
/* Set the LEDs on the caps, num, and scroll lock keys */
int s;
if (!kenv.pc_at) return; /* PC/XT doesn't have LEDs */
kb_wait(); /* wait for buffer empty */
if ((s=sys_outb(KEYBD, LED_CODE)) != OK)
printf("Warning, sys_outb couldn't prepare for LED values: %d\n", s);
/* prepare keyboard to accept LED values */
kb_ack(); /* wait for ack response */
kb_wait(); /* wait for buffer empty */
if ((s=sys_outb(KEYBD, locks[ccurrent])) != OK)
printf("Warning, sys_outb couldn't give LED values: %d\n", s);
/* give keyboard LED values */
kb_ack(); /* wait for ack response */
}
/*==========================================================================*
* kb_wait *
*==========================================================================*/
PRIVATE int kb_wait()
{
/* Wait until the controller is ready; return zero if this times out. */
int retries, status, temp;
int s;
retries = MAX_KB_BUSY_RETRIES + 1; /* wait until not busy */
do {
s = sys_inb(KB_STATUS, &status);
if (status & KB_OUT_FULL) {
s = sys_inb(KEYBD, &temp); /* discard value */
}
if (! (status & (KB_IN_FULL|KB_OUT_FULL)) )
break; /* wait until ready */
} while (--retries != 0); /* continue unless timeout */
return(retries); /* zero on timeout, positive if ready */
}
/*==========================================================================*
* kb_ack *
*==========================================================================*/
PRIVATE int kb_ack()
{
/* Wait until kbd acknowledges last command; return zero if this times out. */
int retries, s;
u8_t u8val;
retries = MAX_KB_ACK_RETRIES + 1;
do {
s = sys_inb(KEYBD, &u8val);
if (u8val == KB_ACK)
break; /* wait for ack */
} while(--retries != 0); /* continue unless timeout */
return(retries); /* nonzero if ack received */
}
/*===========================================================================*
* kb_init *
*===========================================================================*/
PUBLIC void kb_init(tp)
tty_t *tp;
{
/* Initialize the keyboard driver. */
static int count = 0;
int i;
tp->tty_devread = kb_read; /* input function */
set_leds(); /* turn off numlock led */
scan_keyboard(); /* discard leftover keystroke */
/* The following initialization should only run once. */
if (! count ++) {
/* Clear the function key observers array. Also see func_key(). */
for (i=0; i<12; i++) {
fkey_obs[i] = NONE; /* F1-F12 observers */
sfkey_obs[i] = NONE; /* Shift F1-F12 observers */
}
/* Set interrupt handler and enable keyboard IRQ. */
if ((i=sys_irqsetpolicy(KEYBOARD_IRQ, IRQ_REENABLE, SELF, 0, 0, 0)) != OK)
server_panic("TTY", "Couldn't set keyboard IRQ policy", i);
if ((i=sys_irqenable(KEYBOARD_IRQ)) != OK)
server_panic("TTY", "Couldn't enable keyboard IRQs", i);
}
}
/*===========================================================================*
* kbd_loadmap *
*===========================================================================*/
PUBLIC int kbd_loadmap(m)
message *m;
{
/* Load a new keymap. */
int result;
result = sys_vircopy(m->PROC_NR, D, (vir_bytes) m->ADDRESS,
SELF, D, (vir_bytes) keymap,
(vir_bytes) sizeof(keymap));
return(result);
}
/*===========================================================================*
* do_fkey_ctl *
*===========================================================================*/
PUBLIC void do_fkey_ctl(m_ptr)
message *m_ptr; /* pointer to the request message */
{
/* This procedure allows processes to register a function key to receive
* notifications if it is pressed. At most one binding per key can exist.
*/
int fkey = m_ptr->FKEY_CODE; /* get function key code */
unsigned code;
int *observers = NULL;
int index = -1;
int result;
/* See if this key can be observed; get the observers array and index. */
if (SF1 == fkey) result = EINVAL; /* Shift-F1 is TTY reserved */
if (F1 <= fkey && fkey <= F12) { /* F1-F12 */
observers = fkey_obs;
index = fkey - F1;
} else if (SF2 <= fkey && fkey <= SF12) { /* Shift F1-F12 */
observers = sfkey_obs;
index = fkey - SF1;
}
/* Handle the request if an observers array was set above. */
if (observers) {
if (m_ptr->FKEY_ENABLE) { /* try to register an observer */
if (observers[index] == NONE) {
observers[index] = m_ptr->m_source;
result = OK; /* done, new observer registered */
} else {
result = EBUSY; /* function key already bound */
}
} else { /* unregister an observer */
if (observers[index] == m_ptr->m_source) {
observers[index] = NONE;
result = OK; /* done, observer unregistered */
} else {
result = EPERM; /* can only remove own binding */
}
}
} else {
result = EINVAL; /* key cannot be observed */
}
/* Almost done, return result to caller. */
m_ptr->m_type = result;
send(m_ptr->m_source, m_ptr);
}
/*===========================================================================*
* func_key *
*===========================================================================*/
PRIVATE int func_key(scode)
int scode; /* scan code for a function key */
{
/* This procedure traps function keys for debugging purposes. Observers of
* function keys are kept in a global array. If a subject (a key) is pressed
* the observer is notified of the event. Initialization of the arrays is done
* in kb_init, where NONE is set to indicate there is no interest in the key.
* Returns FALSE on a key release or if the key is not observable.
*/
message m;
int *observers = NULL;
unsigned fkey;
int index = -1;
int i,s;
struct proc proc;
/* Ignore key releases. If this is a key press, get full key code. */
if (scode & KEY_RELEASE) return(FALSE); /* key release */
fkey = map_key(scode); /* include modifiers */
/* Key pressed, now see if there is an observer for the pressed key.
* F1-F12 observers are in fkey_obs array.
* SHIFT F1-F12 observers are in sfkey_req array.
* CTRL F1-F12 reserved (see kb_read)
* ALT F1-F12 reserved (see kb_read)
* Other combinations are not in use. Note that Alt+Shift+F1-F12 is yet
* defined in <minix/keymap.h>, but other modifier combinations are not.
*/
if (SF1 == fkey) {
printf("\n");
printf("System information. Known function key mappings to request debug dumps:\n");
printf("-------------------------------------------------------------------------\n");
for (i=0; i<12; i++) {
printf(" %sF%d: ", i+1<10? " ":"", i+1);
if (fkey_obs[i] != NONE) {
if ((s=sys_getproc(&proc, fkey_obs[i]))!=OK)
printf("sys_getproc: %d\n", s);
printf("%-14.14s", proc.p_name);
} else {
printf("%-14.14s", "<none>");
}
printf(" %sShift-F%d: ", i+1<10? " ":"", i+1);
if (sfkey_obs[i] != NONE) {
if ((s=sys_getproc(&proc, sfkey_obs[i]))!=OK)
printf("sys_getproc: %d\n", s);
printf("%-14.14s", proc.p_name);
} else {
printf("%-14.14s", "<none>");
}
printf("\n");
}
printf("\n");
printf("Press one of the registered function keys to trigger a debug dump.\n");
printf("\n");
}
else if (F1 <= fkey && fkey <= F12) { /* F1-F12 */
observers = &fkey_obs[0];
index = fkey - F1;
} else if (SF2 <= fkey && fkey <= SF12) { /* Shift F2-F12 */
observers = &sfkey_obs[0];
index = fkey - SF1;
}
if (! observers) return(FALSE); /* not observable */
/* See if an observer is registered and send it a message. */
if (observers[index] != NONE) {
m.m_type = FKEY_PRESSED;
m.FKEY_NUM = index+1;
m.FKEY_CODE = fkey;
if (OK != (s=nb_send(observers[index], &m))) {
printf("WARNING: F%d key notification to process %d failed: %d.\n",
index+1, observers[index], s);
}
}
return(TRUE);
}
/*==========================================================================*
* scan_keyboard *
*==========================================================================*/
PRIVATE int scan_keyboard()
{
/* Fetch the character from the keyboard hardware and acknowledge it. */
pvb_pair_t byte_in[2], byte_out[2];
byte_in[0].port = KEYBD; /* get the scan code for the key struck */
byte_in[1].port = PORT_B; /* strobe the keyboard to ack the char */
sys_vinb(byte_in, 2); /* request actual input */
pv_set(byte_out[0], PORT_B, byte_in[1].value | KBIT); /* strobe bit high */
pv_set(byte_out[1], PORT_B, byte_in[1].value); /* then strobe low */
sys_voutb(byte_out, 2); /* request actual output */
return(byte_in[0].value); /* return scan code */
}
/*==========================================================================*
* do_panic_dumps *
*==========================================================================*/
PUBLIC void do_panic_dumps(m)
message *m; /* request message to TTY */
{
/* Wait for keystrokes for printing debugging info and reboot. */
int quiet, code;
/* A panic! Allow debug dumps until user wants to shutdown. */
printf("\nHit ESC to reboot, DEL to shutdown, F-keys for debug dumps\n");
(void) scan_keyboard(); /* ack any old input */
quiet = scan_keyboard();/* quiescent value (0 on PC, last code on AT)*/
for (;;) {
tick_delay(10);
/* See if there are pending request for output, but don't block.
* Diagnostics can span multiple printf()s, so do it in a loop.
*/
while (nb_receive(ANY, m) == OK) {
switch(m->m_type) {
case NEW_KMESS: do_new_kmess(m); break;
case DIAGNOSTICS: do_diagnostics(m); break;
default: ; /* do nothing */
}
tick_delay(1); /* allow more */
}
code = scan_keyboard();
if (code != quiet) {
/* A key has been pressed. */
switch (code) { /* possibly abort MINIX */
case ESC_SCAN: sys_abort(RBT_REBOOT); return;
case DEL_SCAN: sys_abort(RBT_HALT); return;
}
(void) func_key(code); /* check for function key */
quiet = scan_keyboard();
}
}
}

View File

@@ -0,0 +1,81 @@
# Generate binary keymaps.
LK = /usr/lib/keymaps
.SUFFIXES: .src .map
.src.map:
$(CC) -DKEYSRC=\"$<\" genmap.c
./a.out > $@
@rm -f a.out
all: \
french.map \
german.map \
italian.map \
japanese.map \
latin-am.map \
olivetti.map \
polish.map \
scandinavn.map \
spanish.map \
uk.map \
us-std.map \
us-swap.map \
install: \
$(LK) \
$(LK)/french.map \
$(LK)/german.map \
$(LK)/italian.map \
$(LK)/japanese.map \
$(LK)/latin-am.map \
$(LK)/olivetti.map \
$(LK)/polish.map \
$(LK)/scandinavn.map \
$(LK)/spanish.map \
$(LK)/uk.map \
$(LK)/us-std.map \
$(LK)/us-swap.map \
clean:
rm -f a.out *.map
$(LK):
install -d $@
$(LK)/french.map: french.map
install -c $? $@
$(LK)/german.map: german.map
install -c $? $@
$(LK)/italian.map: italian.map
install -c $? $@
$(LK)/japanese.map: japanese.map
install -c $? $@
$(LK)/latin-am.map: latin-am.map
install -c $? $@
$(LK)/olivetti.map: olivetti.map
install -c $? $@
$(LK)/polish.map: polish.map
install -c $? $@
$(LK)/scandinavn.map: scandinavn.map
install -c $? $@
$(LK)/spanish.map: spanish.map
install -c $? $@
$(LK)/uk.map: uk.map
install -c $? $@
$(LK)/us-std.map: us-std.map
install -c $? $@
$(LK)/us-swap.map: us-swap.map
install -c $? $@

View File

@@ -0,0 +1,135 @@
/* Keymap for the French keyboard. */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
/* 02 - '1' */ '&', '1', A('1'), '&', '1', C('A'),
/* 03 - '2' */ 0202, '2', A('2'), '~', '2', C('B'),
/* 04 - '3' */ '"', '3', A('3'), '#', '3', C('C'),
/* 05 - '4' */ '\'', '4', A('4'), '{', '4', C('D'),
/* 06 - '5' */ '(', '5', A('5'), '[', '5', C('E'),
/* 07 - '6' */ '-', '6', A('6'), '|', '6', C('F'),
/* 08 - '7' */ 0212, '7', A('7'), '`', '7', C('G'),
/* 09 - '8' */ '_', '8', A('8'), '\\', '8', C('H'),
/* 10 - '9' */ 0207, '9', A('9'), '^', '9', C('I'),
/* 11 - '0' */ 0205, '0', A('0'), '@', '0', C('J'),
/* 12 - '-' */ ')', 0370, A(')'), ']', '-', C('K'),
/* 13 - '=' */ '=', '+', A('='), '}', '=', C('L'),
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
/* 16 - 'q' */ L('a'), 'A', A('a'), 'a', 'Q', C('A'),
/* 17 - 'w' */ L('z'), 'Z', A('z'), 'z', 'W', C('Z'),
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
/* 26 - '[' */ '^', '"', A('^'), '^', '[', C('^'),
/* 27 - ']' */ '$', 0234, A('$'), '$', ']', C('$'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('q'), 'Q', A('q'), 'q', 'A', C('Q'),
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
/* 39 - ';' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
/* 40 - '\'' */ 0227, '%', A('%'), 0227, '\\', C('G'),
/* 41 - '`' */ 0375, 0375, 0375, 0375, '`', C('['),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '`' */ '*', 0346, A('*'), '*', '`', C('*'),
/* 44 - 'z' */ L('w'), 'W', A('w'), 'w', 'Z', C('W'),
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
/* 50 - 'm' */ ',', '?', A(','), ',', 'm', C('@'),
/* 51 - ',' */ ';', '.', A(';'), ';', ',', C('@'),
/* 52 - '.' */ ':', '/', A(':'), ':', '.', C('@'),
/* 53 - '/' */ '!', '$'/*025*/,A('!'), '!', '/', C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,58 @@
/* genmap - output binary keymap Author: Marcus Hampel
*/
#include <sys/types.h>
#include <minix/keymap.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include KEYSRC
u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1];
void tell(const char *s)
{
write(2, s, strlen(s));
}
int main(void)
{
u8_t *cm, *fb;
u16_t *km;
int n;
/* Compress the keymap. */
memcpy(comprmap, KEY_MAGIC, 4);
cm = comprmap + 4;
n = 8;
for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) {
if (n == 8) {
/* Allocate a new flag byte. */
fb = cm;
*cm++ = 0;
n= 0;
}
*cm++ = (*km & 0x00FF); /* Low byte. */
if (*km & 0xFF00) {
*cm++ = (*km >> 8); /* High byte only when set. */
*fb |= (1 << n); /* Set a flag if so. */
}
n++;
}
/* Don't store trailing zeros. */
while (cm > comprmap && cm[-1] == 0) cm--;
/* Emit the compressed keymap. */
if (write(1, comprmap, cm - comprmap) < 0) {
int err = errno;
tell("genmap: ");
tell(strerror(err));
tell("\n");
exit(1);
}
exit(0);
}

View File

@@ -0,0 +1,135 @@
/* Keymap for German MF-2 keyboard. */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code unsh Shift Alt AltGr Alt+Sh Strg */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
/* 03 - '2' */ '2', '"', A('2'), 0375, '@', C('@'),
/* 04 - '3' */ '3', 025, A('3'), 0374, '#', C('C'),
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
/* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'),
/* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'),
/* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'),
/* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'),
/* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'),
/* 12 - '-' */ 0341, '?', 0341, '\\', '_', C('_'),
/* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
/* 21 - 'y' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
/* 26 - '[' */ L(0201),0232, 0201, '[', '{', C('['),
/* 27 - ']' */ '+', '*', A('+'), '~', ']', C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 29 - Strg;-) */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
/* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'),
/* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'),
/* 41 - '`' */ '^', 0370, A('^'), '`', '~', C('^'),
/* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ '#', '\'', A('#'), '\\', '|', C('\\'),
/* 44 - 'z' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'),
/* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'),
/* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'),
/* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'),
/* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,137 @@
/* Keymap for Italian keyboard. */
/* Modified by Ernesto Del Prete in October 1997 */
/* ernesto@cclix1.polito.it or s84508@cclix1.polito.it */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
/* 03 - '2' */ '2', '"', A('2'), '2', '@', C('@'),
/* 04 - '3' */ '3', 0234, A('3'), '3', 0234, C('C'),
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
/* 07 - '6' */ '6', '&', A('6'), '6', '&', C('F'),
/* 08 - '7' */ '7', '/', A('7'), '7', '/', C('G'),
/* 09 - '8' */ '8', '(', A('8'), '8', '(', C('H'),
/* 10 - '9' */ '9', ')', A('9'), '8', ')', C('I'),
/* 11 - '0' */ '0', '=', A('0'), '0', '=', C('@'),
/* 12 - '-' */ '\'', '?', A('\''),'`', '?', C('@'),
/* 13 - '=' */ 0215, '^', A('|'), 0215, '^', C('^'),
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
/* 26 - '[' */ 0212, 0202, 0212, '[', '{', C('['),
/* 27 - ']' */ '+', '*', A('+'), ']', '}', C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
/* 39 - ';' */ 0225, 0207, 0225, '@', '@', C('@'),
/* 40 - '\'' */ 0205, 0370, 0205, '#', 0276, C('@'),
/* 41 - '`' */ '\\', '|', A('\\'),0176, '|', C('\\'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ 0227, 025, 0227, 0227, 025, C('@'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
/* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'),
/* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'),
/* 53 - '/' */ '-', '_', A('-'), '-', '_', C('_'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,157 @@
/*
* Keymap for Japanese 106 keyboard.
* Dec. 31 1995
* Toshiya Ogawa <ogw@shizuokanet.or.jp>
* <GCD02425@niftyserve.or.jp>
*/
/*
* Japanese 106 keyboard has following additional 5 scan codes
* compared to US standard 101 keyboard.
*
* scan-code keytop effect in this keymap
* -------------------------------------------------------
* 112(0x70) KANA (ignored)
* 115(0x73) BackSlash mapped to '\\' and '_'
* 121(0x79) HENKAN (ignored)
* 123(0x7B) MU-HENKAN (ignored)
* 125(0x7D) YEN mapped to '\\' and '|'
*/
#if (NR_SCAN_CODES != 0x80)
#error NR_SCAN_CODES mis-match
#endif
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'),
/* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'),
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
/* 11 - '0' */ '0', '~', A('0'), A('0'), A('~'), C('@'),
/* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'),
/* 13 - '^' */ '^', '~', A('^'), A('^'), A('~'), C('^'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '@' */ '@', '`', A('@'), A('@'), A('`'), C('@'),
/* 27 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 28 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'),
/* 40 - ':' */ ':', '*', A(':'), A(':'), A('*'), C('@'),
/* 41 - KANJI */ 0, 0, 0, 0, 0, 0,
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ 0, 0, 0, 0, 0, 0,
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - KANA */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - '\\' */ '\\', '_', A('\\'),A('\\'),A('_'), C('_'),
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - HENKAN */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - MU-HENKAN*/ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - YEN */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,153 @@
/***
Keymap for Latin American keyboard. v1.02
Victor A. Rodriguez - El bit Fantasma - Bit-Man@Tasa.Com.AR
The Latin American keyboard makes differences between the left and
right ALT keys (the right one is so called ALT GR), and uses accent.
Release History
===============
v1.00 Initial version
v1.01 Extended ASCII characters replaced by hex. equivalents
v1.02 NR_SCAN_CODES has grown to 0x80, required by Toshiya Ogawa
(ogw@shizuokanet.or.jp) and added by Kees J.Bot (kjb@cs.vu.nl)
in MINIX 1.7.2
***/
#if (NR_SCAN_CODES != 0x80)
#error NR_SCAN_CODES mis-match
#endif
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('@'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('$'), C('^'),
/* 08 - '7' */ '7', '/', A('7'), A('7'), A('/'), C('G'),
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
/* 11 - '0' */ '0', '=', A('0'), A('0'), A('='), C('@'),
/* 12 - '-' */ '\'', '?', A('\''), 0x5c, A('?'), C('?'),
/* 13 - '¨' */ 0xa8, 0xad, A(0xa8),A(0xa8),A(0xad), C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), 0x40, A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - 'ï' */ 0xef, 0xf9, A(0xef),A(0xef),A(0xf9),C(0xef),
/* 27 - '+' */ '+', '*', A('+'), 0x7e, A('*'), C('+'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - '¤' */ L(0xa4),0xa5, A(0xa4),A(0xa4),A(0xa5),C('@'),
/* 40 - '{' */ '{', '[', A('{'), 0x5e, A('['), C('@'),
/* 41 - '|' */ '|', 0xf8, A('|'), 0xaa, A('\''),C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '}' */ 0x7d, 0x5d, A('<'), 0x60, A('>'), C('<'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', ';', A(','), A(','), A(';'), C('@'),
/* 52 - '.' */ '.', ':', A('.'), A('.'), A(':'), C('@'),
/* 53 - '/' */ '-', '_', A('-'), A('-'), A('_'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ '-', '-', '-', '-', '-', '-',
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ '+', '+', '+', '+', '+', '+',
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), A('>'), A('>'), C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,135 @@
/* Keymap for the Olivetti M24. */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'),
/* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'),
/* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'),
/* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'),
/* 11 - '0' */ '0', '_', A('0'), A('0'), A('_'), C('@'),
/* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'),
/* 13 - '=' */ '^', '~', A('^'), A('^'), A('~'), C('^'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '[' */ '@', '`', A('@'), A('@'), A('`'), C('@'),
/* 27 - ']' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'),
/* 40 - '\'' */ ':', '*', A(':'), A(':'), A('*'), C('@'),
/* 41 - '`' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ C('S'), C('S'), C('S'), C('S'), C('S'), C('S'),
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 85 - ??? */ LEFT, 014, A(014), A(014), A(014), 014,
/* 86 - ??? */ 0212, 0212, 0212, 0212, 0212, 0212,
/* 87 - F11 */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ DOWN, DOWN, DOWN, DOWN, DOWN, DOWN,
/* 90 - ??? */ RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT,
/* 91 - ??? */ UP, UP, UP, UP, UP, UP,
/* 92 - ??? */ LEFT, LEFT, LEFT, LEFT, LEFT, LEFT,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,140 @@
/*
* Keymap for US MF-2 keyboard. + Polish national letters.
* Modified by Antek Sawicki <tenox@tenox.tc>
* Charset: ISO-8859-2 - [Polska Norma PN-93 T-42118]
*/
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A(0xea),A(0xea),A(0xca),C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A(0xf3),A(0xf3),A(0xd3),C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A(0xb1),A(0xb1),A(0xa1),C('A'),
/* 31 - 's' */ L('s'), 'S', A(0xb6),A(0xb6),A(0xa6),C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A(0xb3),A(0xb3),A(0xa3),C('L'),
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
/* 44 - 'z' */ L('z'), 'Z', A(0xbf),A(0xbf),A(0xaf),C('Z'),
/* 45 - 'x' */ L('x'), 'X', A(0xbc),A(0xbc),A(0xac),C('X'),
/* 46 - 'c' */ L('c'), 'C', A(0xe6),A(0xe6),A(0xc6),C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A(0xf1),A(0xf1),A(0xd1),C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,138 @@
/* Keymap for Scandinavian keyboard.
* by Oliver Reitalu, nolx@nolx.tartu.ee
* preliminary version, 8 Sept 1996
*/
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code unsh Shift Alt AltGr Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
/* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'),
/* 03 - '2' */ '2', '"', A('2'), '@', '@', C('@'),
/* 04 - '3' */ '3', '#', A('3'), 156, '#', C('C'),
/* 05 - '4' */ '4', ' ', A('4'), '$', '$', C('D'),
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
/* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'),
/* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'),
/* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'),
/* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'),
/* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'),
/* 12 - '_' */ '+', '?', 0341, '\\', '_', C('_'),
/* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
/* 26 - '[' */ L(134), 143, 0201, '[', '{', C('['),
/* 27 - ']' */ '\"', '^', A('+'), '~', ']', C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
/* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'),
/* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'),
/* 41 - '`' */ L(21), 171, A('^'), '`', '~', C('^'),
/* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ 39, '*', A('#'), '\\', '|', C('\\'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'),
/* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'),
/* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'),
/* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'),
/* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,138 @@
/* Keymap for Spanish MF-2 keyboard. */
/* Modified by Javier Garcia Martin jawa@inf.deusto.es */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */
/*
====================================================================
*/
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['),
/* 02 - '1' */ '1', '!', A('1'), '|', '!', C('A'),
/* 03 - '2' */ '2', '"', A('2'), '@', '"', C('@'),
/* 04 - '3' */ '3', 0372, A('3'), '#', 0372, C('C'),
/* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'),
/* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'),
/* 07 - '6' */ '6', '&', A('6'), 0252, '&', C('F'),
/* 08 - '7' */ '7', '/', A('7'), '{', '/', C('G'),
/* 09 - '8' */ '8', '(', A('8'), '(', '(', C('H'),
/* 10 - '9' */ '9', ')', A('9'), ')', ')', C('I'),
/* 11 - '0' */ '0', '=', A('0'), '=', '=', C('@'),
/* 12 - '-' */ '\'', '?', A('\''),'?', '?', C('_'),
/* 13 - '=' */ 0255, 0250, A(0255),0250, 0250, C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'),
/* 26 - '[' */ '`', '^', A('`'),'[', '^', C('['),
/* 27 - ']' */ '+', '*', A('+'), ']', '*', C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'),
/* 39 - ';' */ L(0244),0245, A(0244),0244, 0245, C('@'),
/* 40 - '\'' */ '\'', '"', A('\''),'{', '"', C('@'),
/* 41 - '`' */ 0247, 0246, A(0247),'\\', 0246, C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ L(0207),0200, A(0207),'}', 0200, C('@'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'),
/* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'),
/* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'),
/* 53 - '/' */ '-', '_', A('-'), '-', '_', C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, '5', CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS,
/* 79 - End */ END, '1', AEND, AEND, '1', CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

135
drivers/tty/keymaps/uk.src Normal file
View File

@@ -0,0 +1,135 @@
/* Keymap for standard UK keyboard. Author: Darren Mason */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '"', A('2'), A('2'), A('@'), C('@'),
/* 04 - '3' */ '3', 156, A('3'), A('3'), A(156), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
/* 40 - '\'' */ '\'', '@', A('\''),A('\''),A('"'), C('@'),
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '#' */ '#', '~', A('#'), A('#'), A('~'), C('#'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '\\', '|', A('\\'),A('|'), A('|'), C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,135 @@
/* Keymap for US MF-2 keyboard. */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

View File

@@ -0,0 +1,135 @@
/* Keymap for US MF-2 keyboard with the Caps Lock and Control key swapped. */
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
/* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */
/* ==================================================================== */
/* 00 - none */ 0, 0, 0, 0, 0, 0,
/* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['),
/* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'),
/* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'),
/* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'),
/* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'),
/* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'),
/* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'),
/* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'),
/* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'),
/* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'),
/* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'),
/* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'),
/* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'),
/* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,
/* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
/* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'),
/* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'),
/* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'),
/* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'),
/* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'),
/* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'),
/* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'),
/* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'),
/* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'),
/* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'),
/* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['),
/* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'),
/* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 29 - Ctrl */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
/* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'),
/* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'),
/* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'),
/* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'),
/* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'),
/* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'),
/* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'),
/* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'),
/* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'),
/* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'),
/* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'),
/* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'),
/* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'),
/* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'),
/* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'),
/* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'),
/* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'),
/* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'),
/* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'),
/* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'),
/* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'),
/* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'),
/* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'),
/* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
/* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'),
/* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT,
/* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'),
/* 58 - CapsLck */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
/* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1,
/* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2,
/* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3,
/* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4,
/* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5,
/* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6,
/* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7,
/* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8,
/* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9,
/* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10,
/* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK,
/* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK,
/* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME,
/* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP,
/* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP,
/* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN,
/* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT,
/* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID,
/* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT,
/* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS,
/* 79 - End */ END, '1', AEND, AEND, A('1'), CEND,
/* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN,
/* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN,
/* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT,
/* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177,
/* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
/* 85 - ??? */ 0, 0, 0, 0, 0, 0,
/* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'),
/* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11,
/* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12,
/* 89 - ??? */ 0, 0, 0, 0, 0, 0,
/* 90 - ??? */ 0, 0, 0, 0, 0, 0,
/* 91 - ??? */ 0, 0, 0, 0, 0, 0,
/* 92 - ??? */ 0, 0, 0, 0, 0, 0,
/* 93 - ??? */ 0, 0, 0, 0, 0, 0,
/* 94 - ??? */ 0, 0, 0, 0, 0, 0,
/* 95 - ??? */ 0, 0, 0, 0, 0, 0,
/* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
/* 97 - ??? */ 0, 0, 0, 0, 0, 0,
/* 98 - ??? */ 0, 0, 0, 0, 0, 0,
/* 99 - ??? */ 0, 0, 0, 0, 0, 0,
/*100 - ??? */ 0, 0, 0, 0, 0, 0,
/*101 - ??? */ 0, 0, 0, 0, 0, 0,
/*102 - ??? */ 0, 0, 0, 0, 0, 0,
/*103 - ??? */ 0, 0, 0, 0, 0, 0,
/*104 - ??? */ 0, 0, 0, 0, 0, 0,
/*105 - ??? */ 0, 0, 0, 0, 0, 0,
/*106 - ??? */ 0, 0, 0, 0, 0, 0,
/*107 - ??? */ 0, 0, 0, 0, 0, 0,
/*108 - ??? */ 0, 0, 0, 0, 0, 0,
/*109 - ??? */ 0, 0, 0, 0, 0, 0,
/*110 - ??? */ 0, 0, 0, 0, 0, 0,
/*111 - ??? */ 0, 0, 0, 0, 0, 0,
/*112 - ??? */ 0, 0, 0, 0, 0, 0,
/*113 - ??? */ 0, 0, 0, 0, 0, 0,
/*114 - ??? */ 0, 0, 0, 0, 0, 0,
/*115 - ??? */ 0, 0, 0, 0, 0, 0,
/*116 - ??? */ 0, 0, 0, 0, 0, 0,
/*117 - ??? */ 0, 0, 0, 0, 0, 0,
/*118 - ??? */ 0, 0, 0, 0, 0, 0,
/*119 - ??? */ 0, 0, 0, 0, 0, 0,
/*120 - ??? */ 0, 0, 0, 0, 0, 0,
/*121 - ??? */ 0, 0, 0, 0, 0, 0,
/*122 - ??? */ 0, 0, 0, 0, 0, 0,
/*123 - ??? */ 0, 0, 0, 0, 0, 0,
/*124 - ??? */ 0, 0, 0, 0, 0, 0,
/*125 - ??? */ 0, 0, 0, 0, 0, 0,
/*126 - ??? */ 0, 0, 0, 0, 0, 0,
/*127 - ??? */ 0, 0, 0, 0, 0, 0
};

448
drivers/tty/pty.c Normal file
View File

@@ -0,0 +1,448 @@
/* pty.c - pseudo terminal driver Author: Kees J. Bot
* 30 Dec 1995
* PTYs can be seen as a bidirectional pipe with TTY
* input and output processing. For example a simple rlogin session:
*
* keyboard -> rlogin -> in.rld -> /dev/ptypX -> /dev/ttypX -> shell
* shell -> /dev/ttypX -> /dev/ptypX -> in.rld -> rlogin -> screen
*
* This file takes care of copying data between the tty/pty device pairs and
* the open/read/write/close calls on the pty devices. The TTY task takes
* care of the input and output processing (interrupt, backspace, raw I/O,
* etc.) using the pty_read() and pty_write() functions as the "keyboard" and
* "screen" functions of the ttypX devices.
* Be careful when reading this code, the terms "reading" and "writing" are
* used both for the tty and the pty end of the pseudo tty. Writes to one
* end are to be read at the other end and vice-versa.
*/
#include "../drivers.h"
#include <termios.h>
#include <signal.h>
#include <minix/com.h>
#include <minix/callnr.h>
#include "tty.h"
#include "proc.h"
#if NR_PTYS > 0
/* PTY bookkeeping structure, one per pty/tty pair. */
typedef struct pty {
tty_t *tty; /* associated TTY structure */
char state; /* flags: busy, closed, ... */
/* Read call on /dev/ptypX. */
char rdrepcode; /* reply code, TASK_REPLY or REVIVE */
char rdcaller; /* process making the call (usually FS) */
char rdproc; /* process that wants to read from the pty */
vir_bytes rdvir; /* virtual address in readers address space */
int rdleft; /* # bytes yet to be read */
int rdcum; /* # bytes written so far */
/* Write call to /dev/ptypX. */
char wrrepcode; /* reply code, TASK_REPLY or REVIVE */
char wrcaller; /* process making the call (usually FS) */
char wrproc; /* process that wants to write to the pty */
vir_bytes wrvir; /* virtual address in writers address space */
int wrleft; /* # bytes yet to be written */
int wrcum; /* # bytes written so far */
/* Output buffer. */
int ocount; /* # characters in the buffer */
char *ohead, *otail; /* head and tail of the circular buffer */
char obuf[128]; /* buffer for bytes going to the pty reader */
} pty_t;
#define PTY_ACTIVE 0x01 /* pty is open/active */
#define TTY_CLOSED 0x02 /* tty side has closed down */
#define PTY_CLOSED 0x04 /* pty side has closed down */
PRIVATE pty_t pty_table[NR_PTYS]; /* PTY bookkeeping */
FORWARD _PROTOTYPE( void pty_write, (tty_t *tp) );
FORWARD _PROTOTYPE( void pty_echo, (tty_t *tp, int c) );
FORWARD _PROTOTYPE( void pty_start, (pty_t *pp) );
FORWARD _PROTOTYPE( void pty_finish, (pty_t *pp) );
FORWARD _PROTOTYPE( void pty_read, (tty_t *tp) );
FORWARD _PROTOTYPE( void pty_close, (tty_t *tp) );
FORWARD _PROTOTYPE( void pty_icancel, (tty_t *tp) );
FORWARD _PROTOTYPE( void pty_ocancel, (tty_t *tp) );
/*==========================================================================*
* do_pty *
*==========================================================================*/
PUBLIC void do_pty(tp, m_ptr)
tty_t *tp;
message *m_ptr;
{
/* Perform an open/close/read/write call on a /dev/ptypX device. */
pty_t *pp = tp->tty_priv;
int r;
switch (m_ptr->m_type) {
case DEV_READ:
/* Check, store information on the reader, do I/O. */
if (pp->state & TTY_CLOSED) {
r = 0;
break;
}
if (pp->rdleft != 0) {
r = EIO;
break;
}
if (m_ptr->COUNT <= 0) {
r = EINVAL;
break;
}
if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS,
m_ptr->COUNT) == 0) {
r = EFAULT;
break;
}
pp->rdrepcode = TASK_REPLY;
pp->rdcaller = m_ptr->m_source;
pp->rdproc = m_ptr->PROC_NR;
pp->rdvir = (vir_bytes) m_ptr->ADDRESS;
pp->rdleft = m_ptr->COUNT;
pty_start(pp);
handle_events(tp);
if (pp->rdleft == 0) return; /* already done */
if (m_ptr->TTY_FLAGS & O_NONBLOCK) {
r = EAGAIN; /* don't suspend */
pp->rdleft = pp->rdcum = 0;
} else {
r = SUSPEND; /* do suspend */
pp->rdrepcode = REVIVE;
}
break;
case DEV_WRITE:
/* Check, store information on the writer, do I/O. */
if (pp->state & TTY_CLOSED) {
r = EIO;
break;
}
if (pp->wrleft != 0) {
r = EIO;
break;
}
if (m_ptr->COUNT <= 0) {
r = EINVAL;
break;
}
if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS,
m_ptr->COUNT) == 0) {
r = EFAULT;
break;
}
pp->wrrepcode = TASK_REPLY;
pp->wrcaller = m_ptr->m_source;
pp->wrproc = m_ptr->PROC_NR;
pp->wrvir = (vir_bytes) m_ptr->ADDRESS;
pp->wrleft = m_ptr->COUNT;
handle_events(tp);
if (pp->wrleft == 0) return; /* already done */
if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* don't suspend */
r = pp->wrcum > 0 ? pp->wrcum : EAGAIN;
pp->wrleft = pp->wrcum = 0;
} else {
pp->wrrepcode = REVIVE; /* do suspend */
r = SUSPEND;
}
break;
case DEV_OPEN:
r = pp->state != 0 ? EIO : OK;
pp->state |= PTY_ACTIVE;
break;
case DEV_CLOSE:
r = OK;
if (pp->state & TTY_CLOSED) {
pp->state = 0;
} else {
pp->state |= PTY_CLOSED;
sigchar(tp, SIGHUP);
}
break;
case CANCEL:
if (m_ptr->PROC_NR == pp->rdproc) {
/* Cancel a read from a PTY. */
pp->rdleft = pp->rdcum = 0;
}
if (m_ptr->PROC_NR == pp->wrproc) {
/* Cancel a write to a PTY. */
pp->wrleft = pp->wrcum = 0;
}
r = EINTR;
break;
default:
r = EINVAL;
}
tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r);
}
/*==========================================================================*
* pty_write *
*==========================================================================*/
PRIVATE void pty_write(tp)
tty_t *tp;
{
/* (*dev_write)() routine for PTYs. Transfer bytes from the writer on
* /dev/ttypX to the output buffer.
*/
pty_t *pp = tp->tty_priv;
int count, ocount;
phys_bytes user_phys;
/* PTY closed down? */
if (pp->state & PTY_CLOSED) {
if (tp->tty_outleft > 0) {
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
tp->tty_outproc, EIO);
tp->tty_outleft = tp->tty_outcum = 0;
}
return;
}
/* While there is something to do. */
for (;;) {
ocount = buflen(pp->obuf) - pp->ocount;
count = bufend(pp->obuf) - pp->ohead;
if (count > ocount) count = ocount;
if (count > tp->tty_outleft) count = tp->tty_outleft;
if (count == 0 || tp->tty_inhibited) break;
/* Copy from user space to the PTY output buffer. */
user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir);
phys_copy(user_phys, vir2phys(pp->ohead), (phys_bytes) count);
/* Perform output processing on the output buffer. */
out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount);
if (count == 0) break;
/* Assume echoing messed up by output. */
tp->tty_reprint = TRUE;
/* Bookkeeping. */
pp->ocount += ocount;
if ((pp->ohead += ocount) >= bufend(pp->obuf))
pp->ohead -= buflen(pp->obuf);
pty_start(pp);
tp->tty_out_vir += count;
tp->tty_outcum += count;
if ((tp->tty_outleft -= count) == 0) {
/* Output is finished, reply to the writer. */
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
tp->tty_outproc, tp->tty_outcum);
tp->tty_outcum = 0;
}
}
pty_finish(pp);
}
/*==========================================================================*
* pty_echo *
*==========================================================================*/
PRIVATE void pty_echo(tp, c)
tty_t *tp;
int c;
{
/* Echo one character. (Like pty_write, but only one character, optionally.) */
pty_t *pp = tp->tty_priv;
int count, ocount;
ocount = buflen(pp->obuf) - pp->ocount;
if (ocount == 0) return; /* output buffer full */
count = 1;
*pp->ohead = c; /* add one character */
out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount);
if (count == 0) return;
pp->ocount += ocount;
if ((pp->ohead += ocount) >= bufend(pp->obuf)) pp->ohead -= buflen(pp->obuf);
pty_start(pp);
}
/*==========================================================================*
* pty_start *
*==========================================================================*/
PRIVATE void pty_start(pp)
pty_t *pp;
{
/* Transfer bytes written to the output buffer to the PTY reader. */
int count;
phys_bytes user_phys;
/* While there are things to do. */
for (;;) {
count = bufend(pp->obuf) - pp->otail;
if (count > pp->ocount) count = pp->ocount;
if (count > pp->rdleft) count = pp->rdleft;
if (count == 0) break;
/* Copy from the output buffer to the readers address space. */
user_phys = proc_vir2phys(proc_addr(pp->rdproc), pp->rdvir);
phys_copy(vir2phys(pp->otail), user_phys, (phys_bytes) count);
/* Bookkeeping. */
pp->ocount -= count;
if ((pp->otail += count) == bufend(pp->obuf)) pp->otail = pp->obuf;
pp->rdvir += count;
pp->rdcum += count;
pp->rdleft -= count;
}
}
/*==========================================================================*
* pty_finish *
*==========================================================================*/
PRIVATE void pty_finish(pp)
pty_t *pp;
{
/* Finish the read request of a PTY reader if there is at least one byte
* transferred.
*/
if (pp->rdcum > 0) {
tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, pp->rdcum);
pp->rdleft = pp->rdcum = 0;
}
}
/*==========================================================================*
* pty_read *
*==========================================================================*/
PRIVATE void pty_read(tp)
tty_t *tp;
{
/* Offer bytes from the PTY writer for input on the TTY. (Do it one byte at
* a time, 99% of the writes will be for one byte, so no sense in being smart.)
*/
pty_t *pp = tp->tty_priv;
phys_bytes user_phys;
char c;
if (pp->state & PTY_CLOSED) {
if (tp->tty_inleft > 0) {
tty_reply(tp->tty_inrepcode, tp->tty_incaller, tp->tty_inproc,
tp->tty_incum);
tp->tty_inleft = tp->tty_incum = 0;
}
return;
}
while (pp->wrleft > 0) {
/* Transfer one character to 'c'. */
user_phys = proc_vir2phys(proc_addr(pp->wrproc), pp->wrvir);
phys_copy(user_phys, vir2phys(&c), 1L);
/* Input processing. */
if (in_process(tp, &c, 1) == 0) break;
/* PTY writer bookkeeping. */
pp->wrvir++;
pp->wrcum++;
if (--pp->wrleft == 0) {
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, pp->wrcum);
pp->wrcum = 0;
}
}
}
/*==========================================================================*
* pty_close *
*==========================================================================*/
PRIVATE void pty_close(tp)
tty_t *tp;
{
/* The tty side has closed, so shut down the pty side. */
pty_t *pp = tp->tty_priv;
if (!(pp->state & PTY_ACTIVE)) return;
if (pp->rdleft > 0) {
tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, 0);
pp->rdleft = pp->rdcum = 0;
}
if (pp->wrleft > 0) {
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, EIO);
pp->wrleft = pp->wrcum = 0;
}
if (pp->state & PTY_CLOSED) pp->state = 0; else pp->state |= TTY_CLOSED;
}
/*==========================================================================*
* pty_icancel *
*==========================================================================*/
PRIVATE void pty_icancel(tp)
tty_t *tp;
{
/* Discard waiting input. */
pty_t *pp = tp->tty_priv;
if (pp->wrleft > 0) {
tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc,
pp->wrcum + pp->wrleft);
pp->wrleft = pp->wrcum = 0;
}
}
/*==========================================================================*
* pty_ocancel *
*==========================================================================*/
PRIVATE void pty_ocancel(tp)
tty_t *tp;
{
/* Drain the output buffer. */
pty_t *pp = tp->tty_priv;
pp->ocount = 0;
pp->otail = pp->ohead;
}
/*==========================================================================*
* pty_init *
*==========================================================================*/
PUBLIC void pty_init(tp)
tty_t *tp;
{
pty_t *pp;
int line;
/* Associate PTY and TTY structures. */
line = tp - &tty_table[NR_CONS + NR_RS_LINES];
pp = tp->tty_priv = &pty_table[line];
pp->tty = tp;
/* Set up output queue. */
pp->ohead = pp->otail = pp->obuf;
/* Fill in TTY function hooks. */
tp->tty_devread = pty_read;
tp->tty_devwrite = pty_write;
tp->tty_echo = pty_echo;
tp->tty_icancel = pty_icancel;
tp->tty_ocancel = pty_ocancel;
tp->tty_close = pty_close;
}
#endif /* NR_PTYS > 0 */

930
drivers/tty/rs232.c Normal file
View File

@@ -0,0 +1,930 @@
#define USER_SPACE 1
#include <minix/config.h>
/*==========================================================================*
* rs232.c - serial driver for 8250 and 16450 UARTs *
* Added support for Atari ST M68901 and YM-2149 --kub *
*==========================================================================*/
#include "../drivers.h"
#include <termios.h>
#include <signal.h>
#include "tty.h"
#if USER_SPACE
typedef u16_t port_t;
#endif
#if NR_RS_LINES > 0
#if (MACHINE != IBM_PC) && (MACHINE != ATARI)
#error /* rs232.c only supports PC and Atari ST */
#endif
#if (MACHINE == ATARI)
#include "staddr.h"
#include "stsound.h"
#include "stmfp.h"
#if (NR_RS_LINES > 1)
#error /* Only one physical RS232 line available */
#endif
#endif
#if (MACHINE == IBM_PC) /* PC/AT 8250/16450 chip combination */
/* 8250 constants. */
#define UART_FREQ 115200L /* timer frequency */
/* Interrupt enable bits. */
#define IE_RECEIVER_READY 1
#define IE_TRANSMITTER_READY 2
#define IE_LINE_STATUS_CHANGE 4
#define IE_MODEM_STATUS_CHANGE 8
/* Interrupt status bits. */
#define IS_MODEM_STATUS_CHANGE 0
#define IS_TRANSMITTER_READY 2
#define IS_RECEIVER_READY 4
#define IS_LINE_STATUS_CHANGE 6
/* Line control bits. */
#define LC_2STOP_BITS 0x04
#define LC_PARITY 0x08
#define LC_PAREVEN 0x10
#define LC_BREAK 0x40
#define LC_ADDRESS_DIVISOR 0x80
/* Line status bits. */
#define LS_OVERRUN_ERR 2
#define LS_PARITY_ERR 4
#define LS_FRAMING_ERR 8
#define LS_BREAK_INTERRUPT 0x10
#define LS_TRANSMITTER_READY 0x20
/* Modem control bits. */
#define MC_DTR 1
#define MC_RTS 2
#define MC_OUT2 8 /* required for PC & AT interrupts */
/* Modem status bits. */
#define MS_CTS 0x10
#define MS_RLSD 0x80 /* Received Line Signal Detect */
#define MS_DRLSD 0x08 /* RLSD Delta */
#else /* MACHINE == ATARI */ /* Atari ST 68901 USART */
/* Most of the USART constants are already defined in stmfp.h . The local
* definitions made here are for keeping C code changes smaller. --kub
*/
#define UART_FREQ 19200L /* timer frequency */
/* Line status bits. */
#define LS_OVERRUN_ERR R_OE
#define LS_PARITY_ERR R_PE
#define LS_FRAMING_ERR R_FE
#define LS_BREAK_INTERRUPT R_BREAK
/* Modem status bits. */
#define MS_CTS IO_SCTS /* 0x04 */
#endif /* MACHINE == ATARI */
#define DATA_BITS_SHIFT 8 /* amount data bits shifted in mode */
#define DEF_BAUD 1200 /* default baud rate */
#define RS_IBUFSIZE 1024 /* RS232 input buffer size */
#define RS_OBUFSIZE 1024 /* RS232 output buffer size */
/* Input buffer watermarks.
* The external device is asked to stop sending when the buffer
* exactly reaches high water, or when TTY requests it. Sending restarts
* when the input buffer empties below the low watermark.
*/
#define RS_ILOWWATER (1 * RS_IBUFSIZE / 4)
#define RS_IHIGHWATER (3 * RS_IBUFSIZE / 4)
/* Output buffer low watermark.
* TTY is notified when the output buffer empties below the low watermark, so
* it may continue filling the buffer if doing a large write.
*/
#define RS_OLOWWATER (1 * RS_OBUFSIZE / 4)
#if (MACHINE == IBM_PC)
/* Macros to handle flow control.
* Interrupts must be off when they are used.
* Time is critical - already the function call for outb() is annoying.
* If outb() can be done in-line, tests to avoid it can be dropped.
* istart() tells external device we are ready by raising RTS.
* istop() tells external device we are not ready by dropping RTS.
* DTR is kept high all the time (it probably should be raised by open and
* dropped by close of the device).
* OUT2 is also kept high all the time.
*/
#define istart(rs) \
(outb((rs)->modem_ctl_port, MC_OUT2 | MC_RTS | MC_DTR), \
(rs)->idevready = TRUE)
#define istop(rs) \
(outb((rs)->modem_ctl_port, MC_OUT2 | MC_DTR), \
(rs)->idevready = FALSE)
/* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if
* CLOCAL is in effect for a line without a CTS wire.
*/
#define devready(rs) ((inb(rs->modem_status_port) | rs->cts) & MS_CTS)
/* Macro to tell if transmitter is ready. */
#define txready(rs) (inb(rs->line_status_port) & LS_TRANSMITTER_READY)
/* Macro to tell if carrier has dropped.
* The RS232 Carrier Detect (CD) line is usually connected to the 8250
* Received Line Signal Detect pin, reflected by bit MS_RLSD in the Modem
* Status Register. The MS_DRLSD bit tells if MS_RLSD has just changed state.
* So if MS_DRLSD is set and MS_RLSD cleared, we know that carrier has just
* dropped.
*/
#define devhup(rs) \
((inb(rs->modem_status_port) & (MS_RLSD|MS_DRLSD)) == MS_DRLSD)
#else /* MACHINE == ATARI */
/* Macros to handle flow control.
* Time is critical - already the function call for lock()/restore() is
* annoying.
* istart() tells external device we are ready by raising RTS.
* istop() tells external device we are not ready by dropping RTS.
* DTR is kept high all the time (it probably should be raised by open and
* dropped by close of the device). NOTE: The modem lines are active low.
*/
#define set_porta(msk,val) { register int s = lock(); \
SOUND->sd_selr = YM_IOA; \
SOUND->sd_wdat = \
SOUND->sd_rdat & (msk) | (val); \
restore(s); }
#define istart(rs) { set_porta( ~(PA_SRTS|PA_SDTR),0 ); \
(rs)->idevready = TRUE; }
#define istop(rs) { set_porta( ~PA_SDTR, PA_SRTS ); \
(rs)->idevready = FALSE; }
/* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if
* CLOCAL is in effect for a line without a CTS wire.
*/
#define devready(rs) ((~MFP->mf_gpip | rs->cts) & MS_CTS)
/* Transmitter ready test */
#define txready(rs) (MFP->mf_tsr & (T_EMPTY | T_UE))
#endif /* MACHINE == ATARI */
/* Types. */
typedef unsigned char bool_t; /* boolean */
/* RS232 device structure, one per device. */
typedef struct rs232 {
tty_t *tty; /* associated TTY structure */
int icount; /* number of bytes in the input buffer */
char *ihead; /* next free spot in input buffer */
char *itail; /* first byte to give to TTY */
bool_t idevready; /* nonzero if we are ready to receive (RTS) */
char cts; /* normally 0, but MS_CTS if CLOCAL is set */
unsigned char ostate; /* combination of flags: */
#define ODONE 1 /* output completed (< output enable bits) */
#define ORAW 2 /* raw mode for xoff disable (< enab. bits) */
#define OWAKEUP 4 /* tty_wakeup() pending (asm code only) */
#define ODEVREADY MS_CTS /* external device hardware ready (CTS) */
#define OQUEUED 0x20 /* output buffer not empty */
#define OSWREADY 0x40 /* external device software ready (no xoff) */
#define ODEVHUP MS_RLSD /* external device has dropped carrier */
#define OSOFTBITS (ODONE | ORAW | OWAKEUP | OQUEUED | OSWREADY)
/* user-defined bits */
#if (OSOFTBITS | ODEVREADY | ODEVHUP) == OSOFTBITS
/* a weak sanity check */
#error /* bits are not unique */
#endif
unsigned char oxoff; /* char to stop output */
bool_t inhibited; /* output inhibited? (follows tty_inhibited) */
bool_t drain; /* if set drain output and reconfigure line */
int ocount; /* number of bytes in the output buffer */
char *ohead; /* next free spot in output buffer */
char *otail; /* next char to output */
#if (MACHINE == IBM_PC)
port_t xmit_port; /* i/o ports */
port_t recv_port;
port_t div_low_port;
port_t div_hi_port;
port_t int_enab_port;
port_t int_id_port;
port_t line_ctl_port;
port_t modem_ctl_port;
port_t line_status_port;
port_t modem_status_port;
#endif
unsigned char lstatus; /* last line status */
unsigned char pad; /* ensure alignment for 16-bit ints */
unsigned framing_errors; /* error counts (no reporting yet) */
unsigned overrun_errors;
unsigned parity_errors;
unsigned break_interrupts;
irq_hook_t hook; /* interrupt hook */
char ibuf[RS_IBUFSIZE]; /* input buffer */
char obuf[RS_OBUFSIZE]; /* output buffer */
} rs232_t;
PUBLIC rs232_t rs_lines[NR_RS_LINES];
/* Table and macro to translate an RS232 line number to its rs_lines entry. */
PRIVATE rs232_t *p_rs_addr[NR_RS_LINES];
#define rs_addr(line) (p_rs_addr[line])
#if (MACHINE == IBM_PC)
/* 8250 base addresses. */
PRIVATE port_t addr_8250[] = {
0x3F8, /* COM1 */
0x2F8, /* COM2 */
0x3E8, /* COM3 */
0x2E8, /* COM4 */
};
#endif
FORWARD _PROTOTYPE( int rs232_handler, (irq_hook_t *hook) );
FORWARD _PROTOTYPE( void in_int, (rs232_t *rs) );
FORWARD _PROTOTYPE( void line_int, (rs232_t *rs) );
FORWARD _PROTOTYPE( void modem_int, (rs232_t *rs) );
FORWARD _PROTOTYPE( void rs_write, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_echo, (tty_t *tp, int c) );
FORWARD _PROTOTYPE( void rs_ioctl, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_config, (rs232_t *rs) );
FORWARD _PROTOTYPE( void rs_read, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_icancel, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_ocancel, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_ostart, (rs232_t *rs) );
FORWARD _PROTOTYPE( void rs_break, (tty_t *tp) );
FORWARD _PROTOTYPE( void rs_close, (tty_t *tp) );
FORWARD _PROTOTYPE( void out_int, (rs232_t *rs) );
/*==========================================================================*
* rs_write *
*==========================================================================*/
PRIVATE void rs_write(tp)
register tty_t *tp;
{
/* (*devwrite)() routine for RS232. */
rs232_t *rs = tp->tty_priv;
int count, ocount;
phys_bytes user_phys;
if (rs->inhibited != tp->tty_inhibited) {
/* Inhibition state has changed. */
lock();
rs->ostate |= OSWREADY;
if (tp->tty_inhibited) rs->ostate &= ~OSWREADY;
unlock();
rs->inhibited = tp->tty_inhibited;
}
if (rs->drain) {
/* Wait for the line to drain then reconfigure and continue output. */
if (rs->ocount > 0) return;
rs->drain = FALSE;
rs_config(rs);
}
/* While there is something to do. */
for (;;) {
ocount = buflen(rs->obuf) - rs->ocount;
count = bufend(rs->obuf) - rs->ohead;
if (count > ocount) count = ocount;
if (count > tp->tty_outleft) count = tp->tty_outleft;
if (count == 0 || tp->tty_inhibited) break;
/* Copy from user space to the RS232 output buffer. */
user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir);
phys_copy(user_phys, vir2phys(rs->ohead), (phys_bytes) count);
/* Perform output processing on the output buffer. */
out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount);
if (count == 0) break;
/* Assume echoing messed up by output. */
tp->tty_reprint = TRUE;
/* Bookkeeping. */
lock(); /* protect interrupt sensitive rs->ocount */
rs->ocount += ocount;
rs_ostart(rs);
unlock();
if ((rs->ohead += ocount) >= bufend(rs->obuf))
rs->ohead -= buflen(rs->obuf);
tp->tty_out_vir += count;
tp->tty_outcum += count;
if ((tp->tty_outleft -= count) == 0) {
/* Output is finished, reply to the writer. */
tty_reply(tp->tty_outrepcode, tp->tty_outcaller,
tp->tty_outproc, tp->tty_outcum);
tp->tty_outcum = 0;
}
}
if (tp->tty_outleft > 0 && tp->tty_termios.c_ospeed == B0) {
/* Oops, the line has hung up. */
tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, EIO);
tp->tty_outleft = tp->tty_outcum = 0;
}
}
/*==========================================================================*
* rs_echo *
*==========================================================================*/
PRIVATE void rs_echo(tp, c)
tty_t *tp; /* which TTY */
int c; /* character to echo */
{
/* Echo one character. (Like rs_write, but only one character, optionally.) */
rs232_t *rs = tp->tty_priv;
int count, ocount;
ocount = buflen(rs->obuf) - rs->ocount;
if (ocount == 0) return; /* output buffer full */
count = 1;
*rs->ohead = c; /* add one character */
out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount);
if (count == 0) return;
lock();
rs->ocount += ocount;
rs_ostart(rs);
unlock();
if ((rs->ohead += ocount) >= bufend(rs->obuf)) rs->ohead -= buflen(rs->obuf);
}
/*==========================================================================*
* rs_ioctl *
*==========================================================================*/
PRIVATE void rs_ioctl(tp)
tty_t *tp; /* which TTY */
{
/* Reconfigure the line as soon as the output has drained. */
rs232_t *rs = tp->tty_priv;
rs->drain = TRUE;
}
/*==========================================================================*
* rs_config *
*==========================================================================*/
PRIVATE void rs_config(rs)
rs232_t *rs; /* which line */
{
/* Set various line control parameters for RS232 I/O.
* If DataBits == 5 and StopBits == 2, 8250 will generate 1.5 stop bits.
* The 8250 can't handle split speed, so we use the input speed.
*/
tty_t *tp = rs->tty;
int divisor;
int line_controls;
static struct speed2divisor {
speed_t speed;
int divisor;
} s2d[] = {
#if (MACHINE == IBM_PC)
{ B50, UART_FREQ / 50 },
#endif
{ B75, UART_FREQ / 75 },
{ B110, UART_FREQ / 110 },
{ B134, UART_FREQ * 10 / 1345 },
{ B150, UART_FREQ / 150 },
{ B200, UART_FREQ / 200 },
{ B300, UART_FREQ / 300 },
{ B600, UART_FREQ / 600 },
{ B1200, UART_FREQ / 1200 },
#if (MACHINE == IBM_PC)
{ B1800, UART_FREQ / 1800 },
#endif
{ B2400, UART_FREQ / 2400 },
{ B4800, UART_FREQ / 4800 },
{ B9600, UART_FREQ / 9600 },
{ B19200, UART_FREQ / 19200 },
#if (MACHINE == IBM_PC)
{ B38400, UART_FREQ / 38400 },
{ B57600, UART_FREQ / 57600 },
{ B115200, UART_FREQ / 115200L },
#endif
};
struct speed2divisor *s2dp;
/* RS232 needs to know the xoff character, and if CTS works. */
rs->oxoff = tp->tty_termios.c_cc[VSTOP];
rs->cts = (tp->tty_termios.c_cflag & CLOCAL) ? MS_CTS : 0;
/* Look up the 8250 rate divisor from the output speed. */
divisor = 0;
for (s2dp = s2d; s2dp < s2d + sizeof(s2d)/sizeof(s2d[0]); s2dp++) {
if (s2dp->speed == tp->tty_termios.c_ospeed) divisor = s2dp->divisor;
}
if (divisor == 0) return; /* B0? */
#if (MACHINE == IBM_PC)
/* Compute line control flag bits. */
line_controls = 0;
if (tp->tty_termios.c_cflag & PARENB) {
line_controls |= LC_PARITY;
if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= LC_PAREVEN;
}
if (divisor >= (UART_FREQ / 110)) line_controls |= LC_2STOP_BITS;
line_controls |= (tp->tty_termios.c_cflag & CSIZE) >> 2;
/* Lock out interrupts while setting the speed. The receiver register is
* going to be hidden by the div_low register, but the input interrupt
* handler relies on reading it to clear the interrupt and avoid looping
* forever.
*/
lock();
/* Select the baud rate divisor registers and change the rate. */
outb(rs->line_ctl_port, LC_ADDRESS_DIVISOR);
outb(rs->div_low_port, divisor);
outb(rs->div_hi_port, divisor >> 8);
/* Change the line controls and reselect the usual registers. */
outb(rs->line_ctl_port, line_controls);
rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */
if ((tp->tty_termios.c_lflag & IXON) && rs->oxoff != _POSIX_VDISABLE)
rs->ostate &= ~ORAW;
unlock();
#else /* MACHINE == ATARI */
line_controls = U_Q16;
if (tp->tty_termios.c_cflag & PARENB) {
line_controls |= U_PAR;
if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= U_EVEN;
}
line_controls |= (divisor >= (UART_FREQ / 110)) ? U_ST2 : U_ST1;
switch (tp->tty_termios.c_cflag & CSIZE) { /* XXX - are U_Dn like CSn? */
case CS5: line_controls |= U_D5; break;
case CS5: line_controls |= U_D6; break;
case CS5: line_controls |= U_D7; break;
case CS5: line_controls |= U_D8; break;
}
lock();
MFP->mf_ucr = line_controls;
MFP->mf_tddr = divisor;
unlock();
#endif /* MACHINE == ATARI */
}
/*==========================================================================*
* rs_init *
*==========================================================================*/
PUBLIC void rs_init(tp)
tty_t *tp; /* which TTY */
{
/* Initialize RS232 for one line. */
register rs232_t *rs;
int line;
#if (MACHINE == IBM_PC)
port_t this_8250;
int irq;
long v;
#endif
/* Associate RS232 and TTY structures. */
line = tp - &tty_table[NR_CONS];
rs = tp->tty_priv = &rs_lines[line];
rs->tty = tp;
/* Set up input queue. */
rs->ihead = rs->itail = rs->ibuf;
#if (MACHINE == IBM_PC)
/* Precalculate port numbers for speed. Magic numbers in the code (once). */
this_8250 = addr_8250[line];
rs->xmit_port = this_8250 + 0;
rs->recv_port = this_8250 + 0;
rs->div_low_port = this_8250 + 0;
rs->div_hi_port = this_8250 + 1;
rs->int_enab_port = this_8250 + 1;
rs->int_id_port = this_8250 + 2;
rs->line_ctl_port = this_8250 + 3;
rs->modem_ctl_port = this_8250 + 4;
rs->line_status_port = this_8250 + 5;
rs->modem_status_port = this_8250 + 6;
#endif
/* Set up the hardware to a base state, in particular
* o turn off DTR (MC_DTR) to try to stop the external device.
* o be careful about the divisor latch. Some BIOS's leave it enabled
* here and that caused trouble (no interrupts) in version 1.5 by
* hiding the interrupt enable port in the next step, and worse trouble
* (continual interrupts) in an old version by hiding the receiver
* port in the first interrupt. Call rs_ioctl() early to avoid this.
* o disable interrupts at the chip level, to force an edge transition
* on the 8259 line when interrupts are next enabled and active.
* RS232 interrupts are guaranteed to be disabled now by the 8259
* mask, but there used to be trouble if the mask was set without
* handling a previous interrupt.
*/
istop(rs); /* sets modem_ctl_port */
rs_config(rs);
#if (MACHINE == IBM_PC)
outb(rs->int_enab_port, 0);
#endif
/* Clear any harmful leftover interrupts. An output interrupt is harmless
* and will occur when interrupts are enabled anyway. Set up the output
* queue using the status from clearing the modem status interrupt.
*/
#if (MACHINE == IBM_PC)
inb(rs->line_status_port);
inb(rs->recv_port);
#endif
rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */
rs->ohead = rs->otail = rs->obuf;
#if (MACHINE == IBM_PC)
/* Enable interrupts for both interrupt controller and device. */
irq = (line & 1) == 0 ? RS232_IRQ : SECONDARY_IRQ;
put_irq_handler(&rs->hook, irq, rs232_handler);
enable_irq(&rs->hook);
outb(rs->int_enab_port, IE_LINE_STATUS_CHANGE | IE_MODEM_STATUS_CHANGE
| IE_RECEIVER_READY | IE_TRANSMITTER_READY);
#else /* MACHINE == ATARI */
/* Initialize the 68901 chip, then enable interrupts. */
MFP->mf_scr = 0x00;
MFP->mf_tcdcr |= T_Q004;
MFP->mf_rsr = R_ENA;
MFP->mf_tsr = T_ENA;
MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^
(MFP->mf_gpip & (IO_SCTS|IO_SDCD));
MFP->mf_ddr = (MFP->mf_ddr & ~ (IO_SCTS|IO_SDCD));
MFP->mf_iera |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR);
MFP->mf_imra |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR);
MFP->mf_ierb |= (IB_SCTS|IB_SDCD);
MFP->mf_imrb |= (IB_SCTS|IB_SDCD);
#endif /* MACHINE == ATARI */
/* Fill in TTY function hooks. */
tp->tty_devread = rs_read;
tp->tty_devwrite = rs_write;
tp->tty_echo = rs_echo;
tp->tty_icancel = rs_icancel;
tp->tty_ocancel = rs_ocancel;
tp->tty_ioctl = rs_ioctl;
tp->tty_break = rs_break;
tp->tty_close = rs_close;
/* Tell external device we are ready. */
istart(rs);
}
/*==========================================================================*
* rs_icancel *
*==========================================================================*/
PRIVATE void rs_icancel(tp)
tty_t *tp; /* which TTY */
{
/* Cancel waiting input. */
rs232_t *rs = tp->tty_priv;
lock();
rs->icount = 0;
rs->itail = rs->ihead;
istart(rs);
unlock();
}
/*==========================================================================*
* rs_ocancel *
*==========================================================================*/
PRIVATE void rs_ocancel(tp)
tty_t *tp; /* which TTY */
{
/* Cancel pending output. */
rs232_t *rs = tp->tty_priv;
lock();
rs->ostate &= ~(ODONE | OQUEUED);
rs->ocount = 0;
rs->otail = rs->ohead;
unlock();
}
/*==========================================================================*
* rs_read *
*==========================================================================*/
PRIVATE void rs_read(tp)
tty_t *tp; /* which tty */
{
/* Process characters from the circular input buffer. */
rs232_t *rs = tp->tty_priv;
int icount, count, ostate;
if (!(tp->tty_termios.c_cflag & CLOCAL)) {
/* Send a SIGHUP if hangup detected. */
lock();
ostate = rs->ostate;
rs->ostate &= ~ODEVHUP; /* save ostate, clear DEVHUP */
unlock();
if (ostate & ODEVHUP) {
sigchar(tp, SIGHUP);
tp->tty_termios.c_ospeed = B0; /* Disable further I/O. */
return;
}
}
while ((count = rs->icount) > 0) {
icount = bufend(rs->ibuf) - rs->itail;
if (count > icount) count = icount;
/* Perform input processing on (part of) the input buffer. */
if ((count = in_process(tp, rs->itail, count)) == 0) break;
lock(); /* protect interrupt sensitive variables */
rs->icount -= count;
if (!rs->idevready && rs->icount < RS_ILOWWATER) istart(rs);
unlock();
if ((rs->itail += count) == bufend(rs->ibuf)) rs->itail = rs->ibuf;
}
}
/*==========================================================================*
* rs_ostart *
*==========================================================================*/
PRIVATE void rs_ostart(rs)
rs232_t *rs; /* which rs line */
{
/* Tell RS232 there is something waiting in the output buffer. */
rs->ostate |= OQUEUED;
if (txready(rs)) out_int(rs);
}
/*==========================================================================*
* rs_break *
*==========================================================================*/
PRIVATE void rs_break(tp)
tty_t *tp; /* which tty */
{
/* Generate a break condition by setting the BREAK bit for 0.4 sec. */
rs232_t *rs = tp->tty_priv;
int line_controls;
line_controls = inb(rs->line_ctl_port);
outb(rs->line_ctl_port, line_controls | LC_BREAK);
milli_delay(400); /* ouch */
outb(rs->line_ctl_port, line_controls);
}
/*==========================================================================*
* rs_close *
*==========================================================================*/
PRIVATE void rs_close(tp)
tty_t *tp; /* which tty */
{
/* The line is closed; optionally hang up. */
rs232_t *rs = tp->tty_priv;
if (tp->tty_termios.c_cflag & HUPCL) {
outb(rs->modem_ctl_port, MC_OUT2 | MC_RTS);
}
}
/* Low level (interrupt) routines. */
#if (MACHINE == IBM_PC)
/*==========================================================================*
* rs232_handler *
*==========================================================================*/
PRIVATE int rs232_handler(hook)
irq_hook_t *hook;
{
/* Interrupt hander for RS232. */
register rs232_t *rs = structof(rs232_t, hook, hook);
while (TRUE) {
/* Loop to pick up ALL pending interrupts for device.
* This usually just wastes time unless the hardware has a buffer
* (and then we have to worry about being stuck in the loop too long).
* Unfortunately, some serial cards lock up without this.
*/
switch (inb(rs->int_id_port)) {
case IS_RECEIVER_READY:
in_int(rs);
continue;
case IS_TRANSMITTER_READY:
out_int(rs);
continue;
case IS_MODEM_STATUS_CHANGE:
modem_int(rs);
continue;
case IS_LINE_STATUS_CHANGE:
line_int(rs);
continue;
}
return(1); /* reenable serial interrupt */
}
}
#endif /* MACHINE == IBM_PC */
#if (MACHINE == ATARI)
/*==========================================================================*
* siaint *
*==========================================================================*/
PRIVATE void siaint(type)
int type; /* interrupt type */
{
/* siaint is the rs232 interrupt procedure for Atari ST's. For ST there are
* as much as 5 interrupt lines used for rs232. The trap type byte left on the
* stack by the assembler interrupt handler identifies the interrupt cause.
*/
register unsigned char code;
register rs232_t *rs = &rs_lines[0];
int s = lock();
switch (type & 0x00FF)
{
case 0x00: /* receive buffer full */
in_int(rs);
break;
case 0x01: /* receive error */
line_int(rs);
break;
case 0x02: /* transmit buffer empty */
out_int(rs);
break;
case 0x03: /* transmit error */
code = MFP->mf_tsr;
if (code & ~(T_ENA | T_UE | T_EMPTY))
{
printf("sia: transmit error: status=%x\r\n", code);
/* MFP->mf_udr = lastchar; */ /* retry */
}
break;
case 0x04: /* modem lines change */
modem_int(rs);
break;
}
restore(s);
}
#endif /* MACHINE == ATARI */
/*==========================================================================*
* in_int *
*==========================================================================*/
PRIVATE void in_int(rs)
register rs232_t *rs; /* line with input interrupt */
{
/* Read the data which just arrived.
* If it is the oxoff char, clear OSWREADY, else if OSWREADY was clear, set
* it and restart output (any char does this, not just xon).
* Put data in the buffer if room, otherwise discard it.
* Set a flag for the clock interrupt handler to eventually notify TTY.
*/
int c;
#if (MACHINE == IBM_PC)
c = inb(rs->recv_port);
#else /* MACHINE == ATARI */
c = MFP->mf_udr;
#endif
if (!(rs->ostate & ORAW)) {
if (c == rs->oxoff) {
rs->ostate &= ~OSWREADY;
} else
if (!(rs->ostate & OSWREADY)) {
rs->ostate |= OSWREADY;
if (txready(rs)) out_int(rs);
}
}
if (rs->icount == buflen(rs->ibuf)) return; /* input buffer full, discard */
if (++rs->icount == RS_IHIGHWATER && rs->idevready) istop(rs);
*rs->ihead = c;
if (++rs->ihead == bufend(rs->ibuf)) rs->ihead = rs->ibuf;
if (rs->icount == 1) {
rs->tty->tty_events = 1;
force_timeout();
}
}
/*==========================================================================*
* line_int *
*==========================================================================*/
PRIVATE void line_int(rs)
register rs232_t *rs; /* line with line status interrupt */
{
/* Check for and record errors. */
#if (MACHINE == IBM_PC)
rs->lstatus = inb(rs->line_status_port);
#else /* MACHINE == ATARI */
rs->lstatus = MFP->mf_rsr;
MFP->mf_rsr &= R_ENA;
rs->pad = MFP->mf_udr; /* discard char in case of LS_OVERRUN_ERR */
#endif /* MACHINE == ATARI */
if (rs->lstatus & LS_FRAMING_ERR) ++rs->framing_errors;
if (rs->lstatus & LS_OVERRUN_ERR) ++rs->overrun_errors;
if (rs->lstatus & LS_PARITY_ERR) ++rs->parity_errors;
if (rs->lstatus & LS_BREAK_INTERRUPT) ++rs->break_interrupts;
}
/*==========================================================================*
* modem_int *
*==========================================================================*/
PRIVATE void modem_int(rs)
register rs232_t *rs; /* line with modem interrupt */
{
/* Get possibly new device-ready status, and clear ODEVREADY if necessary.
* If the device just became ready, restart output.
*/
#if (MACHINE == ATARI)
/* Set active edge interrupt so that next change causes a new interrupt */
MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^
(MFP->mf_gpip & (IO_SCTS|IO_SDCD));
#endif
if (devhup(rs)) {
rs->ostate |= ODEVHUP;
rs->tty->tty_events = 1;
force_timeout();
}
if (!devready(rs))
rs->ostate &= ~ODEVREADY;
else if (!(rs->ostate & ODEVREADY)) {
rs->ostate |= ODEVREADY;
if (txready(rs)) out_int(rs);
}
}
/*==========================================================================*
* out_int *
*==========================================================================*/
PRIVATE void out_int(rs)
register rs232_t *rs; /* line with output interrupt */
{
/* If there is output to do and everything is ready, do it (local device is
* known ready).
* Notify TTY when the buffer goes empty.
*/
if (rs->ostate >= (ODEVREADY | OQUEUED | OSWREADY)) {
/* Bit test allows ORAW and requires the others. */
#if (MACHINE == IBM_PC)
outb(rs->xmit_port, *rs->otail);
#else /* MACHINE == ATARI */
MFP->mf_udr = *rs->otail;
#endif
if (++rs->otail == bufend(rs->obuf)) rs->otail = rs->obuf;
if (--rs->ocount == 0) {
rs->ostate ^= (ODONE | OQUEUED); /* ODONE on, OQUEUED off */
rs->tty->tty_events = 1;
force_timeout();
} else
if (rs->ocount == RS_OLOWWATER) { /* running low? */
rs->tty->tty_events = 1;
force_timeout();
}
}
}
#endif /* NR_RS_LINES > 0 */

1812
drivers/tty/tty.c Normal file

File diff suppressed because it is too large Load Diff

154
drivers/tty/tty.h Normal file
View File

@@ -0,0 +1,154 @@
/* tty.h - Terminals */
#include <timers.h>
#define TTY_IN_BYTES 256 /* tty input queue size */
#define TAB_SIZE 8 /* distance between tab stops */
#define TAB_MASK 7 /* mask to compute a tab stop position */
#define ESC '\33' /* escape */
#define O_NOCTTY 00400 /* from <fcntl.h>, or cc will choke */
#define O_NONBLOCK 04000
struct tty;
typedef _PROTOTYPE( void (*devfun_t), (struct tty *tp) );
typedef _PROTOTYPE( void (*devfunarg_t), (struct tty *tp, int c) );
typedef struct tty {
int tty_events; /* set when TTY should inspect this line */
int tty_index; /* index into TTY table */
/* Input queue. Typed characters are stored here until read by a program. */
u16_t *tty_inhead; /* pointer to place where next char goes */
u16_t *tty_intail; /* pointer to next char to be given to prog */
int tty_incount; /* # chars in the input queue */
int tty_eotct; /* number of "line breaks" in input queue */
devfun_t tty_devread; /* routine to read from low level buffers */
devfun_t tty_icancel; /* cancel any device input */
int tty_min; /* minimum requested #chars in input queue */
timer_t tty_tmr; /* the timer for this tty */
/* Output section. */
devfun_t tty_devwrite; /* routine to start actual device output */
devfunarg_t tty_echo; /* routine to echo characters input */
devfun_t tty_ocancel; /* cancel any ongoing device output */
devfun_t tty_break; /* let the device send a break */
/* Terminal parameters and status. */
int tty_position; /* current position on the screen for echoing */
char tty_reprint; /* 1 when echoed input messed up, else 0 */
char tty_escaped; /* 1 when LNEXT (^V) just seen, else 0 */
char tty_inhibited; /* 1 when STOP (^S) just seen (stops output) */
char tty_pgrp; /* slot number of controlling process */
char tty_openct; /* count of number of opens of this tty */
/* Information about incomplete I/O requests is stored here. */
char tty_inrepcode; /* reply code, TASK_REPLY or REVIVE */
char tty_incaller; /* process that made the call (usually FS) */
char tty_inproc; /* process that wants to read from tty */
vir_bytes tty_in_vir; /* virtual address where data is to go */
int tty_inleft; /* how many chars are still needed */
int tty_incum; /* # chars input so far */
int tty_instatus; /* status of last sys_vircopy() action */
char tty_outrepcode; /* reply code, TASK_REPLY or REVIVE */
char tty_outcaller; /* process that made the call (usually FS) */
char tty_outproc; /* process that wants to write to tty */
vir_bytes tty_out_vir; /* virtual address where data comes from */
int tty_outleft; /* # chars yet to be output */
int tty_outcum; /* # chars output so far */
int tty_outstatus; /* status of last sys_vircopy() action */
char tty_iocaller; /* process that made the call (usually FS) */
char tty_ioproc; /* process that wants to do an ioctl */
int tty_ioreq; /* ioctl request code */
vir_bytes tty_iovir; /* virtual address of ioctl buffer */
/* Miscellaneous. */
devfun_t tty_ioctl; /* set line speed, etc. at the device level */
devfun_t tty_close; /* tell the device that the tty is closed */
void *tty_priv; /* pointer to per device private data */
struct termios tty_termios; /* terminal attributes */
struct winsize tty_winsize; /* window size (#lines and #columns) */
u16_t tty_inbuf[TTY_IN_BYTES];/* tty input buffer */
} tty_t;
/* Memory allocated in tty.c, so extern here. */
extern tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS];
extern int ccurrent; /* currently visible console */
/* Values for the fields. */
#define NOT_ESCAPED 0 /* previous character is not LNEXT (^V) */
#define ESCAPED 1 /* previous character was LNEXT (^V) */
#define RUNNING 0 /* no STOP (^S) has been typed to stop output */
#define STOPPED 1 /* STOP (^S) has been typed to stop output */
/* Fields and flags on characters in the input queue. */
#define IN_CHAR 0x00FF /* low 8 bits are the character itself */
#define IN_LEN 0x0F00 /* length of char if it has been echoed */
#define IN_LSHIFT 8 /* length = (c & IN_LEN) >> IN_LSHIFT */
#define IN_EOT 0x1000 /* char is a line break (^D, LF) */
#define IN_EOF 0x2000 /* char is EOF (^D), do not return to user */
#define IN_ESC 0x4000 /* escaped by LNEXT (^V), no interpretation */
/* Times and timeouts. */
#define force_timeout() ((void) (0))
/* Memory allocated in tty.c, so extern here. */
extern timer_t *tty_timers; /* queue of TTY timers */
extern clock_t tty_next_timeout; /* next TTY timeout */
/* Number of elements and limit of a buffer. */
#define buflen(buf) (sizeof(buf) / sizeof((buf)[0]))
#define bufend(buf) ((buf) + buflen(buf))
/* Memory allocated in tty.c, so extern here. */
extern struct kenviron kenv; /* kernel environment (a.o.: pc_at, ega) */
/* Function prototypes for TTY driver. */
/* tty.c */
_PROTOTYPE( void handle_events, (struct tty *tp) );
_PROTOTYPE( void sigchar, (struct tty *tp, int sig) );
_PROTOTYPE( void tty_task, (void) );
_PROTOTYPE( int in_process, (struct tty *tp, char *buf, int count) );
_PROTOTYPE( void out_process, (struct tty *tp, char *bstart, char *bpos,
char *bend, int *icount, int *ocount) );
_PROTOTYPE( void tty_wakeup, (clock_t now) );
_PROTOTYPE( void tty_reply, (int code, int replyee, int proc_nr,
int status) );
_PROTOTYPE( void tty_devnop, (struct tty *tp) );
/* rs232.c */
_PROTOTYPE( void rs_init, (struct tty *tp) );
#if (CHIP == INTEL)
/* console.c */
_PROTOTYPE( void kputc, (int c) );
_PROTOTYPE( void cons_stop, (void) );
_PROTOTYPE( void do_new_kmess, (message *m) );
_PROTOTYPE( void do_diagnostics, (message *m) );
_PROTOTYPE( void scr_init, (struct tty *tp) );
_PROTOTYPE( void toggle_scroll, (void) );
_PROTOTYPE( int con_loadfont, (message *m) );
_PROTOTYPE( void select_console, (int cons_line) );
/* keyboard.c */
_PROTOTYPE( void kb_init, (struct tty *tp) );
_PROTOTYPE( int kbd_loadmap, (message *m) );
_PROTOTYPE( void do_panic_dumps, (message *m) );
_PROTOTYPE( void do_fkey_ctl, (message *m) );
_PROTOTYPE( void do_interrupt, (message *m) );
/* pty.c */
_PROTOTYPE( void do_pty, (struct tty *tp, message *m_ptr) );
_PROTOTYPE( void pty_init, (struct tty *tp) );
/* vidcopy.s */
_PROTOTYPE( void vid_vid_copy, (unsigned src, unsigned dst, unsigned count));
_PROTOTYPE( void mem_vid_copy, (u16_t *src, unsigned dst, unsigned count));
#endif /* (CHIP == INTEL) */

160
drivers/tty/vidcopy.s Normal file
View File

@@ -0,0 +1,160 @@
#
! This file contains two specialized assembly code routines to update the
! video memory. The routines can copy from user to video memory, or from
! video to video memory.
! sections
.sect .text; .sect .rom; .sect .data; .sect .bss
! exported functions
.define _mem_vid_copy ! copy data to video ram
.define _vid_vid_copy ! move data in video ram
! The routines only guarantee to preserve the registers the C compiler
! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and
! direction bit in the flags).
.sect .text
!*===========================================================================*
!* mem_vid_copy *
!*===========================================================================*
! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);
!
! Copy count characters from kernel memory to video memory. Src is an ordinary
! pointer to a word, but dst and count are character (word) based video offset
! and count. If src is null then screen memory is blanked by filling it with
! blank_color.
_mem_vid_copy:
push ebp
mov ebp, esp
push esi
push edi
push es
mov esi, 8(ebp) ! source
mov edi, 12(ebp) ! destination
mov edx, 16(ebp) ! count
mov es, (_vid_seg) ! segment containing video memory
cld ! make sure direction is up
mvc_loop:
and edi, (_vid_mask) ! wrap address
mov ecx, edx ! one chunk to copy
mov eax, (_vid_size)
sub eax, edi
cmp ecx, eax
jbe 0f
mov ecx, eax ! ecx = min(ecx, vid_size - edi)
0: sub edx, ecx ! count -= ecx
shl edi, 1 ! byte address
add edi, (_vid_off) ! in video memory
test esi, esi ! source == 0 means blank the screen
jz mvc_blank
mvc_copy:
rep ! copy words to video memory
o16 movs
jmp mvc_test
mvc_blank:
mov eax, (_blank_color) ! ax = blanking character
rep
o16 stos ! copy blanks to video memory
!jmp mvc_test
mvc_test:
sub edi, (_vid_off)
shr edi, 1 ! back to a word address
test edx, edx
jnz mvc_loop
mvc_done:
pop es
pop edi
pop esi
pop ebp
ret
!*===========================================================================*
!* vid_vid_copy *
!*===========================================================================*
! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);
!
! Copy count characters from video memory to video memory. Handle overlap.
! Used for scrolling, line or character insertion and deletion. Src, dst
! and count are character (word) based video offsets and count.
_vid_vid_copy:
push ebp
mov ebp, esp
push esi
push edi
push es
mov esi, 8(ebp) ! source
mov edi, 12(ebp) ! destination
mov edx, 16(ebp) ! count
mov es, (_vid_seg) ! segment containing video memory
cmp esi, edi ! copy up or down?
jb vvc_down
vvc_up:
cld ! direction is up
vvc_uploop:
and esi, (_vid_mask) ! wrap addresses
and edi, (_vid_mask)
mov ecx, edx ! one chunk to copy
mov eax, (_vid_size)
sub eax, esi
cmp ecx, eax
jbe 0f
mov ecx, eax ! ecx = min(ecx, vid_size - esi)
0: mov eax, (_vid_size)
sub eax, edi
cmp ecx, eax
jbe 0f
mov ecx, eax ! ecx = min(ecx, vid_size - edi)
0: sub edx, ecx ! count -= ecx
call vvc_copy ! copy video words
test edx, edx
jnz vvc_uploop ! again?
jmp vvc_done
vvc_down:
std ! direction is down
lea esi, -1(esi)(edx*1) ! start copying at the top
lea edi, -1(edi)(edx*1)
vvc_downloop:
and esi, (_vid_mask) ! wrap addresses
and edi, (_vid_mask)
mov ecx, edx ! one chunk to copy
lea eax, 1(esi)
cmp ecx, eax
jbe 0f
mov ecx, eax ! ecx = min(ecx, esi + 1)
0: lea eax, 1(edi)
cmp ecx, eax
jbe 0f
mov ecx, eax ! ecx = min(ecx, edi + 1)
0: sub edx, ecx ! count -= ecx
call vvc_copy
test edx, edx
jnz vvc_downloop ! again?
cld ! C compiler expects up
!jmp vvc_done
vvc_done:
pop es
pop edi
pop esi
pop ebp
ret
! Copy video words. (Inner code of both the up and downcopying loop.)
vvc_copy:
shl esi, 1
shl edi, 1 ! byte addresses
add esi, (_vid_off)
add edi, (_vid_off) ! in video memory
rep
eseg o16 movs ! copy video words
sub esi, (_vid_off)
sub edi, (_vid_off)
shr esi, 1
shr edi, 1 ! back to word addresses
ret