@@ 337,11 337,152 @@ duartstartrs232o(void)
duartrs232intr();
}
+struct latin
+{
+ uchar l;
+ char c[2];
+}latintab[] = {
+ '', "!!", /* spanish initial ! */
+ '', "c|", /* cent */
+ '', "c$", /* cent */
+ '', "l$", /* pound sterling */
+ '', "g$", /* general currency */
+ '', "y$", /* yen */
+ '', "j$", /* yen */
+ '', "||", /* broken vertical bar */
+ '', "SS", /* section symbol */
+ '', "\"\"", /* dieresis */
+ '', "cr", /* copyright */
+ '', "cO", /* copyright */
+ '', "sa", /* super a, feminine ordinal */
+ '', "<<", /* left angle quotation */
+ '', "no", /* not sign, hooked overbar */
+ '', "--", /* soft hyphen */
+ '', "rg", /* registered trademark */
+ '', "__", /* macron */
+ '', "s0", /* degree (sup o) */
+ '', "+-", /* plus-minus */
+ '', "s2", /* sup 2 */
+ '', "s3", /* sup 3 */
+ '', "''", /* grave accent */
+ '', "mu", /* mu */
+ '', "pg", /* paragraph (pilcrow) */
+ '', "..", /* centered . */
+ '', ",,", /* cedilla */
+ '', "s1", /* sup 1 */
+ '', "so", /* sup o */
+ '', ">>", /* right angle quotation */
+ '', "14", /* 1/4 */
+ '', "12", /* 1/2 */
+ '', "34", /* 3/4 */
+ '', "??", /* spanish initial ? */
+ '', "A`", /* A grave */
+ '', "A'", /* A acute */
+ '', "A^", /* A circumflex */
+ '', "A~", /* A tilde */
+ '', "A\"", /* A dieresis */
+ '', "A:", /* A dieresis */
+ '', "Ao", /* A circle */
+ '', "AO", /* A circle */
+ '', "Ae", /* AE ligature */
+ '', "AE", /* AE ligature */
+ '', "C,", /* C cedilla */
+ '', "E`", /* E grave */
+ '', "E'", /* E acute */
+ '', "E^", /* E circumflex */
+ '', "E\"", /* E dieresis */
+ '', "E:", /* E dieresis */
+ '', "I`", /* I grave */
+ '', "I'", /* I acute */
+ '', "I^", /* I circumflex */
+ '', "I\"", /* I dieresis */
+ '', "I:", /* I dieresis */
+ '', "D-", /* Eth */
+ '', "N~", /* N tilde */
+ '', "O`", /* O grave */
+ '', "O'", /* O acute */
+ '', "O^", /* O circumflex */
+ '', "O~", /* O tilde */
+ '', "O\"", /* O dieresis */
+ '', "O:", /* O dieresis */
+ '', "OE", /* O dieresis */
+ '', "Oe", /* O dieresis */
+ '', "xx", /* times sign */
+ '', "O/", /* O slash */
+ '', "U`", /* U grave */
+ '', "U'", /* U acute */
+ '', "U^", /* U circumflex */
+ '', "U\"", /* U dieresis */
+ '', "U:", /* U dieresis */
+ '', "UE", /* U dieresis */
+ '', "Ue", /* U dieresis */
+ '', "Y'", /* Y acute */
+ '', "P|", /* Thorn */
+ '', "Th", /* Thorn */
+ '', "TH", /* Thorn */
+ '', "ss", /* sharp s */
+ '', "a`", /* a grave */
+ '', "a'", /* a acute */
+ '', "a^", /* a circumflex */
+ '', "a~", /* a tilde */
+ '', "a\"", /* a dieresis */
+ '', "a:", /* a dieresis */
+ '', "ao", /* a circle */
+ '', "ae", /* ae ligature */
+ '', "c,", /* c cedilla */
+ '', "e`", /* e grave */
+ '', "e'", /* e acute */
+ '', "e^", /* e circumflex */
+ '', "e\"", /* e dieresis */
+ '', "e:", /* e dieresis */
+ '', "i`", /* i grave */
+ '', "i'", /* i acute */
+ '', "i^", /* i circumflex */
+ '', "i\"", /* i dieresis */
+ '', "i:", /* i dieresis */
+ '', "d-", /* eth */
+ '', "n~", /* n tilde */
+ '', "o`", /* o grave */
+ '', "o'", /* o acute */
+ '', "o^", /* o circumflex */
+ '', "o~", /* o tilde */
+ '', "o\"", /* o dieresis */
+ '', "o:", /* o dieresis */
+ '', "oe", /* o dieresis */
+ '', "-:", /* divide sign */
+ '', "o/", /* o slash */
+ '', "u`", /* u grave */
+ '', "u'", /* u acute */
+ '', "u^", /* u circumflex */
+ '', "u\"", /* u dieresis */
+ '', "u:", /* u dieresis */
+ '', "ue", /* u dieresis */
+ '', "y'", /* y acute */
+ '', "th", /* thorn */
+ '', "p|", /* thorn */
+ '', "y\"", /* y dieresis */
+ '', "y:", /* y dieresis */
+ 0, 0,
+};
+
+int
+latin1(int k1, int k2)
+{
+ int i;
+ struct latin *l;
+
+ for(l=latintab; l->l; l++)
+ if(k1==l->c[0] && k2==l->c[1])
+ return l->l;
+ return 0;
+}
+
void
duartintr(Ureg *ur)
{
int cause, status, c;
Duart *duart;
+ static int kbdstate, k1, k2;
duart = DUARTREG;
cause = duart->is_imr;
@@ 371,11 512,31 @@ duartintr(Ureg *ur)
if(status & PAR_ERR) /* control word: caps lock (0x4) or repeat (0x10) */
kbdrepeat((c&0x10) == 0);
else{
- if(c == 0x7F)
- c = 0xFF; /* VIEW key (bizarre) */
- if(c & 0x80)
- c = keymap[c&0x7F];
- kbdchar(c);
+ if(c == 0x7F) /* VIEW key (bizarre) */
+ c = 0xFF;
+ if(c == 0xB6) /* NUM PAD */
+ kbdstate = 1;
+ else{
+ if(c & 0x80)
+ c = keymap[c&0x7F];
+ switch(kbdstate){
+ case 1:
+ k1 = c;
+ kbdstate = 2;
+ break;
+ case 2:
+ k2 = c;
+ c = latin1(k1, k2);
+ if(c == 0){
+ kbdchar(k1);
+ c = k2;
+ }
+ /* fall through */
+ default:
+ kbdstate = 0;
+ kbdchar(c);
+ }
+ }
}
}
/*