/*****************************************************************************/
/// @file biosfont.h.cpp with "modified BSD license"
/// @author Jonathan D. Lettvin (jlettvin|gmail|com) Apr  5 2008
/*
* Copyright (c) 2008, Jonathan D. Lettvin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of Jonathan Lettvin Consulting nor the
*       names of its contributors may be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY JONATHAN D. LETTVIN ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL JONATHAN D. LETTVIN BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/// @brief (http://en.wikipedia.org/wiki/BSD_license)
/*****************************************************************************/
/// @brief Usage and example compilations:
///        Include this file in other source code:
///              /// #define BIOSFONT_STATICS /// In one compilation unit.
///              #include "biosfont.h.cpp"
///        Example of autonomous unit test compilation and execution.
///              g++ -Wall -W4 -O4 -DBIOSFONT_UNIT_TEST biosfont biosfont.h.cpp
///              strip biosfont
///              ./biosfont
///        This code also compiles in ordinary C (by eliminating namespacing).
///              gcc -Wall -W4 -O4 -DBIOSFONT_UNIT_TEST biosfont biosfont.h.cpp
/*****************************************************************************/
/// @brief Purpose: This file provides an absolute bitmapped graphics font.
///        This is a (slightly adjusted) iAPX86 ROM BIOS font.
///        This font supports ASCII codes 00H-FFH.
///        This code is invariant to endian issues.
///        No external resources, libraries, or calls are needed or used.
///        EBCDIC and other encodings are not supported.
/*****************************************************************************/
/// @brief File naming convention: (why *.h.cpp?)
///        Managing multiple source files can be cumbersome.
///        Files implementing very simple tables and code can be
///        entirely autonomous, making distribution/integration easy:
///        This file can be used as a pure header.
///        There is no restriction on including .cpp files as headers.
///        Using a .cpp extension enables direct unit test compilation.
///        Naming it .h.cpp is sufficiently unique to be recognized.
///        I offer this naming style for headers with built-in unit testing.
/*****************************************************************************/
///  @brief Organization:
///        This files shows a sample debug font acquisition.
///        This is followed by the magnified font.
///        This is followed by the font bitmap value table.
///        This is followed by an inline font bit accessor function.
///        This is followed by unit test functions and a main function.
/*****************************************************************************/
///  @brief Size and Technical details:
///        256 8 x 8 bit glyphs fit into 64 bits each for a
///        memory footprint of 2KBytes both here and in BIOS.
///        Compiled unit test size including main and runtime libraries:
///              9,216 Windows XP with gcc version 3.4.5 (mingw special)
///        Bits start at the upper left and end at the lower right.
///        US English BIOS provides ASCII 0-127 at F000:FA6E and
///        extension codes 128-255 at the address stored in 0000:007C.
///        Note: the bits of each byte have been swapped end-to-end
///        (i.e. 000100111  becomes 111001000).
///        This reduces reconstruction complexity.
/*****************************************************************************/
/// @brief How the iAPX86 ROM BIOS font was copied.
///        Early IBM PCs provided fonts burned into ROM.
///        (http://en.wikipedia.org/wiki/Color_Graphics_Adapter)
///        The following web-page is useful for DEBUG novitiates.
///        (http://mirror.href.com/thestarman/asm/debug/debug2.htm)
///        Data was acquired by the following DOS operation.
/*****************************************************************************/
/*This is both user input and debug output.
C:\>DEBUG          ;Start debug from a command prompt
-N lower           ;Prompted by '-', Name the outut file
-R CX              ;Request to change the byte count
CX 0000            ;Currently it is 0
:400               ;You set it to 400H (1024)
-RBX               ;Make sure this is zero
BX 0000            ;Currently it is 0
:0000              ;You set it to 0H (0)
W F000:FA6E        ;Write that many bytes to named file
Writing 00400 bytes;Debug tells you what it did
-N upper           ;Name a second output file
-D 0000:007C L 4   ;Get contents of INT 1F
0000:0070                                     34 30 00 C0
W C000:3034        ;Reverse order the bytes
Writing 00400 bytes
-Q                 ;Quit because you're done
C:\>
 */
