JavaScript
const GLYPH_WIDTH = 8;
const GLYPH_HEIGHT = 16;
const WIDTH = 80;
const HEIGHT = 25;
const CANVAS_WIDTH = WIDTH * GLYPH_WIDTH + WIDTH;
const CANVAS_HEIGHT = HEIGHT * GLYPH_HEIGHT;
const ibmGlyphs = new Uint8ClampedArray(new Uint32Array([
// each 32-bit number represents 8x4 pixel info
// each 8x16 glyph consists of four numbers
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x817e0000, 0xbd8181a5, 0x7e818199, 0x00000000, 0xff7e0000, 0xc3ffffdb, 0x7effffe7, 0x00000000, 0x00000000, 0xfefefe6c, 0x10387cfe, 0x00000000, 0x00000000, 0xfe7c3810, 0x0010387c, 0x00000000, 0x18000000, 0xe7e73c3c, 0x3c1818e7, 0x00000000, 0x18000000, 0xffff7e3c, 0x3c18187e, 0x00000000, 0x00000000, 0x3c180000, 0x0000183c, 0x00000000,
0xffffffff, 0xc3e7ffff, 0xffffe7c3, 0xffffffff, 0x00000000, 0x42663c00, 0x003c6642, 0x00000000, 0xffffffff, 0xbd99c3ff, 0xffc399bd, 0xffffffff, 0x0e1e0000, 0xcc78321a, 0x78cccccc, 0x00000000, 0x663c0000, 0x3c666666, 0x18187e18, 0x00000000, 0x333f0000, 0x3030303f, 0xe0f07030, 0x00000000, 0x637f0000, 0x6363637f, 0xe6e76763, 0x000000c0, 0x18000000, 0xe73cdb18, 0x1818db3c, 0x00000000,
0xe0c08000, 0xf8fef8f0, 0x80c0e0f0, 0x00000000, 0x0e060200, 0x3efe3e1e, 0x02060e1e, 0x00000000, 0x3c180000, 0x1818187e, 0x00183c7e, 0x00000000, 0x66660000, 0x66666666, 0x66660066, 0x00000000, 0xdb7f0000, 0x1b7bdbdb, 0x1b1b1b1b, 0x00000000, 0x60c67c00, 0xc6c66c38, 0xc60c386c, 0x0000007c, 0x00000000, 0x00000000, 0xfefefefe, 0x00000000, 0x3c180000, 0x1818187e, 0x7e183c7e, 0x00000000,
0x3c180000, 0x1818187e, 0x18181818, 0x00000000, 0x18180000, 0x18181818, 0x183c7e18, 0x00000000, 0x00000000, 0xfe0c1800, 0x0000180c, 0x00000000, 0x00000000, 0xfe603000, 0x00003060, 0x00000000, 0x00000000, 0xc0c00000, 0x0000fec0, 0x00000000, 0x00000000, 0xfe6c2800, 0x0000286c, 0x00000000, 0x00000000, 0x7c383810, 0x00fefe7c, 0x00000000, 0x00000000, 0x7c7cfefe, 0x00103838, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3c180000, 0x18183c3c, 0x18180018, 0x00000000, 0x66666600,...