Как уменьшить кодовое пространство для преобразования шестнадцатеричных символов ASCII, используя _small_ кодовое пространство?

Как уменьшить кодовое пространство для преобразования шестнадцатеричных символов ASCII, используянебольшое кодовое пространство?

Во встроенном приложении у меня необычайно ограниченное пространство (примечание 1). Мне нужно преобразовать байты из последовательного ввода-вывода со значениями ASCII '0' до 9 и "А" в 'F' к обычным шестнадцатеричным значениям от 0 до 15. Кроме того, все остальные 240 комбинаций, включая «а» в 'F', должны быть обнаружены (как ошибка).

Функции библиотеки, такие какscanf(), atoi(), strtol() являютсядалеко слишком большой, чтобы использовать.

Скорость не проблема. Размер кода является ограничивающим фактором.

Мой настоящий метод повторно отображает 256-байтовые коды в 256 кодов, так что '0' до 9 и "А" в 'Z' имеют значения 0 - 35.Любые идеи о том, как уменьшить или разные подходы приветствуются.

unsigned char ch = GetData(); // Fetch 1 byte of incoming data;
if (!(--ch & 64)) {           // decrement, then if in the '0' to '9' area ...
  ch = (ch + 7) & (~64);      // move 0-9 next to A-Z codes
}
ch -= 54;                     // -= 'A' - 10 - 1
if (ch > 15) { 
  ; // handle error
}

Примечание 1: существует 256 инструкций для кода и постоянных данных (1 байт данных стоит 1 инструкция) в защищенной памяти PIC для загрузчика. Этот код стоит ~ 10 инструкций. Текущий AP нуждается в переписывании & только с 1 запасной инструкцией,сокращение даже на 1 инструкцию ценно. Я'Я прохожу это по частям. И посмотрели на общую реконструкцию.

Примечания: PIC16. Я предпочитаю кодировать в 'C', но должен делать то, что нужно. Код сборки следующий. Быстрый ответ не требуется.

if (!(--ch & 64)) { 
  002D:DECF   44,F   002E:BTFSC  44.6    002F:GOTO   034     
  ch = (ch + 7) & (~64); 
  0030:MOVLW  07     0031:ADDWF  44,W    0032:ANDLW  BF    0033:MOVWF  44
}// endif 
ch -= 54; 
  0034:MOVLW  36     0035:SUBWF  44,F

[редактироватьлучшее решение]

Оптимизация существующего решения в соответствии с предложением @GJ. В С, выполняяch += 7; ch &= (~64); вместоch = (ch + 7) & (~64); сохранено 1 инструкция. Переход на сборку спас другой, не перегружаяch в пределах.if()

Ответы на вопрос(3)

Ваш ответ на вопрос