#include <exec/types.h>
#include <devices/keymap.h>
#include <libraries/dos.h>
#include "keymap.h"

UBYTE replacements[] =
{ 0,1,2,3,4,5,6,7,8,9,10,11,12,16,17,21,26,27,32,41,42,43,49,55,56,57,58,QR };
UBYTE qual_repl[] = { 0,8,12,26,27,42,43 };

ULONG *fi_map[] = {
    KEY('\xb0','`','~','`'),
    KEY('!','1','!','1'),
    KEY('@','2','"','2'),
    KEY('#','3','£','3'),
    KEY('\\','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('&','7','/','7'),
    KEY('*','8','(','8'),
    KEY('(','9',')','9'),
    KEY(')','0','=','0'),
    KEY('_','-','?','+'),
    KEY('+','=','`','\x27'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('\xc5','\xe5','{','['),
    KEY('^','\xa8','}',']'),
    STR(&akey),
    KEY(':','\x2c','\xd6','\xf6'),
    KEY('"','\x27','\xC4','\xE4'),
    KEY('\xdc','\xfc','*','\x27'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY('<',',',';',','),
    KEY('>','.',':','.'),
    KEY('?','/','_','-'),
    VAL(0) };

ULONG *ag_map[] = {
    KEY('\xb0','~','^','~'),
    KEY('!','1','!','1'),
    KEY('"','2','"','2'),
    KEY('\xa7','3','\xa7','3'),
    KEY('$','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('{','6','&','6'),
    KEY('}','7','/','7'),
    KEY('(','8','(','8'),
    KEY(')','9',')','9'),
    KEY('=','0','=','0'),
    KEY('?','\xdf','?','\xdf'),
    STR(&rlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Z','z'),
    KEY('\xdc','\xfc','\\','@'),
    KEY('*','+','*','+'),
    STR(&akey),
    KEY('\xd5','\xf5','\xd5','\xf5'),
    KEY('\xc4','\xe4','[',']'),
    KEY('\x27','#','\x27','#'),
    KEY('\xac','\xb1','Y','y'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(PLEQ) };

ULONG *bf_map[] = {
    STR(&laacc),
    KEY('1','~','1','&'),
    KEY('2','\xe9','2','\xe9'),
    KEY('3','"','3','"'),
    KEY('4','\x27','4','\x27'),
    KEY('\x1e','\x1d','5','('),
    KEY('{','[','6','\xa7'),
    KEY('}',']','7','\xe8'),
    KEY('8','^','8','!'),
    KEY('9','\xe7','9','\xe7'),
    KEY('0','\xc1','0','\xc1'),
    KEY('\xb0',')','\xb0',')'),
    KEY('_','-','_','-'),
    STR(&akey),
    KEY('\xb0','\xb0','Z','z'),
    KEY('\xa5','\xa4','Y','y'),
    STR(&hdacc),
    KEY('*','£','*','$'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('M','m','M','m'),
    KEY('%','\\','%','\xdc'),
    KEY('@','#','@','#'),
    KEY('\xac','\xb1','W','w'),
    KEY('\xbf','\xb8','?',','),
    KEY('.',';','.',';'),
    KEY('/',':','/',':'),
    KEY('+','=','+','='),
    VAL(CORN|UFCR|AQSW) };

ULONG *br_map[] = {
    STR(&aoacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('#','3','£','3'),
    KEY('$','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('\x27','7','\x27','7'),
    KEY('(','8','(','8'),
    KEY(')','9',')','9'),
    KEY('=','0','=','0'),
    KEY('_','-','_','-'),
    KEY('\xc5','\xc6','\xc5','\xc6'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('\\','|','\xa7','@'),
    KEY('[',']','[',']'),
    STR(&akey),
    KEY('+',';','+',';'),
    KEY('{','}','*',':'),
    STR(&hlacc),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(',',',',',',','),
    KEY('.','.','.','.'),
    KEY('?','/','?','/'),
    VAL(CORN|LNCR) };

ULONG *cf_map[] = {
    STR(&aoacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('/','3','/','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','?','6'),
    KEY('&','7','&','7'),
    KEY('*','8','*','8'),
    KEY('{','9','(','9'),
    KEY('}','0',')','0'),
    KEY('_','-','_','-'),
    KEY('+','=','+','='),
    STR(&akey),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('[',']','\xc7','\xe7'),
    KEY('@','#','@','#'),
    KEY('\xc5','\xe5','Q','q'),
    KEY(':',';',':',';'),
    STR(&hdacc),
    KEY('|','\\','|','\\'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY('\x27',',','\x27',','),
    KEY('.','.','.','.'),
    KEY('\xc8','\xe8','\xc8','\xe8'),
    VAL(CORN|LFCR|AQSW) };

ULONG *dn_map[] = {
    STR(&aoacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('@','3','\xa7','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('{','8','(','8'),
    KEY('}','9',')','9'),
    KEY('=','0','=','0'),
    KEY('{','}','?','+'),
    STR(&rlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('[',']','\xc5','\xe5'),
    STR(&dhacc),
    STR(&akey),
    KEY('\xc6','\xe6','\xc6','\xe6'),
    KEY('\\','#','\xd8','\xf8'),
    KEY('*','\x27','*','\x27'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(CORN|PLEQ|UNCR) };

ULONG *du_map[] = {
    STR(&aoacc),
    KEY('1','\xbc','1','\xbc'),
    KEY('[','2','\xbd','2'),
    KEY(']','3','£','3'),
    KEY('$','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','#','6'),
    KEY('&','7','&','7'),
    KEY('(','8','(','8'),
    KEY(')','9',')','9'),
    KEY('\\','0','\xa7','0'),
    KEY('"','\x27','"','\x27'),
    KEY(':','/',':','/'),
    KEY('\xc5','\xe5','q','Q'),
    KEY('\xb0','\xb0','w','W'),
    KEY('\xa5','\xa4','y','Y'),
    STR(&hlacc),
    KEY('~','*','!','*'),
    STR(&akey),
    KEY('_','-','_','-'),
    KEY('`','\x27','`','\x27'),
    KEY('|','@','|','@'),
    KEY('\xac','\xb1','z','Z'),
    KEY('\xbf','\xb8','m','M'),
    KEY('?',',','?',','),
    KEY(';','.',';','.'),
    KEY('+','=','+','='),
    VAL(CORN|UFCR) };

ULONG *fl_map[] = {
    STR(&laacc),
    KEY('1','~','1','&'),
    KEY('2','\xc8','2','\xc8'),
    KEY('3','^','3','"'),
    KEY('4','\x27','4','\x27'),
    KEY('\x1e','\x1d','5','('),
    KEY('6','[','6','\xa7'),
    KEY('7',']','7','\xe8'),
    KEY('8','!','8','!'),
    KEY('{','\xe7','9','\xe7'),
    KEY('}','\xc1','0','\xc1'),
    KEY('\xb0',')','\xb0',')'),
    KEY('_','-','_','-'),
    STR(&akey),
    KEY('\xb0','\xb0','Z','z'),
    KEY('\xa5','\xa4','Y','y'),
    STR(&hdacc),
    KEY('*','£','*','$'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('M','m','M','m'),
    KEY('%','\\','%','\xfc'),
    KEY('@','#','@','#'),
    KEY('\xac','\xb1','W','w'),
    KEY('\xbf','\xb8','?',','),
    KEY('.',';','.',';'),
    KEY('/',':','/',':'),
    KEY('+','=','+','='),
    VAL(CORN|UFCR|AQSW) };

ULONG *ic_map[] = {
    STR(&lhacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('#','3','#','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('(','8','(','8'),
    KEY(')','9',')','9'),
    KEY('=','0','=','0'),
    KEY('\xd6','\xf6','\xd6','\xf6'),
    KEY('_','-','_','-'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('@','\\','@','\\'),
    KEY('?','\x27','?','\x27'),
    STR(&akey),
    KEY('{','}','[',']'),
    KEY('`','\x27','`','\x27'),
    KEY('*','+','*','+'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('\xd8','\xf8','\xd8','\xf8'),
    VAL(CORN) };

ULONG *it_map[] = {
    STR(&laacc),
    KEY('1','@','1','£'),
    KEY('2','#','2','\xe9'),
    KEY('3','~','3','"'),
    KEY('4','\x27','4','\x27'),
    KEY('\x1e','\x1d','5','('),
    KEY('6','^','6','_'),
    KEY('7','\xe8','7','\xe8'),
    STR(&ital8),
    KEY('9','[','9','\xe7'),
    KEY('0',']','0','\xe0'),
    KEY('\xb0',')','\xb0',')'),
    KEY('+','-','+','-'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','Z','z'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('{','}','=','\xed'),
    KEY('&','$','&','$'),
    STR(&akey),
    KEY('M','m','M','m'),
    KEY('%','\xfa','%','\xfa'),
    KEY('\\','*','\xa7','*'),
    KEY('\xac','\xb1','W','w'),
    KEY('\xbf','\xb8','?',','),
    KEY('.',';','.',';'),
    KEY('/',':','/',':'),
    KEY('!','\xf3','!','\xf3'),
    VAL(CORN|ITA8) };

ULONG *no_map[] = {
    STR(&aoacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('@','3','\xa7','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('{','8','(','8'),
    KEY('}','9',')','9'),
    KEY('=','0','=','0'),
    KEY('{','}','?','+'),
    STR(&rlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('[',']','\xc5','\xe5'),
    STR(&dhacc),
    STR(&akey),
    KEY('\xd8','\xf8','\xd8','\xf8'),
    KEY('\\','#','\xc6','\xe6'),
    KEY('*','\x27','*','\x27'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(CORN|PLEQ|UNCR) };

ULONG *po_map[] = {
    KEY('\xb0','\\','|','\\'),
    KEY('~','1','!','1'),
    KEY('@','2','@','2'),
    KEY('#','3','#','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','"','6'),
    KEY('&','7','&','7'),
    KEY('*','8','*','8'),
    KEY('(','9','(','9'),
    KEY(')','0',')','0'),
    KEY('_','-','_','-'),
    KEY('+','=','+','='),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    STR(&rlacc),
    KEY('}',']','}',']'),
    STR(&akey),
    KEY('\xc7','\xe7','\xc7','\xe7'),
    STR(&ahacc),
    KEY('{','[','{','['),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('?','/','?','/'),
    VAL(UFCR|LFCR) };

ULONG *sp_map[] = {
    KEY('\xa1','\xbf','\\','@'),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('\xb0','3','#','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('{','8','(','8'),
    KEY('}','9',')','9'),
    KEY('=','0','=','0'),
    KEY('?','\x27','?','\x27'),
    KEY('[',']','\xb1','\xba'),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    STR(&lhacc),
    KEY('*','+','*','+'),
    STR(&akey),
    KEY('\xd1','\xf1','\xd1','\xf1'),
    STR(&rdacc),
    STR(&caacc),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(UFCR|LFCR|LNCR) };

ULONG *sw_map[] = {
    STR(&aoacc),
    KEY('~','1','!','1'),
    KEY('"','2','"','2'),
    KEY('@','3','\xa7','3'),
    KEY('£','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('(','8','(','8'),
    KEY(')','9',')','9'),
    KEY('=','0','=','0'),
    KEY('?','+','?','+'),
    STR(&hlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('[',']','\xc5','\xe5'),
    KEY('\\','#','\xdc','\xfc'),
    STR(&akey),
    KEY('{','}','\xd6','\xf6'),
    KEY('£','|','\xc4','\xe4'),
    KEY('*','\x27','*','\x27'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(CORN|PLEQ) };

ULONG *sf_map[] = {
    KEY('\xb0','!','\xb0','!'),
    KEY('~','1','+','1'),
    KEY('"','2','"','2'),
    KEY('#','3','*','3'),
    KEY('@','4','\xe7','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('{','8','(','8'),
    KEY('}','9',')','9'),
    KEY('=','0','=','0'),
    KEY('{','}','?','\x27'),
    STR(&hlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Z','z'),
    KEY('\\','\xe9','\xfc','\xe9'),
    STR(&daacc),
    STR(&akey),
    KEY('[','\xe8','\xf6','\xe8'),
    KEY(']','\xe1','\xe4','\xe1'),
    KEY('#','$','£','$'),
    KEY('\xac','\xb1','Y','y'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(PLEQ|UNCR) };

ULONG *sg_map[] = {
    KEY('\xb0','!','\xb0','!'),
    KEY('~','1','+','1'),
    KEY('"','2','"','2'),
    KEY('#','3','*','3'),
    KEY('@','4','\xe7','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','&','6'),
    KEY('/','7','/','7'),
    KEY('{','8','(','8'),
    KEY('}','9',')','9'),
    KEY('=','0','=','0'),
    KEY('{','}','?','\x27'),
    STR(&hlacc),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Z','z'),
    KEY('\\','\xfc','\xe9','\xfc'),
    STR(&daacc),
    STR(&akey),
    KEY('[','\xf6','\xe8','\xf6'),
    KEY(']','\xe4','\xe1','\xe4'),
    KEY('#','$','#','$'),
    KEY('\xac','\xb1','Y','y'),
    KEY('\xbf','\xb8','M','m'),
    KEY(';',',',';',','),
    KEY(':','.',':','.'),
    KEY('_','-','_','-'),
    VAL(PLEQ|UNCR) };

ULONG *us_map[] = {
    KEY('~','`','~','`'),
    KEY('!','1','!','1'),
    KEY('\xb0','2','@','2'),
    KEY('£','3','#','3'),
    KEY('$','4','$','4'),
    KEY('\x1e','\x1d','%','5'),
    KEY('^','6','^','6'),
    KEY('&','7','&','7'),
    KEY('*','8','*','8'),
    KEY('(','9','(','9'),
    KEY(')','0',')','0'),
    KEY('_','-','_','-'),
    KEY('+','=','+','='),
    KEY('\xc5','\xe5','Q','q'),
    KEY('\xb0','\xb0','W','w'),
    KEY('\xa5','\xa4','Y','y'),
    KEY('{','[','{','['),
    KEY('}',']','}',']'),
    STR(&akey),
    KEY(':',';',':',';'),
    KEY('"','\x27','"','\x27'),
    KEY('|','\\','|','\\'),
    KEY('\xac','\xb1','Z','z'),
    KEY('\xbf','\xb8','M','m'),
    KEY(',',',',',',','),
    KEY('.','.','.','.'),
    KEY('?','/','?','/'),
    VAL(0) };

replace(ULONG **key)
{
register    ULONG   val;
register    USHORT  cnt = 0;

while (replacements[cnt] != QR) {
    lokeymap[replacements[cnt]] = *key++;
    cnt++;
    }
val = (ULONG)*key;
for (cnt = 0; cnt < REPC; cnt++) {
    if (val & (1 << cnt)) lotypes[qual_repl[cnt]] = KCF_SHIFT|KCF_DEAD;
    else lotypes[qual_repl[cnt]] = KCF_SHIFT|KCF_ALT;
    }
if (val & AQSW) {
    lotypes[16] = KCF_SHIFT|KCF_CONTROL|KCF_ALT|KCF_DEAD;
    lotypes[32] = KCF_SHIFT|KCF_CONTROL|KCF_ALT;
    }
else {
    lotypes[16] = KCF_SHIFT|KCF_CONTROL|KCF_ALT;
    lotypes[32] = KCF_SHIFT|KCF_CONTROL|KCF_ALT|KCF_DEAD;
    }
return(0);
}
