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

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

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

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

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

Мой настоящий метод повторно отображает 256-байтовые коды в 256 кодов, так что от 0 до 9 и от A до 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)

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