changeset 2541:fde99836e453

Impelement SC-3000 katakana pasting
author Michael Pavone <pavone@retrodev.com>
date Thu, 28 Nov 2024 23:23:12 -0800
parents 544f59d9b419
children 062f0ac1fe7e
files sms.c
diffstat 1 files changed, 106 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/sms.c	Thu Nov 28 21:14:44 2024 -0800
+++ b/sms.c	Thu Nov 28 23:23:12 2024 -0800
@@ -244,6 +244,10 @@
 #define ACCENTED(cp, sc) case cp: return (cp_keys){sc, 0x81}
 #define GRAPHIC(cp, sc) case cp: return (cp_keys){sc, .before=0x11, .after=0x11}
 #define SHIFTED_GRAPHIC(cp, sc) case cp: return (cp_keys){sc, 0x12, .before=0x11, .after=0x11}
+#define KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x81}
+#define SHIFTED_KANA(cp, sc) case cp: return (cp_keys){sc, 0x12, .before=0x81, .after=0x81}
+#define DAKUTEN_KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x85}
+#define MARU_KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x54}
 
 static cp_keys cp_to_keys(int cp)
 {
@@ -441,6 +445,104 @@
 	GRAPHIC(0x2663, 0x3D);//♣
 	GRAPHIC(0x2665, 0x2E);//♥
 	GRAPHIC(0x2666, 0x36);//♦
+	//CJK Punctuation
+	SHIFTED_KANA(0x3002, 0x49);//。
+	SHIFTED_KANA(0x300C, 0x54);//「
+	SHIFTED_KANA(0x300D, 0x5B);//」
+	//Hiragana (for diacritics shared with Katakana)
+	case 0xFF9E://゙ (half-width)
+	case 0x3099:// (combining)
+	KANA(0x309B, 0x85);//゛
+	case 0xFF9F://゚ (half-width)
+	case 0x309A:// (combining)
+	KANA(0x309C, 0x54);//゜
+	//Katakana
+	SHIFTED(0x30A0, 0x4E);//Katakana double hyphen, translate to =
+	case 0x30A1://ァ
+	KANA(0x30A2, 0x26);//ア
+	case 0x30A3://ィ
+	KANA(0x30A4, 0x24);//イ
+	case 0x30A5://ゥ
+	KANA(0x30A6, 0x25);//ウ
+	case 0x30A7://ェ
+	KANA(0x30A8, 0x2E);//エ
+	case 0x30A9://ォ
+	KANA(0x30AA, 0x36);//オ
+	case 0x30F5://ヵ
+	KANA(0x30AB, 0x2C);//カ
+	DAKUTEN_KANA(0x30AC, 0x2C);//ガ
+	KANA(0x30AD, 0x34);//キ
+	DAKUTEN_KANA(0x30AE, 0x34);//ギ
+	KANA(0x30AF, 0x33);//ク
+	DAKUTEN_KANA(0x30B0, 0x33);//グ
+	case 0x30F6://ヶ
+	KANA(0x30B1, 0x52);//ケ
+	DAKUTEN_KANA(0x30B2, 0x52);//ゲ
+	KANA(0x30B3, 0x32);//コ
+	DAKUTEN_KANA(0x30B4, 0x32);//ゴ
+	KANA(0x30B5, 0x22);//サ
+	DAKUTEN_KANA(0x30B6, 0x22);//ザ
+	KANA(0x30B7, 0x23);//シ
+	DAKUTEN_KANA(0x30B8, 0x23);//ジ
+	KANA(0x30B9, 0x2D);//ス
+	DAKUTEN_KANA(0x30BA, 0x2D);//ズ
+	KANA(0x30BB, 0x4D);//セ
+	DAKUTEN_KANA(0x30BC, 0x4D);//ゼ
+	KANA(0x30BD, 0x21);//ソ
+	DAKUTEN_KANA(0x30BE, 0x21);//ゾ
+	KANA(0x30BF, 0x15);//タ
+	DAKUTEN_KANA(0x30C0, 0x15);//ダ
+	KANA(0x30C1, 0x1C);//チ
+	DAKUTEN_KANA(0x30C2, 0x1C);//ヂ
+	case 0x30C3://ッ
+	KANA(0x30C4, 0x1A);//ツ
+	DAKUTEN_KANA(0x30C5, 0x1A);//ヅ
+	KANA(0x30C6, 0x1D);//テ
+	DAKUTEN_KANA(0x30C7, 0x1D);//デ
+	KANA(0x30C8, 0x1B);//ト
+	DAKUTEN_KANA(0x30C9, 0x1B);//ド
+	KANA(0x30CA, 0x3C);//ナ
+	KANA(0x30CB, 0x43);//ニ
+	KANA(0x30CC, 0x16);//ヌ
+	KANA(0x30CD, 0x41);//ネ
+	KANA(0x30CE, 0x42);//ノ
+	KANA(0x30CF, 0x2B);//ハ
+	DAKUTEN_KANA(0x30D0, 0x2B);//バ
+	MARU_KANA(0x30D1, 0x2B);//パ
+	KANA(0x30D2, 0x2A);//ヒ
+	DAKUTEN_KANA(0x30D3, 0x2A);//ビ
+	MARU_KANA(0x30D4, 0x2A);//ピ
+	KANA(0x30D5, 0x1E);//フ
+	DAKUTEN_KANA(0x30D6, 0x1E);//ブ
+	MARU_KANA(0x30D7, 0x1E);//プ
+	KANA(0x30D8, 0x55);//ヘ
+	DAKUTEN_KANA(0x30D9,0x55);//ベ
+	MARU_KANA(0x30DA, 0x55);//ペ
+	KANA(0x30DB, 0x4E);//ホ
+	DAKUTEN_KANA(0x30DC,0x4E);//ボ
+	MARU_KANA(0x30DD, 0x4E);//ポ
+	KANA(0x30DE, 0x3B);//マ
+	KANA(0x30DF, 0x31);//ミ
+	KANA(0x30E0, 0x5B);//ム
+	KANA(0x30E1, 0x4A);//メ
+	KANA(0x30E2, 0x3A);//モ
+	case 0x30E3://ャ
+	KANA(0x30E4, 0x3D);//ヤ
+	case 0x30E5://ュ
+	KANA(0x30E6, 0x3E);//ユ
+	case 0x30E7://ョ
+	KANA(0x30E8, 0x46);//ヨ
+	KANA(0x30E9, 0x44);//ラ
+	KANA(0x30EA, 0x4B);//リ
+	KANA(0x30EB, 0x49);//ル
+	KANA(0x30EC, 0x4C);//レ
+	KANA(0x30ED, 0x0E);//ロ
+	case 0x30EE://ヮ
+	KANA(0x30EF, 0x45);//ワ
+	SHIFTED_KANA(0x30F2, 0x45);//ヲ
+	KANA(0x30F3, 0x35);//ン
+	SHIFTED_KANA(0x30FB, 0x4A);//・
+	KANA(0x30FC, 0x5D);//ー
 	//Miscellaneous Symbos and Pictographs
 	GRAPHIC(0x1F47E, 0x42);//👾
 	//Transport and Map Symbols
@@ -556,6 +658,10 @@
 	case PASTE_AFTER_UP:
 		sms->header.keyboard_up(&sms->header, keys.after);
 		sms->paste_state = PASTE_BEFORE;
+		if (keys.before == 0x81 && (keys.after == 0x85 || keys.after == 0x54)) {
+			//special handling for DAKUTEN_KANA and MARU_KANA
+			sms->paste_toggle = keys.before;
+		}
 		advance_paste_buffer(sms, paste);
 		return keys.after;
 	case PASTE_TOGGLE_UP: {