4

I´m working on a function to plot a character in video mode for the 256 VGA mode. I´m using 6x7 fonts with the set containing only the capital letters, numbers and signs. This is the data:

uint8_t  characters[455] = {
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x50,
  0x50,0x00,0x00,0x00,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x00,0x20,0xf8,0xa0,
  0xf8,0x28,0xf8,0x00,0xc8,0xd0,0x20,0x20,0x58,0x98,0x00,0x40,0xa0,0x40,0xa8,0x90,
  0x68,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00,
  0x20,0x10,0x10,0x10,0x10,0x20,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x20,0x20,
  0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00,0x00,0x00,0xf8,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x08,0x10,0x20,0x40,0x80,
  0x00,0x70,0x88,0x98,0xa8,0xc8,0x70,0x00,0x20,0x60,0x20,0x20,0x20,0x70,0x00,0x70,
  0x88,0x08,0x70,0x80,0xf8,0x00,0xf8,0x10,0x30,0x08,0x88,0x70,0x00,0x20,0x40,0x90,
  0x90,0xf8,0x10,0x00,0xf8,0x80,0xf0,0x08,0x88,0x70,0x00,0x70,0x80,0xf0,0x88,0x88,
  0x70,0x00,0xf8,0x08,0x10,0x20,0x20,0x20,0x00,0x70,0x88,0x70,0x88,0x88,0x70,0x00,
  0x70,0x88,0x88,0x78,0x08,0x70,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x30,0x30,
  0x00,0x30,0x10,0x20,0x00,0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00,0xf8,0x00,0xf8,
  0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x70,0x88,0x10,0x20,0x00,0x20,
  0x00,0x70,0x90,0xa8,0xb8,0x80,0x70,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x00,0xf0,
  0x88,0xf0,0x88,0x88,0xf0,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0xe0,0x90,0x88,
  0x88,0x90,0xe0,0x00,0xf8,0x80,0xf0,0x80,0x80,0xf8,0x00,0xf8,0x80,0xf0,0x80,0x80,
  0x80,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,
  0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x90,0xa0,
  0xc0,0xa0,0x90,0x88,0x00,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x88,0xd8,0xa8,0x88,
  0x88,0x88,0x00,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x70,
  0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x00,0x70,0x88,0x88,0xa8,0x98,0x70,0x00,0xf0,
  0x88,0x88,0xf0,0x90,0x88,0x00,0x70,0x80,0x70,0x08,0x88,0x70,0x00,0xf8,0x20,0x20,
  0x20,0x20,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x50,
  0x20,0x00,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,
  0x88,0x50,0x20,0x20,0x20,0x20,0x00,0xf8,0x10,0x20,0x40,0x80,0xf8,0x00,0x60,0x40,
  0x40,0x40,0x40,0x60,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x30,0x10,0x10,0x10,
  0x10,0x30,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
  0x00,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8};

For the put_char function, I´m calculating an offset for the array by multiplying the ascii code by 7 and substracting 32 (since I´m just using capital letters). Then I iterate over the width and height of the font size (i.e 6 and 7) to plot the pixel if I find a 1 and do nothing if I find a 0.

void put_char(int x,int y,int ascii_char){
    int l,i,j,h,char_offset;
    j,h,l,i=0;
    char_offset = ascii_char*7-32;
    printf("offset: %d\n",char_offset);
    for (l = 0; l < 7; l++) {
        for (i = 6; i > 0; i--) {
            j++;
            if ((characters[char_offset+l+j] & (1 << i))) { 

                plot_pixel(j+x, h+y, current_color);
            }
        }
        h++;
        j = 0;
    }   
}

However, I´m not getting the letter printed correctly on screen. I think I might have a problem calculating the offset, but I don´t know where it is. I´m also doubting my method to check if the number is 1 or 0 is correct. Can anyone help me out with this?

EDIT:

Here´s a picture of what I´m getting (note the green pixels on the drawing area, those should be the letter 'A'

enter image description here

EDIT 2:

Here´s a picture of what I´m getting now that I changed

 char_offset = ascii_char*7-32;

to

 char_offset = (ascii_char-32)*7;

It´s almost good, however the left side of the 'A' is somehow missing on the plotting of the pixels.

enter image description here

Pablo Estrada
  • 3,182
  • 4
  • 30
  • 74

1 Answers1

2

Most likely you want:

char_offset = (ascii_char-32)*7;

If you multiply by 7 first and then subtract 32 then you won't be subtracting enough since you want to move 32 characters back, not 32 pixel rows.

Tommy
  • 99,986
  • 12
  • 185
  • 204
  • thanks for the help. I´m almost getting it good now. I added another screenshot to show the result I have now – Pablo Estrada Jan 13 '16 at 17:19
  • 2
    Looking at the pixel data, the 6 pixels of each line appear to be left-shifted by 2 pixels, so change the inner `for` loop to `for (i = 7; i >= 2; i--) {`. – Ian Abbott Jan 13 '16 at 17:56