BESCII font and Commodore PETSCII font

Post your FreeBASIC source, examples, tips and tricks here. Please don’t post code without including an explanation.
Post Reply
angros47
Posts: 2321
Joined: Jun 21, 2005 19:04

BESCII font and Commodore PETSCII font

Post by angros47 »

This code is a port of the BESCII font (https://github.com/damianvila/font-bescii) to FreeBasic. It allows to use it to simulate the PETSCII (the font of the Commodore computers), but includes also some characters of the Amstrat CPC, and a lot of characters made to build graphics with them. Since the characters are all in the 8x8 format, they can be used only in graphic modes that use that format (it can be set with WIDTH, but it should be the default when graphic is set with ScreenRes)

PETSCII has the same mapping of the original one (besides the characters to change color, activate reverse mode, and so on, of course). Reverse characters are not available, but they are not needed since it's possible to just swap foreground and background color. PETSCII is available in upper case (lower case characters are not available, and are replaced by semigraphic ones), lower case (attention: in that standard, upper and lower case are swapped, compared to modern ASCII).

What can it be used for? The pixel art font can be used for creating retro games, while the PETSCII can be used to port old programs from the Commodore computers (many BASIC programmers started on them) keeping the original look

Code: Select all

type Font
  w as long
  h as long
  d as any ptr
end type

enum
  FB_FONT_8 = 0,
  FB_FONT_14
  FB_FONT_16
end enum

extern Fonts(2)  alias "__fb_font"  as Font

dim shared bescii(...,1 to 8) as ubyte={{24, 60, 102, 102, 126, 102, 102, 0},_
{16, 8, 0, 60, 102, 126, 102, 0},_
{8, 20, 0, 60, 102, 126, 102, 0},_
{36, 0, 0, 60, 102, 126, 102, 0},_
{8, 16, 0, 60, 102, 126, 102, 0},_
{24, 24, 0, 60, 102, 126, 102, 0},_
{60, 0, 0, 60, 102, 126, 102, 0},_
{126, 27, 27, 63, 27, 27, 123, 0},_
{62, 102, 102, 62, 102, 102, 62, 0},_
{60, 102, 6, 6, 6, 102, 60, 0},_
{60, 102, 6, 6, 6, 102, 60, 16},_
{62, 102, 102, 102, 102, 102, 62, 0},_
{62, 102, 102, 111, 102, 102, 62, 0},_
{126, 6, 6, 30, 6, 6, 126, 0},_
{16, 8, 126, 6, 30, 6, 126, 0},_
{8, 20, 126, 6, 30, 6, 126, 0},_
{36, 0, 126, 6, 30, 6, 126, 0},_
{8, 16, 126, 6, 30, 6, 126, 0},_
{126, 6, 6, 30, 6, 6, 6, 0},_
{60, 102, 6, 118, 102, 102, 60, 0},_
{102, 102, 102, 126, 102, 102, 102, 0},_
{60, 24, 24, 24, 24, 24, 60, 0},_
{16, 8, 60, 24, 24, 24, 60, 0},_
{8, 20, 60, 24, 24, 24, 60, 0},_
{36, 0, 60, 24, 24, 24, 60, 0},_
{8, 16, 60, 24, 24, 24, 60, 0},_
{112, 96, 96, 96, 96, 102, 60, 0},_
{102, 102, 54, 30, 54, 102, 102, 0},_
{6, 6, 6, 6, 6, 6, 126, 0},_
{6, 6, 30, 7, 6, 6, 126, 0},_
{99, 119, 127, 107, 99, 99, 99, 0},_
{102, 110, 126, 118, 102, 102, 102, 0},_
{60, 0, 102, 110, 126, 118, 102, 0},_
{60, 102, 102, 102, 102, 102, 60, 0},_
{16, 8, 60, 102, 102, 102, 60, 0},_
{8, 20, 60, 102, 102, 102, 60, 0},_
{36, 0, 60, 102, 102, 102, 60, 0},_
{8, 16, 60, 102, 102, 102, 60, 0},_
{188, 102, 118, 126, 110, 102, 61, 0},_
{60, 102, 102, 102, 102, 102, 60, 0},_
{126, 27, 27, 59, 27, 27, 126, 0},_
{62, 102, 102, 62, 6, 6, 6, 0},_
{12, 60, 108, 108, 108, 60, 12, 0},_
{60, 102, 102, 102, 102, 118, 60, 96},_
{62, 102, 102, 62, 102, 102, 102, 0},_
{60, 102, 6, 60, 96, 102, 60, 0},_
{20, 8, 124, 6, 60, 96, 62, 0},_
{62, 102, 102, 54, 102, 102, 54, 6},_
{126, 24, 24, 24, 24, 24, 24, 0},_
{102, 102, 102, 102, 102, 102, 60, 0},_
{16, 8, 102, 102, 102, 102, 60, 0},_
{8, 20, 102, 102, 102, 102, 60, 0},_
{36, 0, 102, 102, 102, 102, 60, 0},_
{8, 16, 102, 102, 102, 102, 60, 0},_
{102, 102, 102, 102, 102, 60, 24, 0},_
{99, 99, 99, 107, 107, 127, 54, 0},_
{102, 102, 60, 24, 60, 102, 102, 0},_
{102, 102, 102, 60, 24, 24, 24, 0},_
{16, 8, 102, 102, 60, 24, 24, 0},_
{36, 0, 102, 102, 60, 24, 24, 0},_
{126, 96, 48, 24, 12, 6, 126, 0},_
{20, 8, 126, 48, 24, 12, 126, 0},_
{0, 0, 60, 96, 124, 102, 124, 0},_
{32, 16, 60, 96, 124, 102, 124, 0},_
{8, 20, 60, 96, 124, 102, 124, 0},_
{36, 0, 60, 96, 124, 102, 124, 0},_
{8, 16, 60, 96, 124, 102, 124, 0},_
{24, 24, 60, 96, 124, 102, 124, 0},_
{60, 0, 60, 96, 124, 102, 124, 0},_
{0, 0, 55, 76, 126, 13, 62, 0},_
{6, 6, 62, 102, 102, 102, 62, 0},_
{0, 0, 60, 102, 6, 102, 60, 0},_
{0, 0, 60, 102, 6, 102, 60, 16},_
{96, 96, 124, 102, 102, 102, 124, 0},_
{48, 248, 96, 124, 102, 102, 60, 0},_
{0, 0, 60, 102, 126, 6, 60, 0},_
{16, 8, 60, 102, 126, 6, 60, 0},_
{8, 20, 60, 102, 126, 6, 60, 0},_
{36, 0, 60, 102, 126, 6, 60, 0},_
{8, 16, 60, 102, 126, 6, 60, 0},_
{60, 102, 6, 31, 6, 6, 6, 0},_
{0, 0, 124, 102, 102, 124, 96, 60},_
{6, 6, 62, 102, 102, 102, 102, 0},_
{24, 0, 24, 24, 24, 24, 48, 0},_
{0, 0, 24, 24, 24, 24, 48, 0},_
{16, 8, 0, 24, 24, 24, 48, 0},_
{8, 20, 0, 24, 24, 24, 48, 0},_
{36, 0, 0, 24, 24, 24, 48, 0},_
{8, 16, 0, 24, 24, 24, 48, 0},_
{24, 0, 28, 24, 24, 24, 24, 14},_
{6, 6, 102, 54, 30, 54, 102, 0},_
{24, 24, 24, 24, 24, 24, 48, 0},_
{24, 24, 56, 28, 24, 24, 48, 0},_
{0, 0, 55, 127, 107, 107, 107, 0},_
{0, 0, 62, 102, 102, 102, 102, 0},_
{60, 0, 62, 102, 102, 102, 102, 0},_
{0, 0, 60, 102, 102, 102, 60, 0},_
{16, 8, 60, 102, 102, 102, 60, 0},_
{8, 20, 60, 102, 102, 102, 60, 0},_
{36, 0, 60, 102, 102, 102, 60, 0},_
{8, 16, 60, 102, 102, 102, 60, 0},_
{0, 0, 188, 102, 118, 110, 61, 0},_
{60, 0, 60, 102, 102, 102, 60, 0},_
{0, 0, 54, 73, 121, 9, 54, 0},_
{0, 0, 62, 102, 102, 62, 6, 6},_
{0, 0, 12, 60, 108, 60, 12, 0},_
{0, 0, 124, 102, 102, 124, 96, 96},_
{0, 0, 62, 102, 6, 6, 6, 0},_
{0, 0, 60, 6, 60, 96, 60, 0},_
{20, 8, 60, 6, 60, 96, 60, 0},_
{0, 0, 62, 102, 54, 102, 54, 6},_
{12, 12, 62, 12, 12, 12, 56, 0},_
{0, 0, 102, 102, 102, 102, 124, 0},_
{16, 8, 102, 102, 102, 102, 124, 0},_
{8, 20, 102, 102, 102, 102, 124, 0},_
{36, 0, 102, 102, 102, 102, 124, 0},_
{8, 16, 102, 102, 102, 102, 124, 0},_
{0, 0, 102, 102, 102, 60, 24, 0},_
{0, 0, 99, 99, 107, 107, 54, 0},_
{0, 0, 102, 60, 24, 60, 102, 0},_
{0, 0, 102, 102, 102, 124, 96, 60},_
{16, 8, 102, 102, 102, 124, 96, 60},_
{36, 0, 102, 102, 102, 124, 96, 60},_
{0, 0, 126, 48, 24, 12, 126, 0},_
{20, 8, 126, 48, 24, 12, 126, 0},_
{60, 102, 6, 63, 54, 54, 102, 0},_
{60, 102, 102, 111, 102, 102, 102, 0},_
{96, 80, 96, 0, 0, 0, 0, 0},_
{32, 80, 32, 0, 0, 0, 0, 0},_
{8, 28, 54, 54, 99, 99, 127, 0},_
{127, 99, 6, 12, 6, 99, 127, 0},_
{62, 99, 99, 99, 99, 54, 119, 0},_
{0, 0, 206, 123, 51, 123, 206, 0},_
{62, 99, 99, 63, 99, 99, 31, 3},_
{0, 102, 102, 60, 102, 102, 60, 0},_
{60, 6, 6, 60, 102, 102, 60, 0},_
{0, 0, 120, 12, 62, 12, 120, 0},_
{28, 54, 99, 127, 99, 54, 28, 0},_
{0, 3, 6, 12, 28, 54, 99, 0},_
{0, 0, 102, 102, 102, 62, 6, 6},_
{0, 0, 127, 54, 54, 54, 102, 0},_
{0, 0, 126, 51, 51, 51, 30, 0},_
{0, 8, 62, 107, 107, 107, 62, 8},_
{0, 103, 60, 24, 28, 55, 226, 0},_
{0, 8, 107, 107, 107, 107, 62, 8},_
{0, 0, 102, 195, 219, 219, 126, 0},_
{8, 126, 8, 60, 106, 90, 44, 0},_
{0, 8, 60, 8, 28, 58, 44, 0},_
{0, 34, 66, 66, 66, 74, 68, 0},_
{0, 0, 0, 18, 34, 34, 36, 0},_
{60, 0, 62, 64, 64, 32, 28, 0},_
{0, 0, 28, 0, 30, 32, 24, 0},_
{60, 0, 62, 32, 16, 44, 98, 0},_
{0, 0, 28, 0, 60, 16, 44, 0},_
{4, 95, 68, 30, 37, 37, 22, 0},_
{0, 4, 46, 36, 14, 21, 22, 0},_
{4, 30, 84, 84, 82, 18, 10, 0},_
{0, 0, 8, 94, 84, 18, 10, 0},_
{8, 62, 8, 62, 24, 4, 56, 0},_
{82, 87, 2, 15, 6, 1, 14, 0},_
{32, 16, 12, 2, 12, 16, 32, 0},_
{80, 84, 2, 1, 2, 4, 8, 0},_
{32, 122, 34, 34, 34, 34, 16, 0},_
{168, 169, 29, 9, 9, 9, 4, 0},_
{62, 32, 16, 4, 2, 66, 60, 0},_
{87, 84, 0, 2, 1, 33, 30, 0},_
{8, 126, 16, 60, 66, 2, 60, 0},_
{82, 95, 4, 30, 33, 1, 30, 0},_
{2, 2, 2, 2, 66, 34, 28, 0},_
{81, 81, 1, 1, 33, 17, 14, 0},_
{16, 126, 16, 24, 20, 24, 14, 0},_
{164, 175, 4, 6, 5, 6, 3, 0},_
{0, 36, 126, 36, 52, 4, 56, 0},_
{160, 170, 31, 10, 10, 2, 12, 0},_
{124, 48, 126, 48, 8, 8, 112, 0},_
{175, 166, 15, 6, 1, 1, 14, 0},_
{2, 15, 114, 2, 10, 10, 113, 0},_
{162, 167, 26, 2, 10, 10, 49, 0},_
{8, 126, 4, 60, 64, 64, 56, 0},_
{164, 175, 2, 14, 16, 16, 12, 0},_
{0, 0, 62, 64, 64, 64, 60, 0},_
{0, 0, 0, 28, 32, 32, 24, 0},_
{80, 80, 15, 16, 16, 16, 14, 0},_
{0, 126, 48, 8, 4, 4, 56, 0},_
{0, 31, 172, 162, 1, 1, 14, 0},_
{0, 4, 100, 28, 2, 2, 60, 0},_
{80, 82, 2, 30, 1, 1, 30, 0},_
{2, 119, 2, 34, 50, 106, 81, 0},_
{0, 122, 2, 2, 10, 10, 112, 0},_
{0, 20, 62, 85, 85, 121, 182, 0},_
{4, 6, 60, 68, 100, 86, 100, 0},_
{0, 0, 60, 74, 74, 74, 36, 0},_
{16, 125, 17, 17, 57, 85, 72, 0},_
{168, 189, 9, 9, 29, 43, 44, 0},_
{200, 221, 9, 9, 29, 43, 44, 0},_
{0, 23, 52, 98, 34, 34, 28, 0},_
{160, 171, 26, 49, 17, 17, 14, 0},_
{192, 203, 26, 49, 17, 17, 14, 0},_
{28, 0, 8, 42, 82, 81, 12, 0},_
{86, 80, 4, 21, 41, 40, 6, 0},_
{110, 96, 4, 21, 41, 40, 6, 0},_
{0, 0, 4, 10, 49, 64, 0, 0},_
{80, 80, 4, 10, 49, 64, 0, 0},_
{96, 96, 4, 10, 49, 64, 0, 0},_
{125, 17, 125, 17, 57, 85, 73, 0},_
{189, 169, 29, 9, 29, 43, 44, 0},_
{221, 201, 29, 9, 29, 43, 44, 0},_
{16, 126, 16, 126, 16, 62, 78, 0},_
{0, 46, 40, 124, 42, 42, 36, 0},_
{4, 47, 68, 6, 5, 70, 56, 0},_
{0, 18, 62, 83, 85, 77, 38, 0},_
{4, 62, 4, 62, 4, 68, 56, 0},_
{2, 18, 62, 83, 66, 50, 2, 0},_
{0, 0, 20, 30, 36, 20, 4, 0},_
{0, 18, 58, 86, 82, 58, 16, 0},_
{0, 0, 18, 58, 86, 58, 18, 0},_
{8, 56, 8, 8, 28, 42, 68, 0},_
{0, 0, 8, 24, 8, 28, 44, 0},_
{12, 48, 2, 58, 70, 66, 48, 0},_
{0, 66, 66, 66, 70, 66, 48, 0},_
{62, 16, 60, 70, 64, 88, 60, 0},_
{4, 7, 28, 36, 36, 38, 100, 0},_
{0, 60, 16, 56, 68, 64, 48, 0},_
{4, 6, 60, 76, 68, 70, 36, 0},_
{0, 0, 4, 30, 44, 38, 20, 0},_
{0, 30, 8, 60, 74, 106, 100, 0},_
{62, 16, 12, 50, 112, 56, 44, 82},_
{8, 62, 8, 28, 114, 40, 112, 0},_
{2, 2, 10, 22, 18, 82, 34, 0},_
{86, 80, 7, 8, 8, 4, 3, 0},_
{0, 127, 64, 40, 8, 8, 4, 0},_
{0, 0, 62, 32, 24, 8, 4, 0},_
{0, 64, 32, 24, 22, 16, 16, 0},_
{0, 0, 0, 32, 30, 8, 8, 0},_
{0, 8, 126, 66, 64, 32, 24, 0},_
{0, 0, 8, 60, 36, 32, 16, 0},_
{0, 62, 8, 8, 8, 8, 126, 0},_
{0, 0, 0, 30, 8, 8, 62, 0},_
{0, 32, 126, 48, 40, 36, 16, 0},_
{0, 0, 16, 62, 24, 20, 8, 0},_
{0, 8, 126, 72, 72, 68, 34, 0},_
{0, 0, 8, 60, 40, 36, 16, 0},_
{80, 80, 4, 63, 36, 34, 16, 0},_
{8, 62, 8, 127, 8, 8, 8, 0},_
{80, 82, 15, 2, 15, 2, 2, 0},_
{4, 124, 68, 66, 32, 16, 12, 0},_
{80, 82, 14, 10, 9, 4, 3, 0},_
{8, 8, 124, 18, 16, 16, 8, 0},_
{0, 0, 4, 60, 18, 16, 8, 0},_
{80, 80, 2, 30, 9, 8, 4, 0},_
{0, 0, 126, 64, 64, 64, 126, 0},_
{80, 80, 15, 8, 8, 8, 15, 0},_
{0, 36, 126, 36, 32, 32, 16, 0},_
{80, 80, 10, 31, 10, 8, 4, 0},_
{12, 16, 6, 72, 32, 24, 6, 0},_
{80, 82, 4, 33, 18, 12, 3, 0},_
{0, 126, 64, 32, 16, 40, 70, 0},_
{80, 80, 15, 8, 8, 4, 11, 0},_
{0, 4, 124, 38, 20, 4, 120, 0},_
{80, 82, 30, 11, 2, 2, 28, 0},_
{0, 66, 68, 68, 32, 16, 14, 0},_
{80, 82, 4, 68, 32, 16, 14, 0},_
{4, 60, 36, 42, 48, 16, 12, 0},_
{80, 82, 14, 11, 12, 8, 6, 0},_
{0, 124, 16, 126, 16, 16, 8, 0},_
{80, 95, 4, 31, 4, 4, 2, 0},_
{4, 72, 66, 68, 32, 16, 14, 0},_
{0, 8, 16, 68, 72, 32, 24, 0},_
{80, 80, 36, 41, 34, 16, 12, 0},_
{0, 60, 0, 126, 16, 16, 12, 0},_
{80, 80, 14, 4, 31, 4, 2, 0},_
{0, 4, 4, 12, 52, 4, 4, 0},_
{80, 84, 4, 12, 52, 4, 4, 0},_
{16, 16, 126, 16, 16, 16, 12, 0},_
{0, 0, 124, 0, 0, 0, 126, 0},_
{126, 64, 72, 80, 32, 80, 14, 0},_
{8, 63, 40, 28, 12, 26, 41, 0},_
{0, 32, 32, 32, 16, 8, 6, 0},_
{0, 0, 36, 36, 68, 68, 66, 0},_
{80, 80, 10, 10, 18, 18, 17, 0},_
{96, 96, 10, 10, 18, 18, 17, 0},_
{0, 2, 50, 14, 2, 2, 60, 0},_
{80, 81, 1, 15, 1, 1, 30, 0},_
{96, 97, 1, 15, 1, 1, 30, 0},_
{0, 126, 64, 64, 32, 16, 14, 0},_
{80, 80, 15, 8, 8, 4, 3, 0},_
{96, 96, 15, 8, 8, 4, 3, 0},_
{0, 0, 12, 18, 33, 64, 0, 0},_
{80, 80, 12, 18, 33, 64, 0, 0},_
{96, 96, 12, 18, 33, 64, 0, 0},_
{8, 127, 8, 42, 42, 73, 69, 0},_
{80, 84, 31, 4, 14, 21, 2, 0},_
{96, 100, 31, 4, 14, 21, 2, 0},_
{0, 126, 64, 36, 24, 16, 32, 0},_
{0, 30, 0, 60, 0, 124, 0, 0},_
{0, 8, 8, 4, 20, 34, 127, 64},_
{0, 32, 36, 40, 16, 40, 70, 0},_
{0, 62, 8, 126, 8, 8, 48, 0},_
{0, 4, 126, 68, 36, 8, 8, 0},_
{0, 0, 4, 60, 38, 4, 8, 0},_
{0, 62, 32, 32, 32, 32, 126, 0},_
{0, 0, 0, 60, 32, 32, 124, 0},_
{0, 126, 64, 126, 64, 64, 126, 0},_
{0, 0, 60, 32, 60, 32, 60, 0},_
{60, 0, 126, 64, 64, 32, 28, 0},_
{0, 66, 66, 66, 64, 32, 24, 0},_
{0, 18, 18, 18, 82, 50, 17, 0},_
{0, 4, 4, 4, 68, 52, 12, 0},_
{0, 126, 66, 66, 66, 66, 126, 0},_
{0, 126, 66, 66, 64, 32, 24, 0},_
{0, 0, 0, 60, 36, 32, 24, 0},_
{80, 80, 15, 9, 8, 8, 6, 0},_
{0, 32, 126, 36, 36, 127, 32, 32},_
{80, 84, 15, 5, 5, 15, 4, 0},_
{0, 126, 64, 40, 8, 8, 127, 0},_
{80, 80, 15, 8, 6, 2, 15, 0},_
{0, 126, 64, 124, 64, 32, 28, 0},_
{80, 80, 15, 8, 14, 8, 6, 0},_
{0, 70, 72, 64, 32, 16, 14, 0},_
{80, 82, 15, 9, 8, 8, 6, 0},_
{0, 0, 0, 0, 0, 0, 0, 0},_
{60, 102, 118, 110, 102, 102, 60, 0},_
{24, 28, 24, 24, 24, 24, 24, 0},_
{60, 102, 96, 60, 6, 102, 126, 0},_
{60, 102, 96, 56, 96, 102, 60, 0},_
{56, 60, 54, 51, 127, 48, 48, 0},_
{126, 102, 6, 62, 96, 102, 60, 0},_
{60, 102, 6, 62, 102, 102, 60, 0},_
{126, 102, 96, 48, 24, 24, 24, 0},_
{60, 102, 102, 60, 102, 102, 60, 0},_
{60, 102, 102, 124, 96, 102, 60, 0},_
{16, 24, 16, 16, 0, 0, 0, 0},_
{24, 32, 16, 56, 0, 0, 0, 0},_
{24, 32, 48, 56, 0, 0, 0, 0},_
{64, 32, 16, 8, 4, 2, 1, 0},_
{2, 3, 50, 74, 34, 16, 120, 0},_
{2, 3, 34, 50, 42, 120, 32, 0},_
{7, 8, 70, 104, 87, 240, 64, 0},_
{0, 0, 0, 24, 24, 0, 0, 0},_
{0, 0, 0, 0, 0, 0, 24, 0},_
{0, 0, 0, 0, 0, 24, 24, 12},_
{0, 0, 0, 24, 0, 24, 0, 0},_
{0, 0, 0, 24, 0, 24, 24, 12},_
{0, 0, 0, 0, 0, 0, 219, 0},_
{24, 24, 24, 24, 24, 0, 24, 0},_
{0, 24, 0, 24, 24, 24, 24, 24},_
{60, 102, 96, 48, 24, 0, 24, 0},_
{0, 24, 0, 24, 12, 6, 102, 60},_
{0, 0, 0, 0, 24, 0, 0, 0},_
{0, 60, 126, 126, 126, 126, 60, 0},_
{0, 102, 60, 255, 60, 102, 0, 0},_
{54, 54, 127, 54, 127, 54, 54, 0},_
{64, 96, 48, 24, 12, 6, 2, 0},_
{2, 6, 12, 24, 48, 96, 64, 0},_
{0, 0, 0, 0, 60, 0, 0, 0},_
{0, 0, 0, 0, 126, 0, 0, 0},_
{0, 0, 0, 0, 255, 0, 0, 0},_
{0, 0, 0, 0, 0, 0, 255, 0},_
{48, 24, 12, 12, 12, 24, 48, 0},_
{12, 24, 48, 48, 48, 24, 12, 0},_
{48, 24, 24, 12, 24, 24, 48, 0},_
{12, 24, 24, 48, 24, 24, 12, 0},_
{60, 12, 12, 12, 12, 12, 60, 0},_
{60, 48, 48, 48, 48, 48, 60, 0},_
{0, 0, 0, 0, 0, 24, 24, 8},_
{0, 0, 0, 0, 0, 108, 108, 36},_
{54, 54, 108, 0, 0, 0, 0, 0},_
{108, 108, 54, 0, 0, 0, 0, 0},_
{12, 12, 24, 0, 0, 0, 0, 0},_
{24, 24, 12, 0, 0, 0, 0, 0},_
{0, 0, 108, 54, 27, 54, 108, 0},_
{0, 0, 27, 54, 108, 54, 27, 0},_
{0, 0, 48, 24, 12, 24, 48, 0},_
{0, 0, 12, 24, 48, 24, 12, 0},_
{108, 108, 36, 0, 0, 0, 0, 0},_
{24, 24, 8, 0, 0, 0, 0, 0},_
{48, 24, 60, 24, 24, 24, 12, 0},_
{255, 3, 3, 3, 3, 3, 3, 3},_
{24, 24, 24, 24, 24, 24, 24, 255},_
{192, 192, 192, 192, 192, 192, 192, 255},_
{32, 32, 32, 32, 56, 60, 24, 0},_
{16, 48, 80, 16, 28, 30, 12, 0},_
{124, 68, 68, 68, 102, 119, 34, 0},_
{124, 68, 124, 68, 102, 119, 34, 0},_
{0, 4, 4, 28, 20, 12, 0, 0},_
{0, 4, 4, 28, 20, 28, 16, 0},_
{0, 0, 20, 62, 20, 62, 20, 0},_
{0, 2, 10, 14, 58, 46, 24, 0},_
{0, 0, 0, 20, 8, 20, 0, 0},_
{0, 12, 22, 86, 16, 80, 8, 0},_
{8, 12, 8, 28, 52, 60, 16, 8},_
{126, 255, 153, 255, 195, 189, 255, 126},_
{126, 255, 153, 255, 189, 195, 255, 126},_
{153, 90, 36, 195, 195, 36, 90, 153},_
{60, 102, 102, 102, 60, 24, 126, 24},_
{240, 224, 176, 30, 51, 51, 51, 30},_
{8, 28, 62, 127, 127, 8, 28, 0},_
{28, 28, 127, 127, 127, 8, 28, 0},_
{54, 127, 127, 127, 62, 28, 8, 0},_
{8, 28, 62, 127, 62, 28, 8, 0},_
{128, 192, 96, 54, 30, 14, 6, 0},_
{62, 99, 123, 107, 59, 3, 62, 0},_
{28, 54, 28, 110, 59, 51, 110, 0},_
{126, 47, 47, 46, 44, 44, 44, 0},_
{60, 6, 62, 102, 124, 96, 60, 0},_
{28, 34, 89, 69, 89, 34, 28, 0},_
{28, 34, 93, 77, 85, 34, 28, 0},_
{0, 126, 116, 84, 0, 0, 0, 0},_
{28, 54, 28, 0, 0, 0, 0, 0},_
{24, 24, 24, 24, 24, 24, 24, 24},_
{24, 24, 24, 0, 0, 24, 24, 24},_
{24, 60, 24, 24, 24, 0, 0, 0},_
{24, 60, 24, 60, 24, 0, 0, 0},_
{24, 24, 24, 24, 255, 126, 60, 24},_
{8, 12, 14, 255, 255, 14, 12, 8},_
{16, 48, 112, 255, 255, 112, 48, 16},_
{24, 60, 126, 255, 24, 24, 24, 24},_
{0, 16, 124, 22, 22, 22, 124, 16},_
{0, 66, 60, 102, 102, 60, 66, 0},_
{8, 62, 11, 62, 104, 62, 8, 0},_
{60, 102, 15, 6, 15, 70, 60, 0},_
{60, 102, 6, 31, 6, 6, 127, 0},_
{102, 102, 60, 24, 60, 24, 24, 0},_
{0, 0, 24, 24, 126, 24, 24, 0},_
{0, 0, 0, 0, 60, 0, 0, 0},_
{0, 0, 102, 60, 24, 60, 102, 0},_
{0, 0, 24, 0, 126, 0, 24, 0},_
{0, 0, 0, 62, 0, 62, 0, 0},_
{0, 0, 16, 62, 8, 62, 4, 0},_
{0, 0, 12, 24, 48, 24, 12, 0},_
{0, 0, 48, 24, 12, 24, 48, 0},_
{0, 12, 24, 48, 24, 12, 0, 60},_
{0, 48, 24, 12, 24, 48, 0, 60},_
{0, 24, 24, 126, 24, 24, 0, 60},_
{0, 0, 92, 118, 0, 92, 118, 0},_
{0, 0, 0, 0, 92, 118, 0, 0},_
{0, 0, 0, 126, 96, 96, 0, 0},_
{24, 60, 102, 0, 0, 0, 0, 0},_
{0, 0, 0, 54, 73, 54, 0, 0},_
{48, 24, 24, 24, 24, 24, 24, 12},_
{126, 44, 44, 44, 44, 44, 44, 44},_
{62, 6, 12, 24, 24, 12, 6, 62},_
{224, 96, 48, 48, 24, 27, 14, 0},_
{0, 0, 54, 54, 54, 30, 6, 6},_
{24, 48, 96, 120, 108, 108, 56, 0},_
{0, 102, 54, 24, 12, 102, 98, 0},_
{0, 51, 27, 12, 6, 107, 89, 0},_
{192, 192, 192, 255, 192, 192, 192, 0},_
{8, 28, 42, 73, 8, 8, 8, 0},_
{0, 124, 96, 80, 72, 68, 2, 0},_
{8, 16, 32, 127, 32, 16, 8, 0},_
{0, 2, 68, 72, 80, 96, 124, 0},_
{8, 8, 8, 73, 42, 28, 8, 0},_
{0, 64, 34, 18, 10, 6, 62, 0},_
{8, 4, 2, 127, 2, 4, 8, 0},_
{0, 62, 6, 10, 18, 34, 64, 0},_
{0, 20, 34, 127, 34, 20, 0, 0},_
{8, 28, 42, 8, 42, 28, 8, 0},_
{0, 0, 0, 0, 0, 0, 0, 255},_
{0, 0, 0, 0, 0, 0, 255, 255},_
{0, 0, 0, 0, 0, 255, 255, 255},_
{0, 0, 0, 0, 255, 255, 255, 255},_
{255, 255, 255, 255, 255, 255, 255, 255},_
{255, 255, 255, 255, 0, 0, 0, 0},_
{255, 0, 0, 0, 0, 0, 0, 0},_
{1, 1, 1, 1, 1, 1, 1, 1},_
{3, 3, 3, 3, 3, 3, 3, 3},_
{7, 7, 7, 7, 7, 7, 7, 7},_
{15, 15, 15, 15, 15, 15, 15, 15},_
{240, 240, 240, 240, 240, 240, 240, 240},_
{128, 128, 128, 128, 128, 128, 128, 128},_
{0, 0, 0, 0, 15, 15, 15, 15},_
{0, 0, 0, 0, 240, 240, 240, 240},_
{15, 15, 15, 15, 0, 0, 0, 0},_
{15, 15, 15, 15, 255, 255, 255, 255},_
{15, 15, 15, 15, 240, 240, 240, 240},_
{255, 255, 255, 255, 15, 15, 15, 15},_
{255, 255, 255, 255, 240, 240, 240, 240},_
{240, 240, 240, 240, 0, 0, 0, 0},_
{240, 240, 240, 240, 15, 15, 15, 15},_
{240, 240, 240, 240, 255, 255, 255, 255},_
{51, 51, 204, 204, 51, 51, 204, 204},_
{60, 126, 255, 255, 255, 255, 126, 60},_
{60, 102, 195, 129, 129, 195, 102, 60},_
{40, 2, 128, 1, 128, 1, 64, 20},_
{8, 28, 54, 99, 54, 28, 8, 0},_
{0, 126, 126, 126, 126, 126, 126, 0},_
{0, 126, 66, 66, 66, 66, 126, 0},_
{255, 254, 252, 248, 240, 224, 192, 128},_
{128, 192, 224, 240, 248, 252, 254, 255},_
{1, 3, 7, 15, 31, 63, 127, 255},_
{255, 127, 63, 31, 15, 7, 3, 1},_
{0, 0, 0, 7, 15, 28, 24, 24},_
{0, 0, 0, 224, 240, 56, 24, 24},_
{24, 24, 28, 15, 7, 0, 0, 0},_
{24, 24, 56, 240, 224, 0, 0, 0},_
{195, 231, 126, 60, 60, 126, 231, 195},_
{3, 7, 14, 28, 56, 112, 224, 192},_
{192, 224, 112, 56, 28, 14, 7, 3},_
{0, 0, 0, 24, 24, 24, 24, 24},_
{0, 0, 0, 255, 255, 24, 24, 24},_
{0, 0, 0, 31, 31, 24, 24, 24},_
{0, 0, 0, 248, 248, 24, 24, 24},_
{0, 0, 0, 255, 255, 0, 0, 0},_
{0, 0, 0, 31, 31, 0, 0, 0},_
{0, 0, 0, 248, 248, 0, 0, 0},_
{24, 24, 24, 24, 24, 0, 0, 0},_
{24, 24, 24, 255, 255, 0, 0, 0},_
{24, 24, 24, 31, 31, 0, 0, 0},_
{24, 24, 24, 248, 248, 0, 0, 0},_
{24, 24, 24, 24, 24, 24, 24, 24},_
{24, 24, 24, 255, 255, 24, 24, 24},_
{24, 24, 24, 31, 31, 24, 24, 24},_
{24, 24, 24, 248, 248, 24, 24, 24},_
{0, 157, 157, 0, 0, 0, 128, 0},_
{0, 128, 128, 1, 2, 6, 129, 0},_
{10, 10, 0, 1, 194, 6, 1, 0},_
{0, 0, 128, 0, 15, 0, 0, 0},_
{128, 0, 0, 1, 2, 4, 0, 0},_
{4, 0, 0, 0, 0, 0, 0, 0},_
{3, 3, 0, 0, 0, 0, 0, 0},_
{1, 2, 0, 0, 0, 0, 0, 0},_
{16, 8, 0, 0, 0, 0, 0, 0},_
{40, 20, 0, 0, 0, 0, 0, 0},_
{8, 20, 0, 0, 0, 0, 0, 0},_
{20, 8, 0, 0, 0, 0, 0, 0},_
{36, 24, 0, 0, 0, 0, 0, 0},_
{24, 24, 0, 0, 0, 0, 0, 0},_
{60, 0, 0, 0, 0, 0, 0, 0},_
{0, 24, 0, 0, 0, 0, 0, 0},_
{0, 0, 0, 0, 0, 0, 0, 16},_
{0, 0, 0, 0, 0, 0, 0, 8},_
{5, 10, 5, 10, 5, 10, 5, 10},_
{80, 160, 80, 160, 80, 160, 80, 160},_
{85, 170, 85, 170, 0, 0, 0, 0},_
{0, 0, 0, 0, 85, 170, 85, 170},_
{170, 85, 170, 85, 170, 85, 170, 85},_
{51, 51, 204, 204, 51, 51, 204, 204},_
{204, 204, 51, 51, 204, 204, 51, 51},_
{85, 42, 21, 10, 5, 2, 1, 0},_
{85, 170, 84, 168, 80, 160, 64, 128},_
{128, 64, 160, 80, 168, 84, 170, 85},_
{0, 1, 2, 5, 10, 21, 42, 85},_
{24, 12, 6, 3, 1, 0, 0, 0},_
{24, 48, 96, 192, 128, 0, 0, 0},_
{0, 0, 0, 1, 3, 6, 12, 24},_
{0, 0, 0, 128, 192, 96, 48, 24},_
{24, 12, 6, 3, 3, 6, 12, 24},_
{24, 48, 96, 192, 192, 96, 48, 24},_
{0, 0, 0, 129, 195, 102, 60, 24},_
{24, 60, 102, 195, 129, 0, 0, 0},_
{24, 12, 6, 131, 193, 96, 48, 24},_
{24, 48, 96, 193, 131, 6, 12, 24},_
{28, 28, 8, 127, 8, 20, 34, 65},_
{28, 28, 73, 62, 8, 20, 20, 20},_
{28, 28, 72, 62, 9, 20, 36, 68},_
{28, 28, 9, 62, 72, 20, 18, 17},_
{0, 0, 255, 255, 0, 0, 0, 0},_
{0, 255, 255, 0, 0, 0, 0, 0},_
{0, 0, 0, 0, 255, 255, 0, 0},_
{12, 12, 12, 12, 12, 12, 12, 12},_
{48, 48, 48, 48, 48, 48, 48, 48},_
{3, 3, 3, 3, 3, 3, 255, 255},_
{255, 255, 3, 3, 3, 3, 3, 3},_
{255, 255, 192, 192, 192, 192, 192, 192},_
{0, 0, 0, 0, 0, 255, 255, 0},_
{6, 6, 6, 6, 6, 6, 6, 6},_
{96, 96, 96, 96, 96, 96, 96, 96},_
{3, 3, 12, 12, 3, 3, 12, 12},_
{192, 192, 192, 192, 192, 192, 192, 192},_
{0, 0, 0, 0, 51, 51, 204, 204},_
{224, 224, 224, 224, 224, 224, 224, 224},_
{255, 255, 0, 0, 0, 0, 0, 0},_
{255, 255, 255, 0, 0, 0, 0, 0},_
{192, 192, 192, 192, 192, 192, 255, 255},_
{204, 153, 51, 102, 204, 153, 51, 102},_
{51, 153, 204, 102, 51, 153, 204, 102},_
{8, 28, 28, 28, 28, 28, 62, 107},_
{0, 60, 24, 60, 60, 60, 24, 0},_
{60, 255, 255, 24, 48, 24, 12, 24},_
{255, 239, 215, 187, 221, 233, 241, 255},_
{28, 50, 99, 99, 99, 38, 28, 0},_
{24, 28, 24, 24, 24, 24, 126, 0},_
{62, 99, 112, 60, 30, 7, 127, 0},_
{126, 48, 24, 60, 96, 99, 62, 0},_
{48, 56, 60, 54, 51, 127, 48, 0},_
{63, 3, 63, 96, 96, 99, 62, 0},_
{60, 6, 3, 63, 99, 99, 62, 0},_
{127, 99, 48, 24, 12, 12, 12, 0},_
{30, 35, 39, 30, 121, 97, 62, 0},_
{62, 99, 99, 126, 96, 48, 30, 0},_
{127, 65, 95, 95, 95, 95, 127, 0},_
{0, 6, 47, 127, 127, 62, 0, 0},_
{0, 64, 160, 31, 0, 8, 20, 227},_
{66, 176, 4, 11, 64, 176, 4, 26},_
{1, 72, 0, 34, 0, 136, 2, 80},_
{24, 60, 92, 58, 124, 94, 58, 60},_
{62, 28, 28, 28, 28, 42, 0, 0},_
{0, 126, 161, 255, 173, 161, 255, 0},_
{0, 60, 24, 36, 66, 126, 60, 0},_
{4, 34, 82, 132, 32, 65, 74, 36},_
{165, 7, 133, 8, 8, 233, 64, 69},_
{60, 68, 116, 126, 126, 126, 50, 118},_
{60, 44, 124, 56, 28, 60, 60, 236},_
{0, 0, 48, 56, 21, 11, 6, 13},_
{3, 5, 9, 9, 63, 9, 5, 3},_
{0, 16, 4, 88, 24, 36, 2, 1},_
{60, 36, 124, 124, 110, 110, 34, 102},_
{60, 44, 126, 62, 30, 62, 60, 236},_
{0, 28, 62, 103, 95, 255, 255, 126},_
{0, 48, 58, 109, 204, 70, 195, 129},_
{0, 159, 0, 243, 0, 236, 0, 123},_
{16, 32, 56, 54, 156, 248, 124, 63},_
{60, 42, 60, 124, 108, 200, 76, 35},_
{24, 40, 40, 24, 255, 129, 194, 188},_
{96, 240, 112, 126, 127, 127, 85, 85},_
{24, 60, 46, 58, 60, 24, 60, 127},_
{62, 42, 62, 62, 54, 118, 68, 119},_
{15, 31, 30, 28, 56, 112, 96, 192},_
{0, 0, 0, 3, 126, 3, 0, 0},_
{80, 32, 80, 8, 24, 60, 60, 24},_
{16, 56, 36, 34, 90, 254, 255, 255},_
{2, 48, 24, 36, 68, 82, 90, 60},_
{0, 28, 54, 107, 107, 107, 54, 28},_
{0, 0, 30, 52, 243, 30, 0, 0},_
{8, 12, 26, 63, 255, 248, 240, 240},_
{62, 124, 254, 255, 231, 199, 143, 31},_
{240, 240, 240, 120, 56, 28, 14, 0},_
{63, 127, 255, 254, 220, 152, 142, 64},_
{8, 12, 28, 8, 62, 28, 28, 20},_
{0, 0, 6, 12, 28, 28, 60, 126},_
{0, 0, 0, 0, 66, 102, 126, 60},_
{0, 0, 0, 0, 0, 90, 60, 36},_
{85, 255, 145, 255, 133, 255, 145, 255},_
{60, 126, 219, 219, 219, 219, 219, 255},_
{170, 255, 137, 255, 161, 255, 137, 255},_
{24, 60, 126, 44, 60, 60, 52, 60},_
{0, 224, 248, 76, 254, 255, 156, 0},_
{0, 7, 31, 50, 127, 255, 57, 0},_
{56, 124, 214, 203, 151, 202, 126, 52},_
{24, 24, 60, 60, 165, 231, 255, 153},_
{68, 86, 234, 246, 92, 88, 8, 0},_
{0, 0, 24, 189, 126, 219, 255, 165},_
{0, 60, 126, 153, 255, 60, 90, 165},_
{60, 126, 255, 153, 219, 126, 219, 165},_
{36, 60, 60, 24, 24, 60, 60, 24},_
{153, 90, 0, 195, 195, 0, 90, 153},_
{0, 0, 126, 129, 60, 66, 24, 0},_
{28, 62, 127, 127, 127, 62, 28, 0},_
{28, 62, 127, 7, 127, 62, 28, 0},_
{28, 62, 15, 7, 15, 62, 28, 0},_
{28, 62, 73, 109, 127, 127, 85, 0},_
{28, 62, 73, 127, 99, 127, 85, 0},_
{0, 66, 36, 0, 0, 36, 66, 0},_
{0, 0, 36, 0, 0, 36, 0, 0},_
{0, 0, 0, 24, 24, 0, 0, 0},_
{0, 24, 90, 90, 24, 90, 90, 0},_
{40, 116, 58, 93, 46, 20, 8, 0},_
{0, 54, 0, 126, 126, 0, 54, 0},_
{8, 20, 46, 93, 58, 116, 40, 0},_
{0, 90, 90, 24, 90, 90, 24, 0},_
{8, 20, 58, 93, 46, 23, 10, 0},_
{0, 108, 0, 126, 126, 0, 108, 0},_
{10, 23, 46, 93, 58, 20, 8, 0},_
{0, 20, 28, 235, 126, 60, 16, 0},_
{0, 54, 73, 65, 34, 20, 8, 0},_
{0, 54, 121, 113, 50, 20, 8, 0},_
{0, 54, 127, 127, 62, 28, 8, 0},_
{0, 28, 62, 127, 93, 73, 54, 42}}


sub SetChar cdecl(c as ubyte, s as integer)

	dim as long y,code
	dim row as ubyte ptr

	code=c*8:row=Fonts(0).d+code
	for y = 1 to 8
		*row=bescii(s,y)
		row+=1
	next
end sub

sub SetFont(f() as short)
	for i as long=0 to 255
		SetChar (i, f(i))
	next
end sub


dim shared PETSCII(0 to 255) as short={320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 344, 374, 351, 419, 445, 402, 369, 358, 359, 350, 423, 340, 424, 339, 352, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 341, 342, 430, 427, 429, 346, 401, 0, 8, 9, 11, 13, 18, 19, 20, 21, 26, 27, 28, 30, 31, 33, 41, 43, 44, 45, 48, 49, 54, 55, 56, 57, 60, 362, 421, 363, 416, 414, 503, 396, 510, 503, 557, 558, 559, 560, 561, 492, 495, 494, 562, 497, 498, 563, 564, 482, 565, 398, 566, 493, 496, 483, 397, 567, 399, 511, 532, 409, 140, 488, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 468, 461, 464, 458, 466, 537, 569, 570, 491, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 574, 471, 478, 508, 473, 475,  503, 396, 510, 503, 557, 558, 559, 560, 561, 492, 495, 494, 562, 497, 498, 563, 564, 482, 565, 398, 566, 493, 496, 483, 397, 567, 399, 511, 532, 409, 140, 488, 320, 468, 461, 464, 458, 466, 537, 569, 570, 491, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 574, 471, 478, 508, 473, 140}

dim shared PETSCIIlo(0 to 255) as short={320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 344, 374, 351, 419, 445, 402, 369, 358, 359, 350, 423, 340, 424, 339, 352, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 341, 342, 430, 427, 429, 346, 401, 62, 70, 71, 73, 75, 80, 81, 82, 83, 89, 90, 91, 93, 94, 96, 104, 106, 107, 108, 111, 112, 117, 118, 119, 120, 123, 362, 421, 363, 416, 414, 503, 0, 8, 9, 11, 13, 18, 19, 20, 21, 26, 27, 28, 30, 31, 33, 41, 43, 44, 45, 48, 49, 54, 55, 56, 57, 60, 511, 532, 409, 538, 575, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 468, 461, 464, 458, 466, 537, 569, 570, 576, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 400, 471, 478, 508, 473, 475,  503, 0, 8, 9, 11, 13, 18, 19, 20, 21, 26, 27, 28, 30, 31, 33, 41, 43, 44, 45, 48, 49, 54, 55, 56, 57, 60, 511, 532, 409, 538, 575, 320, 468, 461, 464, 458, 466, 537, 569, 570, 576, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 400, 471, 478, 508, 473, 140}

dim shared PETSCIIall(0 to 255) as short={320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 344, 374, 351, 419, 445, 402, 369, 358, 359, 350, 423, 340, 424, 339, 352, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 341, 342, 430, 427, 429, 346, 401, 62, 70, 71, 73, 75, 80, 81, 82, 83, 89, 90, 91, 93, 94, 96, 104, 106, 107, 108, 111, 112, 117, 118, 119, 120, 123, 362, 421, 363, 416, 414, 503, 0, 8, 9, 11, 13, 18, 19, 20, 21, 26, 27, 28, 30, 31, 33, 41, 43, 44, 45, 48, 49, 54, 55, 56, 57, 60, 511, 532, 409, 538, 575, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 468, 461, 464, 458, 466, 537, 569, 570, 576, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 400, 471, 478, 508, 473, 475,  503, 396, 510, 503, 557, 558, 559, 560, 561, 492, 495, 494, 562, 497, 498, 563, 564, 482, 565, 398, 566, 493, 496, 483, 397, 567, 399, 511, 532, 409, 140, 488, 320, 468, 461, 464, 458, 466, 537, 569, 570, 491, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 574, 471, 478, 508, 473, 140}

dim shared PIXELART(0 to 255) as short={320, 648, 649, 650, 651, 652, 653, 320, 320, 320, 320, 654, 655, 320, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 320, 320, 320, 344, 374, 351, 419, 445, 402, 369, 358, 359, 350, 423, 340, 424, 339, 352, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 341, 342, 430, 427, 429, 346, 401, 0, 8, 9, 11, 13, 18, 19, 20, 21, 26, 27, 28, 30, 31, 33, 41, 43, 44, 45, 48, 49, 54, 55, 56, 57, 60, 362, 421, 363, 416, 414, 503,  62, 70, 71, 73, 75, 80, 81, 82, 83, 89, 90, 91, 93, 94, 96, 104, 106, 107, 108, 111, 112, 117, 118, 119, 120, 123, 511, 532, 409, 538, 488, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 468, 461, 464, 458, 466, 537, 569, 570, 491, 569, 513, 472, 509, 501, 459, 502, 507, 500, 512, 466, 467, 571, 572, 573, 460, 574, 471, 478, 508, 473, 475,  503, 396, 510, 503, 557, 558, 559, 560, 561, 492, 495, 494, 562, 497, 498, 563, 564, 482, 565, 398, 566, 493, 496, 483, 397, 567, 399, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 656, 657, 658, 659, 660, 661, 663, 664, 665, 666, 667, 668, 0}


screenres 800,600
dim a as string

SetFont PETSCII()
for i as integer=0 to 255
	locate 1+2*(i\25),(i*3) mod 75
	Print chr(i)
next
?:? "THIS IS THE COMMODORE 64 FONT. PRESS ENTER"
input a: cls

SetFont PETSCIIlo()
for i as integer=0 to 255
	locate 1+2*(i\25),(i*3) mod 75
	Print chr(i)
next
?:? "THIS IS THE COMMODORE 64 FONT. PRESS ENTER"
input a: cls

SetFont PIXELART()
for i as integer=0 to 255
	locate 1+2*(i\25),(i*3) mod 75
	Print chr(i)
next
?:? "THIS IS THE BESCII FONT. PRESS ENTER"
input a: cls
sero
Posts: 59
Joined: Mar 06, 2018 13:26
Location: USA

Re: BESCII font and Commodore PETSCII font

Post by sero »

Thanks for sharing this. I'd come across this technique of using ubyte values for the rows of 8x8 fonts but hadn't done anything with it. Your post encouraged me to convert my own slightly modified font tileset this way. Besides this I also included the bulkier method of storing the font in a bitmap buffer instead of your example's utilizing the sleeker built in font method. It isn't efficient but it works and it was fun.

Image

Code: Select all

#define font_center_x   1
#define font_center_y   2
#define font_center     3

declare sub screen_print overload ( _
  byref _x as long = 0, _
  byref _y as long = 0, _
  byref _s as string = "", _
  byref _c as ulong = rgb( 255, 255, 255 ), _
  byref _f as long = 0 )
declare sub screen_print overload ( _
  byref _x as long = 0, _
  byref _y as long = 0, _
  byref _chr as long, _
  byref _c as ulong = rgb( 255, 255, 255 ), _
  byref _f as long = 0 )

dim _font( 0 to 127, 0 to 7 ) as ubyte = _
  { { 0, 0, 0, 0, 0, 0, 0, 0 }, _                   '   0 : 
    { 60, 66, 165, 129, 189, 153, 66, 60 }, _       '   1 : 
    { 60, 126, 219, 255, 195, 231, 126, 60 }, _     '   2 : 
    { 102, 255, 255, 255, 126, 60, 24, 0 }, _       '   3 : 
    { 0, 24, 60, 126, 126, 60, 24, 0 }, _           '   4 : 
    { 24, 60, 126, 255, 255, 219, 24, 60 }, _       '   5 : 
    { 24, 60, 126, 255, 255, 126, 24, 60 }, _       '   6 : 
    { 0, 60, 126, 126, 126, 126, 60, 0 }, _         '   7 : 
    { 0, 60, 102, 66, 66, 102, 60, 0 }, _           '   8 : 
    { 126, 195, 129, 129, 129, 129, 195, 126 }, _   '   9 : 
    { 126, 195, 153, 189, 189, 153, 195, 126 }, _   '  10 : 
    { 240, 224, 240, 190, 51, 51, 51, 30 }, _       '  11 : 
    { 60, 102, 102, 102, 60, 24, 126, 24 }, _       '  12 : 
    { 16, 48, 112, 80, 80, 28, 30, 12 }, _          '  13 : 
    { 0, 124, 68, 68, 100, 118, 39, 2 }, _          '  14 : 
    { 24, 90, 36, 195, 195, 36, 90, 24 }, _         '  15 : 
    { 0, 6, 30, 126, 126, 30, 6, 0 }, _             '  16 : 
    { 0, 96, 120, 126, 126, 120, 96, 0 }, _         '  17 : 
    { 24, 60, 126, 24, 24, 126, 60, 24 }, _         '  18 : 
    { 102, 102, 102, 102, 102, 0, 102, 0 }, _       '  19 : 
    { 254, 219, 219, 222, 216, 216, 216, 0 }, _     '  20 : 
    { 60, 6, 60, 102, 60, 96, 60, 0 }, _            '  21 : 
    { 0, 0, 0, 0, 255, 255, 0, 0 }, _               '  22 : 
    { 24, 60, 126, 24, 126, 60, 24, 255 }, _        '  23 : 
    { 24, 60, 126, 24, 24, 24, 24, 0 }, _           '  24 : 
    { 24, 24, 24, 24, 126, 60, 24, 0 }, _           '  25 : 
    { 0, 24, 48, 126, 48, 24, 0, 0 }, _             '  26 : 
    { 0, 24, 12, 126, 12, 24, 0, 0 }, _             '  27 : 
    { 0, 0, 6, 6, 6, 126, 0, 0 }, _                 '  28 : 
    { 0, 36, 102, 255, 102, 36, 0, 0 }, _           '  29 : 
    { 0, 24, 24, 60, 60, 126, 126, 0 }, _           '  30 : 
    { 0, 126, 126, 60, 60, 24, 24, 0 }, _           '  31 : 
    { 0, 0, 0, 0, 0, 0, 0, 0 }, _                   '  32 : 
    { 24, 60, 60, 24, 24, 0, 24, 0 }, _             '  33 : !
    { 108, 108, 108, 0, 0, 0, 0, 0 }, _             '  34 : "
    { 108, 108, 254, 108, 254, 108, 108, 0 }, _     '  35 : #
    { 24, 124, 6, 60, 96, 62, 24, 0 }, _            '  36 : $
    { 6, 102, 48, 24, 12, 102, 96, 0 }, _           '  37 : %
    { 28, 54, 54, 28, 182, 102, 220, 0 }, _         '  38 : &
    { 56, 24, 12, 0, 0, 0, 0, 0 }, _                '  39 : '
    { 48, 24, 12, 12, 12, 24, 48, 0 }, _            '  40 : (
    { 12, 24, 48, 48, 48, 24, 12, 0 }, _            '  41 : )
    { 0, 24, 126, 60, 126, 24, 0, 0 }, _            '  42 : *
    { 0, 24, 24, 126, 24, 24, 0, 0 }, _             '  43 : +
    { 0, 0, 0, 0, 0, 24, 24, 12 }, _                '  44 : ,
    { 0, 0, 0, 126, 0, 0, 0, 0 }, _                 '  45 : -
    { 0, 0, 0, 0, 0, 24, 24, 0 }, _                 '  46 : .
    { 0, 96, 48, 24, 12, 6, 0, 0 }, _               '  47 : /
    { 60, 102, 118, 126, 110, 102, 60, 0 }, _       '  48 : 0
    { 24, 28, 24, 24, 24, 24, 126, 0 }, _           '  49 : 1
    { 60, 102, 96, 56, 12, 102, 126, 0 }, _         '  50 : 2
    { 60, 102, 96, 56, 96, 102, 60, 0 }, _          '  51 : 3
    { 112, 120, 108, 102, 254, 96, 240, 0 }, _      '  52 : 4
    { 126, 6, 62, 96, 96, 102, 60, 0 }, _           '  53 : 5
    { 56, 12, 6, 62, 102, 102, 60, 0 }, _           '  54 : 6
    { 126, 102, 96, 48, 24, 24, 24, 0 }, _          '  55 : 7
    { 60, 102, 102, 60, 102, 102, 60, 0 }, _        '  56 : 8
    { 60, 102, 102, 124, 96, 48, 28, 0 }, _         '  57 : 9
    { 0, 0, 24, 24, 0, 24, 24, 0 }, _               '  58 : :
    { 0, 0, 24, 24, 0, 24, 24, 12 }, _              '  59 : ;
    { 48, 24, 12, 6, 12, 24, 48, 0 }, _             '  60 : <
    { 0, 0, 126, 0, 126, 0, 0, 0 }, _               '  61 : =
    { 12, 24, 48, 96, 48, 24, 12, 0 }, _            '  62 : >
    { 60, 102, 96, 48, 24, 0, 24, 0 }, _            '  63 : ?
    { 60, 102, 118, 118, 118, 6, 60, 0 }, _         '  64 : @
    { 60, 102, 102, 126, 102, 102, 102, 0 }, _      '  65 : A
    { 62, 102, 102, 62, 102, 102, 62, 0 }, _        '  66 : B
    { 60, 102, 6, 6, 6, 102, 60, 0 }, _             '  67 : C
    { 30, 54, 102, 102, 102, 54, 30, 0 }, _         '  68 : D
    { 126, 6, 6, 62, 6, 6, 126, 0 }, _              '  69 : E
    { 126, 6, 6, 62, 6, 6, 6, 0 }, _                '  70 : F
    { 60, 102, 6, 118, 102, 102, 60, 0 }, _         '  71 : G
    { 102, 102, 102, 126, 102, 102, 102, 0 }, _     '  72 : H
    { 60, 24, 24, 24, 24, 24, 60, 0 }, _            '  73 : I
    { 96, 96, 96, 96, 102, 102, 60, 0 }, _          '  74 : J
    { 102, 102, 54, 30, 54, 102, 102, 0 }, _        '  75 : K
    { 6, 6, 6, 6, 6, 6, 126, 0 }, _                 '  76 : L
    { 198, 238, 254, 254, 214, 198, 198, 0 }, _     '  77 : M
    { 102, 110, 126, 126, 118, 102, 102, 0 }, _     '  78 : N
    { 60, 102, 102, 102, 102, 102, 60, 0 }, _       '  79 : O
    { 62, 102, 102, 62, 6, 6, 6, 0 }, _             '  80 : P
    { 60, 102, 102, 102, 118, 60, 112, 0 }, _       '  81 : Q
    { 62, 102, 102, 62, 54, 102, 102, 0 }, _        '  82 : R
    { 60, 102, 6, 60, 96, 102, 60, 0 }, _           '  83 : S
    { 126, 24, 24, 24, 24, 24, 24, 0 }, _           '  84 : T
    { 102, 102, 102, 102, 102, 102, 60, 0 }, _      '  85 : U
    { 102, 102, 102, 102, 102, 60, 24, 0 }, _       '  86 : V
    { 198, 198, 198, 214, 254, 238, 198, 0 }, _     '  87 : W
    { 102, 102, 60, 24, 60, 102, 102, 0 }, _        '  88 : X
    { 102, 102, 102, 60, 24, 24, 24, 0 }, _         '  89 : Y
    { 126, 96, 48, 24, 12, 6, 126, 0 }, _           '  90 : Z
    { 124, 12, 12, 12, 12, 12, 124, 0 }, _          '  91 : [
    { 0, 6, 12, 24, 48, 96, 0, 0 }, _               '  92 : \
    { 124, 96, 96, 96, 96, 96, 124, 0 }, _          '  93 : ]
    { 24, 60, 102, 195, 0, 0, 0, 0 }, _             '  94 : ^
    { 0, 0, 0, 0, 0, 0, 0, 255 }, _                 '  95 : _
    { 28, 24, 48, 0, 0, 0, 0, 0 }, _                '  96 : '
    { 0, 0, 60, 96, 124, 102, 124, 0 }, _           '  97 : a
    { 6, 6, 62, 102, 102, 102, 62, 0 }, _           '  98 : b
    { 0, 0, 60, 102, 6, 102, 60, 0 }, _             '  99 : c
    { 96, 96, 124, 102, 102, 102, 124, 0 }, _       ' 100 : d
    { 0, 0, 60, 102, 126, 6, 60, 0 }, _             ' 101 : e
    { 56, 12, 12, 62, 12, 12, 12, 0 }, _            ' 102 : f
    { 0, 0, 124, 102, 102, 124, 96, 60 }, _         ' 103 : g
    { 6, 6, 62, 102, 102, 102, 102, 0 }, _          ' 104 : h
    { 24, 0, 24, 24, 24, 24, 24, 0 }, _             ' 105 : i
    { 24, 0, 24, 24, 24, 24, 24, 14 }, _            ' 106 : j
    { 6, 6, 102, 54, 30, 54, 102, 0 }, _            ' 107 : k
    { 28, 24, 24, 24, 24, 24, 60, 0 }, _            ' 108 : l
    { 0, 0, 108, 254, 214, 214, 198, 0 }, _         ' 109 : m
    { 0, 0, 62, 102, 102, 102, 102, 0 }, _          ' 110 : n
    { 0, 0, 60, 102, 102, 102, 60, 0 }, _           ' 111 : o
    { 0, 0, 62, 102, 102, 62, 6, 6 }, _             ' 112 : p
    { 0, 0, 124, 102, 102, 124, 96, 224 }, _        ' 113 : q
    { 0, 0, 62, 102, 6, 6, 6, 0 }, _                ' 114 : r
    { 0, 0, 124, 6, 60, 96, 62, 0 }, _              ' 115 : s
    { 12, 12, 62, 12, 12, 12, 56, 0 }, _            ' 116 : t
    { 0, 0, 102, 102, 102, 102, 124, 0 }, _         ' 117 : u
    { 0, 0, 102, 102, 102, 60, 24, 0 }, _           ' 118 : v
    { 0, 0, 198, 214, 214, 254, 108, 0 }, _         ' 119 : w
    { 0, 0, 102, 60, 24, 60, 102, 0 }, _            ' 120 : x
    { 0, 0, 102, 102, 102, 124, 96, 60 }, _         ' 121 : y
    { 0, 0, 126, 48, 24, 12, 126, 0 }, _            ' 122 : z
    { 56, 12, 12, 6, 12, 12, 56, 0 }, _             ' 123 : {
    { 24, 24, 24, 0, 24, 24, 24, 0 }, _             ' 124 : |
    { 28, 48, 48, 96, 48, 48, 28, 0 }, _            ' 125 : }
    { 0, 0, 76, 126, 50, 0, 0, 0 }, _               ' 126 : ~
    { 0, 0, 24, 60, 102, 102, 126, 0 } }            ' 127 : 

