I've changed my switch to use ranges and it looks great. With both versions, the program compiles to the same size. I'd like to see the assembly code for both versions to: 1) see if there is a deference in how it compiles and runs and 2) learn more about making assembly jump tables for AVR uCs.
I can work my way backwards using objdump if I have to, but I'm wondering if there is a way to capture the assembly code before if gets assembled into a hex file?
Here are the two versions of the switch
With ranges:
uint8_t lookup(char character) {
switch (character) {
case ' ':
return B00100000;
case '!':
return B00100001;
case '"':
return B00100010;
case '#':
return B00100011;
case '$':
return B00100100;
case '%':
return B00100101;
case '&':
return B00100110;
case '\'':
return B00100111;
case '{':
return B00101000;
case '}':
return B00101001;
case '*':
return B00101010;
case '+':
return B00101011;
case ',':
return B00101100;
case '-':
return B00101101;
case '.':
return B00101110;
case '/':
return B00101111;
case '0' ... '9':
return (uint8_t)character - 18;
case ':':
return B00111010;
case ';':
return B00111011;
case '<':
return B00111100;
case '=':
return B00111101;
case '>':
return B00111110;
case '?':
return B00111111;
case '@':
return B01000000;
case 'A' ... 'Z':
return (uint8_t)character;
case 'a' ... 'z':
return (uint8_t)character - 32;
case '(':
return B01011011;
case '\\':
return B01011100;
case ')':
return B01011101;
case '^':
return B01011110;
case '_':
return B01011111;
}
}
Without ranges:
uint8_t lookup(char character) {
switch (character) {
case ' ':
return B00100000;
case '!':
return B00100001;
case '"':
return B00100010;
case '#':
return B00100011;
case '$':
return B00100100;
case '%':
return B00100101;
case '&':
return B00100110;
case '\'':
return B00100111;
case '{':
return B00101000;
case '}':
return B00101001;
case '*':
return B00101010;
case '+':
return B00101011;
case ',':
return B00101100;
case '-':
return B00101101;
case '.':
return B00101110;
case '/':
return B00101111;
case '0':
return B00110000;
case '1':
return B00110001;
case '2':
return B00110010;
case '3':
return B00110011;
case '4':
return B00110100;
case '5':
return B00110101;
case '6':
return B00110110;
case '7':
return B00110111;
case '8':
return B00111000;
case '9':
return B00111001;
case ':':
return B00111010;
case ';':
return B00111011;
case '<':
return B00111100;
case '=':
return B00111101;
case '>':
return B00111110;
case '?':
return B00111111;
case '@':
return B01000000;
case 'a':
case 'A':
return B01000001;
case 'b':
case 'B':
return B01000010;
case 'c':
case 'C':
return B01000011;
case 'd':
case 'D':
return B01000100;
case 'e':
case 'E':
return B01000101;
case 'f':
case 'F':
return B01000110;
case 'g':
case 'G':
return B01000111;
case 'h':
case 'H':
return B01001000;
case 'i':
case 'I':
return B01001001;
case 'j':
case 'J':
return B01001010;
case 'k':
case 'K':
return B01001011;
case 'l':
case 'L':
return B01001100;
case 'm':
case 'M':
return B01001101;
case 'n':
case 'N':
return B01001110;
case 'o':
case 'O':
return B01001111;
case 'p':
case 'P':
return B01010000;
case 'q':
case 'Q':
return B01010001;
case 'r':
case 'R':
return B01010010;
case 's':
case 'S':
return B01010011;
case 't':
case 'T':
return B01010100;
case 'u':
case 'U':
return B01010101;
case 'v':
case 'V':
return B01010110;
case 'w':
case 'W':
return B01010111;
case 'x':
case 'X':
return B01011000;
case 'y':
case 'Y':
return B01011001;
case 'z':
case 'Z':
return B01011010;
case '(':
return B01011011;
case '\\':
return B01011100;
case ')':
return B01011101;
case '^':
return B01011110;
case '_':
return B01011111;
}
}
This is code for my 2416 display library.