/*****************************************************************************/
/// The BIOS font appearance (magnified):
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        | ****** | ****** | ** **  |   *    |  ***   |        |        |
//|        |*      *|********|******* |  ***   | *****  |   *    |        |
//|        |* *  * *|** ** **|******* | *****  |  ***   |  ***   |   **   |
//|        |*      *|********|******* |******* |******* | *****  |  ****  |
//|        |* **** *|**    **| *****  | *****  |******* |******* |  ****  |
//|        |*  **  *|***  ***|  ***   |  ***   |*  *  * | *****  |   **   |
//|        |*      *|********|   *    |   *    |   *    |  ***   |        |
//|        | ****** | ****** |        |        | *****  | *****  |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|********|        |********|    ****|  ****  |  ******| *******|*  **  *|
//|********|  ****  |**    **|     ***| **  ** |  **  **| **   **| * ** * |
//|***  ***| **  ** |*  **  *|    ****| **  ** |  ******| *******|  ****  |
//|**    **| *    * |* **** *| ***** *| **  ** |  **    | **   **|***  ***|
//|**    **| *    * |* **** *|**  **  |  ****  |  **    | **   **|***  ***|
//|***  ***| **  ** |*  **  *|**  **  |   **   | ***    | **  ***|  ****  |
//|********|  ****  |**    **|**  **  | ****** |****    |***  ** | * ** * |
//|********|        |********| ****   |   **   |***     |**      |*  **  *|
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|*       |      * |   **   | **  ** | *******|  ***** |        |   **   |
//|***     |    *** |  ****  | **  ** |** ** **| **   **|        |  ****  |
//|*****   |  ***** | ****** | **  ** |** ** **|  ***   |        | ****** |
//|******* |******* |   **   | **  ** | **** **| ** **  |        |   **   |
//|*****   |  ***** |   **   | **  ** |   ** **| ** **  | ****** | ****** |
//|***     |    *** | ****** |        |   ** **|  ***   | ****** |  ****  |
//|*       |      * |  ****  | **  ** |   ** **|*    ** | ****** |   **   |
//|        |        |   **   |        |        |******  |        |********|
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   **   |   **   |        |        |        |        |        |        |
//|  ****  |   **   |   **   |  **    |        |  *  *  |   **   |********|
//| ****** |   **   |    **  | **     |**      | **  ** |  ****  |********|
//|   **   |   **   |******* |******* |**      |********| ****** | ****** |
//|   **   | ****** |    **  | **     |**      | **  ** |********|  ****  |
//|   **   |  ****  |   **   |  **    |******* |  *  *  |********|   **   |
//|   **   |   **   |        |        |        |        |        |        |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |   **   | ** **  | ** **  |   **   |        |  ***   |  **    |
//|        |  ****  | ** **  | ** **  | ****** |**   ** | ** **  |  **    |
//|        |  ****  | ** **  |******* |**      |**  **  |  ***   | **     |
//|        |   **   |        | ** **  | *****  |   **   | *** ** |        |
//|        |   **   |        |******* |     ** |  **    |** ***  |        |
//|        |        |        | ** **  |******  | **  ** |**  **  |        |
//|        |   **   |        | ** **  |   **   |**   ** | *** ** |        |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   **   | **     |        |        |        |        |        |     ** |
//|  **    |  **    | **  ** |   **   |        |        |        |    **  |
//| **     |   **   |  ****  |   **   |        |        |        |   **   |
//| **     |   **   |********| ****** |        | ****** |        |  **    |
//| **     |   **   |  ****  |   **   |        |        |        | **     |
//|  **    |  **    | **  ** |   **   |   **   |        |   **   |**      |
//|   **   | **     |        |        |   **   |        |   **   |*       |
//|        |        |        |        |  **    |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//| *****  |  **    | ****   | ****   |   ***  |******  |  ***   |******  |
//|**  *** | ***    |**  **  |**  **  |  ****  |**      | **     |**  **  |
//|** **** |  **    |    **  |    **  | ** **  |*****   |**      |    **  |
//|**** ** |  **    |  ***   |  ***   |**  **  |    **  |*****   |   **   |
//|***  ** |  **    | **     |    **  |******* |    **  |**  **  |  **    |
//|**   ** |  **    |**  **  |**  **  |    **  |**  **  |**  **  |  **    |
//| *****  |******  |******  | ****   |   **** | ****   | ****   |  **    |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//| ****   | ****   |        |        |   **   |        | **     |  ****  |
//|**  **  |**  **  |   **   |   **   |  **    |        |  **    | **  ** |
//|**  **  |**  **  |   **   |   **   | **     | ****** |   **   |    **  |
//| ****   | *****  |        |        |**      |        |    **  |   **   |
//|**  **  |    **  |        |        | **     | ****** |   **   |   **   |
//|**  **  |   **   |   **   |   **   |  **    |        |  **    |        |
//| ****   | ***    |   **   |   **   |   **   |        | **     |   **   |
//|        |        |        |  **    |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//| *****  |  **    |******  |  ****  |*****   |******* |******* |  ****  |
//|**   ** | ****   | **  ** | **  ** | ** **  | **   * | **   * | **  ** |
//|** **** |**  **  | **  ** |**      | **  ** | ** *   | ** *   |**      |
//|** **** |**  **  | *****  |**      | **  ** | ****   | ****   |**      |
//|** ***  |******  | **  ** |**      | **  ** | ** *   | ** *   |**  *** |
//|**      |**  **  | **  ** | **  ** | ** **  | **   * | **     | **  ** |
//| *****  |**  **  |******  |  ****  |*****   |******* |****    |  *** * |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|**  **  | ****   |   **** |***  ** |****    |**   ** |**   ** |  ***   |
//|**  **  |  **    |    **  | **  ** | **     |*** *** |***  ** | ** **  |
//|**  **  |  **    |    **  | ** **  | **     |******* |**** ** |**   ** |
//|******  |  **    |    **  | ****   | **     |******* |** **** |**   ** |
//|**  **  |  **    |**  **  | ** **  | **   * |** * ** |**  *** |**   ** |
//|**  **  |  **    |**  **  | **  ** | **  ** |**   ** |**   ** | ** **  |
//|**  **  | ****   | ****   |***  ** |******* |**   ** |**   ** |  ***   |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|******  | *****  |******  | *****  |******  |**  **  |**  **  |**   ** |
//| **  ** |**   ** | **  ** |**   ** |* ** *  |**  **  |**  **  |**   ** |
//| **  ** |**   ** | **  ** |***     |  **    |**  **  |**  **  |**   ** |
//| *****  |**   ** | *****  | ****   |  **    |**  **  |**  **  |**   ** |
//| **     |** * ** | ** **  |    *** |  **    |**  **  |**  **  |** * ** |
//| **     | *****  | **  ** |**   ** |  **    |**  **  | ****   |******* |
//|****    |    *** |***  ** | *****  | ****   |******  |  **    | ** **  |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|**   ** |**  **  |******* | ****   |**      | ****   |   *    |        |
//|**   ** |**  **  |**   ** | **     | **     |   **   |  ***   |        |
//| ** **  |**  **  |*   **  | **     |  **    |   **   | ** **  |        |
//|  ***   | ****   |   **   | **     |   **   |   **   |**   ** |        |
//| ** **  |  **    |  **  * | **     |    **  |   **   |        |        |
//|**   ** |  **    | **  ** | **     |     ** |   **   |        |        |
//|**   ** | ****   |******* | ****   |      * | ****   |        |        |
//|        |        |        |        |        |        |        |********|
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  **    |        |***     |        |   ***  |        |  ***   |        |
//|  **    |        | **     |        |    **  |        | ** **  |        |
//|   **   | ****   | **     | ****   |    **  | ****   | **  *  | *** ** |
//|        |    **  | *****  |**  **  | *****  |**  **  |****    |**  **  |
//|        | *****  | **  ** |**      |**  **  |******  | **     |**  **  |
//|        |**  **  | **  ** |**  **  |**  **  |**      | **     | *****  |
//|        | *** ** |** ***  | ****   | *** ** | ****   |****    |    **  |
//|        |        |        |        |        |        |        |*****   |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|***     |  **    |    **  |***     | ***    |        |        |        |
//| **     |        |        | **     |  **    |        |        |        |
//| ** **  | ***    |   ***  | **  ** |  **    |**  **  |* ***   | ****   |
//| *** ** |  **    |    **  | ** **  |  **    |******* |**  **  |**  **  |
//| **  ** |  **    |    **  | ****   |  **    |******* |**  **  |**  **  |
//| **  ** |  **    |**  **  | ** **  |  **    |** * ** |**  **  |**  **  |
//|***  ** | ****   |**  **  |***  ** | ****   |** * ** |**  **  | ****   |
//|        |        | ****   |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |        |        |        |   *    |        |        |        |
//|        |        |        |        |  **    |        |        |        |
//|** ***  | *** ** |** ***  | *****  |******  |**  **  |**  **  |**   ** |
//| **  ** |**  **  | *** ** |**      |  **    |**  **  |**  **  |**   ** |
//| **  ** |**  **  | **   * | ***    |  **    |**  **  |**  **  |** * ** |
//| *****  | *****  | **     |   ***  |  ** *  |**  **  | ****   |******* |
//| **     |    **  |****    |*****   |   **   | *** ** |  **    | ** **  |
//|****    |   **** |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |        |        |   ***  |   **   |***     | *** ** |        |
//|        |        |        |  **    |   **   |  **    |** ***  |   *    |
//|**   ** |**  **  |******  |  **    |   **   |  **    |        |  ***   |
//| ** **  |**  **  |*  **   |***     |        |   ***  |        | ** **  |
//|  ***   |**  **  |  **    |  **    |   **   |  **    |        |**   ** |
//| ** **  | *****  | **  *  |  **    |   **   |  **    |        |**   ** |
//|**   ** |    **  |******  |   ***  |   **   |***     |        |******* |
//|        |*****   |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//| ****   |        |   ***  | ****** |**  **  |***     |  **    |        |
//|**  **  |**  **  |        |**    **|        |        |  **    |        |
//|**      |        | ****   |  ****  | ****   | ****   | ****   | ****   |
//|**  **  |**  **  |**  **  |     ** |    **  |    **  |    **  |**      |
//| ****   |**  **  |******  |  ***** | *****  | *****  | *****  |**      |
//|   **   |**  **  |**      | **  ** |**  **  |**  **  |**  **  | ****   |
//|    **  | ****** | ****   |  ******| ****** | ****** | ****** |    **  |
//| ****   |        |        |        |        |        |        |  ***   |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//| ****** |**  **  |***     |**  **  | *****  |***     |**   ** |  **    |
//|**    **|        |        |        |**   ** |        |  ***   |  **    |
//|  ****  | ****   | ****   | ***    |  ***   | ***    | ** **  |        |
//| **  ** |**  **  |**  **  |  **    |   **   |  **    |**   ** | ****   |
//| ****** |******  |******  |  **    |   **   |  **    |******* |**  **  |
//| **     |**      |**      |  **    |   **   |  **    |**   ** |******  |
//|  ****  | ****   | ****   | ****   |  ****  | ****   |**   ** |**  **  |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   ***  |        |  ***** | ****   |        |        | ****   |        |
//|        |        | ** **  |**  **  |**  **  |***     |**  **  |***     |
//|******  | *******|**  **  |        |        |        |        |        |
//| **     |    **  |******* | ****   | ****   | ****   |**  **  |**  **  |
//| ****   | *******|**  **  |**  **  |**  **  |**  **  |**  **  |**  **  |
//| **     |**  **  |**  **  |**  **  |**  **  |**  **  |**  **  |**  **  |
//|******  | *******|**  *** | ****   | ****   | ****   | ****** | ****** |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |**    **|**  **  |   **   |  ***   |**  **  |*****   |    *** |
//|**  **  |   **   |        |   **   | ** **  |**  **  |**  **  |   ** **|
//|        |  ****  |**  **  | ****** | **  *  | ****   |**  **  |   **   |
//|**  **  | **  ** |**  **  |**      |****    |******  |***** * |  ****  |
//|**  **  | **  ** |**  **  |**      | **     |  **    |**   ** |   **   |
//| *****  |  ****  |**  **  | ****** |***  ** |******  |**  ****|   **   |
//|    **  |   **   | ****   |   **   |******  |  **    |**   ** |** **   |
//|*****   |        |        |   **   |        |  **    |**   ***| ***    |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   ***  |  ***   |        |        |        |******  |  ****  |  ***   |
//|        |        |   ***  |   ***  |*****   |        | ** **  | ** **  |
//| ****   | ***    |        |        |        |**  **  | ** **  | ** **  |
//|    **  |  **    | ****   |**  **  |*****   |*** **  |  ***** |  ***   |
//| *****  |  **    |**  **  |**  **  |**  **  |******  |        |        |
//|**  **  |  **    |**  **  |**  **  |**  **  |** ***  | ****** | *****  |
//| ****** | ****   | ****   | ****** |**  **  |**  **  |        |        |
//|        |        |        |        |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  **    |        |        |**    **|**    **|   **   |        |        |
//|        |        |        |**   ** |**   ** |   **   |  **  **|**  **  |
//|  **    |        |        |**  **  |**  **  |        | **  ** | **  ** |
//| **     |******  |******  |** **** |** ** **|   **   |**  **  |  **  **|
//|**      |**      |    **  |  **  **|  ** ***|   **   | **  ** | **  ** |
//|**  **  |**      |    **  | **  ** | ** ****|   **   |  **  **|**  **  |
//| ****   |        |        |**  **  |**  ****|   **   |        |        |
//|        |        |        |    ****|      **|        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  *   * | * * * *|** ** **|   **   |   **   |   **   |  ** ** |        |
//|*   *   |* * * * | *** ***|   **   |   **   |   **   |  ** ** |        |
//|  *   * | * * * *|** ** **|   **   |   **   |*****   |  ** ** |        |
//|*   *   |* * * * |*** *** |   **   |   **   |   **   |  ** ** |        |
//|  *   * | * * * *|** ** **|   **   |*****   |*****   |**** ** |******* |
//|*   *   |* * * * | *** ***|   **   |   **   |   **   |  ** ** |  ** ** |
//|  *   * | * * * *|** ** **|   **   |   **   |   **   |  ** ** |  ** ** |
//|*   *   |* * * * |*** *** |   **   |   **   |   **   |  ** ** |  ** ** |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |  ** ** |  ** ** |        |  ** ** |  ** ** |   **   |        |
//|        |  ** ** |  ** ** |        |  ** ** |  ** ** |   **   |        |
//|*****   |**** ** |  ** ** |******* |**** ** |  ** ** |*****   |        |
//|   **   |     ** |  ** ** |     ** |     ** |  ** ** |   **   |        |
//|*****   |**** ** |  ** ** |**** ** |******* |******* |*****   |*****   |
//|   **   |  ** ** |  ** ** |  ** ** |        |        |        |   **   |
//|   **   |  ** ** |  ** ** |  ** ** |        |        |        |   **   |
//|   **   |  ** ** |  ** ** |  ** ** |        |        |        |   **   |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   **   |   **   |        |   **   |        |   **   |   **   |  ** ** |
//|   **   |   **   |        |   **   |        |   **   |   **   |  ** ** |
//|   **   |   **   |        |   **   |        |   **   |   *****|  ** ** |
//|   **   |   **   |        |   **   |        |   **   |   **   |  ** ** |
//|   *****|********|********|   *****|********|********|   *****|  ** ***|
//|        |        |   **   |   **   |        |   **   |   **   |  ** ** |
//|        |        |   **   |   **   |        |   **   |   **   |  ** ** |
//|        |        |   **   |   **   |        |   **   |   **   |  ** ** |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  ** ** |        |  ** ** |        |  ** ** |        |  ** ** |   **   |
//|  ** ** |        |  ** ** |        |  ** ** |        |  ** ** |   **   |
//|  ** ***|  ******|**** ***|********|  ** ***|********|**** ***|********|
//|  **    |  **    |        |        |  **    |        |        |        |
//|  ******|  ** ***|********|**** ***|  ** ***|********|**** ***|********|
//|        |  ** ** |        |  ** ** |  ** ** |        |  ** ** |        |
//|        |  ** ** |        |  ** ** |  ** ** |        |  ** ** |        |
//|        |  ** ** |        |  ** ** |  ** ** |        |  ** ** |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  ** ** |        |        |  ** ** |   **   |        |        |  ** ** |
//|  ** ** |        |        |  ** ** |   **   |        |        |  ** ** |
//|  ** ** |********|        |  ** ** |   *****|   *****|        |  ** ** |
//|  ** ** |        |        |  ** ** |   **   |   **   |        |  ** ** |
//|********|********|********|  ******|   *****|   *****|  ******|********|
//|        |   **   |  ** ** |        |        |   **   |  ** ** |  ** ** |
//|        |   **   |  ** ** |        |        |   **   |  ** ** |  ** ** |
//|        |   **   |  ** ** |        |        |   **   |  ** ** |  ** ** |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|   **   |   **   |        |********|        |****    |    ****|********|
//|   **   |   **   |        |********|        |****    |    ****|********|
//|********|   **   |        |********|        |****    |    ****|********|
//|   **   |   **   |        |********|        |****    |    ****|********|
//|********|*****   |   *****|********|********|****    |    ****|        |
//|   **   |        |   **   |********|********|****    |    ****|        |
//|   **   |        |   **   |********|********|****    |    ****|        |
//|   **   |        |   **   |********|********|****    |    ****|        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |        |        |        |******  |        |        |        |
//|        | ****   |******  |******* |**  **  |        | **  ** | *** ** |
//| *** ** |**  **  |**  **  | ** **  | **     | ****** | **  ** |** ***  |
//|** ***  |*****   |**      | ** **  |  **    |** **   | **  ** |   **   |
//|**  *   |**  **  |**      | ** **  | **     |** **   | **  ** |   **   |
//|** ***  |*****   |**      | ** **  |**  **  |** **   | *****  |   **   |
//| *** ** |**      |**      | ** **  |******  | ***    | **     |   **   |
//|        |**      |        |        |        |        |**      |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|******  |  ***   |  ***   |   ***  |        |     ** |  ***   | ****   |
//|  **    | ** **  | ** **  |  **    |        |    **  | **     |**  **  |
//| ****   |**   ** |**   ** |   **   | ****** | ****** |**      |**  **  |
//|**  **  |******* |**   ** | *****  |** ** **|** ** **|*****   |**  **  |
//|**  **  |**   ** | ** **  |**  **  |** ** **|** ** **|**      |**  **  |
//| ****   | ** **  | ** **  |**  **  | ****** | ****** | **     |**  **  |
//|  **    |  ***   |*** *** | ****   |        | **     |  ***   |**  **  |
//|******  |        |        |        |        |**      |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|        |  **    | **     |   **   |    *** |   **   |  **    |        |
//|******  |  **    |  **    |  **    |   ** **|   **   |  **    | *** ** |
//|        |******  |   **   | **     |   ** **|   **   |        |** ***  |
//|******  |  **    |  **    |  **    |   **   |   **   |******  |        |
//|        |  **    | **     |   **   |   **   |   **   |        | *** ** |
//|******  |        |        |        |   **   |** **   |  **    |** ***  |
//|        |******  |******  |******  |   **   |** **   |  **    |        |
//|        |        |        |        |   **   | ***    |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
//|  ***   |        |        |    ****| ****   | ***    |        |        |
//| ** **  |        |        |    **  | ** **  |   **   |        |        |
//| ** **  |        |        |    **  | ** **  |  **    |  ****  |        |
//|  ***   |   **   |        |    **  | ** **  | **     |  ****  |        |
//|        |   **   |   **   |*** **  | ** **  | ****   |  ****  |        |
//|        |        |        | ** **  |        |        |  ****  |        |
//|        |        |        |  ****  |        |        |        |        |
//|        |        |        |   ***  |        |        |        |        |
//+--------+--------+--------+--------+--------+--------+--------+--------+
/*****************************************************************************/
#ifndef BIOSFONT_H
#define BIOSFONT_H
/*****************************************************************************/
#ifdef  BIOSFONT_UNIT_TEST
#define BIOSFONT_STATIC
#endif//BIOSFONT_UNIT_TEST
/*****************************************************************************/
#ifdef  __cplusplus
namespace BIOSfont {
#endif//__cplusplus
#ifdef  BIOSFONT_STATIC
  static const unsigned char bytes[ 256 ][ 8 ] = {
   {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ///< character 0x00 |  ^@|
  ,{0x7e,0x81,0xa5,0x81,0xbd,0x99,0x81,0x7e} ///< character 0x01 |  ^A|
  ,{0x7e,0xff,0xdb,0xff,0xc3,0xe7,0xff,0x7e} ///< character 0x02 |  ^B|
  ,{0x36,0x7f,0x7f,0x7f,0x3e,0x1c,0x08,0x00} ///< character 0x03 |  ^C|
  ,{0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x08,0x00} ///< character 0x04 |  ^D|
  ,{0x1c,0x3e,0x1c,0x7f,0x7f,0x49,0x08,0x3e} ///< character 0x05 |  ^E|
  ,{0x00,0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x3e} ///< character 0x06 |  ^F|
  ,{0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00} ///< character 0x07 |  ^G|
  ,{0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff} ///< character 0x08 |  ^H|
  ,{0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00} ///< character 0x09 |  ^I|
  ,{0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff} ///< character 0x0a |  ^J|
  ,{0xf0,0xe0,0xf0,0xbe,0x33,0x33,0x33,0x1e} ///< character 0x0b |  ^K|
  ,{0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18} ///< character 0x0c |  ^L|
  ,{0xfc,0xcc,0xfc,0x0c,0x0c,0x0e,0x0f,0x07} ///< character 0x0d |  ^M|
  ,{0xfe,0xc6,0xfe,0xc6,0xc6,0xe6,0x67,0x03} ///< character 0x0e |  ^N|
  ,{0x99,0x5a,0x3c,0xe7,0xe7,0x3c,0x5a,0x99} ///< character 0x0f |  ^O|
  ,{0x01,0x07,0x1f,0x7f,0x1f,0x07,0x01,0x00} ///< character 0x10 |  ^P|
  ,{0x40,0x70,0x7c,0x7f,0x7c,0x70,0x40,0x00} ///< character 0x11 |  ^Q|
  ,{0x18,0x3c,0x7e,0x18,0x18,0x7e,0x3c,0x18} ///< character 0x12 |  ^R|
  ,{0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00} ///< character 0x13 |  ^S|
  ,{0xfe,0xdb,0xdb,0xde,0xd8,0xd8,0xd8,0x00} ///< character 0x14 |  ^T|
  ,{0x7c,0xc6,0x1c,0x36,0x36,0x1c,0x61,0x3f} ///< character 0x15 |  ^U|
  ,{0x00,0x00,0x00,0x00,0x7e,0x7e,0x7e,0x00} ///< character 0x16 |  ^V|
  ,{0x18,0x3c,0x7e,0x18,0x7e,0x3c,0x18,0xff} ///< character 0x17 |  ^W|
  ,{0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x00} ///< character 0x18 |  ^X|
  ,{0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00} ///< character 0x19 |  ^Y|
  ,{0x00,0x18,0x30,0x7f,0x30,0x18,0x00,0x00} ///< character 0x1a |  ^Z|
  ,{0x00,0x0c,0x06,0x7f,0x06,0x0c,0x00,0x00} ///< character 0x1b |  ^[|
  ,{0x00,0x00,0x03,0x03,0x03,0x7f,0x00,0x00} ///< character 0x1c |  ^\|
  ,{0x00,0x24,0x66,0xff,0x66,0x24,0x00,0x00} ///< character 0x1d |  ^]|
  ,{0x00,0x18,0x3c,0x7e,0xff,0xff,0x00,0x00} ///< character 0x1e |  ^^|
  ,{0x00,0xff,0xff,0x7e,0x3c,0x18,0x00,0x00} ///< character 0x1f |  ^_|
  ,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ///< character 0x20 |    |
  ,{0x18,0x3c,0x3c,0x18,0x18,0x00,0x18,0x00} ///< character 0x21 |   !|
  ,{0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00} ///< character 0x22 |   "|
  ,{0x36,0x36,0x7f,0x36,0x7f,0x36,0x36,0x00} ///< character 0x23 |   #|
  ,{0x18,0x7e,0x03,0x3e,0x60,0x3f,0x18,0x00} ///< character 0x24 |   $|
  ,{0x00,0x63,0x33,0x18,0x0c,0x66,0x63,0x00} ///< character 0x25 |   %|
  ,{0x1c,0x36,0x1c,0x6e,0x3b,0x33,0x6e,0x00} ///< character 0x26 |   &|
  ,{0x0c,0x0c,0x06,0x00,0x00,0x00,0x00,0x00} ///< character 0x27 |   '|
  ,{0x18,0x0c,0x06,0x06,0x06,0x0c,0x18,0x00} ///< character 0x28 |   (|
  ,{0x06,0x0c,0x18,0x18,0x18,0x0c,0x06,0x00} ///< character 0x29 |   )|
  ,{0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00} ///< character 0x2a |   *|
  ,{0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00} ///< character 0x2b |   +|
  ,{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x0c} ///< character 0x2c |   ,|
  ,{0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00} ///< character 0x2d |   -|
  ,{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00} ///< character 0x2e |   .|
  ,{0x60,0x30,0x18,0x0c,0x06,0x03,0x01,0x00} ///< character 0x2f |   /|
  ,{0x3e,0x73,0x7b,0x6f,0x67,0x63,0x3e,0x00} ///< character 0x30 |   0|
  ,{0x0c,0x0e,0x0c,0x0c,0x0c,0x0c,0x3f,0x00} ///< character 0x31 |   1|
  ,{0x1e,0x33,0x30,0x1c,0x06,0x33,0x3f,0x00} ///< character 0x32 |   2|
  ,{0x1e,0x33,0x30,0x1c,0x30,0x33,0x1e,0x00} ///< character 0x33 |   3|
  ,{0x38,0x3c,0x36,0x33,0x7f,0x30,0x78,0x00} ///< character 0x34 |   4|
  ,{0x3f,0x03,0x1f,0x30,0x30,0x33,0x1e,0x00} ///< character 0x35 |   5|
  ,{0x1c,0x06,0x03,0x1f,0x33,0x33,0x1e,0x00} ///< character 0x36 |   6|
  ,{0x3f,0x33,0x30,0x18,0x0c,0x0c,0x0c,0x00} ///< character 0x37 |   7|
  ,{0x1e,0x33,0x33,0x1e,0x33,0x33,0x1e,0x00} ///< character 0x38 |   8|
  ,{0x1e,0x33,0x33,0x3e,0x30,0x18,0x0e,0x00} ///< character 0x39 |   9|
  ,{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00} ///< character 0x3a |   :|
  ,{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x0c} ///< character 0x3b |   ;|
  ,{0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x00} ///< character 0x3c |   <|
  ,{0x00,0x00,0x7e,0x00,0x7e,0x00,0x00,0x00} ///< character 0x3d |   =|
  ,{0x06,0x0c,0x18,0x30,0x18,0x0c,0x06,0x00} ///< character 0x3e |   >|
  ,{0x3c,0x66,0x30,0x18,0x18,0x00,0x18,0x00} ///< character 0x3f |   ?|
  ,{0x3e,0x63,0x7b,0x7b,0x3b,0x03,0x3e,0x00} ///< character 0x40 |   @|
  ,{0x0c,0x1e,0x33,0x33,0x3f,0x33,0x33,0x00} ///< character 0x41 |   A|
  ,{0x3f,0x66,0x66,0x3e,0x66,0x66,0x3f,0x00} ///< character 0x42 |   B|
  ,{0x3c,0x66,0x03,0x03,0x03,0x66,0x3c,0x00} ///< character 0x43 |   C|
  ,{0x1f,0x36,0x66,0x66,0x66,0x36,0x1f,0x00} ///< character 0x44 |   D|
  ,{0x7f,0x46,0x16,0x1e,0x16,0x46,0x7f,0x00} ///< character 0x45 |   E|
  ,{0x7f,0x46,0x16,0x1e,0x16,0x06,0x0f,0x00} ///< character 0x46 |   F|
  ,{0x3c,0x66,0x03,0x03,0x73,0x66,0x5c,0x00} ///< character 0x47 |   G|
  ,{0x33,0x33,0x33,0x3f,0x33,0x33,0x33,0x00} ///< character 0x48 |   H|
  ,{0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x49 |   I|
  ,{0x78,0x30,0x30,0x30,0x33,0x33,0x1e,0x00} ///< character 0x4a |   J|
  ,{0x67,0x66,0x36,0x1e,0x36,0x66,0x67,0x00} ///< character 0x4b |   K|
  ,{0x0f,0x06,0x06,0x06,0x46,0x66,0x7f,0x00} ///< character 0x4c |   L|
  ,{0x63,0x77,0x7f,0x7f,0x6b,0x63,0x63,0x00} ///< character 0x4d |   M|
  ,{0x63,0x67,0x6f,0x7b,0x73,0x63,0x63,0x00} ///< character 0x4e |   N|
  ,{0x1c,0x36,0x63,0x63,0x63,0x36,0x1c,0x00} ///< character 0x4f |   O|
  ,{0x3f,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00} ///< character 0x50 |   P|
  ,{0x3e,0x63,0x63,0x63,0x6b,0x3e,0x70,0x00} ///< character 0x51 |   Q|
  ,{0x3f,0x66,0x66,0x3e,0x36,0x66,0x67,0x00} ///< character 0x52 |   R|
  ,{0x3e,0x63,0x07,0x1e,0x70,0x63,0x3e,0x00} ///< character 0x53 |   S|
  ,{0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x54 |   T|
  ,{0x33,0x33,0x33,0x33,0x33,0x33,0x3f,0x00} ///< character 0x55 |   U|
  ,{0x33,0x33,0x33,0x33,0x33,0x1e,0x0c,0x00} ///< character 0x56 |   V|
  ,{0x63,0x63,0x63,0x63,0x6b,0x7f,0x36,0x00} ///< character 0x57 |   W|
  ,{0x63,0x63,0x36,0x1c,0x36,0x63,0x63,0x00} ///< character 0x58 |   X|
  ,{0x33,0x33,0x33,0x1e,0x0c,0x0c,0x1e,0x00} ///< character 0x59 |   Y|
  ,{0x7f,0x63,0x31,0x18,0x4c,0x66,0x7f,0x00} ///< character 0x5a |   Z|
  ,{0x1e,0x06,0x06,0x06,0x06,0x06,0x1e,0x00} ///< character 0x5b |   [|
  ,{0x03,0x06,0x0c,0x18,0x30,0x60,0x40,0x00} ///< character 0x5c |   \|
  ,{0x1e,0x18,0x18,0x18,0x18,0x18,0x1e,0x00} ///< character 0x5d |   ]|
  ,{0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00} ///< character 0x5e |   ^|
  ,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff} ///< character 0x5f |   _|
  ,{0x0c,0x0c,0x18,0x00,0x00,0x00,0x00,0x00} ///< character 0x60 |   `|
  ,{0x00,0x00,0x1e,0x30,0x3e,0x33,0x6e,0x00} ///< character 0x61 |   a|
  ,{0x07,0x06,0x06,0x3e,0x66,0x66,0x3b,0x00} ///< character 0x62 |   b|
  ,{0x00,0x00,0x1e,0x33,0x03,0x33,0x1e,0x00} ///< character 0x63 |   c|
  ,{0x38,0x30,0x30,0x3e,0x33,0x33,0x6e,0x00} ///< character 0x64 |   d|
  ,{0x00,0x00,0x1e,0x33,0x3f,0x03,0x1e,0x00} ///< character 0x65 |   e|
  ,{0x1c,0x36,0x26,0x0f,0x06,0x06,0x0f,0x00} ///< character 0x66 |   f|
  ,{0x00,0x00,0x6e,0x33,0x33,0x3e,0x30,0x1f} ///< character 0x67 |   g|
  ,{0x07,0x06,0x36,0x6e,0x66,0x66,0x67,0x00} ///< character 0x68 |   h|
  ,{0x0c,0x00,0x0e,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x69 |   i|
  ,{0x30,0x00,0x38,0x30,0x30,0x33,0x33,0x1e} ///< character 0x6a |   j|
  ,{0x07,0x06,0x66,0x36,0x1e,0x36,0x67,0x00} ///< character 0x6b |   k|
  ,{0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x6c |   l|
  ,{0x00,0x00,0x33,0x7f,0x7f,0x6b,0x6b,0x00} ///< character 0x6d |   m|
  ,{0x00,0x00,0x1d,0x33,0x33,0x33,0x33,0x00} ///< character 0x6e |   n|
  ,{0x00,0x00,0x1e,0x33,0x33,0x33,0x1e,0x00} ///< character 0x6f |   o|
  ,{0x00,0x00,0x3b,0x66,0x66,0x3e,0x06,0x0f} ///< character 0x70 |   p|
  ,{0x00,0x00,0x6e,0x33,0x33,0x3e,0x30,0x78} ///< character 0x71 |   q|
  ,{0x00,0x00,0x3b,0x6e,0x46,0x06,0x0f,0x00} ///< character 0x72 |   r|
  ,{0x00,0x00,0x3e,0x03,0x0e,0x38,0x1f,0x00} ///< character 0x73 |   s|
  ,{0x08,0x0c,0x3f,0x0c,0x0c,0x2c,0x18,0x00} ///< character 0x74 |   t|
  ,{0x00,0x00,0x33,0x33,0x33,0x33,0x6e,0x00} ///< character 0x75 |   u|
  ,{0x00,0x00,0x33,0x33,0x33,0x1e,0x0c,0x00} ///< character 0x76 |   v|
  ,{0x00,0x00,0x63,0x63,0x6b,0x7f,0x36,0x00} ///< character 0x77 |   w|
  ,{0x00,0x00,0x63,0x36,0x1c,0x36,0x63,0x00} ///< character 0x78 |   x|
  ,{0x00,0x00,0x33,0x33,0x33,0x3e,0x30,0x1f} ///< character 0x79 |   y|
  ,{0x00,0x00,0x3f,0x19,0x0c,0x26,0x3f,0x00} ///< character 0x7a |   z|
  ,{0x38,0x0c,0x0c,0x07,0x0c,0x0c,0x38,0x00} ///< character 0x7b |   {|
  ,{0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00} ///< character 0x7c |   ||
  ,{0x07,0x0c,0x0c,0x38,0x0c,0x0c,0x07,0x00} ///< character 0x7d |   }|
  ,{0x6e,0x3b,0x00,0x00,0x00,0x00,0x00,0x00} ///< character 0x7e |   ~|
  ,{0x00,0x08,0x1c,0x36,0x63,0x63,0x7f,0x00} ///< character 0x7f |    |
  ,{0x1e,0x33,0x03,0x33,0x1e,0x18,0x30,0x1e} ///< character 0x80 |^M-@|
  ,{0x00,0x33,0x00,0x33,0x33,0x33,0x7e,0x00} ///< character 0x81 |^M-A|
  ,{0x38,0x00,0x1e,0x33,0x3f,0x03,0x1e,0x00} ///< character 0x82 |^M-B|
  ,{0x7e,0xc3,0x3c,0x60,0x7c,0x66,0xfc,0x00} ///< character 0x83 |^M-C|
  ,{0x33,0x00,0x1e,0x30,0x3e,0x33,0x7e,0x00} ///< character 0x84 |^M-D|
  ,{0x07,0x00,0x1e,0x30,0x3e,0x33,0x7e,0x00} ///< character 0x85 |^M-E|
  ,{0x0c,0x0c,0x1e,0x30,0x3e,0x33,0x7e,0x00} ///< character 0x86 |^M-F|
  ,{0x00,0x00,0x1e,0x03,0x03,0x1e,0x30,0x1c} ///< character 0x87 |^M-G|
  ,{0x7e,0xc3,0x3c,0x66,0x7e,0x06,0x3c,0x00} ///< character 0x88 |^M-H|
  ,{0x33,0x00,0x1e,0x33,0x3f,0x03,0x1e,0x00} ///< character 0x89 |^M-I|
  ,{0x07,0x00,0x1e,0x33,0x3f,0x03,0x1e,0x00} ///< character 0x8a |^M-J|
  ,{0x33,0x00,0x0e,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x8b |^M-K|
  ,{0x3e,0x63,0x1c,0x18,0x18,0x18,0x3c,0x00} ///< character 0x8c |^M-L|
  ,{0x07,0x00,0x0e,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0x8d |^M-M|
  ,{0x63,0x1c,0x36,0x63,0x7f,0x63,0x63,0x00} ///< character 0x8e |^M-N|
  ,{0x0c,0x0c,0x00,0x1e,0x33,0x3f,0x33,0x00} ///< character 0x8f |^M-O|
  ,{0x38,0x00,0x3f,0x06,0x1e,0x06,0x3f,0x00} ///< character 0x90 |^M-P|
  ,{0x00,0x00,0xfe,0x30,0xfe,0x33,0xfe,0x00} ///< character 0x91 |^M-Q|
  ,{0x7c,0x36,0x33,0x7f,0x33,0x33,0x73,0x00} ///< character 0x92 |^M-R|
  ,{0x1e,0x33,0x00,0x1e,0x33,0x33,0x1e,0x00} ///< character 0x93 |^M-S|
  ,{0x00,0x33,0x00,0x1e,0x33,0x33,0x1e,0x00} ///< character 0x94 |^M-T|
  ,{0x00,0x07,0x00,0x1e,0x33,0x33,0x1e,0x00} ///< character 0x95 |^M-U|
  ,{0x1e,0x33,0x00,0x33,0x33,0x33,0x7e,0x00} ///< character 0x96 |^M-V|
  ,{0x00,0x07,0x00,0x33,0x33,0x33,0x7e,0x00} ///< character 0x97 |^M-W|
  ,{0x00,0x33,0x00,0x33,0x33,0x3e,0x30,0x1f} ///< character 0x98 |^M-X|
  ,{0xc3,0x18,0x3c,0x66,0x66,0x3c,0x18,0x00} ///< character 0x99 |^M-Y|
  ,{0x33,0x00,0x33,0x33,0x33,0x33,0x1e,0x00} ///< character 0x9a |^M-Z|
  ,{0x18,0x18,0x7e,0x03,0x03,0x7e,0x18,0x18} ///< character 0x9b |^M-[|
  ,{0x1c,0x36,0x26,0x0f,0x06,0x67,0x3f,0x00} ///< character 0x9c |^M-\|
  ,{0x33,0x33,0x1e,0x3f,0x0c,0x3f,0x0c,0x0c} ///< character 0x9d |^M-]|
  ,{0x1f,0x33,0x33,0x5f,0x63,0xf3,0x63,0xe3} ///< character 0x9e |^M-^|
  ,{0x70,0xd8,0x18,0x3c,0x18,0x18,0x1b,0x0e} ///< character 0x9f |^M-_|
  ,{0x38,0x00,0x1e,0x30,0x3e,0x33,0x7e,0x00} ///< character 0xa0 | M- |
  ,{0x1c,0x00,0x0e,0x0c,0x0c,0x0c,0x1e,0x00} ///< character 0xa1 | M-!|
  ,{0x00,0x38,0x00,0x1e,0x33,0x33,0x1e,0x00} ///< character 0xa2 | M-"|
  ,{0x00,0x38,0x00,0x33,0x33,0x33,0x7e,0x00} ///< character 0xa3 | M-#|
  ,{0x00,0x1f,0x00,0x1f,0x33,0x33,0x33,0x00} ///< character 0xa4 | M-$|
  ,{0x3f,0x00,0x33,0x37,0x3f,0x3b,0x33,0x00} ///< character 0xa5 | M-%|
  ,{0x3c,0x36,0x36,0x7c,0x00,0x7e,0x00,0x00} ///< character 0xa6 | M-&|
  ,{0x1c,0x36,0x36,0x1c,0x00,0x3e,0x00,0x00} ///< character 0xa7 | M-'|
  ,{0x0c,0x00,0x0c,0x06,0x03,0x33,0x1e,0x00} ///< character 0xa8 | M-(|
  ,{0x00,0x00,0x00,0x3f,0x03,0x03,0x00,0x00} ///< character 0xa9 | M-)|
  ,{0x00,0x00,0x00,0x3f,0x30,0x30,0x00,0x00} ///< character 0xaa | M-*|
  ,{0xc3,0x63,0x33,0x7b,0xcc,0x66,0x33,0xf0} ///< character 0xab | M-+|
  ,{0xc3,0x63,0x33,0xdb,0xec,0xf6,0xf3,0xc0} ///< character 0xac | M-,|
  ,{0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00} ///< character 0xad | M--|
  ,{0x00,0xcc,0x66,0x33,0x66,0xcc,0x00,0x00} ///< character 0xae | M-.|
  ,{0x00,0x33,0x66,0xcc,0x66,0x33,0x00,0x00} ///< character 0xaf | M-/|
  ,{0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11} ///< character 0xb0 | M-0|
  ,{0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55} ///< character 0xb1 | M-1|
  ,{0xdb,0xee,0xdb,0x77,0xdb,0xee,0xdb,0x77} ///< character 0xb2 | M-2|
  ,{0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18} ///< character 0xb3 | M-3|
  ,{0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18} ///< character 0xb4 | M-4|
  ,{0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18} ///< character 0xb5 | M-5|
  ,{0x6c,0x6c,0x6c,0x6c,0x6f,0x6c,0x6c,0x6c} ///< character 0xb6 | M-6|
  ,{0x00,0x00,0x00,0x00,0x7f,0x6c,0x6c,0x6c} ///< character 0xb7 | M-7|
  ,{0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18} ///< character 0xb8 | M-8|
  ,{0x6c,0x6c,0x6f,0x60,0x6f,0x6c,0x6c,0x6c} ///< character 0xb9 | M-9|
  ,{0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c} ///< character 0xba | M-:|
  ,{0x00,0x00,0x7f,0x60,0x6f,0x6c,0x6c,0x6c} ///< character 0xbb | M-;|
  ,{0x6c,0x6c,0x6f,0x60,0x7f,0x00,0x00,0x00} ///< character 0xbc | M-<|
  ,{0x6c,0x6c,0x6c,0x6c,0x7f,0x00,0x00,0x00} ///< character 0xbd | M-=|
  ,{0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00} ///< character 0xbe | M->|
  ,{0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18} ///< character 0xbf | M-?|
  ,{0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00} ///< character 0xc0 | M-@|
  ,{0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00} ///< character 0xc1 | M-A|
  ,{0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18} ///< character 0xc2 | M-B|
  ,{0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18} ///< character 0xc3 | M-C|
  ,{0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00} ///< character 0xc4 | M-D|
  ,{0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18} ///< character 0xc5 | M-E|
  ,{0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18} ///< character 0xc6 | M-F|
  ,{0x6c,0x6c,0x6c,0x6c,0xec,0x6c,0x6c,0x6c} ///< character 0xc7 | M-G|
  ,{0x6c,0x6c,0xec,0x0c,0xfc,0x00,0x00,0x00} ///< character 0xc8 | M-H|
  ,{0x00,0x00,0xfc,0x0c,0xec,0x6c,0x6c,0x6c} ///< character 0xc9 | M-I|
  ,{0x6c,0x6c,0xef,0x00,0xff,0x00,0x00,0x00} ///< character 0xca | M-J|
  ,{0x00,0x00,0xff,0x00,0xef,0x6c,0x6c,0x6c} ///< character 0xcb | M-K|
  ,{0x6c,0x6c,0xec,0x0c,0xec,0x6c,0x6c,0x6c} ///< character 0xcc | M-L|
  ,{0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00} ///< character 0xcd | M-M|
  ,{0x6c,0x6c,0xef,0x00,0xef,0x6c,0x6c,0x6c} ///< character 0xce | M-N|
  ,{0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00} ///< character 0xcf | M-O|
  ,{0x6c,0x6c,0x6c,0x6c,0xff,0x00,0x00,0x00} ///< character 0xd0 | M-P|
  ,{0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18} ///< character 0xd1 | M-Q|
  ,{0x00,0x00,0x00,0x00,0xff,0x6c,0x6c,0x6c} ///< character 0xd2 | M-R|
  ,{0x6c,0x6c,0x6c,0x6c,0xfc,0x00,0x00,0x00} ///< character 0xd3 | M-S|
  ,{0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00} ///< character 0xd4 | M-T|
  ,{0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18} ///< character 0xd5 | M-U|
  ,{0x00,0x00,0x00,0x00,0xfc,0x6c,0x6c,0x6c} ///< character 0xd6 | M-V|
  ,{0x6c,0x6c,0x6c,0x6c,0xff,0x6c,0x6c,0x6c} ///< character 0xd7 | M-W|
  ,{0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18} ///< character 0xd8 | M-X|
  ,{0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00} ///< character 0xd9 | M-Y|
  ,{0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18} ///< character 0xda | M-Z|
  ,{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff} ///< character 0xdb | M-[|
  ,{0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff} ///< character 0xdc | M-\|
  ,{0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f} ///< character 0xdd | M-]|
  ,{0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} ///< character 0xde | M-^|
  ,{0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00} ///< character 0xdf | M-_|
  ,{0x00,0x00,0x6e,0x3b,0x13,0x3b,0x6e,0x00} ///< character 0xe0 | M-`|
  ,{0x00,0x1e,0x33,0x1f,0x33,0x1f,0x03,0x03} ///< character 0xe1 | M-a|
  ,{0x00,0x3f,0x33,0x03,0x03,0x03,0x03,0x00} ///< character 0xe2 | M-b|
  ,{0x00,0x7f,0x36,0x36,0x36,0x36,0x36,0x00} ///< character 0xe3 | M-c|
  ,{0x3f,0x33,0x06,0x0c,0x06,0x33,0x3f,0x00} ///< character 0xe4 | M-d|
  ,{0x00,0x00,0x7e,0x1b,0x1b,0x1b,0x0e,0x00} ///< character 0xe5 | M-e|
  ,{0x00,0x66,0x66,0x66,0x66,0x3e,0x06,0x03} ///< character 0xe6 | M-f|
  ,{0x00,0x6e,0x3b,0x18,0x18,0x18,0x18,0x00} ///< character 0xe7 | M-g|
  ,{0x3f,0x0c,0x1e,0x33,0x33,0x1e,0x0c,0x3f} ///< character 0xe8 | M-h|
  ,{0x1c,0x36,0x63,0x7f,0x63,0x36,0x1c,0x00} ///< character 0xe9 | M-i|
  ,{0x1c,0x36,0x63,0x63,0x36,0x36,0x77,0x00} ///< character 0xea | M-j|
  ,{0x38,0x0c,0x18,0x3e,0x33,0x33,0x1e,0x00} ///< character 0xeb | M-k|
  ,{0x00,0x00,0x7e,0xdb,0xdb,0x7e,0x00,0x00} ///< character 0xec | M-l|
  ,{0x60,0x30,0x7e,0xdb,0xdb,0x7e,0x06,0x03} ///< character 0xed | M-m|
  ,{0x1c,0x06,0x03,0x1f,0x03,0x06,0x1c,0x00} ///< character 0xee | M-n|
  ,{0x1e,0x33,0x33,0x33,0x33,0x33,0x33,0x00} ///< character 0xef | M-o|
  ,{0x00,0x3f,0x00,0x3f,0x00,0x3f,0x00,0x00} ///< character 0xf0 | M-p|
  ,{0x0c,0x0c,0x3f,0x0c,0x0c,0x00,0x3f,0x00} ///< character 0xf1 | M-q|
  ,{0x06,0x0c,0x18,0x0c,0x06,0x00,0x3f,0x00} ///< character 0xf2 | M-r|
  ,{0x18,0x0c,0x06,0x0c,0x18,0x00,0x3f,0x00} ///< character 0xf3 | M-s|
  ,{0x70,0xd8,0xd8,0x18,0x18,0x18,0x18,0x18} ///< character 0xf4 | M-t|
  ,{0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x0e} ///< character 0xf5 | M-u|
  ,{0x0c,0x0c,0x00,0x3f,0x00,0x0c,0x0c,0x00} ///< character 0xf6 | M-v|
  ,{0x00,0x6e,0x3b,0x00,0x6e,0x3b,0x00,0x00} ///< character 0xf7 | M-w|
  ,{0x1c,0x36,0x36,0x1c,0x00,0x00,0x00,0x00} ///< character 0xf8 | M-x|
  ,{0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00} ///< character 0xf9 | M-y|
  ,{0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00} ///< character 0xfa | M-z|
  ,{0xf0,0x30,0x30,0x30,0x37,0x36,0x3c,0x38} ///< character 0xfb | M-{|
  ,{0x1e,0x36,0x36,0x36,0x36,0x00,0x00,0x00} ///< character 0xfc | M-||
  ,{0x0e,0x18,0x0c,0x06,0x1e,0x00,0x00,0x00} ///< character 0xfd | M-}|
  ,{0x00,0x00,0x3c,0x3c,0x3c,0x3c,0x00,0x00} ///< character 0xfe | M-~|
  ,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ///< character 0xff |    |
  };
#else
  extern const unsigned long long bytes[ 256 ][ 8 ];
#endif//BIOSFONT_STATIC

/*****************************************************************************/
/// @brief This recovers one font bit.
  inline bool
  fontbit( const unsigned char c, const unsigned x, const unsigned y ) {
    return !!(bytes[ c ][ y ] & (1<<x));
  }
#ifdef  __cplusplus
}

#endif//__cplusplus
/*****************************************************************************/
#ifdef  BIOSFONT_UNIT_TEST
/// @brief This unit test displays the entire ROM BIOS font.
#include <stdio.h>

/*****************************************************************************/
/// @brief This encodes one scan line for 1 character.
inline char *
scanchar( char *scan, const unsigned code, const unsigned line ) {
  const char bit[ 2 ] = { ' ', '*' };
  scan[ 0 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x01) ];
  scan[ 1 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x02) ];
  scan[ 2 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x04) ];
  scan[ 3 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x08) ];
  scan[ 4 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x10) ];
  scan[ 5 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x20) ];
  scan[ 6 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x40) ];
  scan[ 7 ] = bit[ !!(BIOSfont::bytes[ code ][ line ] & 0x80) ];
  return scan;
}