dim shared as any ptr _buffer

dim as long screen_width = 320
dim as long screen_height = 180
screenres screen_width, screen_height, 32
_buffer = imagecreate( 8 * 128, 8 )

dim as ubyte _i, _x, _y
dim as long _chr_x = 0

for _i = 0 to 127 step 1
  for _y = 0 to 7 step 1
    for _x = 0 to 7 step 1
      if( ( _font( _i, _y ) and ( 2 ^ _x ) ) ) then
        pset _buffer, ( _chr_x + _x, _y ), rgb( 255, 255, 255 )
      else
        pset _buffer, ( _chr_x + _x, _y ), rgb( 255, 0, 255 )
      endif
    next _x
  next _y
_chr_x += 8
next _i

put ( 0, 0 ), _buffer, pset

screen_print( 0, 8, "12345" )
screen_print( 0, 16, "abcde" )
screen_print( 0, 24, 65,  rgb( 255,   0,   0 ) )
screen_print( 8, 24, 66,  rgb(   0, 255,   0 ) )
screen_print( 16, 24, 67, rgb(   0,   0, 255 ) )
screen_print( 24, 24, 68, rgb(   0, 255, 255 ) )
screen_print( 32, 24, 69, rgb( 255, 255, 255 ) )
screen_print( screen_width shr 1, screen_height shr 1, "HELLO WORLD", rgb( 0, 127, 255 ), font_center )

