///|
/// Bitmap Font Data (8x16 VGA-style monospace font)
/// Each character is 16 bytes (16 rows of 8 pixels each)
/// Covers ASCII printable characters (32-126)

///|
/// Font dimensions
pub let font_width : Int = 8

///|
pub let font_height : Int = 16

///|
/// Get bitmap data for an ASCII character
/// Returns array of 16 bytes, each byte is one row (MSB = leftmost pixel)
/// Returns None for unsupported characters
pub fn get_char_bitmap(c : Char) -> Array[Int]? {
  let code = c.to_int()
  if code >= 32 && code <= 126 {
    let idx = code - 32
    Some(font_data[idx])
  } else {
    None
  }
}

///|
/// Check if character is supported by the bitmap font
pub fn is_font_supported(c : Char) -> Bool {
  let code = c.to_int()
  code >= 32 && code <= 126
}

///|
/// 8x16 VGA font data for ASCII 32-126
/// Each character is represented as 16 integers (one per row)
/// Each integer's bits represent pixels (bit 7 = leftmost, bit 0 = rightmost)
let font_data : Array[Array[Int]] = [
  // 32: Space
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 33: !
  [
    0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 34: "
  [
    0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 35: #
  [
    0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 36: $
  [
    0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x06, 0x86, 0xC6, 0x7C, 0x18,
    0x18, 0x00, 0x00,
  ],
  // 37: %
  [
    0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0x86, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 38: &
  [
    0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 39: '
  [
    0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 40: (
  [
    0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 41: )
  [
    0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 42: *
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 43: +
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 44: ,
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
    0x00, 0x00, 0x00,
  ],
  // 45: -
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 46: .
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 47: /
  [
    0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 48: 0
  [
    0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 49: 1
  [
    0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 50: 2
  [
    0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 51: 3
  [
    0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 52: 4
  [
    0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 53: 5
  [
    0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 54: 6
  [
    0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 55: 7
  [
    0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 56: 8
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 57: 9
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 58: :
  [
    0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 59: ;
  [
    0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 60: <
  [
    0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 61: =
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 62: >
  [
    0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 63: ?
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 64: @
  [
    0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 65: A
  [
    0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 66: B
  [
    0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 67: C
  [
    0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 68: D
  [
    0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 69: E
  [
    0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 70: F
  [
    0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xF0, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 71: G
  [
    0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 72: H
  [
    0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 73: I
  [
    0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 74: J
  [
    0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 75: K
  [
    0x00, 0x00, 0xE6, 0x66, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 76: L
  [
    0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 77: M
  [
    0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 78: N
  [
    0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 79: O
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 80: P
  [
    0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 81: Q
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0C,
    0x0E, 0x00, 0x00,
  ],
  // 82: R
  [
    0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x66, 0xE6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 83: S
  [
    0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 84: T
  [
    0x00, 0x00, 0xFF, 0xDB, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 85: U
  [
    0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 86: V
  [
    0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 87: W
  [
    0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0x6C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 88: X
  [
    0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, 0x7C, 0x6C, 0xC6, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 89: Y
  [
    0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 90: Z
  [
    0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 91: [
  [
    0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 92: \
  [
    0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 93: ]
  [
    0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 94: ^
  [
    0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 95: _
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xFF, 0x00, 0x00,
  ],
  // 96: `
  [
    0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 97: a
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 98: b
  [
    0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 99: c
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 100: d
  [
    0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 101: e
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 102: f
  [
    0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 103: g
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C,
    0xCC, 0x78, 0x00,
  ],
  // 104: h
  [
    0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 105: i
  [
    0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 106: j
  [
    0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66,
    0x66, 0x3C, 0x00,
  ],
  // 107: k
  [
    0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 108: l
  [
    0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 109: m
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 110: n
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 111: o
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 112: p
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60,
    0x60, 0xF0, 0x00,
  ],
  // 113: q
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C,
    0x0C, 0x1E, 0x00,
  ],
  // 114: r
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 115: s
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 116: t
  [
    0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 117: u
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 118: v
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 119: w
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 120: x
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 121: y
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06,
    0x0C, 0xF8, 0x00,
  ],
  // 122: z
  [
    0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 123: {
  [
    0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 124: |
  [
    0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 125: }
  [
    0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00,
    0x00, 0x00, 0x00,
  ],
  // 126: ~
  [
    0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00,
  ],
]