comparison sms.c @ 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
comparison
equal deleted inserted replaced
2539:a01c30bef250 2540:544f59d9b419
253 cp -= 'a' - 'A'; 253 cp -= 'a' - 'A';
254 } else if (cp >= '!' && cp <= ')') { 254 } else if (cp >= '!' && cp <= ')') {
255 shift = 0x12; 255 shift = 0x12;
256 cp += '1' - '!'; 256 cp += '1' - '!';
257 } else if (cp >= 0xE0 && cp <= 0xFC && cp != 0xF7) { 257 } else if (cp >= 0xE0 && cp <= 0xFC && cp != 0xF7) {
258 //accented latin letters only have a single case 258 //accented latin letters only have a single case (Latin-1 block)
259 cp -= 0xE0 - 0xC0; 259 cp -= 0xE0 - 0xC0;
260 } else if (cp >= 0x100 && cp <= 0x16D && (cp & 1)) {
261 //accented latin letters only have a single case (Latin Extended-A block)
262 cp &= ~1;
263 } else if (cp >= 0x1CD && cp <= 0x1D4 && !(cp & 1)) {
264 cp--;
260 } 265 }
261 switch (cp) 266 switch (cp)
262 { 267 {
263 SIMPLE('0', 0x45); 268 SIMPLE('0', 0x45);
264 MAYBE_SHIFT('1', 0x16); 269 MAYBE_SHIFT('1', 0x16);
346 ACCENTED(0xD3, 0x4D);//Ó 351 ACCENTED(0xD3, 0x4D);//Ó
347 ACCENTED(0xD4, 0x45);//Ô 352 ACCENTED(0xD4, 0x45);//Ô
348 ACCENTED(0xD5, 0x0E);//Õ 353 ACCENTED(0xD5, 0x0E);//Õ
349 ACCENTED(0xD6, 0x52);//Ö 354 ACCENTED(0xD6, 0x52);//Ö
350 //character in font doesn't really look like a phi to me 355 //character in font doesn't really look like a phi to me
351 //but Wikipedia lists it as such 356 //but Wikipedia lists it as such and it's between other Greek chars
352 case 0x3A6: //Φ 357 case 0x3A6: //Φ
353 ACCENTED(0xD8, 0x54);//Ø 358 ACCENTED(0xD8, 0x54);//Ø
354 ACCENTED(0xD9, 0x43);//Ù 359 ACCENTED(0xD9, 0x43);//Ù
355 ACCENTED(0xDA, 0x3C);//Ú 360 ACCENTED(0xDA, 0x3C);//Ú
356 ACCENTED(0xDB, 0x3D);//Û 361 ACCENTED(0xDB, 0x3D);//Û
357 ACCENTED(0xDC, 0x42);//Ü 362 ACCENTED(0xDC, 0x42);//Ü
358 GRAPHIC(0xF7, 0x0E);//÷ 363 GRAPHIC(0xF7, 0x0E);//÷
364 //Latin Extended-A
365 ACCENTED(0x100, 0x2B);//Ā
366 case 0x1CD: //Ǎ
367 ACCENTED(0x102, 0x1E);//Ă
368 ACCENTED(0x112, 0x36);//Ē
369 case 0x11A: //Ě
370 ACCENTED(0x114, 0x25);//Ĕ
371 ACCENTED(0x12A, 0x4A);//Ī
372 case 0x1CF: //Ǐ
373 ACCENTED(0x12C, 0x46);//Ĭ
374 case 0x1D1: //Ǒ
375 ACCENTED(0x14E, 0x4E);//Ŏ
376 ACCENTED(0x16A, 0x41);//Ū
377 case 0x1D3: //Ǔ
378 ACCENTED(0x16C, 0x3E);//Ŭ
379 //Greek and Coptic
359 ACCENTED(0x3A3, 0x5B);//Σ 380 ACCENTED(0x3A3, 0x5B);//Σ
360 ACCENTED(0x3A9, 0x3A);//Ω 381 ACCENTED(0x3A9, 0x3A);//Ω
361 ACCENTED(0x3B1, 0x34);//α 382 ACCENTED(0x3B1, 0x34);//α
362 ACCENTED(0x3B2, 0x33);//β 383 ACCENTED(0x3B2, 0x33);//β
363 ACCENTED(0x3B8, 0x3B);//θ 384 ACCENTED(0x3B8, 0x3B);//θ
461 482
462 static uint8_t paste_internal(sms_context *sms, uint8_t prev_key) 483 static uint8_t paste_internal(sms_context *sms, uint8_t prev_key)
463 { 484 {
464 const char *paste = sms->header.paste_buffer + sms->header.paste_cur_char; 485 const char *paste = sms->header.paste_buffer + sms->header.paste_cur_char;
465 int cp = utf8_codepoint(&paste); 486 int cp = utf8_codepoint(&paste);
466 cp_keys keys = cp_to_keys(cp); 487 cp_keys keys = {0};
488 if (cp == 'N' || cp == 'n') {
489 const char *tmp = paste;
490 int next = utf8_codepoint(&tmp);
491 if (next == 0x302) {
492 keys = (cp_keys){0x35, 0x81};//N̂ (N with circumflex above)
493 paste = tmp;
494 }
495 }
496 if (!keys.main) {
497 keys = cp_to_keys(cp);
498 }
467 if (!keys.main) { 499 if (!keys.main) {
468 advance_paste_buffer(sms, paste); 500 advance_paste_buffer(sms, paste);
469 return 0; 501 return 0;
470 } 502 }
471 switch (sms->paste_state) 503 switch (sms->paste_state)