Monospaced 11x10 Font
For my VT100 terminal emulator on Raspberry Pi Pico project I needed to make my own font to fit the specific requirements. For convenience, that source code only contains the font data as a static "char.rom" binary file. For completeness sake I present the font data source here.
The source data is an image, so any modifications can be done in an image editor:
As can be seen here the image is divided into a grid of 16x16 to provide 256 characters in total.
This image needs to be converted to PGM format and then be fed into a special utility that converts it to the actual ROM binary file.
The source code for the PGM to ROM utility is provided here, which operates on stdin/stdout for the conversion:
#include <stdio.h> #include <stdbool.h> #define HEIGHT 10 #define WIDTH 11 #define CHAR_PER_LINE 16 #define BYTES_PER_LINE 176 #define COLLECT (HEIGHT * BYTES_PER_LINE) static unsigned char buffer[COLLECT]; static int power_of_two(int n) { if (n == 0) { return 1; } else { return 2 * power_of_two(n - 1); } } int main(void) { int skip = 4; int c, n, i, j, k; int b; n = 0; while ((c = fgetc(stdin)) != EOF) { if (skip > 0) { if (c == '\n') { skip--; } continue; } buffer[n] = c; n++; if (n >= COLLECT) { n = 0; /* Store as 16 bits by 10 lines, even if 11 bits wide. */ for (i = 0; i < CHAR_PER_LINE; i++) { for (j = 0; j < HEIGHT; j++) { b = 0; for (k = 0; k < 8; k++) { if (buffer[k + (i * WIDTH) + (j * BYTES_PER_LINE)] == 0) { b += power_of_two(7 - k); } } fputc(b, stdout); b = 0; for (k = 0; k < 3; k++) { if (buffer[k + 8 + (i * WIDTH) + (j * BYTES_PER_LINE)] == 0) { b += power_of_two(2 - k); } } fputc(b, stdout); } } } } return 0; }