Jak zmniejszyć przestrzeń kodu dla szesnastkowej konwersji znaków ASCII przy użyciu przestrzeni kodu _small_?

Jak zmniejszyć przestrzeń kodu na szesnastkową konwersję znaków ASCII za pomocą amała przestrzeń kodu?

W aplikacji osadzonej mam nadzwyczajnie ograniczoną przestrzeń (uwaga 1). Muszę przekonwertować bajty, z seryjnych we / wy, z wartościami ASCII „0” na „9” i „A” na „F” na zwykłe wartości szesnastkowe od 0 do 15. Ponadto wszystkie pozostałe 240 kombinacji, w tym „ a 'do' f ', muszą być wykryte (jako błąd).

Funkcje biblioteczne, takie jakscanf(), atoi(), strtol() sądaleko za duży, aby go użyć.

Prędkość nie jest problemem. Rozmiar kodu jest czynnikiem ograniczającym.

Moja obecna metoda odwzorowuje 256-bajtowe kody na 256 kodów, tak że od „0” do „9” i od „A” do „Z” mają wartości 0 - 35.Doceniane są wszelkie pomysły dotyczące zmniejszenia lub różnych podejść.

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
}

Uwaga 1: Istnieje 256 instrukcji dla kodu i stałych danych (instrukcja 1 bajt danych kosztów) w pamięci chronionej PIC dla bootloadera. Ten kod kosztuje ~ 10 instrukcji. Bieżący ap wymaga ponownego zapisu i tylko z 1 dodatkową instrukcją,zmniejszenie nawet 1 instrukcji jest cenny. Przechodzę przez to kawałek po kawałku. Przyjrzałem się także ogólnej rekonstrukcji.

Uwagi: PIC16. Wolę kodować „C”, ale muszę robić to, co trzeba. Następuje kod zespołu. Szybka odpowiedź nie jest wymagana.

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

[edytowaćnajlepsze rozwiązanie]
Optymalizacja istniejącego rozwiązania zgodnie z sugestią @GJ. W C, wykonaniech += 7; ch &= (~64); zamiastch = (ch + 7) & (~64); zapisano 1 instrukcję. Przechodzenie do zgromadzenia uratowało inny, bez konieczności ponownego ładowaniach w obrębieif().

questionAnswers(3)

yourAnswerToTheQuestion