changeset 2540:544f59d9b419

Paste support for remaining SC-3000 export characters
author Michael Pavone <pavone@retrodev.com>
date Thu, 28 Nov 2024 21:14:44 -0800
parents a01c30bef250
children fde99836e453
files sms.c
diffstat 1 files changed, 35 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/sms.c	Thu Nov 28 00:58:31 2024 -0800
+++ b/sms.c	Thu Nov 28 21:14:44 2024 -0800
@@ -255,8 +255,13 @@
 		shift = 0x12;
 		cp += '1' - '!';
 	} else if (cp >= 0xE0 && cp <= 0xFC && cp != 0xF7) {
-		//accented latin letters only have a single case
+		//accented latin letters only have a single case (Latin-1 block)
 		cp -= 0xE0 - 0xC0;
+	} else if (cp >= 0x100 && cp <= 0x16D && (cp & 1)) {
+		//accented latin letters only have a single case (Latin Extended-A block)
+		cp &= ~1;
+	} else if (cp >= 0x1CD && cp <= 0x1D4 && !(cp & 1)) {
+		cp--;
 	}
 	switch (cp)
 	{
@@ -348,7 +353,7 @@
 	ACCENTED(0xD5, 0x0E);//Õ
 	ACCENTED(0xD6, 0x52);//Ö
 	//character in font doesn't really look like a phi to me
-	//but Wikipedia lists it as such
+	//but Wikipedia lists it as such and it's between other Greek chars
 	case 0x3A6: //Φ
 	ACCENTED(0xD8, 0x54);//Ø
 	ACCENTED(0xD9, 0x43);//Ù
@@ -356,6 +361,22 @@
 	ACCENTED(0xDB, 0x3D);//Û
 	ACCENTED(0xDC, 0x42);//Ü
 	GRAPHIC(0xF7, 0x0E);//÷
+	//Latin Extended-A
+	ACCENTED(0x100, 0x2B);//Ā
+	case 0x1CD: //Ǎ
+	ACCENTED(0x102, 0x1E);//Ă
+	ACCENTED(0x112, 0x36);//Ē
+	case 0x11A: //Ě
+	ACCENTED(0x114, 0x25);//Ĕ
+	ACCENTED(0x12A, 0x4A);//Ī
+	case 0x1CF: //Ǐ
+	ACCENTED(0x12C, 0x46);//Ĭ
+	case 0x1D1: //Ǒ
+	ACCENTED(0x14E, 0x4E);//Ŏ
+	ACCENTED(0x16A, 0x41);//Ū
+	case 0x1D3: //Ǔ
+	ACCENTED(0x16C, 0x3E);//Ŭ
+	//Greek and Coptic
 	ACCENTED(0x3A3, 0x5B);//Σ
 	ACCENTED(0x3A9, 0x3A);//Ω
 	ACCENTED(0x3B1, 0x34);//α
@@ -463,7 +484,18 @@
 {
 	const char *paste = sms->header.paste_buffer + sms->header.paste_cur_char;
 	int cp = utf8_codepoint(&paste);
-	cp_keys keys = cp_to_keys(cp);
+	cp_keys keys = {0};
+	if (cp == 'N' || cp == 'n') {
+		const char *tmp = paste;
+		int next = utf8_codepoint(&tmp);
+		if (next == 0x302) {
+			keys = (cp_keys){0x35, 0x81};//N̂  (N with circumflex above)
+			paste = tmp;
+		}
+	}
+	if (!keys.main) {
+		keys = cp_to_keys(cp);
+	}
 	if (!keys.main) {
 		advance_paste_buffer(sms, paste);
 		return 0;