sleep
imagedestroy( _buffer )

sub screen_print( _
  byref _x as long = 0, _
  byref _y as long = 0, _
  byref _chr as long, _
  byref _c as ulong = rgb( 255, 255, 255 ), _
  byref _f as long = 0 )
  '   _x :: screen x position
  '   _y :: screen y position
  ' _chr :: character
  '   _c :: color
  '   _f :: flag
  
  screen_print( _
    _x, _
    _y, _
    chr( _chr ), _
    _c, _
    _f )
end sub

sub screen_print( _
  byref _x as long = 0, _
  byref _y as long = 0, _
  byref _s as string = "", _
  byref _c as ulong = rgb( 255, 255, 255 ), _
  byref _f as long = 0 )
  '  _x :: screen x position
  '  _y :: screen y position
  '  _s :: string message
  '  _c :: color
  '  _f :: flag
  
  dim as long _sp ' string position
  dim as long _spa ' string position adjusted
  dim as long _sfx ' string position font x
  dim as long _fx = 0 ' font x
  dim as long _fy = 0 ' font y
  dim as long _l = len( _s ) ' string length
  
  if( _f and font_center_x ) then _x = _x - ( ( _l * 8 ) shr 1 )
  if( _f and font_center_y ) then _y = _y - ( 8 shr 1 )
  
  for _sp = 1 to _l step 1
    _sfx = ( asc( mid( _s, _sp, 1 ) ) ) * 8
    _spa = _sp - 1
    for _fy = 0 to 7 step 1
      for _fx = 0 to 7 step 1
        if point( _sfx + _fx, _fy, _buffer ) = rgb( 255, 255, 255 ) then
          pset ( ( _spa * 8 ) + _x + _fx, _y + _fy ), _c
        end if
      next _fx
    next _fy
  next _sp
end sub
Post Reply