Mercurial > repos > blastem
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) |