Como reduzir o espaço de código para uma conversão de caracteres ASCII hexadecimais usando um espaço de código _small_?

Como reduzir o espaço de código para uma conversão de caracteres ASCII hexadecimais usando umpequeno espaço de código?

Em um aplicativo incorporado, tenho espaço limitado extraordinário (nota 1). Eu preciso converter bytes, de E / S serial, com os valores ASCII '0' a '9' e 'A' a 'F' para os valores hexadecimais usuais 0 a 15. Além disso, todas as outras 240 combinações, incluindo ' a 'to' f ', precisa ser detectado (como um erro).

Funções de biblioteca comoscanf(), atoi(), strtol() estálonge muito grande para usar.

A velocidade não é um problema. O tamanho do código é o fator limitante.

Meu método atual mapeia os códigos de 256 bytes em 256 códigos, de tal forma que '0' a '9' e 'A' a 'Z' têm os valores 0 - 35.Quaisquer ideias sobre como reduzir ou abordagens diferentes são apreciadas.

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
}

Nota 1: Existem 256 instruções para código e dados constantes (1 byte data costs 1 instruction) em uma memória PIC protegida para um bootloader. Este código custa ~ 10 instruções. O ap atual precisa de uma reescrita e com apenas 1 instrução de reserva,reduzindo até 1 instrução é valioso. Eu estou passando por isso peça por peça. Também olhei para a reconstrução geral.

Notas: PIC16. Eu prefiro codificar em 'C', mas devo fazer o que for preciso. Código de montagem segue. Uma resposta rápida não é necessária.

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

[editarmelhor solução]
Otimizando a solução existente como sugerido por @GJ. Em C, executando och += 7; ch &= (~64); ao invés dech = (ch + 7) & (~64); salvou 1 instrução. Indo para montagem salva outro por não ter que recarregarch dentro doif().

questionAnswers(3)

yourAnswerToTheQuestion