/*****************************************************************************/
/// @brief This encodes one scan line for 8 characters across.
inline char *
scanline( char *cells, const unsigned start, const unsigned line ) {
  scanchar( cells + 1 + 9 * 0, start + 0, line );
  scanchar( cells + 1 + 9 * 1, start + 1, line );
  scanchar( cells + 1 + 9 * 2, start + 2, line );
  scanchar( cells + 1 + 9 * 3, start + 3, line );
  scanchar( cells + 1 + 9 * 4, start + 4, line );
  scanchar( cells + 1 + 9 * 5, start + 5, line );
  scanchar( cells + 1 + 9 * 6, start + 6, line );
  scanchar( cells + 1 + 9 * 7, start + 7, line );
  return cells;
}

/*****************************************************************************/
/// @brief This encodes one set of 8 characters starting at code.
///        It marches through one set of eight, scan-line at a time..
void display( const unsigned start ) {
  static char line[ 80 ] =
  "+--------+--------+--------+--------+--------+--------+--------+--------+";
  static char cells[ 80 ] =
  "|        |        |        |        |        |        |        |        |";
  puts( line );
  if( start >= 0x100 ) return;
  puts( scanline( cells, start, 0 ) );
  puts( scanline( cells, start, 1 ) );
  puts( scanline( cells, start, 2 ) );
  puts( scanline( cells, start, 3 ) );
  puts( scanline( cells, start, 4 ) );
  puts( scanline( cells, start, 5 ) );
  puts( scanline( cells, start, 6 ) );
  puts( scanline( cells, start, 7 ) );
}

/*****************************************************************************/
/// @brief This causes the entire font to be displayed magnified.
void display( ) {  for( unsigned c = 0; c <= 0x100; c += 0x08 ) display( c );}

/*****************************************************************************/
int main( int argc, char *argv[ ] ) {
  if( argc > 1 ) puts( argv[ 0 ] );
  display( );
  return 0;
}
/*****************************************************************************/
#endif//BIOSFONT_UNIT_TEST
#endif//BIOSFONT_H
/// biosfont.h <EOF>
/*****************************************************************************/
