From aa20959d82acba0fa4b908f6adbe42de5069a07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Wed, 21 Oct 2020 00:28:28 +0200 Subject: [PATCH] add a font demo --- examples/font/Makefile | 7 + examples/font/README.txt | 3 + examples/font/a.out | Bin 0 -> 18832 bytes examples/font/convert.c | 40 +++++ examples/font/font.csn | 259 ++++++++++++++++++++++++++++ examples/font/font.xbm | 174 +++++++++++++++++++ examples/screen_font.csn | 353 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 836 insertions(+) create mode 100644 examples/font/Makefile create mode 100644 examples/font/README.txt create mode 100755 examples/font/a.out create mode 100644 examples/font/convert.c create mode 100644 examples/font/font.csn create mode 100644 examples/font/font.xbm create mode 100644 examples/screen_font.csn diff --git a/examples/font/Makefile b/examples/font/Makefile new file mode 100644 index 0000000..2b174e9 --- /dev/null +++ b/examples/font/Makefile @@ -0,0 +1,7 @@ +.PHONY: run + +run: a.out + ./a.out > font.csn + +a.out: convert.c font.xbm + cc convert.c diff --git a/examples/font/README.txt b/examples/font/README.txt new file mode 100644 index 0000000..0e23df9 --- /dev/null +++ b/examples/font/README.txt @@ -0,0 +1,3 @@ +This is a demo of producing font data for use in CRSN programs. + +The source font was obtained from a .FON file using psftools diff --git a/examples/font/a.out b/examples/font/a.out new file mode 100755 index 0000000000000000000000000000000000000000..3321ba19270534cb473421438952b932612e7d35 GIT binary patch literal 18832 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 +#include +#include +#include "font.xbm" + +void main() { + uint64_t digits[256]; + printf("(sym FONT r15)\n"); + printf("(mkbf FONT (\n"); + for (int ch = 0; ch < 256; ch++) { + uint64_t symbol = 0; + for(int row = 0; row<8;row++) { + symbol <<= 8ull; + unsigned char slice = psf_bits[row*32 + (ch/32)*(32*8) + (ch%32)]; + symbol |= slice; + /* // show the symbol + printf(" ; "); + for(int j=0;j<8;j++) { + if(slice&0x1) { + printf("█"); + } else { + printf(" "); + } + slice >>= 1; + } + printf("\n"); + //*/ + } + digits[ch] = symbol; + printf(" 0x%016lx ; %d", symbol, ch); + if (ch >= 32 && ch <= 126) { + printf(" '%c'\n", ch); + } else { + printf("\n", ch); + } + } + printf("))\n"); +} diff --git a/examples/font/font.csn b/examples/font/font.csn new file mode 100644 index 0000000..03c68d8 --- /dev/null +++ b/examples/font/font.csn @@ -0,0 +1,259 @@ +(sym FONT r15) +(mkbf FONT ( + 0x0000000000000000 ; 0 + 0x7e81a581bd99817e ; 1 + 0x7effdbffc3e7ff7e ; 2 + 0x367f7f7f3e1c0800 ; 3 + 0x081c3e7f3e1c0800 ; 4 + 0x1c3e1c7f7f3e1c3e ; 5 + 0x08081c3e7f3e1c3e ; 6 + 0x0000183c3c180000 ; 7 + 0xffffe7c3c3e7ffff ; 8 + 0x003c664242663c00 ; 9 + 0xffc399bdbd99c3ff ; 10 + 0xf0e0f0be3333331e ; 11 + 0x3c6666663c187e18 ; 12 + 0xfcccfc0c0c0e0f07 ; 13 + 0xfec6fec6c6e66703 ; 14 + 0x995a3ce7e73c5a99 ; 15 + 0x01071f7f1f070100 ; 16 + 0x40707c7f7c704000 ; 17 + 0x183c7e18187e3c18 ; 18 + 0x6666666666006600 ; 19 + 0xfedbdbded8d8d800 ; 20 + 0x7cc61c36361c331e ; 21 + 0x000000007e7e7e00 ; 22 + 0x183c7e187e3c18ff ; 23 + 0x183c7e1818181800 ; 24 + 0x181818187e3c1800 ; 25 + 0x0018307f30180000 ; 26 + 0x000c067f060c0000 ; 27 + 0x00000303037f0000 ; 28 + 0x002466ff66240000 ; 29 + 0x00183c7effff0000 ; 30 + 0x00ffff7e3c180000 ; 31 + 0x0000000000000000 ; 32 ' ' + 0x0c1e1e0c0c000c00 ; 33 '!' + 0x3636360000000000 ; 34 '"' + 0x36367f367f363600 ; 35 '#' + 0x0c3e031e301f0c00 ; 36 '$' + 0x006333180c666300 ; 37 '%' + 0x1c361c6e3b336e00 ; 38 '&' + 0x0606030000000000 ; 39 ''' + 0x180c0606060c1800 ; 40 '(' + 0x060c1818180c0600 ; 41 ')' + 0x00663cff3c660000 ; 42 '*' + 0x000c0c3f0c0c0000 ; 43 '+' + 0x00000000000c0c06 ; 44 ',' + 0x0000003f00000000 ; 45 '-' + 0x00000000000c0c00 ; 46 '.' + 0x6030180c06030100 ; 47 '/' + 0x3e63737b6f673e00 ; 48 '0' + 0x0c0e0c0c0c0c3f00 ; 49 '1' + 0x1e33301c06333f00 ; 50 '2' + 0x1e33301c30331e00 ; 51 '3' + 0x383c36337f307800 ; 52 '4' + 0x3f031f3030331e00 ; 53 '5' + 0x1c06031f33331e00 ; 54 '6' + 0x3f3330180c0c0c00 ; 55 '7' + 0x1e33331e33331e00 ; 56 '8' + 0x1e33333e30180e00 ; 57 '9' + 0x000c0c00000c0c00 ; 58 ':' + 0x000c0c00000c0c06 ; 59 ';' + 0x180c0603060c1800 ; 60 '<' + 0x00003f00003f0000 ; 61 '=' + 0x060c1830180c0600 ; 62 '>' + 0x1e3330180c000c00 ; 63 '?' + 0x3e637b7b7b031e00 ; 64 '@' + 0x0c1e33333f333300 ; 65 'A' + 0x3f66663e66663f00 ; 66 'B' + 0x3c66030303663c00 ; 67 'C' + 0x1f36666666361f00 ; 68 'D' + 0x7f46161e16467f00 ; 69 'E' + 0x7f46161e16060f00 ; 70 'F' + 0x3c66030373667c00 ; 71 'G' + 0x3333333f33333300 ; 72 'H' + 0x1e0c0c0c0c0c1e00 ; 73 'I' + 0x7830303033331e00 ; 74 'J' + 0x6766361e36666700 ; 75 'K' + 0x0f06060646667f00 ; 76 'L' + 0x63777f7f6b636300 ; 77 'M' + 0x63676f7b73636300 ; 78 'N' + 0x1c36636363361c00 ; 79 'O' + 0x3f66663e06060f00 ; 80 'P' + 0x1e3333333b1e3800 ; 81 'Q' + 0x3f66663e36666700 ; 82 'R' + 0x1e33070e38331e00 ; 83 'S' + 0x3f2d0c0c0c0c1e00 ; 84 'T' + 0x3333333333333f00 ; 85 'U' + 0x33333333331e0c00 ; 86 'V' + 0x6363636b7f776300 ; 87 'W' + 0x6363361c1c366300 ; 88 'X' + 0x3333331e0c0c1e00 ; 89 'Y' + 0x7f6331184c667f00 ; 90 'Z' + 0x1e06060606061e00 ; 91 '[' + 0x03060c1830604000 ; 92 '\' + 0x1e18181818181e00 ; 93 ']' + 0x081c366300000000 ; 94 '^' + 0x00000000000000ff ; 95 '_' + 0x0c0c180000000000 ; 96 '`' + 0x00001e303e336e00 ; 97 'a' + 0x0706063e66663b00 ; 98 'b' + 0x00001e3303331e00 ; 99 'c' + 0x3830303e33336e00 ; 100 'd' + 0x00001e333f031e00 ; 101 'e' + 0x1c36060f06060f00 ; 102 'f' + 0x00006e33333e301f ; 103 'g' + 0x0706366e66666700 ; 104 'h' + 0x0c000e0c0c0c1e00 ; 105 'i' + 0x300030303033331e ; 106 'j' + 0x070666361e366700 ; 107 'k' + 0x0e0c0c0c0c0c1e00 ; 108 'l' + 0x0000337f7f6b6300 ; 109 'm' + 0x00001f3333333300 ; 110 'n' + 0x00001e3333331e00 ; 111 'o' + 0x00003b66663e060f ; 112 'p' + 0x00006e33333e3078 ; 113 'q' + 0x00003b6e66060f00 ; 114 'r' + 0x00003e031e301f00 ; 115 's' + 0x080c3e0c0c2c1800 ; 116 't' + 0x0000333333336e00 ; 117 'u' + 0x00003333331e0c00 ; 118 'v' + 0x0000636b7f7f3600 ; 119 'w' + 0x000063361c366300 ; 120 'x' + 0x00003333333e301f ; 121 'y' + 0x00003f190c263f00 ; 122 'z' + 0x380c0c070c0c3800 ; 123 '{' + 0x1818180018181800 ; 124 '|' + 0x070c0c380c0c0700 ; 125 '}' + 0x6e3b000000000000 ; 126 '~' + 0x00081c3663637f00 ; 127 + 0x1e3303331e18301e ; 128 + 0x0033003333337e00 ; 129 + 0x38001e333f031e00 ; 130 + 0x7ec33c607c66fc00 ; 131 + 0x33001e303e337e00 ; 132 + 0x07001e303e337e00 ; 133 + 0x0c0c1e303e337e00 ; 134 + 0x00001e03031e301c ; 135 + 0x7ec33c667e063c00 ; 136 + 0x33001e333f031e00 ; 137 + 0x07001e333f031e00 ; 138 + 0x33000e0c0c0c1e00 ; 139 + 0x3e631c1818183c00 ; 140 + 0x07000e0c0c0c1e00 ; 141 + 0x631c36637f636300 ; 142 + 0x0c0c001e333f3300 ; 143 + 0x38003f061e063f00 ; 144 + 0x0000fe30fe33fe00 ; 145 + 0x7c36337f33337300 ; 146 + 0x1e33001e33331e00 ; 147 + 0x0033001e33331e00 ; 148 + 0x0007001e33331e00 ; 149 + 0x1e33003333337e00 ; 150 + 0x0007003333337e00 ; 151 + 0x00330033333e301f ; 152 + 0xc3183c66663c1800 ; 153 + 0x3300333333331e00 ; 154 + 0x18187e03037e1818 ; 155 + 0x1c36260f06673f00 ; 156 + 0x33331e3f0c3f0c0c ; 157 + 0x1f33335f63f363e3 ; 158 + 0x70d8183c18181b0e ; 159 + 0x38001e303e337e00 ; 160 + 0x1c000e0c0c0c1e00 ; 161 + 0x0038001e33331e00 ; 162 + 0x0038003333337e00 ; 163 + 0x001f001f33333300 ; 164 + 0x3f0033373f3b3300 ; 165 + 0x3c36367c007e0000 ; 166 + 0x1c36361c003e0000 ; 167 + 0x0c000c0603331e00 ; 168 + 0x0000003f03030000 ; 169 + 0x0000003f30300000 ; 170 + 0xc363337bcc6633f0 ; 171 + 0xc36333dbecf6f3c0 ; 172 + 0x1818001818181800 ; 173 + 0x00cc663366cc0000 ; 174 + 0x003366cc66330000 ; 175 + 0x4411441144114411 ; 176 + 0xaa55aa55aa55aa55 ; 177 + 0xdbeedb77dbeedb77 ; 178 + 0x1818181818181818 ; 179 + 0x181818181f181818 ; 180 + 0x18181f181f181818 ; 181 + 0x6c6c6c6c6f6c6c6c ; 182 + 0x000000007f6c6c6c ; 183 + 0x00001f181f181818 ; 184 + 0x6c6c6f606f6c6c6c ; 185 + 0x6c6c6c6c6c6c6c6c ; 186 + 0x00007f606f6c6c6c ; 187 + 0x6c6c6f607f000000 ; 188 + 0x6c6c6c6c7f000000 ; 189 + 0x18181f181f000000 ; 190 + 0x000000001f181818 ; 191 + 0x18181818f8000000 ; 192 + 0x18181818ff000000 ; 193 + 0x00000000ff181818 ; 194 + 0x18181818f8181818 ; 195 + 0x00000000ff000000 ; 196 + 0x18181818ff181818 ; 197 + 0x1818f818f8181818 ; 198 + 0x6c6c6c6cec6c6c6c ; 199 + 0x6c6cec0cfc000000 ; 200 + 0x0000fc0cec6c6c6c ; 201 + 0x6c6cef00ff000000 ; 202 + 0x0000ff00ef6c6c6c ; 203 + 0x6c6cec0cec6c6c6c ; 204 + 0x0000ff00ff000000 ; 205 + 0x6c6cef00ef6c6c6c ; 206 + 0x1818ff00ff000000 ; 207 + 0x6c6c6c6cff000000 ; 208 + 0x0000ff00ff181818 ; 209 + 0x00000000ff6c6c6c ; 210 + 0x6c6c6c6cfc000000 ; 211 + 0x1818f818f8000000 ; 212 + 0x0000f818f8181818 ; 213 + 0x00000000fc6c6c6c ; 214 + 0x6c6c6c6cff6c6c6c ; 215 + 0x1818ff18ff181818 ; 216 + 0x181818181f000000 ; 217 + 0x00000000f8181818 ; 218 + 0xffffffffffffffff ; 219 + 0x00000000ffffffff ; 220 + 0x0f0f0f0f0f0f0f0f ; 221 + 0xf0f0f0f0f0f0f0f0 ; 222 + 0xffffffff00000000 ; 223 + 0x00006e3b133b6e00 ; 224 + 0x001e331f331f0303 ; 225 + 0x003f330303030300 ; 226 + 0x007f363636363600 ; 227 + 0x3f33060c06333f00 ; 228 + 0x00007e1b1b1b0e00 ; 229 + 0x00666666663e0603 ; 230 + 0x006e3b1818181800 ; 231 + 0x3f0c1e33331e0c3f ; 232 + 0x1c36637f63361c00 ; 233 + 0x1c36636336367700 ; 234 + 0x380c183e33331e00 ; 235 + 0x00007edbdb7e0000 ; 236 + 0x60307edbdb7e0603 ; 237 + 0x1c06031f03061c00 ; 238 + 0x1e33333333333300 ; 239 + 0x003f003f003f0000 ; 240 + 0x0c0c3f0c0c003f00 ; 241 + 0x060c180c06003f00 ; 242 + 0x180c060c18003f00 ; 243 + 0x70d8d81818181818 ; 244 + 0x18181818181b1b0e ; 245 + 0x0c0c003f000c0c00 ; 246 + 0x006e3b006e3b0000 ; 247 + 0x1c36361c00000000 ; 248 + 0x0000001818000000 ; 249 + 0x0000000018000000 ; 250 + 0xf030303037363c38 ; 251 + 0x1e36363636000000 ; 252 + 0x0e180c061e000000 ; 253 + 0x00003c3c3c3c0000 ; 254 + 0x0000000000000000 ; 255 +)) diff --git a/examples/font/font.xbm b/examples/font/font.xbm new file mode 100644 index 0000000..1bfa272 --- /dev/null +++ b/examples/font/font.xbm @@ -0,0 +1,174 @@ +#define psf_width 256 +#define psf_height 64 +static unsigned char psf_bits[] = { + 0x00, 0x7e, 0x7e, 0x36, 0x08, 0x1c, 0x08, 0x00, 0xff, 0x00, 0xff, 0xf0, + 0x3c, 0xfc, 0xfe, 0x99, 0x01, 0x40, 0x18, 0x66, 0xfe, 0x7c, 0x00, 0x18, + 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xff, 0x7f, + 0x1c, 0x3e, 0x08, 0x00, 0xff, 0x3c, 0xc3, 0xe0, 0x66, 0xcc, 0xc6, 0x5a, + 0x07, 0x70, 0x3c, 0x66, 0xdb, 0xc6, 0x00, 0x3c, 0x3c, 0x18, 0x18, 0x0c, + 0x00, 0x24, 0x18, 0xff, 0x00, 0xa5, 0xdb, 0x7f, 0x3e, 0x1c, 0x1c, 0x18, + 0xe7, 0x66, 0x99, 0xf0, 0x66, 0xfc, 0xfe, 0x3c, 0x1f, 0x7c, 0x7e, 0x66, + 0xdb, 0x1c, 0x00, 0x7e, 0x7e, 0x18, 0x30, 0x06, 0x03, 0x66, 0x3c, 0xff, + 0x00, 0x81, 0xff, 0x7f, 0x7f, 0x7f, 0x3e, 0x3c, 0xc3, 0x42, 0xbd, 0xbe, + 0x66, 0x0c, 0xc6, 0xe7, 0x7f, 0x7f, 0x18, 0x66, 0xde, 0x36, 0x00, 0x18, + 0x18, 0x18, 0x7f, 0x7f, 0x03, 0xff, 0x7e, 0x7e, 0x00, 0xbd, 0xc3, 0x3e, + 0x3e, 0x7f, 0x7f, 0x3c, 0xc3, 0x42, 0xbd, 0x33, 0x3c, 0x0c, 0xc6, 0xe7, + 0x1f, 0x7c, 0x18, 0x66, 0xd8, 0x36, 0x7e, 0x7e, 0x18, 0x7e, 0x30, 0x06, + 0x03, 0x66, 0xff, 0x3c, 0x00, 0x99, 0xe7, 0x1c, 0x1c, 0x3e, 0x3e, 0x18, + 0xe7, 0x66, 0x99, 0x33, 0x18, 0x0e, 0xe6, 0x3c, 0x07, 0x70, 0x7e, 0x00, + 0xd8, 0x1c, 0x7e, 0x3c, 0x18, 0x3c, 0x18, 0x0c, 0x7f, 0x24, 0xff, 0x18, + 0x00, 0x81, 0xff, 0x08, 0x08, 0x1c, 0x1c, 0x00, 0xff, 0x3c, 0xc3, 0x33, + 0x7e, 0x0f, 0x67, 0x5a, 0x01, 0x40, 0x3c, 0x66, 0xd8, 0x33, 0x7e, 0x18, + 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, + 0x00, 0x3e, 0x3e, 0x00, 0xff, 0x00, 0xff, 0x1e, 0x18, 0x07, 0x03, 0x99, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x1e, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x36, 0x36, 0x0c, 0x00, 0x1c, 0x06, + 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3e, 0x0c, 0x1e, 0x1e, + 0x38, 0x3f, 0x1c, 0x3f, 0x1e, 0x1e, 0x00, 0x00, 0x18, 0x00, 0x06, 0x1e, + 0x00, 0x1e, 0x36, 0x36, 0x3e, 0x63, 0x36, 0x06, 0x0c, 0x0c, 0x66, 0x0c, + 0x00, 0x00, 0x00, 0x30, 0x63, 0x0e, 0x33, 0x33, 0x3c, 0x03, 0x06, 0x33, + 0x33, 0x33, 0x0c, 0x0c, 0x0c, 0x00, 0x0c, 0x33, 0x00, 0x1e, 0x36, 0x7f, + 0x03, 0x33, 0x1c, 0x03, 0x06, 0x18, 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x18, + 0x73, 0x0c, 0x30, 0x30, 0x36, 0x1f, 0x03, 0x30, 0x33, 0x33, 0x0c, 0x0c, + 0x06, 0x3f, 0x18, 0x30, 0x00, 0x0c, 0x00, 0x36, 0x1e, 0x18, 0x6e, 0x00, + 0x06, 0x18, 0xff, 0x3f, 0x00, 0x3f, 0x00, 0x0c, 0x7b, 0x0c, 0x1c, 0x1c, + 0x33, 0x30, 0x1f, 0x18, 0x1e, 0x3e, 0x00, 0x00, 0x03, 0x00, 0x30, 0x18, + 0x00, 0x0c, 0x00, 0x7f, 0x30, 0x0c, 0x3b, 0x00, 0x06, 0x18, 0x3c, 0x0c, + 0x00, 0x00, 0x00, 0x06, 0x6f, 0x0c, 0x06, 0x30, 0x7f, 0x30, 0x33, 0x0c, + 0x33, 0x30, 0x00, 0x00, 0x06, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x36, + 0x1f, 0x66, 0x33, 0x00, 0x0c, 0x0c, 0x66, 0x0c, 0x0c, 0x00, 0x0c, 0x03, + 0x67, 0x0c, 0x33, 0x33, 0x30, 0x33, 0x33, 0x0c, 0x33, 0x18, 0x0c, 0x0c, + 0x0c, 0x3f, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x36, 0x0c, 0x63, 0x6e, 0x00, + 0x18, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x01, 0x3e, 0x3f, 0x3f, 0x1e, + 0x78, 0x1e, 0x1e, 0x0c, 0x1e, 0x0e, 0x0c, 0x0c, 0x18, 0x00, 0x06, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0c, 0x3f, 0x3c, + 0x1f, 0x7f, 0x7f, 0x3c, 0x33, 0x1e, 0x78, 0x67, 0x0f, 0x63, 0x63, 0x1c, + 0x3f, 0x1e, 0x3f, 0x1e, 0x3f, 0x33, 0x33, 0x63, 0x63, 0x33, 0x7f, 0x1e, + 0x03, 0x1e, 0x08, 0x00, 0x63, 0x1e, 0x66, 0x66, 0x36, 0x46, 0x46, 0x66, + 0x33, 0x0c, 0x30, 0x66, 0x06, 0x77, 0x67, 0x36, 0x66, 0x33, 0x66, 0x33, + 0x2d, 0x33, 0x33, 0x63, 0x63, 0x33, 0x63, 0x06, 0x06, 0x18, 0x1c, 0x00, + 0x7b, 0x33, 0x66, 0x03, 0x66, 0x16, 0x16, 0x03, 0x33, 0x0c, 0x30, 0x36, + 0x06, 0x7f, 0x6f, 0x63, 0x66, 0x33, 0x66, 0x07, 0x0c, 0x33, 0x33, 0x63, + 0x36, 0x33, 0x31, 0x06, 0x0c, 0x18, 0x36, 0x00, 0x7b, 0x33, 0x3e, 0x03, + 0x66, 0x1e, 0x1e, 0x03, 0x3f, 0x0c, 0x30, 0x1e, 0x06, 0x7f, 0x7b, 0x63, + 0x3e, 0x33, 0x3e, 0x0e, 0x0c, 0x33, 0x33, 0x6b, 0x1c, 0x1e, 0x18, 0x06, + 0x18, 0x18, 0x63, 0x00, 0x7b, 0x3f, 0x66, 0x03, 0x66, 0x16, 0x16, 0x73, + 0x33, 0x0c, 0x33, 0x36, 0x46, 0x6b, 0x73, 0x63, 0x06, 0x3b, 0x36, 0x38, + 0x0c, 0x33, 0x33, 0x7f, 0x1c, 0x0c, 0x4c, 0x06, 0x30, 0x18, 0x00, 0x00, + 0x03, 0x33, 0x66, 0x66, 0x36, 0x46, 0x06, 0x66, 0x33, 0x0c, 0x33, 0x66, + 0x66, 0x63, 0x63, 0x36, 0x06, 0x1e, 0x66, 0x33, 0x0c, 0x33, 0x1e, 0x77, + 0x36, 0x0c, 0x66, 0x06, 0x60, 0x18, 0x00, 0x00, 0x1e, 0x33, 0x3f, 0x3c, + 0x1f, 0x7f, 0x0f, 0x7c, 0x33, 0x1e, 0x1e, 0x67, 0x7f, 0x63, 0x63, 0x1c, + 0x0f, 0x38, 0x67, 0x1e, 0x1e, 0x3f, 0x0c, 0x63, 0x63, 0x1e, 0x7f, 0x1e, + 0x40, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x07, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x07, 0x0c, 0x30, 0x07, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x18, 0x07, 0x6e, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x30, 0x00, 0x36, 0x00, 0x06, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x18, 0x0c, 0x3b, 0x08, 0x18, 0x1e, 0x06, 0x1e, 0x30, 0x1e, 0x06, 0x6e, + 0x36, 0x0e, 0x30, 0x66, 0x0c, 0x33, 0x1f, 0x1e, 0x3b, 0x6e, 0x3b, 0x3e, + 0x3e, 0x33, 0x33, 0x63, 0x63, 0x33, 0x3f, 0x0c, 0x18, 0x0c, 0x00, 0x1c, + 0x00, 0x30, 0x3e, 0x33, 0x3e, 0x33, 0x0f, 0x33, 0x6e, 0x0c, 0x30, 0x36, + 0x0c, 0x7f, 0x33, 0x33, 0x66, 0x33, 0x6e, 0x03, 0x0c, 0x33, 0x33, 0x6b, + 0x36, 0x33, 0x19, 0x07, 0x00, 0x38, 0x00, 0x36, 0x00, 0x3e, 0x66, 0x03, + 0x33, 0x3f, 0x06, 0x33, 0x66, 0x0c, 0x30, 0x1e, 0x0c, 0x7f, 0x33, 0x33, + 0x66, 0x33, 0x66, 0x1e, 0x0c, 0x33, 0x33, 0x7f, 0x1c, 0x33, 0x0c, 0x0c, + 0x18, 0x0c, 0x00, 0x63, 0x00, 0x33, 0x66, 0x33, 0x33, 0x03, 0x06, 0x3e, + 0x66, 0x0c, 0x33, 0x36, 0x0c, 0x6b, 0x33, 0x33, 0x3e, 0x3e, 0x06, 0x30, + 0x2c, 0x33, 0x1e, 0x7f, 0x36, 0x3e, 0x26, 0x0c, 0x18, 0x0c, 0x00, 0x63, + 0x00, 0x6e, 0x3b, 0x1e, 0x6e, 0x1e, 0x0f, 0x30, 0x67, 0x1e, 0x33, 0x67, + 0x1e, 0x63, 0x33, 0x1e, 0x06, 0x30, 0x0f, 0x1f, 0x18, 0x6e, 0x0c, 0x36, + 0x63, 0x30, 0x3f, 0x38, 0x18, 0x07, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x38, 0x7e, 0x33, 0x07, 0x0c, 0x00, + 0x7e, 0x33, 0x07, 0x33, 0x3e, 0x07, 0x63, 0x0c, 0x38, 0x00, 0x7c, 0x1e, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0xc3, 0x33, 0x18, 0x1c, 0x33, 0x1f, 0x70, + 0x33, 0x33, 0x00, 0xc3, 0x00, 0x00, 0x0c, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x36, 0x33, 0x33, 0x07, 0x33, 0x07, + 0x33, 0x18, 0x00, 0x18, 0x36, 0x33, 0x33, 0xd8, 0x03, 0x00, 0x1e, 0x3c, + 0x1e, 0x1e, 0x1e, 0x1e, 0x3c, 0x1e, 0x1e, 0x0e, 0x1c, 0x0e, 0x36, 0x00, + 0x3f, 0xfe, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x33, 0x7e, + 0x26, 0x1e, 0x33, 0x18, 0x33, 0x33, 0x33, 0x60, 0x30, 0x30, 0x30, 0x03, + 0x66, 0x33, 0x33, 0x0c, 0x18, 0x0c, 0x63, 0x1e, 0x06, 0x30, 0x7f, 0x1e, + 0x1e, 0x1e, 0x33, 0x33, 0x33, 0x66, 0x33, 0x03, 0x0f, 0x3f, 0x5f, 0x3c, + 0x1e, 0x33, 0x3f, 0x7c, 0x3e, 0x3e, 0x3e, 0x03, 0x7e, 0x3f, 0x3f, 0x0c, + 0x18, 0x0c, 0x7f, 0x33, 0x1e, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x66, 0x33, 0x03, 0x06, 0x0c, 0x63, 0x18, 0x18, 0x33, 0x03, 0x66, + 0x33, 0x33, 0x33, 0x1e, 0x06, 0x03, 0x03, 0x0c, 0x18, 0x0c, 0x63, 0x3f, + 0x06, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3e, 0x3c, 0x33, 0x7e, + 0x67, 0x3f, 0xf3, 0x18, 0x30, 0x7e, 0x1e, 0xfc, 0x7e, 0x7e, 0x7e, 0x30, + 0x3c, 0x1e, 0x1e, 0x1e, 0x3c, 0x1e, 0x63, 0x33, 0x3f, 0xfe, 0x73, 0x1e, + 0x1e, 0x1e, 0x7e, 0x7e, 0x30, 0x18, 0x1e, 0x18, 0x3f, 0x0c, 0x63, 0x1b, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x18, 0x00, 0x0c, 0xe3, 0x0e, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x3f, 0x3c, 0x1c, 0x0c, 0x00, 0x00, 0xc3, 0xc3, 0x18, 0x00, 0x00, + 0x44, 0xaa, 0xdb, 0x18, 0x18, 0x18, 0x6c, 0x00, 0x00, 0x6c, 0x6c, 0x00, + 0x6c, 0x6c, 0x18, 0x00, 0x00, 0x00, 0x38, 0x38, 0x1f, 0x00, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x63, 0x63, 0x18, 0xcc, 0x33, 0x11, 0x55, 0xee, 0x18, + 0x18, 0x18, 0x6c, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x6c, 0x6c, 0x18, 0x00, + 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x33, 0x36, 0x36, 0x0c, 0x00, 0x00, 0x33, + 0x33, 0x00, 0x66, 0x66, 0x44, 0xaa, 0xdb, 0x18, 0x18, 0x1f, 0x6c, 0x00, + 0x1f, 0x6f, 0x6c, 0x7f, 0x6f, 0x6c, 0x1f, 0x00, 0x30, 0x0c, 0x1e, 0x33, + 0x1f, 0x37, 0x7c, 0x1c, 0x06, 0x3f, 0x3f, 0x7b, 0xdb, 0x18, 0x33, 0xcc, + 0x11, 0x55, 0x77, 0x18, 0x18, 0x18, 0x6c, 0x00, 0x18, 0x60, 0x6c, 0x60, + 0x60, 0x6c, 0x18, 0x00, 0x3e, 0x0c, 0x33, 0x33, 0x33, 0x3f, 0x00, 0x00, + 0x03, 0x03, 0x30, 0xcc, 0xec, 0x18, 0x66, 0x66, 0x44, 0xaa, 0xdb, 0x18, + 0x1f, 0x1f, 0x6f, 0x7f, 0x1f, 0x6f, 0x6c, 0x6f, 0x7f, 0x7f, 0x1f, 0x1f, + 0x33, 0x0c, 0x33, 0x33, 0x33, 0x3b, 0x7e, 0x3e, 0x33, 0x03, 0x30, 0x66, + 0xf6, 0x18, 0xcc, 0x33, 0x11, 0x55, 0xee, 0x18, 0x18, 0x18, 0x6c, 0x6c, + 0x18, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x18, 0x7e, 0x1e, 0x1e, 0x7e, + 0x33, 0x33, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x33, 0xf3, 0x18, 0x00, 0x00, + 0x44, 0xaa, 0xdb, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x18, 0x6c, 0x6c, 0x6c, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x11, 0x55, 0x77, 0x18, + 0x18, 0x18, 0x6c, 0x6c, 0x18, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x18, + 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x6c, 0x6c, 0x00, 0x6c, 0x00, + 0x6c, 0x00, 0x6c, 0x18, 0x6c, 0x00, 0x00, 0x6c, 0x18, 0x00, 0x00, 0x6c, + 0x18, 0x18, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0x18, 0x18, 0x00, 0x18, + 0x00, 0x18, 0x18, 0x6c, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x18, + 0x6c, 0x00, 0x00, 0x6c, 0x18, 0x00, 0x00, 0x6c, 0x18, 0x18, 0x00, 0xff, + 0x00, 0x0f, 0xf0, 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0xf8, 0x6c, + 0xec, 0xfc, 0xef, 0xff, 0xec, 0xff, 0xef, 0xff, 0x6c, 0xff, 0x00, 0x6c, + 0xf8, 0xf8, 0x00, 0x6c, 0xff, 0x18, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0xff, + 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x6c, 0x0c, 0x0c, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x6c, 0x18, 0x18, 0x00, 0x6c, + 0x18, 0x18, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0xf8, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0xec, 0xfc, 0xec, 0xff, 0xef, 0xec, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xf8, 0xfc, 0xff, 0xff, 0x1f, 0xf8, 0xff, + 0xff, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x6c, + 0x00, 0x6c, 0x00, 0x6c, 0x6c, 0x00, 0x6c, 0x00, 0x00, 0x18, 0x6c, 0x00, + 0x00, 0x18, 0x6c, 0x6c, 0x18, 0x00, 0x18, 0xff, 0xff, 0x0f, 0xf0, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x6c, 0x00, 0x6c, 0x00, 0x6c, + 0x6c, 0x00, 0x6c, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x18, 0x6c, 0x6c, + 0x18, 0x00, 0x18, 0xff, 0xff, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x00, 0x18, 0x18, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x6c, 0x00, 0x6c, 0x00, + 0x00, 0x18, 0x6c, 0x00, 0x00, 0x18, 0x6c, 0x6c, 0x18, 0x00, 0x18, 0xff, + 0xff, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3f, 0x1c, 0x1c, 0x38, 0x00, 0x60, 0x1c, 0x1e, 0x00, 0x0c, 0x06, 0x18, + 0x70, 0x18, 0x0c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x1e, 0x0e, 0x00, 0x00, + 0x00, 0x1e, 0x3f, 0x7f, 0x33, 0x00, 0x66, 0x6e, 0x0c, 0x36, 0x36, 0x0c, + 0x00, 0x30, 0x06, 0x33, 0x3f, 0x0c, 0x0c, 0x0c, 0xd8, 0x18, 0x0c, 0x6e, + 0x36, 0x00, 0x00, 0x30, 0x36, 0x18, 0x00, 0x00, 0x6e, 0x33, 0x33, 0x36, + 0x06, 0x7e, 0x66, 0x3b, 0x1e, 0x63, 0x63, 0x18, 0x7e, 0x7e, 0x03, 0x33, + 0x00, 0x3f, 0x18, 0x06, 0xd8, 0x18, 0x00, 0x3b, 0x36, 0x00, 0x00, 0x30, + 0x36, 0x0c, 0x3c, 0x00, 0x3b, 0x1f, 0x03, 0x36, 0x0c, 0x1b, 0x66, 0x18, + 0x33, 0x7f, 0x63, 0x3e, 0xdb, 0xdb, 0x1f, 0x33, 0x3f, 0x0c, 0x0c, 0x0c, + 0x18, 0x18, 0x3f, 0x00, 0x1c, 0x18, 0x00, 0x30, 0x36, 0x06, 0x3c, 0x00, + 0x13, 0x33, 0x03, 0x36, 0x06, 0x1b, 0x66, 0x18, 0x33, 0x63, 0x36, 0x33, + 0xdb, 0xdb, 0x03, 0x33, 0x00, 0x0c, 0x06, 0x18, 0x18, 0x18, 0x00, 0x6e, + 0x00, 0x18, 0x18, 0x37, 0x36, 0x1e, 0x3c, 0x00, 0x3b, 0x1f, 0x03, 0x36, + 0x33, 0x1b, 0x3e, 0x18, 0x1e, 0x36, 0x36, 0x33, 0x7e, 0x7e, 0x06, 0x33, + 0x3f, 0x00, 0x00, 0x00, 0x18, 0x1b, 0x0c, 0x3b, 0x00, 0x00, 0x00, 0x36, + 0x00, 0x00, 0x3c, 0x00, 0x6e, 0x03, 0x03, 0x36, 0x3f, 0x0e, 0x06, 0x18, + 0x0c, 0x1c, 0x77, 0x1e, 0x00, 0x06, 0x1c, 0x33, 0x00, 0x3f, 0x3f, 0x3f, + 0x18, 0x1b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00}; diff --git a/examples/screen_font.csn b/examples/screen_font.csn new file mode 100644 index 0000000..720b0cf --- /dev/null +++ b/examples/screen_font.csn @@ -0,0 +1,353 @@ +( + ; This is a demo of a bitmap font and string rendering using buffers. + ; You can do this many ways. + + (sc-init 800 250) + (sc-opt SCREEN_UPSCALE 5) + + ; Define a font. This should be less ugly once we have includes implemented... + (sym FONT g15) + (mkbf FONT ( + 0x0000000000000000 ; 0 + 0x7e81a581bd99817e ; 1 + 0x7effdbffc3e7ff7e ; 2 + 0x367f7f7f3e1c0800 ; 3 + 0x081c3e7f3e1c0800 ; 4 + 0x1c3e1c7f7f3e1c3e ; 5 + 0x08081c3e7f3e1c3e ; 6 + 0x0000183c3c180000 ; 7 + 0xffffe7c3c3e7ffff ; 8 + 0x003c664242663c00 ; 9 + 0xffc399bdbd99c3ff ; 10 + 0xf0e0f0be3333331e ; 11 + 0x3c6666663c187e18 ; 12 + 0xfcccfc0c0c0e0f07 ; 13 + 0xfec6fec6c6e66703 ; 14 + 0x995a3ce7e73c5a99 ; 15 + 0x01071f7f1f070100 ; 16 + 0x40707c7f7c704000 ; 17 + 0x183c7e18187e3c18 ; 18 + 0x6666666666006600 ; 19 + 0xfedbdbded8d8d800 ; 20 + 0x7cc61c36361c331e ; 21 + 0x000000007e7e7e00 ; 22 + 0x183c7e187e3c18ff ; 23 + 0x183c7e1818181800 ; 24 + 0x181818187e3c1800 ; 25 + 0x0018307f30180000 ; 26 + 0x000c067f060c0000 ; 27 + 0x00000303037f0000 ; 28 + 0x002466ff66240000 ; 29 + 0x00183c7effff0000 ; 30 + 0x00ffff7e3c180000 ; 31 + 0x0000000000000000 ; 32 ' ' + 0x0c1e1e0c0c000c00 ; 33 '!' + 0x3636360000000000 ; 34 '"' + 0x36367f367f363600 ; 35 '#' + 0x0c3e031e301f0c00 ; 36 '$' + 0x006333180c666300 ; 37 '%' + 0x1c361c6e3b336e00 ; 38 '&' + 0x0606030000000000 ; 39 ''' + 0x180c0606060c1800 ; 40 '(' + 0x060c1818180c0600 ; 41 ')' + 0x00663cff3c660000 ; 42 '*' + 0x000c0c3f0c0c0000 ; 43 '+' + 0x00000000000c0c06 ; 44 ',' + 0x0000003f00000000 ; 45 '-' + 0x00000000000c0c00 ; 46 '.' + 0x6030180c06030100 ; 47 '/' + 0x3e63737b6f673e00 ; 48 '0' + 0x0c0e0c0c0c0c3f00 ; 49 '1' + 0x1e33301c06333f00 ; 50 '2' + 0x1e33301c30331e00 ; 51 '3' + 0x383c36337f307800 ; 52 '4' + 0x3f031f3030331e00 ; 53 '5' + 0x1c06031f33331e00 ; 54 '6' + 0x3f3330180c0c0c00 ; 55 '7' + 0x1e33331e33331e00 ; 56 '8' + 0x1e33333e30180e00 ; 57 '9' + 0x000c0c00000c0c00 ; 58 ':' + 0x000c0c00000c0c06 ; 59 ';' + 0x180c0603060c1800 ; 60 '<' + 0x00003f00003f0000 ; 61 '=' + 0x060c1830180c0600 ; 62 '>' + 0x1e3330180c000c00 ; 63 '?' + 0x3e637b7b7b031e00 ; 64 '@' + 0x0c1e33333f333300 ; 65 'A' + 0x3f66663e66663f00 ; 66 'B' + 0x3c66030303663c00 ; 67 'C' + 0x1f36666666361f00 ; 68 'D' + 0x7f46161e16467f00 ; 69 'E' + 0x7f46161e16060f00 ; 70 'F' + 0x3c66030373667c00 ; 71 'G' + 0x3333333f33333300 ; 72 'H' + 0x1e0c0c0c0c0c1e00 ; 73 'I' + 0x7830303033331e00 ; 74 'J' + 0x6766361e36666700 ; 75 'K' + 0x0f06060646667f00 ; 76 'L' + 0x63777f7f6b636300 ; 77 'M' + 0x63676f7b73636300 ; 78 'N' + 0x1c36636363361c00 ; 79 'O' + 0x3f66663e06060f00 ; 80 'P' + 0x1e3333333b1e3800 ; 81 'Q' + 0x3f66663e36666700 ; 82 'R' + 0x1e33070e38331e00 ; 83 'S' + 0x3f2d0c0c0c0c1e00 ; 84 'T' + 0x3333333333333f00 ; 85 'U' + 0x33333333331e0c00 ; 86 'V' + 0x6363636b7f776300 ; 87 'W' + 0x6363361c1c366300 ; 88 'X' + 0x3333331e0c0c1e00 ; 89 'Y' + 0x7f6331184c667f00 ; 90 'Z' + 0x1e06060606061e00 ; 91 '[' + 0x03060c1830604000 ; 92 '\' + 0x1e18181818181e00 ; 93 ']' + 0x081c366300000000 ; 94 '^' + 0x00000000000000ff ; 95 '_' + 0x0c0c180000000000 ; 96 '`' + 0x00001e303e336e00 ; 97 'a' + 0x0706063e66663b00 ; 98 'b' + 0x00001e3303331e00 ; 99 'c' + 0x3830303e33336e00 ; 100 'd' + 0x00001e333f031e00 ; 101 'e' + 0x1c36060f06060f00 ; 102 'f' + 0x00006e33333e301f ; 103 'g' + 0x0706366e66666700 ; 104 'h' + 0x0c000e0c0c0c1e00 ; 105 'i' + 0x300030303033331e ; 106 'j' + 0x070666361e366700 ; 107 'k' + 0x0e0c0c0c0c0c1e00 ; 108 'l' + 0x0000337f7f6b6300 ; 109 'm' + 0x00001f3333333300 ; 110 'n' + 0x00001e3333331e00 ; 111 'o' + 0x00003b66663e060f ; 112 'p' + 0x00006e33333e3078 ; 113 'q' + 0x00003b6e66060f00 ; 114 'r' + 0x00003e031e301f00 ; 115 's' + 0x080c3e0c0c2c1800 ; 116 't' + 0x0000333333336e00 ; 117 'u' + 0x00003333331e0c00 ; 118 'v' + 0x0000636b7f7f3600 ; 119 'w' + 0x000063361c366300 ; 120 'x' + 0x00003333333e301f ; 121 'y' + 0x00003f190c263f00 ; 122 'z' + 0x380c0c070c0c3800 ; 123 '{' + 0x1818180018181800 ; 124 '|' + 0x070c0c380c0c0700 ; 125 '}' + 0x6e3b000000000000 ; 126 '~' + 0x00081c3663637f00 ; 127 + 0x1e3303331e18301e ; 128 + 0x0033003333337e00 ; 129 + 0x38001e333f031e00 ; 130 + 0x7ec33c607c66fc00 ; 131 + 0x33001e303e337e00 ; 132 + 0x07001e303e337e00 ; 133 + 0x0c0c1e303e337e00 ; 134 + 0x00001e03031e301c ; 135 + 0x7ec33c667e063c00 ; 136 + 0x33001e333f031e00 ; 137 + 0x07001e333f031e00 ; 138 + 0x33000e0c0c0c1e00 ; 139 + 0x3e631c1818183c00 ; 140 + 0x07000e0c0c0c1e00 ; 141 + 0x631c36637f636300 ; 142 + 0x0c0c001e333f3300 ; 143 + 0x38003f061e063f00 ; 144 + 0x0000fe30fe33fe00 ; 145 + 0x7c36337f33337300 ; 146 + 0x1e33001e33331e00 ; 147 + 0x0033001e33331e00 ; 148 + 0x0007001e33331e00 ; 149 + 0x1e33003333337e00 ; 150 + 0x0007003333337e00 ; 151 + 0x00330033333e301f ; 152 + 0xc3183c66663c1800 ; 153 + 0x3300333333331e00 ; 154 + 0x18187e03037e1818 ; 155 + 0x1c36260f06673f00 ; 156 + 0x33331e3f0c3f0c0c ; 157 + 0x1f33335f63f363e3 ; 158 + 0x70d8183c18181b0e ; 159 + 0x38001e303e337e00 ; 160 + 0x1c000e0c0c0c1e00 ; 161 + 0x0038001e33331e00 ; 162 + 0x0038003333337e00 ; 163 + 0x001f001f33333300 ; 164 + 0x3f0033373f3b3300 ; 165 + 0x3c36367c007e0000 ; 166 + 0x1c36361c003e0000 ; 167 + 0x0c000c0603331e00 ; 168 + 0x0000003f03030000 ; 169 + 0x0000003f30300000 ; 170 + 0xc363337bcc6633f0 ; 171 + 0xc36333dbecf6f3c0 ; 172 + 0x1818001818181800 ; 173 + 0x00cc663366cc0000 ; 174 + 0x003366cc66330000 ; 175 + 0x4411441144114411 ; 176 + 0xaa55aa55aa55aa55 ; 177 + 0xdbeedb77dbeedb77 ; 178 + 0x1818181818181818 ; 179 + 0x181818181f181818 ; 180 + 0x18181f181f181818 ; 181 + 0x6c6c6c6c6f6c6c6c ; 182 + 0x000000007f6c6c6c ; 183 + 0x00001f181f181818 ; 184 + 0x6c6c6f606f6c6c6c ; 185 + 0x6c6c6c6c6c6c6c6c ; 186 + 0x00007f606f6c6c6c ; 187 + 0x6c6c6f607f000000 ; 188 + 0x6c6c6c6c7f000000 ; 189 + 0x18181f181f000000 ; 190 + 0x000000001f181818 ; 191 + 0x18181818f8000000 ; 192 + 0x18181818ff000000 ; 193 + 0x00000000ff181818 ; 194 + 0x18181818f8181818 ; 195 + 0x00000000ff000000 ; 196 + 0x18181818ff181818 ; 197 + 0x1818f818f8181818 ; 198 + 0x6c6c6c6cec6c6c6c ; 199 + 0x6c6cec0cfc000000 ; 200 + 0x0000fc0cec6c6c6c ; 201 + 0x6c6cef00ff000000 ; 202 + 0x0000ff00ef6c6c6c ; 203 + 0x6c6cec0cec6c6c6c ; 204 + 0x0000ff00ff000000 ; 205 + 0x6c6cef00ef6c6c6c ; 206 + 0x1818ff00ff000000 ; 207 + 0x6c6c6c6cff000000 ; 208 + 0x0000ff00ff181818 ; 209 + 0x00000000ff6c6c6c ; 210 + 0x6c6c6c6cfc000000 ; 211 + 0x1818f818f8000000 ; 212 + 0x0000f818f8181818 ; 213 + 0x00000000fc6c6c6c ; 214 + 0x6c6c6c6cff6c6c6c ; 215 + 0x1818ff18ff181818 ; 216 + 0x181818181f000000 ; 217 + 0x00000000f8181818 ; 218 + 0xffffffffffffffff ; 219 + 0x00000000ffffffff ; 220 + 0x0f0f0f0f0f0f0f0f ; 221 + 0xf0f0f0f0f0f0f0f0 ; 222 + 0xffffffff00000000 ; 223 + 0x00006e3b133b6e00 ; 224 + 0x001e331f331f0303 ; 225 + 0x003f330303030300 ; 226 + 0x007f363636363600 ; 227 + 0x3f33060c06333f00 ; 228 + 0x00007e1b1b1b0e00 ; 229 + 0x00666666663e0603 ; 230 + 0x006e3b1818181800 ; 231 + 0x3f0c1e33331e0c3f ; 232 + 0x1c36637f63361c00 ; 233 + 0x1c36636336367700 ; 234 + 0x380c183e33331e00 ; 235 + 0x00007edbdb7e0000 ; 236 + 0x60307edbdb7e0603 ; 237 + 0x1c06031f03061c00 ; 238 + 0x1e33333333333300 ; 239 + 0x003f003f003f0000 ; 240 + 0x0c0c3f0c0c003f00 ; 241 + 0x060c180c06003f00 ; 242 + 0x180c060c18003f00 ; 243 + 0x70d8d81818181818 ; 244 + 0x18181818181b1b0e ; 245 + 0x0c0c003f000c0c00 ; 246 + 0x006e3b006e3b0000 ; 247 + 0x1c36361c00000000 ; 248 + 0x0000001818000000 ; 249 + 0x0000000018000000 ; 250 + 0xf030303037363c38 ; 251 + 0x1e36363636000000 ; 252 + 0x0e180c061e000000 ; 253 + 0x00003c3c3c3c0000 ; 254 + 0x0000000000000000 ; 255 + )) + + (mkbf r7 " Hello World ") + (bfpush @r7 1) ; ASCII smileys + (bfrpush @r7 2) + + ; It sometimes randomly doesn't show... ??? + + ; Test + (sc-wr 0 0 #ff00ff) + (sc-blit) + + (call ShowChar 10 10 #ffffff 'A') + + (call ShowString 10 20 #ffff00 r7) + (sc-blit) + + (bfrsz @r7 0) + + (lds @cout "Type something: ") + (:read) + (ld r0 @cin (eof? (halt))) + (ld @cout r0) + (ld @r7 r0) + (call ShowString 10 30 #ff0000 r7) + (sc-blit) + (j :read) + + (proc ShowString x y color str + (sym size r10) + (sym index r11) + (sym xx r12) + + (bfsz size @str (z? (ret))) + (ld index 0) + (ld xx x) + (:ch) + (bfrd r0 @str index) + (call ShowChar xx y color r0) + (add xx 8) + (inc index) + (dec size (z? (ret))) + (j :ch) + ) + + (proc ShowChar x y color ch + (rcmp ch 0 255) + (ret.ne) + + (sym s r15) + (bfrd s @FONT ch) + (rev s) + + (sym xx r5) + (sym yy r6) + (sym nb r7) + (sym xmax r8) + (add xmax x 8) + + (ld xx x) + (ld yy y) + (ld nb 64) + + (:nb) + (and r0 s 1) + (j.z :skip) + + (sc-wr xx yy color) + + (:skip) + (ror s 1) + (inc xx) + (cmp xx xmax (eq? (ld xx x)(inc yy))) + (dec nb) + (j.nz :nb) + (ret) + ) + + + (proc WaitForClose + (:j) + (sc-blit) + ;(sc-poll) + (mslp 100) + (j :j) + ) +)