-------------------------------------------------------------------------------
-- Program         -- HAVK Operating System Terminal                         --
-- Filename        -- havk_terminal-font.ads                                 --
-- License         -- GNU General Public License version 3.0                 --
-- Original Author -- Ravjot Singh Samra, Copyright 2019-2021                --
-------------------------------------------------------------------------------

WITH
   HAVK_Operating_System;
USE
   HAVK_Operating_System;

-- Contains a 8x8 bitmap font used for drawing text onto a framebuffer.
PACKAGE HAVK_Terminal.Font
IS
   -- Fonts encompass both ASCII and EASCII.
   TYPE font IS ARRAY(number RANGE 0 .. 255, number RANGE 0 .. 7) OF number;

   -- Going to go with a 8x8 size. Most significant bit is on the left.
   -- Because of left MSB, the loop to draw a line must be reversed.
   Framefont_Width  : CONSTANT number := 8;
   Framefont_Height : CONSTANT number := 8;

   -- TODO: Create the lowercase alphabet and symbols.
   -- A generic font I created for now. No fanciness.
   Framefont : CONSTANT font :=
   (
      33 =>
      (
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00000000#,   --
         2#00011000#,   --    XX
         2#00011000#    --    XX
      ),
      34 =>
      (
         2#01100110#,   --  XX  XX
         2#01100110#,   --  XX  XX
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#    --
      ),
      35 =>
      (
         2#01100110#,   --  XX  XX
         2#01100110#,   --  XX  XX
         2#11111111#,   -- XXXXXXXX
         2#01100110#,   --  XX  XX
         2#01100110#,   --  XX  XX
         2#11111111#,   -- XXXXXXXX
         2#01100110#,   --  XX  XX
         2#01100110#    --  XX  XX
      ),
      36 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11011000#,   -- XX XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00011011#,   --    XX XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      37 =>
      (
         2#11100011#,   -- XXX   XX
         2#11100111#,   -- XXX  XXX
         2#00001110#,   --     XXX
         2#00011100#,   --    XXX
         2#00111000#,   --   XXX
         2#01110000#,   --  XXX
         2#11100111#,   -- XXX  XXX
         2#11000111#    -- XX   XXX
      ),
      38 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11110000#,   -- XXXX
         2#11111000#,   -- XXXXX
         2#11011100#,   -- XX XXX
         2#11001110#,   -- XX  XXX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      39 =>
      (
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#    --
      ),
      40 =>
      (
         2#00001111#,   --     XXXX
         2#00111000#,   --   XXX
         2#11100000#,   -- XXX
         2#11100000#,   -- XXX
         2#11100000#,   -- XXX
         2#11100000#,   -- XXX
         2#00111000#,   --   XXX
         2#00001111#    --     XXXX
      ),
      41 =>
      (
         2#11110000#,   -- XXXX
         2#00011100#,   --    XXX
         2#00000111#,   --      XXX
         2#00000111#,   --      XXX
         2#00000111#,   --      XXX
         2#00000111#,   --      XXX
         2#00011100#,   --    XXX
         2#11110000#    -- XXXX
      ),
      42 =>
      (
         2#10011001#,   -- X  XX  X
         2#01011010#,   --  X XX X
         2#00111100#,   --   XXXX
         2#11111111#,   -- XXXXXXXX
         2#00111100#,   --   XXXX
         2#01011010#,   --  X XX X
         2#10011001#,   -- X  XX  X
         2#00000000#    --
      ),
      43 =>
      (
         2#00000000#,   --
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#11111111#,   -- XXXXXXXX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00000000#,   --
         2#00000000#    --
      ),
      44 =>
      (
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00011000#,   --    XX
         2#00111000#    --   XXX
      ),
      45 =>
      (
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#11111111#,   -- XXXXXXXX
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#    --
      ),
      46 =>
      (
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00000000#,   --
         2#00011000#,   --    XX
         2#00011000#    --    XX
      ),
      47 =>
      (
         2#00000011#,   --       XX
         2#00000111#,   --      XXX
         2#00001110#,   --     XXX
         2#00011100#,   --    XXX
         2#00111000#,   --   XXX
         2#01110000#,   --  XXX
         2#11100000#,   -- XXX
         2#11000000#    -- XX
      ),
      48 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000111#,   -- XX   XXX
         2#11001011#,   -- XX  X XX
         2#11010011#,   -- XX X  XX
         2#11100011#,   -- XXX   XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      49 =>
      (
         2#00111000#,   --   XXX
         2#01111000#,   --  XXXX
         2#11011000#,   -- XX XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      50 =>
      (
         2#11111100#,   -- XXXXXX
         2#11111110#,   -- XXXXXXX
         2#00001110#,   --     XXX
         2#00011110#,   --    XXXX
         2#00111100#,   --   XXXX
         2#11110000#,   -- XXXX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      51 =>
      (
         2#11111110#,   -- XXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000111#,   --      XXX
         2#11111110#,   -- XXXXXXX
         2#11111110#,   -- XXXXXXX
         2#00000111#,   --      XXX
         2#11111111#,   -- XXXXXXXX
         2#11111110#    -- XXXXXXX
      ),
      52 =>
      (
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000011#,   --       XX
         2#00000011#,   --       XX
         2#00000011#    --       XX
      ),
      53 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111100#,   -- XXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000111#,   --      XXX
         2#11111110#,   -- XXXXXXX
         2#11111100#    -- XXXXXX
      ),
      54 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      55 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000110#,   --      XX
         2#00001100#,   --     XX
         2#00011000#,   --    XX
         2#00110000#,   --   XX
         2#01100000#,   --  XX
         2#11000000#    -- XX
      ),
      56 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      57 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000111#,   --      XXX
         2#00001110#,   --     XXX
         2#00011100#    --    XXX
      ),
      65 =>
      (
         2#00011000#,   --    XX
         2#00111100#,   --   XXXX
         2#01100110#,   --  XX  XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11000011#    -- XX    XX
      ),
      66 =>
      (
         2#11111110#,   -- XXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000111#,   -- XX   XXX
         2#11111110#,   -- XXXXXXX
         2#11111110#,   -- XXXXXXX
         2#11000111#,   -- XX   XXX
         2#11111111#,   -- XXXXXXXX
         2#11111110#    -- XXXXXXX
      ),
      67 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      68 =>
      (
         2#11111100#,   -- XXXXXX
         2#11111110#,   -- XXXXXXX
         2#11000111#,   -- XX   XXX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000111#,   -- XX   XXX
         2#11111110#,   -- XXXXXXX
         2#11111100#    -- XXXXXX
      ),
      69 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      70 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#    -- XX
      ),
      71 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11001111#,   -- XX  XXXX
         2#11001111#,   -- XX  XXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      72 =>
      (
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#    -- XX    XX
      ),
      73 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      74 =>
      (
         2#00000011#,   --       XX
         2#00000011#,   --       XX
         2#00000011#,   --       XX
         2#00000011#,   --       XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      75 =>
      (
         2#11000011#,   -- XX    XX
         2#11000110#,   -- XX   XX
         2#11001100#,   -- XX  XX
         2#11111000#,   -- XXXXX
         2#11111000#,   -- XXXXX
         2#11001100#,   -- XX  XX
         2#11000110#,   -- XX   XX
         2#11000011#    -- XX    XX
      ),
      76 =>
      (
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      77 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#    -- XX XX XX
      ),
      78 =>
      (
         2#11100011#,   -- XXX   XX
         2#11110011#,   -- XXXX  XX
         2#11011011#,   -- XX XX XX
         2#11001111#,   -- XX  XXXX
         2#11000111#,   -- XX   XXX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#    -- XX    XX
      ),
      79 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      80 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11000000#,   -- XX
         2#11000000#    -- XX
      ),
      81 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11011011#,   -- XX XX XX
         2#11001111#,   -- XX  XXXX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      82 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11001100#,   -- XX  XX
         2#11000110#,   -- XX   XX
         2#11000011#    -- XX    XX
      ),
      83 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#11000000#,   -- XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000011#,   --       XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      84 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#    --    XX
      ),
      85 =>
      (
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      86 =>
      (
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#01100110#,   --  XX  XX
         2#00111100#,   --   XXXX
         2#00011000#    --    XX
      ),
      87 =>
      (
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11011011#,   -- XX XX XX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      88 =>
      (
         2#11000011#,   -- XX    XX
         2#01100110#,   --  XX  XX
         2#00111100#,   --   XXXX
         2#00011000#,   --    XX
         2#00111100#,   --   XXXX
         2#01100110#,   --  XX  XX
         2#11000011#,   -- XX    XX
         2#11000011#    -- XX    XX
      ),
      89 =>
      (
         2#11000011#,   -- XX    XX
         2#11000011#,   -- XX    XX
         2#01100110#,   --  XX  XX
         2#00111100#,   --   XXXX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#,   --    XX
         2#00011000#    --    XX
      ),
      90 =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11111111#,   -- XXXXXXXX
         2#00000111#,   --      XXX
         2#00001110#,   --     XXX
         2#00111000#,   --   XXX
         2#11100000#,   -- XXX
         2#11111111#,   -- XXXXXXXX
         2#11111111#    -- XXXXXXXX
      ),
      -- Both nulls and spaces are just background colour.
      00 => (0, 0, 0, 0, 0, 0, 0, 0),
      32 => (0, 0, 0, 0, 0, 0, 0, 0),
      -- Unique shape for both the control characters and the characters
      -- I have not yet designed into my bitmap font.
      OTHERS =>
      (
         2#11111111#,   -- XXXXXXXX
         2#11000011#,   -- XX    XX
         2#10100101#,   -- X X  X X
         2#10011001#,   -- X  XX  X
         2#10011001#,   -- X  XX  X
         2#10100101#,   -- X X  X X
         2#11000011#,   -- XX    XX
         2#11111111#    -- XXXXXXXX
      )
   );

END HAVK_Terminal.Font;
