From d88de360d0a1ea7401e41556f304ebff6b4de7ff Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 11 May 2023 00:36:10 +0300 Subject: [PATCH] add simple work with fonts (too small for this screen), still have some bugs with sprites in lower right corner --- F3:F303/NitrogenFlooding/font14.h | 3168 +++++++++++++++++++++++ F3:F303/NitrogenFlooding/fontNumb8.h | 786 ++++++ F3:F303/NitrogenFlooding/fonts.c | 325 +++ F3:F303/NitrogenFlooding/fonts.h | 42 + F3:F303/NitrogenFlooding/hardware.c | 1 - F3:F303/NitrogenFlooding/ili9341.c | 81 +- F3:F303/NitrogenFlooding/ili9341.h | 14 +- F3:F303/NitrogenFlooding/main.c | 4 + F3:F303/NitrogenFlooding/nitrogen.bin | Bin 21856 -> 31440 bytes F3:F303/NitrogenFlooding/nitrogen.files | 6 + F3:F303/NitrogenFlooding/proto.c | 93 +- F3:F303/NitrogenFlooding/screen.c | 304 +++ F3:F303/NitrogenFlooding/screen.h | 55 + F3:F303/NitrogenFlooding/spi.c | 94 +- F3:F303/NitrogenFlooding/spi.h | 4 +- F3:F303/NitrogenFlooding/version.inc | 4 +- 16 files changed, 4917 insertions(+), 64 deletions(-) create mode 100644 F3:F303/NitrogenFlooding/font14.h create mode 100644 F3:F303/NitrogenFlooding/fontNumb8.h create mode 100644 F3:F303/NitrogenFlooding/fonts.c create mode 100644 F3:F303/NitrogenFlooding/fonts.h create mode 100644 F3:F303/NitrogenFlooding/screen.c create mode 100644 F3:F303/NitrogenFlooding/screen.h diff --git a/F3:F303/NitrogenFlooding/font14.h b/F3:F303/NitrogenFlooding/font14.h new file mode 100644 index 0000000..a31229e --- /dev/null +++ b/F3:F303/NitrogenFlooding/font14.h @@ -0,0 +1,3168 @@ +/* + * This file is part of the nitrogen project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +// this file should be included JUST ONCE! +// only in fonts.c + +// font14: matrix 16x16 bits -> 32 bytes per symbol +#define FONT14BYTES 32 +#define FONT14HEIGHT 16 +#define FONT14BASELINE 2 + +//------------------------------------------------------------------------------ +// Font author: Nadyrshin Ruslan, +// https://www.youtube.com/channel/UChButpZaL5kUUl_zTyIDFkQ +//------------------------------------------------------------------------------ + +// this array shows position of every koi8-r symbol in font14_table +const uint8_t font14_encoding[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0..31 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // 47 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, // 63 + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // 79 + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, // 95 + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 111 + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, // 127 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 143 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 159 + 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 175 + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 191 + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, // 207 + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 223 + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, // 239 + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, // 255 +}; + +// Font 14px height, full matrix is 32x32px +// first number is symbol width, another are symbol data +// the 0th element substitutes all absent characters +const uint8_t font14_table[] = { + // 0x00 - empty + 0, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x20 - ' ' + , + 4, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x21 + , + 3, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x22 + , + 7, + ________,________, + ________,________, + XX__XX__,________, + XX__XX__,________, + XX__XX__,________, + XX__XX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x23 + , + 8, + ________,________, + ________,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + _XX_XX__,________, + _XX_XX__,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX_XX___,________, + XX_XX___,________, + ________,________, + ________,________, + ________,________ + // 0x24 + , + 8, + ________,________, + ___X____,________, + __XXX___,________, + _XXXXX__,________, + XX_X_XX_,________, + XX_X____,________, + XXXX____,________, + _XXXX___,________, + __XXXX__,________, + ___XXXX_,________, + XX_X_XX_,________, + XX_X_XX_,________, + _XXXXX__,________, + __XXX___,________, + ___X____,________, + ________,________ + // 0x25 + , + 16, + ________,________, + ________,________, + _XXXX___,__XX____, + XX__XX__,_XX_____, + XX__XX__,_XX_____, + XX__XX__,XX______, + XX__XX_X,X_______, + _XXXX__X,X_______, + ______XX,__XXXX__, + ______XX,_XX__XX_, + _____XX_,_XX__XX_, + _____XX_,_XX__XX_, + ____XX__,_XX__XX_, + ___XX___,__XXXX__, + ________,________, + ________,________ + // 0x26 + , + 12, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + __XXXX__,________, + _XX_XX__,X_______, + XX__XXX_,XX______, + XX___XXX,X_______, + XX____XX,XX______, + _XXXXXXX,XXX_____, + __XXXX__,_X______, + ________,________, + ________,________ + // 0x27 + , + 3, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x28 + , + 5, + __XX____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX____,________, + ________,________ + // 0x29 + , + 5, + XX______,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + XX______,________, + ________,________ + // 0x2A + , + 8, + ________,________, + _X_X_X__,________, + __XXX___,________, + XXXXXXX_,________, + __XXX___,________, + _X_X_X__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x2B + , + 9, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x2C + , + 3, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + _X______,________, + _X______,________, + X_______,________ + // 0x2D + , + 6, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX___,________, + XXXXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x2E + , + 3, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________ + // 0x2F + , + 5, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________ + // 0x30 + , + 9, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x31 + , + 6, + ________,________, + ________,________, + ___XX___,________, + __XXX___,________, + _XXXX___,________, + XX_XX___,________, + X__XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________ + // 0x32 + , + 9, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX___XX,________, + XX____XX,________, + ______XX,________, + _____XX_,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + _XX_____,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________ + // 0x33 + , + 9, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + XX____XX,________, + ______XX,________, + ___XXXX_,________, + ___XXXX_,________, + _____XXX,________, + ______XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x34 + , + 9, + ________,________, + ________,________, + _____XX_,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX__XX_,________, + XX___XX_,________, + XXXXXXXX,________, + XXXXXXXX,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________ + // 0x35 + , + 9, + ________,________, + ________,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XX_____,________, + XXX_____,________, + XXXXXX__,________, + XXXXXXX_,________, + XX___XXX,________, + ______XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x36 + , + 9, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + _XX___XX,________, + XX______,________, + XX_XXX__,________, + XXXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + _XX___XX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x37 + , + 9, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XXX___,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________ + // 0x38 + , + 9, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x39 + , + 9, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XX___XX_,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXXX,________, + __XXX_XX,________, + ______XX,________, + XX___XX_,________, + XXXXXXX_,________, + _XXXXX__,________, + ________,________, + ________,________ + // 0x3A + , + 3, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x3B + , + 3, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + _X______,________, + _X______,________, + X_______,________, + ________,________ + // 0x3C + , + 9, + ________,________, + ________,________, + ________,________, + _______X,________, + _____XXX,________, + ___XXXX_,________, + _XXXX___,________, + XXX_____,________, + _XXXX___,________, + ___XXXX_,________, + _____XXX,________, + _______X,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x3D + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXX_,________, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x3E + , + 9, + ________,________, + ________,________, + ________,________, + X_______,________, + XXX_____,________, + _XXXX___,________, + ___XXXX_,________, + _____XXX,________, + ___XXXX_,________, + _XXXX___,________, + XXX_____,________, + X_______,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x3F + , + 9, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX___XX,________, + XX____XX,________, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + ___XX___,________, + ___XX___,________, + ________,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________ + // 0x40 + , + 16, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXX___,___XXX__, + _XXX__XX,X_XXXX__, + _XX_XXXX,XXXX_XX_, + XXX_XX__,_XXX_XX_, + XX_XX___,_XX__XX_, + XX_XX___,_XX__XX_, + XX_XX___,_XX__XX_, + XX_XX___,XXX_XX__, + XX_XXXXX,XXXXX___, + _XX_XXXX,_XXX____, + _XXX____,_____XX_, + __XXX___,___XXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____ + // 0x41 + , + 12, + ________,________, + ________,________, + ____XXX_,________, + ____XXX_,________, + ___XX_XX,________, + ___XX_XX,________, + ___XX_XX,________, + __XX___X,X_______, + __XX___X,X_______, + __XXXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + _XX_____,XX______, + XX______,_XX_____, + ________,________, + ________,________ + // 0x42 + , + 11, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,XX______, + XX______,XX______, + XX______,XX______, + XXXXXXXX,X_______, + XXXXXXXX,________, + ________,________, + ________,________ + // 0x43 + , + 11, + ________,________, + ________,________, + ___XXXXX,________, + _XXXXXXX,X_______, + _XX____X,XX______, + XX______,X_______, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,X_______, + _XX____X,XX______, + _XXXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________ + // 0x44 + , + 11, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXXX,X_______, + XX_____X,X_______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX_____X,X_______, + XXXXXXXX,X_______, + XXXXXXX_,________, + ________,________, + ________,________ + // 0x45 + , + 10, + ________,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ________,________, + ________,________ + // 0x46 + , + 9, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + XX______,________, + XX______,________, + XX______,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x47 + , + 11, + ________,________, + ________,________, + ___XXXXX,________, + _XXXXXXX,X_______, + _XX____X,XX______, + XX______,X_______, + XX______,________, + XX______,________, + XX___XXX,XX______, + XX___XXX,XX______, + XX______,XX______, + _XX____X,XX______, + _XXXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________ + // 0x48 + , + 10, + ________,________, + ________,________, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0x49 + , + 3, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x4A + , + 9, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x4B + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX_____X,X_______, + XX____XX,________, + XX___XX_,________, + XX__XX__,________, + XX_XXXX_,________, + XXXX_XX_,________, + XXX___XX,________, + XX____XX,________, + XX_____X,X_______, + XX_____X,XX______, + XX______,XX______, + ________,________, + ________,________ + // 0x4C + , + 9, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________ + // 0x4D + , + 12, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + XXXX___X,XXX_____, + XXXX___X,XXX_____, + XX_X___X,_XX_____, + XX_XX_XX,_XX_____, + XX_XX_XX,_XX_____, + XX_XX_XX,_XX_____, + XX__XXX_,_XX_____, + XX__XXX_,_XX_____, + XX__XXX_,_XX_____, + XX___X__,_XX_____, + ________,________, + ________,________ + // 0x4E + , + 11, + ________,________, + ________,________, + XX______,XX______, + XXX_____,XX______, + XXXX____,XX______, + XXXX____,XX______, + XX_XX___,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX___XX_,XX______, + XX____XX,XX______, + XX____XX,XX______, + XX_____X,XX______, + XX______,XX______, + ________,________, + ________,________ + // 0x4F + , + 11, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,X_______, + _XX____X,X_______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + _XX____X,X_______, + _XXXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________ + // 0x50 + , + 10, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXXX,________, + XX____XX,X_______, + XX_____X,X_______, + XX____XX,X_______, + XXXXXXXX,________, + XXXXXXX_,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x51 + , + 11, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,X_______, + _XX____X,X_______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX__XX__,XX______, + _XX__XXX,X_______, + _XXXXXXX,X_______, + ___XXX_X,X_______, + ________,XX______, + ________,________ + // 0x52 + , + 12, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,XX______, + XX______,XX______, + XX_____X,XX______, + XXXXXXXX,X_______, + XXXXXXX_,________, + XX___XXX,________, + XX____XX,X_______, + XX_____X,X_______, + XX_____X,XX______, + XX______,XXX_____, + ________,________, + ________,________ + // 0x53 + , + 10, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + XX____XX,X_______, + XX_____X,X_______, + XXXX____,________, + _XXXXXX_,________, + ___XXXXX,________, + ______XX,X_______, + XX_____X,X_______, + XXX___XX,X_______, + _XXXXXXX,________, + __XXXXX_,________, + ________,________, + ________,________ + // 0x54 + , + 11, + ________,________, + ________,________, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________ + // 0x55 + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XXX____X,XX______, + _XXXXXXX,X_______, + __XXXXXX,________, + ________,________, + ________,________ + // 0x56 + , + 12, + ________,________, + ________,________, + XX______,_XX_____, + XX______,_XX_____, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,X_______, + __XX___X,X_______, + __XX___X,X_______, + ___XX_XX,________, + ___XX_XX,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________ + // 0x57 + , + 16, + ________,________, + ________,________, + XX____XX,X____XX_, + XXX___XX,X____XX_, + _XX___XX,X___XX__, + _XX__XX_,XX__XX__, + _XX__XX_,XX__XX__, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + ___XXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ________,________, + ________,________ + // 0x58 + , + 10, + ________,________, + ________,________, + XX_____X,X_______, + XXX___XX,X_______, + _XX___XX,________, + __XX_XX_,________, + __XXXXX_,________, + ___XXX__,________, + ___XXX__,________, + __XXXXX_,________, + __XX_XX_,________, + _XX___XX,________, + XXX___XX,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0x59 + , + 11, + ________,________, + ________,________, + XX______,XX______, + XXX____X,XX______, + _XX____X,X_______, + __XX__XX,________, + __XX__XX,________, + ___XXXX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________ + // 0x5A + , + 10, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ______XX,________, + _____XX_,________, + ____XXX_,________, + ____XX__,________, + ___XX___,________, + __XXX___,________, + __XX____,________, + _XX_____,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ________,________, + ________,________ + // 0x5B + , + 5, + ________,________, + XXXX____,________, + XXXX____,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XXXX____,________, + XXXX____,________, + ________,________ + // 0x5C + , + 5, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________ + // 0x5D + , + 5, + ________,________, + XXXX____,________, + XXXX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + XXXX____,________, + XXXX____,________, + ________,________ + // 0x5E + , + 9, + ________,________, + ________,________, + ___XX___,________, + __XXXX__,________, + __XXXX__,________, + _XX__XX_,________, + _XX__XX_,________, + XX____XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x5F + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________ + // 0x60 + , + 4, + ________,________, + XXX_____,________, + _XX_____,________, + __XX____,________, + ____X___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0x61 + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + XXXXXXX_,________, + XX___XX_,________, + ___XXXX_,________, + _XXXXXX_,________, + XXX__XX_,________, + XX___XX_,________, + XXXXXXX_,________, + _XXXX_XX,________, + ________,________, + ________,________ + // 0x62 + , + 9, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX_XXX__,________, + XXXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + XXXXXXX_,________, + XX_XXX__,________, + ________,________, + ________,________ + // 0x63 + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XX_,________, + XX______,________, + XX______,________, + XX______,________, + XXX__XX_,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x64 + , + 9, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + __XXX_XX,________, + _XXXXXXX,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXXX,________, + __XXX_XX,________, + ________,________, + ________,________ + // 0x65 + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + _XXXXX__,________, + XX___XX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX______,________, + XXX__XX_,________, + _XXXXX__,________, + __XXX___,________, + ________,________, + ________,________ + // 0x66 + , + 7, + ________,________, + ________,________, + __XXXX__,________, + _XXXXX__,________, + _XX_____,________, + XXXXX___,________, + XXXXX___,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________ + // 0x67 + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX_XX,________, + _XXXXXXX,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXXX,________, + __XXX_XX,________, + XX____XX,________, + XXXXXXXX,________, + _XXXXXX_,________ + // 0x68 + , + 9, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX_XXXX_,________, + XXXXXXXX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0x69 + , + 3, + ________,________, + ________,________, + XX______,________, + XX______,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x6A + , + 4, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + XXX_____,________, + XX______,________ + // 0x6B + , + 8, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX___XX_,________, + XX__XX__,________, + XX_XX___,________, + XXXXX___,________, + XXXXX___,________, + XXX_XX__,________, + XX__XX__,________, + XX___XX_,________, + XX___XX_,________, + ________,________, + ________,________ + // 0x6C + , + 3, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x6D + , + 13, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XXX__,XXX_____, + XXXXXXXX,XXXX____, + XXX__XXX,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + ________,________, + ________,________ + // 0x6E + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XXXX_,________, + XXXXXXXX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0x6F + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0x70 + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XXXX_,________, + XXXXXXXX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + XXXXXXX_,________, + XX_XXX__,________, + XX______,________, + XX______,________ + // 0x71 + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX_XX,________, + _XXXXXXX,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXXX,________, + __XXX_XX,________, + ______XX,________, + ______XX,________, + ______XX,________ + // 0x72 + , + 6, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XX___,________, + XXXXX___,________, + XXX_____,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0x73 + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + XXXXXXX_,________, + XX___XX_,________, + XXXX____,________, + _XXXXX__,________, + ___XXXX_,________, + XX___XX_,________, + XXXXXXX_,________, + _XXXXX__,________, + ________,________, + ________,________ + // 0x74 + , + 6, + ________,________, + ________,________, + __X_____,________, + _XX_____,________, + _XX_____,________, + XXXXX___,________, + XXXXX___,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXX___,________, + __XXX___,________, + ________,________, + ________,________ + // 0x75 + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX___XXX,________, + XXXXXXXX,________, + _XXXX_XX,________, + ________,________, + ________,________ + // 0x76 + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XX_,________, + XX___XX_,________, + XX___XX_,________, + _XX_XX__,________, + _XX_XX__,________, + _XX_XX__,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________ + // 0x77 + , + 14, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XXX,___XX___, + XX___XXX,___XX___, + _XX__XXX,__XX____, + _XX_XX_X,X_XX____, + _XX_XX_X,X_XX____, + _XX_XX_X,X_XX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ________,________, + ________,________ + // 0x78 + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XX_,________, + XXX_XXX_,________, + _XX_XX__,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + _XX_XX__,________, + XXX_XXX_,________, + XX___XX_,________, + ________,________, + ________,________ + // 0x79 + , + 10, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_____X,X_______, + _XX___XX,________, + _XX___XX,________, + __XX_XX_,________, + __XX_XX_,________, + __XXXXX_,________, + ___XXX__,________, + ___XXX__,________, + ___XX___,________, + _XXXX___,________, + _XXX____,________ + // 0x7A + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXX_,________, + ____XX__,________, + ___XXX__,________, + __XXX___,________, + _XXX____,________, + _XX_____,________, + XXXXXXX_,________, + XXXXXXX_,________, + ________,________, + ________,________ + // 0x7B + , + 7, + ________,________, + ___XXX__,________, + __XXXX__,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + XXX_____,________, + XXX_____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXX__,________, + ___XXX__,________, + ________,________ + // 0x7C + , + 3, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________ + // 0x7D + , + 7, + ________,________, + XXX_____,________, + XXXX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ___XXX__,________, + ___XXX__,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + XXXX____,________, + XXX_____,________, + ________,________ + // 0x7E + , + 9, + ________,________, + ________,________, + _XXX___X,________, + XXXXXXXX,________, + X___XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ + // 0xA3 - £ + , + 8, + ________,________, + ________,________, + _XX_XX__,________, + _XX_XX__,________, + ________,________, + __XXX___,________, + _XXXXX__,________, + XX___XX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX______,________, + XXX__XX_,________, + _XXXXX__,________, + __XXX___,________, + ________,________, + ________,________ + // 0xB3 - ³ + , + 10, + __XX_XX_,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ________,________, + ________,________ + // 0xC0 - À + , + 12, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XXX,X_______, + XX__XXXX,XX______, + XX_XXX__,XXX_____, + XXXXX___,_XX_____, + XXXXX___,_XX_____, + XX_XX___,_XX_____, + XX_XXX__,XXX_____, + XX__XXXX,XX______, + XX___XXX,X_______, + ________,________, + ________,________ + // 0xC1 - Á + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + XXXXXXX_,________, + XX___XX_,________, + ___XXXX_,________, + _XXXXXX_,________, + XXX__XX_,________, + XX___XX_,________, + XXXXXXX_,________, + _XXXX_XX,________, + ________,________, + ________,________ + // 0xC2 -  + , + 9, + ________,________, + ______X_,________, + _XXXXXX_,________, + XXXXXX__,________, + XX______,________, + XXXXXX__,________, + XXXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0xC3 - à + , + 10, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + _______X,X_______, + _______X,X_______ + // 0xC4 - Ä + , + 12, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,X_______, + __XX___X,X_______, + __XX___X,X_______, + __XX___X,X_______, + __XX___X,X_______, + _XX____X,X_______, + XXXXXXXX,XXX_____, + XXXXXXXX,XXX_____, + XX______,_XX_____, + XX______,_XX_____ + // 0xC5 - Å + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + _XXXXX__,________, + XX___XX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX______,________, + XXX__XX_,________, + _XXXXX__,________, + __XXX___,________, + ________,________, + ________,________ + // 0xC6 - Æ + , + 13, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + _____XX_,________, + _____XX_,________ + // 0xC7 - Ç + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXX_,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0xC8 - È + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XX_,________, + XXX_XXX_,________, + _XX_XX__,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + _XX_XX__,________, + XXX_XXX_,________, + XX___XX_,________, + ________,________, + ________,________ + // 0xC9 - É + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XX___XXX,________, + XX__XXXX,________, + XX_XXXXX,________, + XXXXX_XX,________, + XXXX__XX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xCA - Ê + , + 9, + ________,________, + __X__X__,________, + __XXXX__,________, + ___XX___,________, + ________,________, + XX____XX,________, + XX___XXX,________, + XX__XXXX,________, + XX_XXXXX,________, + XXXXX_XX,________, + XXXX__XX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xCB - Ë + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XX_,________, + XX___XX_,________, + XX__XX__,________, + XXXX____,________, + XXXX____,________, + XX__XX__,________, + XX___XX_,________, + XX___XX_,________, + XX___XX_,________, + ________,________, + ________,________ + // 0xCC - Ì + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XXXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + XXX___XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xCD - Í + , + 12, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + XXXX___X,XXX_____, + XXXX___X,XXX_____, + XX_XX_XX,_XX_____, + XX_XX_XX,_XX_____, + XX__XXX_,_XX_____, + XX__XXX_,_XX_____, + XX___X__,_XX_____, + ________,________, + ________,________ + // 0xCE - Î + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,________, + XXXXXXXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xCF - Ï + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0xD0 - Ð + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xD1 - Ñ + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + XXXXXXXX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,________, + _XXXXXXX,________, + __XX__XX,________, + _XX___XX,________, + XX____XX,________, + ________,________, + ________,________ + // 0xD2 - Ò + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XXXX_,________, + XXXXXXXX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXX__XXX,________, + XXXXXXX_,________, + XX_XXX__,________, + XX______,________, + XX______,________ + // 0xD3 - Ó + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XX_,________, + XX______,________, + XX______,________, + XX______,________, + XXX__XX_,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0xD4 - Ô + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________ + // 0xD5 - Õ + , + 11, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,XX______, + XX______,XX______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + __XX__XX,________, + ___XXXX_,________, + ___XXXX_,________, + ____XX__,________, + _XXXX___,________, + _XXX____,________ + // 0xD6 - Ö + , + 13, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___XX_,__XX____, + _XX__XX_,_XX_____, + __XX_XX_,XX______, + __XX_XX_,XX______, + ____XXXX,________, + __XX_XX_,XX______, + _XX__XX_,_XX_____, + XX___XX_,__XX____, + XX___XX_,__XX____, + ________,________, + ________,________ + // 0xD7 - × + , + 8, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXX__,________, + XXXXXXX_,________, + XX___XX_,________, + XXXXXX__,________, + XXXXXX__,________, + XX___XX_,________, + XX___XX_,________, + XXXXXXX_,________, + XXXXXX__,________, + ________,________, + ________,________ + // 0xD8 - Ø + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XXXXXXX_,________, + XXXXXXXX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,________, + XXXXXXX_,________, + ________,________, + ________,________ + // 0xD9 - Ù + , + 12, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,_XX_____, + XX______,_XX_____, + XX______,_XX_____, + XXXXXXX_,_XX_____, + XXXXXXXX,_XX_____, + XX____XX,_XX_____, + XX____XX,_XX_____, + XXXXXXXX,_XX_____, + XXXXXXX_,_XX_____, + ________,________, + ________,________ + // 0xDA - Ú + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + XXXXXXXX,________, + ______XX,________, + ____XXX_,________, + ____XXXX,________, + ______XX,________, + XX____XX,________, + XXXXXXXX,________, + _XXXXXX_,________, + ________,________, + ________,________ + // 0xDB - Û + , + 11, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ________,________, + ________,________ + // 0xDC - Ü + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + XXXXXXXX,________, + XX____XX,________, + ____XXXX,________, + ____XXXX,________, + ______XX,________, + XX____XX,________, + XXXXXXXX,________, + _XXXXXX_,________, + ________,________, + ________,________ + // 0xDD - Ý + , + 12, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XXXXXXXX,XX______, + XXXXXXXX,XXX_____, + ________,_XX_____, + ________,_XX_____ + // 0xDE - Þ + , + 9, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,________, + _XXXXXXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________ + // 0xDF - ß + , + 11, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX____,________, + XXXX____,________, + __XX____,________, + __XXXXXX,X_______, + __XXXXXX,XX______, + __XX____,XX______, + __XX____,XX______, + __XXXXXX,XX______, + __XXXXXX,X_______, + ________,________, + ________,________ + // 0xE0 - à + , + 14, + ________,________, + ________,________, + XX_____X,XX______, + XX___XXX,XXXX____, + XX___XX_,__XX____, + XX__XX__,___XX___, + XX__XX__,___XX___, + XXXXXX__,___XX___, + XXXXXX__,___XX___, + XX__XX__,___XX___, + XX__XX__,___XX___, + XX___XX_,__XX____, + XX___XXX,XXXX____, + XX_____X,XX______, + ________,________, + ________,________ + // 0xE1 - á + , + 12, + ________,________, + ________,________, + ____XXX_,________, + ____XXX_,________, + ___XX_XX,________, + ___XX_XX,________, + ___XX_XX,________, + __XX___X,X_______, + __XX___X,X_______, + __XXXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + _XX_____,XX______, + XX______,_XX_____, + ________,________, + ________,________ + // 0xE2 - â + , + 11, + ________,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,XX______, + XX______,XX______, + XX______,XX______, + XXXXXXXX,X_______, + XXXXXXXX,________, + ________,________, + ________,________ + // 0xE3 - ã + , + 11, + ________,________, + ________,________, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ________,XX______, + ________,XX______ + // 0xE4 - ä + , + 13, + ________,________, + ________,________, + ____XXXX,XX______, + ___XXXXX,XX______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + _XX_____,XX______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + XX______,__XX____, + XX______,__XX____ + // 0xE5 - å + , + 10, + ________,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ________,________, + ________,________ + // 0xE6 - æ + , + 15, + ________,________, + ________,________, + ______XX,________, + ___XXXXX,XXX_____, + _XXXXXXX,XXXXX___, + _XX___XX,___XX___, + XX____XX,____XX__, + XX____XX,____XX__, + XX____XX,____XX__, + XX____XX,____XX__, + _XX___XX,___XX___, + _XXXXXXX,XXXXX___, + ___XXXXX,XXX_____, + ______XX,________, + ________,________, + ________,________ + // 0xD5 + // 0xE7 - ç + , + 10, + ________,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0xE8 - è + , + 10, + ________,________, + ________,________, + XX_____X,X_______, + XXX___XX,X_______, + _XX___XX,________, + __XX_XX_,________, + __XXXXX_,________, + ___XXX__,________, + ___XXX__,________, + __XXXXX_,________, + __XX_XX_,________, + _XX___XX,________, + XXX___XX,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0xE9 - é + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX_____X,XX______, + XX____XX,XX______, + XX____XX,XX______, + XX___XX_,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX_XX___,XX______, + XXXX____,XX______, + XXXX____,XX______, + XXX_____,XX______, + XX______,XX______, + ________,________, + ________,________ + // 0xEA - ê + , + 11, + ___XXXX_,________, + ____XX__,________, + XX______,XX______, + XX_____X,XX______, + XX____XX,XX______, + XX____XX,XX______, + XX___XX_,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX_XX___,XX______, + XXXX____,XX______, + XXXX____,XX______, + XXX_____,XX______, + XX______,XX______, + ________,________, + ________,________ + // 0xEB - ë + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX_____X,X_______, + XX____XX,________, + XX___XX_,________, + XX__XX__,________, + XX_XXXX_,________, + XXXX_XX_,________, + XXX___XX,________, + XX____XX,________, + XX_____X,X_______, + XX_____X,XX______, + XX______,XX______, + ________,________, + ________,________ + // 0xEC - ì + , + 10, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,X_______, + __XX___X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + XXX____X,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0xED - í + , + 12, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + XXXX___X,XXX_____, + XXXX___X,XXX_____, + XX_X___X,_XX_____, + XX_XX_XX,_XX_____, + XX_XX_XX,_XX_____, + XX_XX_XX,_XX_____, + XX__XXX_,_XX_____, + XX__XXX_,_XX_____, + XX__XXX_,_XX_____, + XX___X__,_XX_____, + ________,________, + ________,________ + // 0xEE - î + , + 10, + ________,________, + ________,________, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0xEF - ï + , + 11, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,X_______, + _XX____X,X_______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + _XX____X,X_______, + _XXXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________ + // 0xF0 - ð + , + 10, + ________,________, + ________,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________ + // 0xF1 - ñ + , + 12, + ________,________, + ________,________, + ___XXXXX,XXX_____, + __XXXXXX,XXX_____, + _XXX____,_XX_____, + _XX_____,_XX_____, + _XXX____,_XX_____, + __XXXXXX,XXX_____, + ____XXXX,XXX_____, + ___XXX__,_XX_____, + __XXX___,_XX_____, + __XX____,_XX_____, + _XXX____,_XX_____, + XXX_____,_XX_____, + ________,________, + ________,________ + // 0xF2 - ò + , + 10, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXXX,________, + XX____XX,X_______, + XX_____X,X_______, + XX____XX,X_______, + XXXXXXXX,________, + XXXXXXX_,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + ________,________, + ________,________ + // 0xF3 - ó + , + 11, + ________,________, + ________,________, + ___XXXXX,________, + _XXXXXXX,X_______, + _XX____X,XX______, + XX______,X_______, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,X_______, + _XX____X,XX______, + _XXXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________ + // 0xF4 - ô + , + 11, + ________,________, + ________,________, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________ + // 0xF5 - õ + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX______,XX______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + __XX__XX,________, + ___XXXX_,________, + ___XXXX_,________, + ____XX__,________, + ____XX__,________, + _XXXX___,________, + _XXX____,________, + ________,________, + ________,________ + // 0xF6 - ö + , + 13, + ________,________, + ________,________, + XX___XX_,__XX____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + __XX_XX_,XX______, + ____XXXX,________, + __XX_XX_,XX______, + __XX_XX_,XX______, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + XX___XX_,__XX____, + XX___XX_,__XX____, + ________,________, + ________,________ + // 0xF7 - ÷ + , + 11, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XXXXXXXX,________, + XXXXXXXX,X_______, + XX_____X,XX______, + XX______,XX______, + XX______,XX______, + XXXXXXXX,X_______, + XXXXXXXX,________, + ________,________, + ________,________ + // 0xF8 - ø + , + 10, + ________,________, + ________,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XXXXXXX_,________, + XXXXXXXX,________, + XX____XX,X_______, + XX_____X,X_______, + XX____XX,X_______, + XXXXXXXX,________, + XXXXXXX_,________, + ________,________, + ________,________ + // 0xF9 - ù + , + 13, + ________,________, + ________,________, + XX______,__XX____, + XX______,__XX____, + XX______,__XX____, + XX______,__XX____, + XX______,__XX____, + XXXXXXX_,__XX____, + XXXXXXXX,__XX____, + XX____XX,X_XX____, + XX_____X,X_XX____, + XX____XX,X_XX____, + XXXXXXXX,__XX____, + XXXXXXX_,__XX____, + ________,________, + ________,________ + // 0xFA - ú + , + 9, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + XX____XX,________, + ______XX,________, + ___XXXX_,________, + ___XXXX_,________, + _____XXX,________, + ______XX,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________ + // 0xFB - û + , + 13, + ________,________, + ________,________, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________ + // 0xFC - ü + , + 11, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,X_______, + XXX____X,X_______, + XX______,XX______, + ________,XX______, + ____XXXX,XX______, + ____XXXX,XX______, + ________,XX______, + XX______,XX______, + XXX____X,X_______, + _XXXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________ + // 0xFD - ý + , + 14, + ________,________, + ________,________, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XXXXXXXX,XXXXX___, + XXXXXXXX,XXXXX___, + ________,___XX___, + ________,___XX___ + // 0xFE - þ + , + 11, + ________,________, + ________,________, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XX______,XX______, + XXX_____,XX______, + _XXXXXXX,XX______, + __XXXXXX,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,________, + ________,________ + // 0xFF - ÿ + , + 12, + ________,________, + ________,________, + XXXX____,________, + XXXX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,X_______, + __XXXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + __XXXXXX,X_______, + ________,________, + ________,________ +}; + +/* +32 (0x20) - 64 (0x40) - @ 96 (0x60) - ` 128 (0x80) - € 160 (0xa0) -   192 (0xc0) - À 224 (0xe0) - à +33 (0x21) - ! 65 (0x41) - A 97 (0x61) - a 129 (0x81) - 161 (0xa1) - ¡ 193 (0xc1) - Á 225 (0xe1) - á +34 (0x22) - " 66 (0x42) - B 98 (0x62) - b 130 (0x82) - ‚ 162 (0xa2) - ¢ 194 (0xc2) -  226 (0xe2) - â +35 (0x23) - # 67 (0x43) - C 99 (0x63) - c 131 (0x83) - ƒ 163 (0xa3) - £ 195 (0xc3) - à 227 (0xe3) - ã +36 (0x24) - $ 68 (0x44) - D 100 (0x64) - d 132 (0x84) - „ 164 (0xa4) - ¤ 196 (0xc4) - Ä 228 (0xe4) - ä +37 (0x25) - % 69 (0x45) - E 101 (0x65) - e 133 (0x85) - … 165 (0xa5) - ¥ 197 (0xc5) - Å 229 (0xe5) - å +38 (0x26) - & 70 (0x46) - F 102 (0x66) - f 134 (0x86) - † 166 (0xa6) - ¦ 198 (0xc6) - Æ 230 (0xe6) - æ +39 (0x27) - ' 71 (0x47) - G 103 (0x67) - g 135 (0x87) - ‡ 167 (0xa7) - § 199 (0xc7) - Ç 231 (0xe7) - ç +40 (0x28) - ( 72 (0x48) - H 104 (0x68) - h 136 (0x88) - ˆ 168 (0xa8) - ¨ 200 (0xc8) - È 232 (0xe8) - è +41 (0x29) - ) 73 (0x49) - I 105 (0x69) - i 137 (0x89) - ‰ 169 (0xa9) - © 201 (0xc9) - É 233 (0xe9) - é +42 (0x2a) - * 74 (0x4a) - J 106 (0x6a) - j 138 (0x8a) - Š 170 (0xaa) - ª 202 (0xca) - Ê 234 (0xea) - ê +43 (0x2b) - + 75 (0x4b) - K 107 (0x6b) - k 139 (0x8b) - ‹ 171 (0xab) - « 203 (0xcb) - Ë 235 (0xeb) - ë +44 (0x2c) - , 76 (0x4c) - L 108 (0x6c) - l 140 (0x8c) - Œ 172 (0xac) - ¬ 204 (0xcc) - Ì 236 (0xec) - ì +45 (0x2d) - - 77 (0x4d) - M 109 (0x6d) - m 141 (0x8d) - 173 (0xad) - ­ 205 (0xcd) - Í 237 (0xed) - í +46 (0x2e) - . 78 (0x4e) - N 110 (0x6e) - n 142 (0x8e) - Ž 174 (0xae) - ® 206 (0xce) - Î 238 (0xee) - î +47 (0x2f) - / 79 (0x4f) - O 111 (0x6f) - o 143 (0x8f) - 175 (0xaf) - ¯ 207 (0xcf) - Ï 239 (0xef) - ï +48 (0x30) - 0 80 (0x50) - P 112 (0x70) - p 144 (0x90) - 176 (0xb0) - ° 208 (0xd0) - Ð 240 (0xf0) - ð +49 (0x31) - 1 81 (0x51) - Q 113 (0x71) - q 145 (0x91) - ‘ 177 (0xb1) - ± 209 (0xd1) - Ñ 241 (0xf1) - ñ +50 (0x32) - 2 82 (0x52) - R 114 (0x72) - r 146 (0x92) - ’ 178 (0xb2) - ² 210 (0xd2) - Ò 242 (0xf2) - ò +51 (0x33) - 3 83 (0x53) - S 115 (0x73) - s 147 (0x93) - “ 179 (0xb3) - ³ 211 (0xd3) - Ó 243 (0xf3) - ó +52 (0x34) - 4 84 (0x54) - T 116 (0x74) - t 148 (0x94) - ” 180 (0xb4) - ´ 212 (0xd4) - Ô 244 (0xf4) - ô +53 (0x35) - 5 85 (0x55) - U 117 (0x75) - u 149 (0x95) - • 181 (0xb5) - µ 213 (0xd5) - Õ 245 (0xf5) - õ +54 (0x36) - 6 86 (0x56) - V 118 (0x76) - v 150 (0x96) - – 182 (0xb6) - ¶ 214 (0xd6) - Ö 246 (0xf6) - ö +55 (0x37) - 7 87 (0x57) - W 119 (0x77) - w 151 (0x97) - — 183 (0xb7) - · 215 (0xd7) - × 247 (0xf7) - ÷ +56 (0x38) - 8 88 (0x58) - X 120 (0x78) - x 152 (0x98) - ˜ 184 (0xb8) - ¸ 216 (0xd8) - Ø 248 (0xf8) - ø +57 (0x39) - 9 89 (0x59) - Y 121 (0x79) - y 153 (0x99) - ™ 185 (0xb9) - ¹ 217 (0xd9) - Ù 249 (0xf9) - ù +58 (0x3a) - : 90 (0x5a) - Z 122 (0x7a) - z 154 (0x9a) - 186 (0xba) - º 218 (0xda) - Ú 250 (0xfa) - ú +59 (0x3b) - ; 91 (0x5b) - [ 123 (0x7b) - { 155 (0x9b) - › 187 (0xbb) - » 219 (0xdb) - Û 251 (0xfb) - û +60 (0x3c) - < 92 (0x5c) - \ 124 (0x7c) - | 156 (0x9c) - œ 188 (0xbc) - ¼ 220 (0xdc) - Ü 252 (0xfc) - ü +61 (0x3d) - = 93 (0x5d) - ] 125 (0x7d) - } 157 (0x9d) - 189 (0xbd) - ½ 221 (0xdd) - Ý 253 (0xfd) - ý +62 (0x3e) - > 94 (0x5e) - ^ 126 (0x7e) - ~ 158 (0x9e) - ž 190 (0xbe) - ¾ 222 (0xde) - Þ 254 (0xfe) - þ +63 (0x3f) - ? 95 (0x5f) - _ 127 (0x7f) - 159 (0x9f) - Ÿ 191 (0xbf) - ¿ 223 (0xdf) - ß 255 (0xff) - ÿ +*/ diff --git a/F3:F303/NitrogenFlooding/fontNumb8.h b/F3:F303/NitrogenFlooding/fontNumb8.h new file mode 100644 index 0000000..627032d --- /dev/null +++ b/F3:F303/NitrogenFlooding/fontNumb8.h @@ -0,0 +1,786 @@ +/* + * This file is part of the nitrogen project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +// numbers and base symbols up to Z + +// this file should be included JUST ONCE! +// only in fonts.c + +#define FONTNUMB8BYTES 10 +#define FONTNUMB8HEIGHT 10 +#define FONTNUMB8BASELINE 2 + +// this array shows position of every koi8-r symbol in font10_table +const uint8_t fontNumb8_encoding[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0..31 + // 0 1 2 3 4 5 6 7 8 9 A B C D E F +/*20*/1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, // 47 +/*30*/2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 29, 30, 31, 32, 33, 34, // 63 +/*40*/35, 12, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 13, // 79 +/*50*/49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, // 95 +/*60*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 111 +/*70*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 127 +/*80*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 143 +/*90*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 159 +/*A0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 175 +/*B0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 191 +/*C0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 207 +/*D0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 223 +/*E0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 239 +/*F0*/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 255 +}; + +const uint8_t fontNumb8_table[] = { + // 0 0x00 - empty + 0, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + // 1 0x20 - ' ' + 4, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + // 2 0x30 - '0' + 6, + _XXX____, + XX_XX___, + X___X___, + X___X___, + X___X___, + X___X___, + XX_XX___, + _XXX____, + ________, + ________, + // 3 0x31 - '1' + 6, + _XX_____, + X_X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + XXXXX___, + ________, + ________, + // 4 0x32 - '2' + 6, + _XXX____, + X___X___, + ____X___, + ____X___, + ___X____, + __X_____, + _X______, + XXXXX___, + ________, + ________, + // 5 0x33 - '3' + 6, + XXXX____, + ____X___, + ____X___, + _XXX____, + ____X___, + ____X___, + ____X___, + XXXX____, + ________, + ________, + // 6 0x34 - '4' + 7, + ___XX___, + ___XX___, + __X_X___, + _X__X___, + _X__X___, + XXXXXX__, + ____X___, + ____X___, + ________, + ________, + // 7 0x35 - '5' + 5, + XXXX____, + X_______, + X_______, + XXX_____, + ___X____, + ___X____, + ___X____, + XXX_____, + ________, + ________, + // 8 0x36 - '6' + 6, + _XXX____, + X___X___, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + // 9 0x37 - '7' + 5, + XXXX____, + ___X____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + ________, + ________, + // 10 0x38 - '8' + 6, + _XXX____, + X___X___, + X___X___, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + // 11 0x39 - '9' + 6, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + X___X___, + _XXX____, + ________, + ________, + // 12 0x41 - 'A' + 6, + __X_____, + _X_X____, + _X_X____, + _X_X____, + X___X___, + XXXXX___, + X___X___, + X___X___, + ________, + ________, + // 13 0x4f - 'O' + 7, + __XX____, + _X__X___, + X____X__, + X____X__, + X____X__, + X____X__, + _X__X___, + __XX____, + ________, + ________, + // 14 0x21 - '!' + 2, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + X_______, + ________, + ________, + // 15 0x22 - '"' + 4, + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + // 16 0x23 - '#' + 7, + ________, + ____X_X_, + ___X_X__, + XXXXXXX_, + __X_X___, + XXXXXXX_, + _X_X____, + X_X_____, + ________, + ________, + // 17 0x24 - '$' + 6, + __X_____, + _XXX____, + X_X_X___, + X_X_____, + _XXX____, + __X_X___, + X_X_X___, + XXXX____, + __X_____, + ________, + // 18 0x25 - '%' + 8, + ________, + _XX___X_, + X__X_X__, + _XX_X___, + ___X____, + __X_XX__, + _X_X__X_, + X___XX__, + ________, + ________, + // 19 0x26 - '&' + 7, + ________, + _X______, + X_X_____, + X_X_____, + _X__XX__, + X_XXX___, + X__X____, + _XX_XX__, + ________, + ________, + // 20 0x27 - ''' + 2, + ________, + X_______, + X_______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + // 21 0x28 - '(' + 4, + __XX____, + _X______, + X_______, + X_______, + X_______, + X_______, + X_______, + _X______, + __XX____, + ________, + // 22 0x29 - ')' + 4, + XX______, + __X_____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + __X_____, + XX______, + ________, + // 23 0x2A - '*' + 6, + ________, + ________, + __X_____, + XXXXX___, + _XXX____, + X___X___, + ________, + ________, + ________, + ________, + // 24 0x2B - '+' + 6, + ________, + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + ________, + ________, + // 25 0x2C - ',' + 3, + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + _X______, + X_______, + ________, + // 26 0x2D - '-' + 6, + ________, + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + // 27 0x2E - '.' + 3, + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________, + ________, + // 28 0x2F - '/' + 6, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + X_______, + ________, + // 29 0x3A - ':' + 3, + ________, + ________, + XX______, + XX______, + ________, + XX______, + XX______, + ________, + ________, + ________, + // 30 0x3B - ';' + 3, + ________, + ________, + ________, + XX______, + XX______, + ________, + XX______, + _X______, + X_______, + ________, + // 31 0x3C - '<' + 4, + ________, + ________, + __X_____, + _X______, + X_______, + _X______, + __X_____, + ________, + ________, + ________, + // 32 0x3D - '=' + 5, + ________, + ________, + ________, + XXXX____, + ________, + XXXX____, + ________, + ________, + ________, + ________, + // 33 0x3E - '>' + 4, + ________, + ________, + X_______, + _X______, + __X_____, + _X______, + X_______, + ________, + ________, + ________, + // 34 0x3F - '?' + 5, + _XX_____, + X__X____, + ___X____, + __X_____, + _X______, + _X______, + ________, + _X______, + ________, + ________, + // 35 0x40 - '@' + 8, + ___XXX__, + __X__X__, + _X_XXXX_, + X__X_XX_, + X_X_X_X_, + X_X_X_X_, + X__X_X__, + _X______, + __XXXX__, + ________, + // 36 0x42 - 'B' + 6, + XXX_____, + X__X____, + X_X_____, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXX____, + ________, + ________, + // 37 0x43 - 'C' + 7, + __XXX___, + _X___X__, + X_______, + X_______, + X_______, + X_______, + _X___X__, + __XXX___, + ________, + ________, + // 38 0x44 - 'D' + 6, + XXX_____, + X__X____, + X___X___, + X___X___, + X___X___, + X___X___, + X__X____, + XXX_____, + ________, + ________, + // 39 0x45 - 'E' + 6, + XXXXX___, + X_______, + X_______, + XXX_____, + X_______, + X_______, + X___X___, + XXXXX___, + ________, + ________, + // 40 0x46 - 'F' + 6, + XXXXX___, + X___X___, + X_______, + X_______, + XXX_____, + X_______, + X_______, + X_______, + ________, + ________, + // 41 0x47 - 'G' + 7, + __XXX___, + _X___X__, + X_______, + X_______, + X_______, + X__XXX__, + _X___X__, + __XXX___, + ________, + ________, + // 42 0x48 - 'H' + 6, + X___X___, + X___X___, + X___X___, + XXXXX___, + X___X___, + X___X___, + X___X___, + X___X___, + ________, + ________, + // 43 0x49 - 'I' + 4, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________, + // 44 0x4A - 'J' + 5, + XXXX____, + X__X____, + ___X____, + ___X____, + ___X____, + ___X____, + X_XX____, + _X______, + ________, + ________, + // 45 0x4B - 'K' + 6, + X___X___, + X__X____, + X_X_____, + XXX_____, + X__X____, + X__X____, + X___X___, + X___X___, + ________, + ________, + // 46 0x4C - 'L' + 6, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X___X___, + XXXXX___, + ________, + ________, + // 47 0x4D - 'M' + 8, + X_____X_, + XX___XX_, + X_X_X_X_, + X_X_X_X_, + X__X__X_, + X_____X_, + X_____X_, + X_____X_, + ________, + ________, + // 48 0x4E - 'N' + 6, + X___X___, + XX__X___, + XX__X___, + X_X_X___, + X_X_X___, + X__XX___, + X__XX___, + X___X___, + ________, + ________, + // 49 0x50 - 'P' + 6, + XXXX____, + X__XX___, + X___X___, + X__XX___, + XXXX____, + X_______, + X_______, + X_______, + ________, + ________, + // 50 0x51 - 'Q' + 7, + __XX____, + _X__X___, + X____X__, + X____X__, + X____X__, + X____X__, + _X_XX___, + __XX____, + ___XXX__, + ________, + // 51 0x52 - 'R' + 6, + XXXX____, + X__XX___, + X___X___, + X__XX___, + XXXX____, + X_X_____, + X__X____, + X__XX___, + ________, + ________, + // 52 0x53 - 'S' + 6, + _XX_____, + X__X____, + X_______, + _XX_____, + __XX____, + ____X___, + XX_XX___, + _XXX____, + ________, + ________, + // 53 0x54 - 'T' + 6, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________, + // 54 0x55 - 'U' + 7, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _X__X___, + __XX____, + ________, + ________, + // 55 0x56 - 'V' + 6, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + ________, + ________, + // 56 0x57 - 'W' + 8, + X_____X_, + X_____X_, + X_____X_, + X__X__X_, + X__X__X_, + _X_X_X__, + _X_X_X__, + __X_X___, + ________, + ________, + // 57 0x58 - 'X' + 6, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + _X_X____, + X___X___, + X___X___, + ________, + ________, + // 58 0x59 - 'Y' + 6, + X___X___, + X___X___, + X___X___, + _X_X____, + _XXX____, + __X_____, + __X_____, + __X_____, + ________, + ________, + // 59 0x5A - 'Z' + 6, + XXXXX___, + ____X___, + ___X____, + __X_____, + __X_____, + _X______, + X_______, + XXXXX___, + ________, + ________, +}; + + +#if 0 +// 14 0x21 - '!' + 0, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, +#endif diff --git a/F3:F303/NitrogenFlooding/fonts.c b/F3:F303/NitrogenFlooding/fonts.c new file mode 100644 index 0000000..c8ab062 --- /dev/null +++ b/F3:F303/NitrogenFlooding/fonts.c @@ -0,0 +1,325 @@ +/* + * This file is part of the TETRIS project. + * Copyright 2019 Edward V. Emelianov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include +#include "fonts.h" + +/* Bash-script to generate the symbols + +#!/bin/bash + +function bits(){ + Ans="" + for x in $(seq 7 -1 0); do + B=$((1<<$x)) + if [ $(($1&$B)) -ne 0 ]; then Ans="${Ans}X" + else Ans="${Ans}_" + fi + done + echo $Ans +} + +for x in $(seq 0 255); do + printf "#define $(bits $x)\t0x%02x\n" $x +done + +*/ + +#define ________ 0x00 +#define _______X 0x01 +#define ______X_ 0x02 +#define ______XX 0x03 +#define _____X__ 0x04 +#define _____X_X 0x05 +#define _____XX_ 0x06 +#define _____XXX 0x07 +#define ____X___ 0x08 +#define ____X__X 0x09 +#define ____X_X_ 0x0a +#define ____X_XX 0x0b +#define ____XX__ 0x0c +#define ____XX_X 0x0d +#define ____XXX_ 0x0e +#define ____XXXX 0x0f +#define ___X____ 0x10 +#define ___X___X 0x11 +#define ___X__X_ 0x12 +#define ___X__XX 0x13 +#define ___X_X__ 0x14 +#define ___X_X_X 0x15 +#define ___X_XX_ 0x16 +#define ___X_XXX 0x17 +#define ___XX___ 0x18 +#define ___XX__X 0x19 +#define ___XX_X_ 0x1a +#define ___XX_XX 0x1b +#define ___XXX__ 0x1c +#define ___XXX_X 0x1d +#define ___XXXX_ 0x1e +#define ___XXXXX 0x1f +#define __X_____ 0x20 +#define __X____X 0x21 +#define __X___X_ 0x22 +#define __X___XX 0x23 +#define __X__X__ 0x24 +#define __X__X_X 0x25 +#define __X__XX_ 0x26 +#define __X__XXX 0x27 +#define __X_X___ 0x28 +#define __X_X__X 0x29 +#define __X_X_X_ 0x2a +#define __X_X_XX 0x2b +#define __X_XX__ 0x2c +#define __X_XX_X 0x2d +#define __X_XXX_ 0x2e +#define __X_XXXX 0x2f +#define __XX____ 0x30 +#define __XX___X 0x31 +#define __XX__X_ 0x32 +#define __XX__XX 0x33 +#define __XX_X__ 0x34 +#define __XX_X_X 0x35 +#define __XX_XX_ 0x36 +#define __XX_XXX 0x37 +#define __XXX___ 0x38 +#define __XXX__X 0x39 +#define __XXX_X_ 0x3a +#define __XXX_XX 0x3b +#define __XXXX__ 0x3c +#define __XXXX_X 0x3d +#define __XXXXX_ 0x3e +#define __XXXXXX 0x3f +#define _X______ 0x40 +#define _X_____X 0x41 +#define _X____X_ 0x42 +#define _X____XX 0x43 +#define _X___X__ 0x44 +#define _X___X_X 0x45 +#define _X___XX_ 0x46 +#define _X___XXX 0x47 +#define _X__X___ 0x48 +#define _X__X__X 0x49 +#define _X__X_X_ 0x4a +#define _X__X_XX 0x4b +#define _X__XX__ 0x4c +#define _X__XX_X 0x4d +#define _X__XXX_ 0x4e +#define _X__XXXX 0x4f +#define _X_X____ 0x50 +#define _X_X___X 0x51 +#define _X_X__X_ 0x52 +#define _X_X__XX 0x53 +#define _X_X_X__ 0x54 +#define _X_X_X_X 0x55 +#define _X_X_XX_ 0x56 +#define _X_X_XXX 0x57 +#define _X_XX___ 0x58 +#define _X_XX__X 0x59 +#define _X_XX_X_ 0x5a +#define _X_XX_XX 0x5b +#define _X_XXX__ 0x5c +#define _X_XXX_X 0x5d +#define _X_XXXX_ 0x5e +#define _X_XXXXX 0x5f +#define _XX_____ 0x60 +#define _XX____X 0x61 +#define _XX___X_ 0x62 +#define _XX___XX 0x63 +#define _XX__X__ 0x64 +#define _XX__X_X 0x65 +#define _XX__XX_ 0x66 +#define _XX__XXX 0x67 +#define _XX_X___ 0x68 +#define _XX_X__X 0x69 +#define _XX_X_X_ 0x6a +#define _XX_X_XX 0x6b +#define _XX_XX__ 0x6c +#define _XX_XX_X 0x6d +#define _XX_XXX_ 0x6e +#define _XX_XXXX 0x6f +#define _XXX____ 0x70 +#define _XXX___X 0x71 +#define _XXX__X_ 0x72 +#define _XXX__XX 0x73 +#define _XXX_X__ 0x74 +#define _XXX_X_X 0x75 +#define _XXX_XX_ 0x76 +#define _XXX_XXX 0x77 +#define _XXXX___ 0x78 +#define _XXXX__X 0x79 +#define _XXXX_X_ 0x7a +#define _XXXX_XX 0x7b +#define _XXXXX__ 0x7c +#define _XXXXX_X 0x7d +#define _XXXXXX_ 0x7e +#define _XXXXXXX 0x7f +#define X_______ 0x80 +#define X______X 0x81 +#define X_____X_ 0x82 +#define X_____XX 0x83 +#define X____X__ 0x84 +#define X____X_X 0x85 +#define X____XX_ 0x86 +#define X____XXX 0x87 +#define X___X___ 0x88 +#define X___X__X 0x89 +#define X___X_X_ 0x8a +#define X___X_XX 0x8b +#define X___XX__ 0x8c +#define X___XX_X 0x8d +#define X___XXX_ 0x8e +#define X___XXXX 0x8f +#define X__X____ 0x90 +#define X__X___X 0x91 +#define X__X__X_ 0x92 +#define X__X__XX 0x93 +#define X__X_X__ 0x94 +#define X__X_X_X 0x95 +#define X__X_XX_ 0x96 +#define X__X_XXX 0x97 +#define X__XX___ 0x98 +#define X__XX__X 0x99 +#define X__XX_X_ 0x9a +#define X__XX_XX 0x9b +#define X__XXX__ 0x9c +#define X__XXX_X 0x9d +#define X__XXXX_ 0x9e +#define X__XXXXX 0x9f +#define X_X_____ 0xa0 +#define X_X____X 0xa1 +#define X_X___X_ 0xa2 +#define X_X___XX 0xa3 +#define X_X__X__ 0xa4 +#define X_X__X_X 0xa5 +#define X_X__XX_ 0xa6 +#define X_X__XXX 0xa7 +#define X_X_X___ 0xa8 +#define X_X_X__X 0xa9 +#define X_X_X_X_ 0xaa +#define X_X_X_XX 0xab +#define X_X_XX__ 0xac +#define X_X_XX_X 0xad +#define X_X_XXX_ 0xae +#define X_X_XXXX 0xaf +#define X_XX____ 0xb0 +#define X_XX___X 0xb1 +#define X_XX__X_ 0xb2 +#define X_XX__XX 0xb3 +#define X_XX_X__ 0xb4 +#define X_XX_X_X 0xb5 +#define X_XX_XX_ 0xb6 +#define X_XX_XXX 0xb7 +#define X_XXX___ 0xb8 +#define X_XXX__X 0xb9 +#define X_XXX_X_ 0xba +#define X_XXX_XX 0xbb +#define X_XXXX__ 0xbc +#define X_XXXX_X 0xbd +#define X_XXXXX_ 0xbe +#define X_XXXXXX 0xbf +#define XX______ 0xc0 +#define XX_____X 0xc1 +#define XX____X_ 0xc2 +#define XX____XX 0xc3 +#define XX___X__ 0xc4 +#define XX___X_X 0xc5 +#define XX___XX_ 0xc6 +#define XX___XXX 0xc7 +#define XX__X___ 0xc8 +#define XX__X__X 0xc9 +#define XX__X_X_ 0xca +#define XX__X_XX 0xcb +#define XX__XX__ 0xcc +#define XX__XX_X 0xcd +#define XX__XXX_ 0xce +#define XX__XXXX 0xcf +#define XX_X____ 0xd0 +#define XX_X___X 0xd1 +#define XX_X__X_ 0xd2 +#define XX_X__XX 0xd3 +#define XX_X_X__ 0xd4 +#define XX_X_X_X 0xd5 +#define XX_X_XX_ 0xd6 +#define XX_X_XXX 0xd7 +#define XX_XX___ 0xd8 +#define XX_XX__X 0xd9 +#define XX_XX_X_ 0xda +#define XX_XX_XX 0xdb +#define XX_XXX__ 0xdc +#define XX_XXX_X 0xdd +#define XX_XXXX_ 0xde +#define XX_XXXXX 0xdf +#define XXX_____ 0xe0 +#define XXX____X 0xe1 +#define XXX___X_ 0xe2 +#define XXX___XX 0xe3 +#define XXX__X__ 0xe4 +#define XXX__X_X 0xe5 +#define XXX__XX_ 0xe6 +#define XXX__XXX 0xe7 +#define XXX_X___ 0xe8 +#define XXX_X__X 0xe9 +#define XXX_X_X_ 0xea +#define XXX_X_XX 0xeb +#define XXX_XX__ 0xec +#define XXX_XX_X 0xed +#define XXX_XXX_ 0xee +#define XXX_XXXX 0xef +#define XXXX____ 0xf0 +#define XXXX___X 0xf1 +#define XXXX__X_ 0xf2 +#define XXXX__XX 0xf3 +#define XXXX_X__ 0xf4 +#define XXXX_X_X 0xf5 +#define XXXX_XX_ 0xf6 +#define XXXX_XXX 0xf7 +#define XXXXX___ 0xf8 +#define XXXXX__X 0xf9 +#define XXXXX_X_ 0xfa +#define XXXXX_XX 0xfb +#define XXXXXX__ 0xfc +#define XXXXXX_X 0xfd +#define XXXXXXX_ 0xfe +#define XXXXXXXX 0xff + +// here are fonts themself +#include "font14.h" +#include "fontNumb8.h" + +static const afont FONTS[] = { + [FONT14] = {font14_table, font14_encoding, FONT14HEIGHT, FONT14BYTES, FONT14BASELINE}, + [FONTN8] = {fontNumb8_table, fontNumb8_encoding, FONTNUMB8HEIGHT, FONTNUMB8BYTES, FONTNUMB8BASELINE}, +}; + +const afont *curfont = &FONTS[FONT14]; + +/** + * @brief choose_font - font selector + * @param newfont - font to choose + * @return 0 if all OK + */ +int choose_font(font_t newfont){ + if(newfont >= FONT_T_MAX || newfont <= FONT_T_MIN) return 1; + curfont = &FONTS[newfont]; + return 0; +} + +const uint8_t *font_char(uint8_t Char){ + uint8_t idx = curfont->enctable[Char]; + if(!idx) return NULL; // no this character in font + return &(curfont->font[idx*(curfont->bytes+1)]); +} diff --git a/F3:F303/NitrogenFlooding/fonts.h b/F3:F303/NitrogenFlooding/fonts.h new file mode 100644 index 0000000..68f4c19 --- /dev/null +++ b/F3:F303/NitrogenFlooding/fonts.h @@ -0,0 +1,42 @@ +/* + * This file is part of the nitrogen project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +// type for font choosing +typedef enum{ + FONT_T_MIN = -1, // no fonts <= this + FONT14, // 16x16, font height near 14px + FONTN8, // numbers and 'A'..'Z', height 8px + FONT_T_MAX // no fonts >= this +} font_t; + +int choose_font(font_t newfont); +const uint8_t *font_char(uint8_t Char); + +typedef struct{ + const uint8_t *font; // font inself + const uint8_t *enctable; // font encoding table + uint8_t height; // full font matrix height + uint8_t bytes; // amount of bytes in font matrix + uint8_t baseline; // baseline position (coordinate from bottom line) +} afont; + +extern const afont *curfont; diff --git a/F3:F303/NitrogenFlooding/hardware.c b/F3:F303/NitrogenFlooding/hardware.c index 5e1a86c..e31aefa 100644 --- a/F3:F303/NitrogenFlooding/hardware.c +++ b/F3:F303/NitrogenFlooding/hardware.c @@ -136,7 +136,6 @@ void hw_setup(){ RCC->AHBENR |= RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN; gpio_setup(); i2c_setup(LOW_SPEED); - spi_setup(); pwm_setup(); #ifndef EBUG iwdg_setup(); diff --git a/F3:F303/NitrogenFlooding/ili9341.c b/F3:F303/NitrogenFlooding/ili9341.c index 33da10e..399cd99 100644 --- a/F3:F303/NitrogenFlooding/ili9341.c +++ b/F3:F303/NitrogenFlooding/ili9341.c @@ -24,9 +24,13 @@ #endif #include "usb.h" +#include // bzero + +// color buffer for DMA translations (2 lines) +uint16_t colorbuf[COLORBUFSZ]; + static const uint8_t initcmd[] = { ILI9341_SWRESET, 0xff, // reset and wait a lot - //0xEF, 3, 0x03, 0x80, 0x02, // WTF? ILI9341_POWCTLA, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, // default ILI9341_POWCTLB, 3, 0x00, 0xC1, 0x30, // PC/EQ for power saving ILI9341_DRVTCTLA1, 3, 0x85, 0x00, 0x78, // EQ timimg @@ -48,7 +52,7 @@ static const uint8_t initcmd[] = { 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, ILI9341_NEGGAMCOR, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, - ILI9341_SLPOUT, 0x8a, // Exit Sleep + ILI9341_SLPOUT, 0x8a, // Exit Sleep and wait 10ms ILI9341_NORON, 0x80, // Normal display mode ON ILI9341_DISPON, 0x80, // Display on 0x00 // End of list @@ -70,6 +74,8 @@ int ili9341_init(){ if(!ili9341_writereg(reg, ptr, N)) return 0; ptr += N; } + if(!ili9341_setcol(0, SCRNW-1)) return 0; + if(!ili9341_setrow(0, SCRNH-1)) return 0; return 1; } @@ -174,14 +180,47 @@ int ili9341_writecmd(uint8_t cmd){ return r; } -// write data -int ili9341_writedata(const uint8_t *data, uint32_t N){ +// read/write data over DMA +static int dmardwr(uint8_t *out, uint8_t *in, uint32_t N){ + if(!out || !N) return 0; + if(in) bzero(out, N); SCRN_Data(); SCRN_RST_set(0); + uint32_t r = 0; + do{ + if(!spi_write_dma((const uint8_t*)out, in, N)) break; + if(!spi_waitbsy()) break; + uint32_t T = Tms; + while(Tms - T < 100 && spi_status != SPI_READY); + if(spi_status != SPI_READY) break; + if(in){if(!spi_read_dma(&r)) break;} + else r = 1; + }while(0); + SCRN_Command(); + SCRN_RST_set(1); + return r; +} + +// write data by SPI over DMA (but blocking!) +// !!!! don't do anything with `data` until transmission complete !!!! +int ili9341_writedata(uint8_t *data, uint32_t N){ + return dmardwr(data, NULL, N); +} + +// blocking read data by DMA +int ili9341_readdata(uint8_t *data, uint32_t N){ + return dmardwr(data, data, N); +} + +int ili9341_readregdma(uint8_t reg, uint8_t *data, uint32_t N){ + SCRN_Command(); + SCRN_RST_set(0); int r = 0; do{ - if(!spi_write(data, N)) break; + if(!spi_write(®, 1)) break; if(!spi_waitbsy()) break; + SCRN_Data(); + if(!dmardwr(data, data, N)) break; r = 1; }while(0); SCRN_Command(); @@ -191,32 +230,14 @@ int ili9341_writedata(const uint8_t *data, uint32_t N){ static int fillcmd(uint16_t color, uint8_t cmd, int sz){ uint16_t rc = __builtin_bswap16(color); - //USB_sendstr("rc="); USB_sendstr(u2str(rc)); newline(); - SCRN_Command(); - SCRN_RST_set(0); - int r = 0; - if(!spi_write(&cmd, 1)) goto rtn; - if(!spi_waitbsy()) goto rtn; - r = 1; - SCRN_Data(); - uint16_t black = 0; - for(int i = 0; i < sz; ++i){ - IWDG->KR = IWDG_REFRESH; - if(i%80 == 0){ - if(!spi_write((uint8_t*)&black, 2)){ - r = 0; - break; - } - } else if(!spi_write((uint8_t*)&rc, 2)){ - r = 0; - break; - } + if(!ili9341_writecmd(cmd)) return 0; + for(int i = 0; i < COLORBUFSZ; ++i) colorbuf[i] = rc; // prepare buffer to write + while(sz){ + int portion = (sz > COLORBUFSZ) ? COLORBUFSZ : sz; + if(!ili9341_writedata((uint8_t*)colorbuf, portion * 2)) return 0; // multiply by 2: we are writing uint16_t! + sz -= portion; } - if(!spi_waitbsy()) r = 0; -rtn: - SCRN_Command(); - SCRN_RST_set(1); - return r; + return 1; } // fill start diff --git a/F3:F303/NitrogenFlooding/ili9341.h b/F3:F303/NitrogenFlooding/ili9341.h index 2d9e418..ae5627e 100644 --- a/F3:F303/NitrogenFlooding/ili9341.h +++ b/F3:F303/NitrogenFlooding/ili9341.h @@ -163,7 +163,14 @@ #define SCRNSZMIN 240 #define SCRNSZ (SCRNSZMAX*SCRNSZMIN) -#define DEFMADCTL (ILI9341_MADCTL_MY | ILI9341_MADCTL_RGB) +// Different orientations +// default orientation: w=320, h=240, zero in upper left corner, connector is from the left +#define DEFMADCTL (ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_RGB) +#define SCRNW SCRNSZMAX +#define SCRNH SCRNSZMIN + +#define COLORBUFSZ (2*SCRNW) +extern uint16_t colorbuf[]; int ili9341_init(); int ili9341_readreg(uint8_t reg, uint8_t *data, uint32_t N); @@ -171,7 +178,10 @@ int ili9341_writereg(uint8_t reg, const uint8_t *data, uint32_t N); int ili9341_writereg16(uint8_t reg, uint16_t data); int ili9341_writereg32(uint8_t reg, uint16_t data1, uint16_t data2); int ili9341_writecmd(uint8_t cmd); -int ili9341_writedata(const uint8_t *data, uint32_t N); +int ili9341_writedata(uint8_t *data, uint32_t N); +int ili9341_readdata(uint8_t *data, uint32_t N); +int ili9341_readregdma(uint8_t reg, uint8_t *data, uint32_t N); + int ili9341_fill(uint16_t color); int ili9341_filln(uint16_t color); int ili9341_fillp(uint16_t color, int sz); diff --git a/F3:F303/NitrogenFlooding/main.c b/F3:F303/NitrogenFlooding/main.c index 4638c7a..39b5504 100644 --- a/F3:F303/NitrogenFlooding/main.c +++ b/F3:F303/NitrogenFlooding/main.c @@ -24,6 +24,7 @@ #include "hardware.h" #include "i2c.h" #include "proto.h" +#include "screen.h" #include "strfunc.h" #include "usb.h" @@ -35,6 +36,8 @@ void sys_tick_handler(void){ ++Tms; } + +// SPI setup done in `screen.h` int main(void){ char inbuff[MAXSTRLEN+1]; if(StartHSE()){ @@ -112,6 +115,7 @@ int main(void){ const char *ans = cmd_parser(inbuff); if(ans) USB_sendstr(ans); } + process_screen(); //process_keys(); } } diff --git a/F3:F303/NitrogenFlooding/nitrogen.bin b/F3:F303/NitrogenFlooding/nitrogen.bin index 83130e5edb14c4907220ecfd0681b9ff31243a61..32c58c2e330b300056477fd2bede6526f5dbc792 100755 GIT binary patch delta 15260 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 delta 6174 zcmcgwd301&n!oo|B`J~u3JBRDFA35`7N{(S0)!L+ipq{OV{?${sVr)-NtB3jX)B02 z89>MOiV6(^?J|&-o`jGQJd{BjTN;tB(6Ku#j?tkFBFn`N)T^pgz4_gjka3&Sf6e5a zU%q?4`|a<$_uW_C8??8Dy2)-L@4THDwgFqe2lBl?AtNBzf=-G1q0aYh{GGYm@bp+> z@Bn{D@c(Gt{r~HD-?Z=f8!=q+_GjpqlsefOoi9(~y9c6Wi9b9b+a><0U*fN5^R<{q zwQ|pv;>)K~>@oJg_K{AfMC8j0*-QG#P;1b{$_84mI-(^QI3JMsN{u&H<9RMin+=}) z{GZwgX_`SC?5e(WuEYy9k&(k{uR<+bYw12I-Q2ie(OU>#AJW^2 z`9UwucvjI_XvWCvI_Ym|=0?KzvnvtFbQc>DIn6XLWInveA@TO0sL7@vb3~@oOtvaA z%`NdQ8nZSi+jS_+EQoE?ILn4OR&XBGICln#EMyA6c|hYhhGcTVacP_)aL)Ek#oVdQ zr(=G)FRMH%Bi;Tv61pvP{II!kOW)rb&5a0|#YByX?HUkCyw#Nots+e;F32oVw!-Z)v8+k=LUn!fOVIx!=1}iLxX|E$`H4 zWYh~0)%SQ<&|0>~FoPDhpEG$jNh~in0wh2qvJ;uc84*+B=Pd_r(cl_iC-GPJ_xfqqj_|3**wRx74u5! zJBqnZDrRpRbKQlNDK$T@DXg66EUbLhnOCvgS;b9v{U`o6&&#UGD_d2gyS{gx?uI;% z=4UylIi{8U#<|*g*;&a4y1+@MSVC;XLTo9esD3FsF=~4u<=L8;PBq&V&j_eZ(&oXi zjJf3K#(o!SnmSbLpxRi-Hn2p~u0)e)H(^ OFh8b5$+o6y8tsxmjm@3G37Cpx4CF{`RwsuTvH0AM{-qjF$WlVORa3@>|6+=g4 zNn~l1gJ#6kkE^HrS}0ofTr}7yKjs;O#Ofe(9<6HWNH0q-Pjqc;rM>B{7uu3si<9ay z{bwd3s866n`CFkBjQ^;O-wZMH*vatwwl;k(#FmcD9{=q$`(abF&$f-7HexlrtR|8T zB^#UX7PESwNpL_#O6JO^T5a!C@us>ePHLZ3qD=c0BcW*rtFc!|d-Zrb<=KOI*UTUmOu#Y}tO zC{Fgi8PsR|s&s_z>y5gDU+YqGo0{gsHwRG6}th(eJyC z_0dU+XcKgR=&p}Xo;+FK@nmZptB#!@^(ZVQHX&szM6Y{=_guT#{#rHV34UU}=%u__ zVVB2EmEIhbtNnr8^WX@%yA-x4cB<5%u%_4qYwobzns;796-E&$4LL2Md>K|Qc-Ox( z%yUw{2)whf5vMS3Y^J+Vu^f)Xz9Ti;t97masOW=)-&Bbup_9tr^ocw~(G$uOtI$bJ zR7Qy=&vD+sGwo@1)pxhr)0RD7ZX{;jMbS2VgX;U8+T0ew-4QENdKB!7 zoNHcC%de6)7hgJkYjnf?rwe^VQy`tsqZ38ZM0Xg=OdWW>HK-;zfi4*qlTZT zc%CK?;d_Qcy*^a*s{WUXv(r@HKfg;l#rO`4H((q+Q938akG;ECTYp&a?9`r{DXYF| zor9AsjHh5Mm5y`K{Bch4dKJN-0t<7lNSpWHi2TLBvrt?jZDH~8squTtl3XM$oi{z0 zb2J4O2r#@7+%#|+ARW3;+Z5gaCb4lDN88XLs_1o4mT|(N(6{Rc7RytNyt|}Sh zT*Yz|5~n^Mp!`TM?7N8zit5uTH5H#J2loIQoOo&nf4S?5a}$cWuDx13J@#b6RQI{V zs?Vx~eMiE2bD>uN_*AQ!!eavIyVNM9gQr3D|Sv70TNJvmy1{09Fa%zf~#U8<+vk8v)fv;q7U7JKm*h zk=*+z%p{=|ANJ-!U~6FK6^c6(8AppUXdQ1;<)c>^P?YQ zMEPUG>tABMA&>!`2f)*5I_JS#8At{1K4|Kqg?-hx)i3OwQg9eA$LpE${J_S(cnJMN zAnYp%|DunWB%AwcAESq03xoTuXkZ%ziBRe=+Ql&z6Cm08 zbF!WAXp~YPn2mtX`OTP1m=E~H0d2KW-gTHgk@RMvi0PK2_e zJRc$}p4H{V&;T?6&43A6h+Wfq)wYT9=;44yKu@OybXFO>DHFa5`S{(6xFCz9Oi1eF zAybFm9`?O}rmo^@uIl>>UfQ;WUm>>r^`NcIE!*k#L06~XN)yrklPT7Y2z!cs?76lZ zO+`s(UuYxQNuM?!5GUUs2AbN;_Vl3;4`?@xg*UI|lFZ9p%?DIpJGRhOoQYP?S}qZ* zM>w}4i661)){IsctG->|G1~kCqZ|Jhqn3_}i5pvWIh2j*+1?gmr+bYEanXS3FqOq6 z)QrQLZdZN(1dC!WLi(mpgmkS>ox*0O#>M4+M;KR56sJgK_oimb3xejh8Fq_ZpRW2w z1_y2OVVg-RYfa70NDW$1j~RAy8%n!X_5C$)OVBdp{5VrnCrDj>Hc`&bnB%v!<=L(H zV)-1!ddz=ISVX#0(ZjjQ*2u|A8`0ZMQ{sC}9V5$jw;JsUjVtV5Kx2lcA>(Np9E3Ni zzdo?S9*NPc0U`^o$WR>PLjOfH<-QzZFm#N7#7dR$JeBpzDbiczEG)}o>r@&2_K=!p zm+)RzeU=cjq%D!wh1fG`h0@PL?A^4<74t$wzND4R>Jgh-Z0OfvIA%)H`N3yuv>VTo zNy5~^KpG6u0@ZgYWX!(NrQJrspA``4slNRzH$Bz8)h`^<0^u?Wa{a?{&Dx6K2a(QT z2h}fBr^NIaI*udxnE?YHtihv4I$LlPGz_PENZWsU`{FizmZUYj$_o8gn8@-z|ax)l?7~vV_>otS4F~ShQq!k0W(xq1zQ76+&04CiNNX- zZ8a+_0wA5Q;Mh6{7&=tn=%KJANX^y4BAtiI*`|z%qpAazHVbyk6gZ6^VE>VkH*(>( zSUz?m!z~T?+4@O#_uSy@w5N(?du*q)3$ae8{C&Up)_dPe@$qU7(tVim?%+FpNtG#Z zwK-JpBIYh{Qh9PkawQIJ{$xlT2JX-jMQJqBy=a{IFHRoyh{}09VF{gmpJKG z4|2IHG!rsKp^N!_Bz-L>^PW|VGG!fo2FDvXqGR#Mk0Q@rU;vOYccIu$pr@?;{@YGb zYjjCW*@+b~4$DEj`iraj7d}+ge`v{x>IqJozT7F*C%KBbO-gcFj-WH~z9Cj(dj$Q- zj5&_<41C5D9>CYK)pHpyAF){UL6QqG}75oYttk{fB3xZW-3$}QXO>W=Q>_SLcwZpWr4T$2(a|PKvvBL58)Pr)w)D{@CWq=<8Dw%{LH039?( zR!o%+2|q7I*rU_Nz%PE!sGDwyQ+-Q=`Hdv&YS$fh@jZGRW?#{rhP9s0Xb^DksIZjM;h)~C$GI%uB&dSW;@sYiS;%d zie6X0V$fVJJGDNpbjI{4Gv$UAYwlV5Py=+y@bZiw=NDLioL^`W=A^;`_T~E1W6j7d z8*lw#SGp90+i+(^Oic%ZKX0ssI2 diff --git a/F3:F303/NitrogenFlooding/nitrogen.files b/F3:F303/NitrogenFlooding/nitrogen.files index a6753f2..ed85dc1 100644 --- a/F3:F303/NitrogenFlooding/nitrogen.files +++ b/F3:F303/NitrogenFlooding/nitrogen.files @@ -10,6 +10,10 @@ commonproto.c commonproto.h flash.c flash.h +font14.h +fontNumb8.h +fonts.c +fonts.h hardware.c hardware.h hashgen/hashgen.c @@ -27,6 +31,8 @@ proto.c proto.h ringbuffer.c ringbuffer.h +screen.c +screen.h spi.c spi.h steppers.c diff --git a/F3:F303/NitrogenFlooding/proto.c b/F3:F303/NitrogenFlooding/proto.c index 1dc65c4..add0765 100644 --- a/F3:F303/NitrogenFlooding/proto.c +++ b/F3:F303/NitrogenFlooding/proto.c @@ -22,6 +22,7 @@ #include "i2c.h" #include "proto.h" #include "ili9341.h" +#include "screen.h" #include "strfunc.h" #include "version.inc" @@ -62,7 +63,7 @@ static void sendkeyu(const char *cmd, int parno, uint32_t u){ // `sendkey` for uint32_t out in hex static void sendkeyuhex(const char *cmd, int parno, uint32_t u){ USB_sendstr(cmd); - if(parno > -1) USB_sendstr(u2str((uint32_t)parno)); + if(parno > -1) USB_sendstr(uhex2str((uint32_t)parno)); USB_putbyte('='); USB_sendstr(uhex2str(u)); newline(); } @@ -237,6 +238,14 @@ static int scrnrdwr4(const char *cmd, int parno, const char *c, int32_t i){ sendkeyuhex(cmd, parno, i); return RET_GOOD; } +static int scrnrdn(const char *cmd, int parno, const char *c, int32_t i){ + if(parno < 0 || parno > 255) return RET_WRONGPARNO; + if(!c || i < 1 || i > COLORBUFSZ*2) return RET_WRONGARG; + if(!ili9341_readregdma(parno, (uint8_t*)colorbuf, i)) return RET_BAD; + sendkey(cmd, parno, i); + hexdump(USB_sendstr, (uint8_t*)colorbuf, i); + return RET_GOOD; +} static int scrncmd(const char _U_ *cmd, int parno, const char _U_ *c, int32_t _U_ i){ if(parno < 0 || parno > 255) return RET_WRONGPARNO; if(!ili9341_writecmd((uint8_t)parno)) return RET_BAD; @@ -266,30 +275,30 @@ static int scrninit(const char _U_ *cmd, int _U_ parno, const char _U_ *c, int32 static int scrnfill(const char *cmd, int parno, const char *c, int32_t i){ if(parno < 0) parno = RGB(0xf, 0x1f, 0xf); if(parno > 0xffff) return RET_WRONGPARNO; - if(!c){if(!ili9341_fill((uint16_t)parno)) return RET_BAD; + if(!c){if(!(i=ili9341_fill((uint16_t)parno))) return RET_BAD; }else{ if(i < 1) return RET_WRONGARG; if(!ili9341_fillp((uint16_t)parno, -i)) return RET_BAD; } - sendkeyuhex(cmd, -1, i); + sendkeyu(cmd, parno, i); return RET_GOOD; } -static int scrnfilln(const char *cmd, int _U_ parno, const char *c, int32_t i){ +static int scrnfilln(const char *cmd, int parno, const char *c, int32_t i){ if(parno < 0) parno = RGB(0xf, 0x1f, 0xf); if(parno > 0xffff) return RET_WRONGPARNO; - if(!c){if(!ili9341_filln((uint16_t)parno)) return RET_BAD; + if(!c){if(!(i=ili9341_filln((uint16_t)parno))) return RET_BAD; }else{ if(i < 1) return RET_WRONGARG; if(!ili9341_fillp((uint16_t)parno, i)) return RET_BAD; } - sendkeyuhex(cmd, -1, i); + sendkeyu(cmd, parno, i); return RET_GOOD; } -static int smadctl(const char *cmd, int _U_ parno, const char *c, int32_t i){ +static int smadctl(const char *cmd, int parno, const char *c, int32_t i){ if(!c) i = 0; if(i < 0 || i > 255) return RET_WRONGARG; if(!ili9341_writereg(ILI9341_MADCTL, (uint8_t*)&i, 1)) return RET_BAD; - sendkeyuhex(cmd, -1, i); + sendkeyuhex(cmd, parno, i); return RET_GOOD; } static int scolrow(int col, const char *cmd, int parno, const char *c, int32_t i){ @@ -306,6 +315,66 @@ static int scol(const char *cmd, int parno, const char *c, int32_t i){ static int srow(const char *cmd, int parno, const char *c, int32_t i){ return scolrow(0, cmd, parno, c, i); } +static int sread(const char *cmd, int parno, const char _U_ *c, int32_t _U_ i){ + if(parno < 0 || parno > COLORBUFSZ*2) return RET_WRONGARG; + if(!(parno = ili9341_readdata((uint8_t*)colorbuf, parno))) return RET_BAD; + USB_sendstr(cmd); USB_sendstr(u2str(parno)); newline(); + hexdump(USB_sendstr, (uint8_t*)colorbuf, parno); + return RET_GOOD; +} +static int scls(const char *cmd, int parno, const char *c, int32_t i){ + // fg=bg, default: fg=0xffff, bg=0 + if(parno < 0 || parno > 0xffff) parno = 0xffff; + if(!c) i = 0; + setBGcolor(i); + setFGcolor(parno); + ClearScreen(); + sendkeyuhex(cmd, parno, i); + return RET_GOOD; +} +static int scolor(const char *cmd, int parno, const char *c, int32_t i){ + // fg=bg, default: fg=0xffff, bg=0 + if(parno < 0 || parno > 0xffff) parno = 0xffff; + if(!c) i = 0; + setBGcolor(i); + setFGcolor(parno); + sendkeyuhex(cmd, parno, i); + return RET_GOOD; +} +static int sputstr(const char _U_ *cmd, int parno, const char *c, int32_t _U_ i){ + if(!c) return RET_WRONGARG; + if(parno < 0) parno = 0; + if(parno > SCRNH-1) parno = SCRNH-1; + PutStringAt(0, parno, c); + UpdateScreen(parno - 14, parno+2); + USB_sendstr("put string: '"); USB_sendstr(c); USB_sendstr("'\n"); + return RET_GOOD; +} +static int sstate(const char _U_ *cmd, int _U_ parno, const char _U_ *c, int32_t _U_ i){ + const char *s = "unknown"; + switch(getScreenState()){ + case SCREEN_INIT: + s = "init"; + break; + case SCREEN_W4INIT: + s = "wait for init"; + break; + case SCREEN_RELAX: + s = "relax"; + break; + case SCREEN_CONVBUF: + s = "convert buffer"; + break; + case SCREEN_UPDATENXT: + s = "update next"; + break; + case SCREEN_ACTIVE: + s = "transmission in progress"; + break; + } + USB_sendstr("ScreenState="); USB_sendstr(s); newline(); + return RET_GOOD; +} typedef struct{ int (*fn)(const char*, int, const char*, int32_t); @@ -334,15 +403,21 @@ commands cmdlist[] = { {scrnrst, "Srst", "reset (1/0)"}, {scrnrdwr, "Sreg", "read/write 8-bit register"}, {scrnrdwr4, "Sregx", "read/write 32-bit register"}, + {scrnrdn, "Sregn", "read from register x =n bytes"}, {scrncmd, "Scmd", "write 8bit command"}, {scrndata, "Sdat", "write 8bit data"}, - {scrndata4, "Sdatx", "write x bytes of data"}, + {scrndata4, "Sdatn", "write x bytes of =data"}, + {sread, "Sread", "read "}, {scrninit, "Sini", "init screen"}, {scrnfill, "Sfill", "fill screen with color (=npix)"}, {scrnfilln, "Sfilln", "fill screen (next) with color (=npix)"}, {smadctl, "Smad", "change MADCTL"}, {scol, "Scol", "set column limits (low=high)"}, {srow, "Srow", "set row limits (low=high)"}, + {scls, "Scls", "clear screen fg=bg"}, + {scolor, "Scolor", "seg color fg=bg"}, + {sputstr, "Sstr", "put string y=string"}, + {sstate, "Sstate", "current screen state"}, {NULL, "ADC commands", NULL}, {adcval, "ADC", "get ADCx value (without x - for all)"}, {adcvoltage, "ADCv", "get ADCx voltage (without x - for all)"}, diff --git a/F3:F303/NitrogenFlooding/screen.c b/F3:F303/NitrogenFlooding/screen.c new file mode 100644 index 0000000..451e5fe --- /dev/null +++ b/F3:F303/NitrogenFlooding/screen.c @@ -0,0 +1,304 @@ +/* + * This file is part of the nitrogen project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include // memset, memcpy +#include +#include "fonts.h" +#include "hardware.h" +#include "screen.h" +#include "spi.h" // spi_status +#include "ili9341.h" +#include "usb.h" +#ifdef EBUG +#include "strfunc.h" +#endif + +#define SWAPINT(a,b) do{register int r = a; a = b; b = r;}while(0) + +// sprites 8x8 bytes with 8bit foreground and 8bit background + +// X coordinate - from left to right! +// Y coordinate - from top to bottom! +// (0,0) is top left corner + + +// full screen buffer size in bytes/words (depending on sprite size) +// !!! If sprite width != 8, change all code !!! +#define SCREENBUF_SZ (SCRNSZ/SPRITEWD) +// amount of sprites by both axes +#define SCRNSPRITEW (SCRNW/SPRITEWD) +#define SCRNSPRITEH (SCRNH/SPRITEHT) +#define SPRITE_SZ (SCRNSPRITEW * SCRNSPRITEH) + +// pixel buffer +static uint8_t screenbuf[SCREENBUF_SZ]; +// color buffers +static uint16_t foreground[SPRITE_SZ]; +static uint16_t background[SPRITE_SZ]; +// borders of string numbers to update screen (including!) +static int uy0, uy1; +// index of pixel in given updating block +static int updidx = 0; // ==-1 to initialize update +// next data portion size (in bytes!), total amount of bytes in update buffer +static int portionsz = 0, updbuffsz; + +static uint16_t fgColor = 0xff, bgColor = 0; // foreground and background colors +void setBGcolor(uint16_t c){bgColor = c;} +void setFGcolor(uint16_t c){fgColor = c;} + +static screen_state ScrnState = SCREEN_INIT; +screen_state getScreenState(){return ScrnState;} + +/** + * @brief UpdateScreen - request to screen updating from lines y0 to y1 (including) + * @param y0, y1 - first and last line of field to update + */ +void UpdateScreen(int y0, int y1){ + if(y0 > y1) SWAPINT(y0, y1); + if(y0 < 0) y0 = 0; + if(y1 > SCRNH) y1 = SCRNH - 1; + //USB_sendstr("y0="); USB_sendstr(i2str(y0)); newline(); + //USB_sendstr("y1="); USB_sendstr(i2str(y1)); newline(); + uy0 = y0; uy1 = y1; + updidx = -1; + updbuffsz = SCRNW * (1 + y1 - y0); +} + +/** + * @brief FillScreen - fill screen buffer with current bgColor + */ +void ClearScreen(){ + memset(screenbuf, 0, SCREENBUF_SZ); + int i; + for(i = 0; i < SPRITE_SZ; ++i){ + foreground[i] = fgColor; + background[i] = bgColor; + } + USB_sendstr("total spsz="); USB_sendstr(i2str(i)); newline(); + foreground[SPRITE_SZ-5] = 0x1234; + foreground[SPRITE_SZ-21] = 0x4321; + UpdateScreen(0, SCRNH-1); +} + +/** + * @brief DrawPix - set or clear pixel + * @param X, Y - pixel coordinates (could be outside of screen) + * @param pix - 1 - foreground, 0 - background + */ +void DrawPix(int X, int Y, uint8_t pix){ + if(X < 0 || X > SCRNW-1 || Y < 0 || Y > SCRNH-1) return; // outside of screen + // now calculate coordinate of pixel + int16_t spritex = X/SPRITEWD, spriteidx = spritex + SCRNSPRITEW * Y / SPRITEHT; + uint8_t *ptr = &screenbuf[Y*SCRNSPRITEW + spritex]; // pointer to byte with 8 pixels + if(pix) *ptr |= 1 << (7 - (X%8)); + else *ptr &= ~(1 << (7 - (X%8))); + foreground[spriteidx] = fgColor; + background[spriteidx] = bgColor; +} + +/** + * @brief invertSpriteColor - change bg-fg colors in given rectangle + * @param xmin, xmax, ymin, ymax - rectangle coordinates + */ +void invertSpriteColor(int xmin, int xmax, int ymin, int ymax){ + if(xmin < 0) xmin = 0; + if(xmax > SCRNW-1) xmax = SCRNW-1; + if(ymin < 0) ymin = 0; + if(ymax > SCRNH-1) ymax = SCRNH-1; + if(xmin > xmax) SWAPINT(xmin, xmax); + if(ymin > ymax) SWAPINT(ymin, ymax); + // convert to sprite coordinates + xmin /= SPRITEWD; xmax = (xmax + SPRITEWD - 1) / SPRITEWD; + ymin /= SPRITEHT; ymax = (ymax + SPRITEHT - 1) / SPRITEHT; + for(int y = ymin; y <= ymax; ++y){ + int idx = y * SCRNSPRITEW + xmin; + uint16_t *f = foreground + idx, *b = background + idx; + for(int x = xmin; x <= xmax; ++x, ++f, ++b){ + register uint16_t r = *f; + *f = *b; *b = r; + } + } +} + +// TODO in case of low speed: draw at once full line? +/** + * @brief DrawCharAt - draws character @ position X,Y (this point is left baseline corner of char!) + * character will be drawn with current fg and bg colors + * @param X, Y - started point + * @param Char - char to draw + * @return char width + */ +uint8_t DrawCharAt(int X, int Y, uint8_t Char){ + const uint8_t *curchar = font_char(Char); + if(!curchar) return 0; + // now change Y coordinate to left upper corner of font + Y += curfont->baseline - curfont->height + 1; + // height and width of letter in pixels + uint8_t h = curfont->height, w = *curchar++; // now curchar is pointer to bits array + uint8_t lw = curfont->bytes / h; // width of letter in bytes + for(uint8_t row = 0; row < h; ++row){ + int Y1 = Y + row; + for(uint8_t col = 0; col < w; ++col){ + register uint8_t pix = curchar[row*lw + (col/8)] & (1 << (7 - (col%8))); + DrawPix(X + col, Y1, pix); + } + } + return w; +} + +/** + * @brief PutStringAt - draw text string @ screen + * @param X, Y - base coordinates + * @param str - string to draw + * @return - X-coordinate of last pixel + */ +int PutStringAt(int X, int Y, const char *str){ + if(!str) return 0; + while(*str){ + X += DrawCharAt(X, Y, (uint8_t)*str++); + } + return X; +} + +/** + * @brief CenterStringAt - draw string @ center line + * @param Y - y coordinate + * @param str - string + * @return - text width in pixels + */ +int CenterStringAt(int Y, const char *str){ + int l = strpixlen(str); + return PutStringAt((SCRNW - l)/2, Y, str); +} + +// full string length in pixels +int strpixlen(const char *str){ + int l = 0; + while(*str){ + const uint8_t *c = font_char(*str++); + if(c) l += *c; + } + return l; +} + +// convert buffer to update (return 0 if all sent) +static int convbuf(){ +// DBG("convert buffer"); + int rest = updbuffsz - updidx; +/* USB_sendstr("updbuffsz="); USB_sendstr(i2str(updbuffsz)); + USB_sendstr("\nupdidx="); USB_sendstr(i2str(updidx)); + USB_sendstr("\nrest="); USB_sendstr(i2str(rest)); newline();*/ + if(rest < 1) return 0; + if(rest > COLORBUFSZ) rest = COLORBUFSZ; + portionsz = rest; +// USB_sendstr("portionsz="); USB_sendstr(i2str(portionsz)); newline(); + int Y = uy0 + updidx / SCRNW; // starting Y of updating string + uint16_t *o = colorbuf; // output color data + uint8_t *i = screenbuf + (Y*SCRNSPRITEW); // starting portion of pixel info + while(rest > 0){ + int spidx = (Y/SPRITEHT)*SCRNSPRITEW; // index in color array + uint16_t *fg = foreground + spidx, *bg = background + spidx; + for(int X = 0; X < SCRNSPRITEW; ++X, ++fg, ++bg, ++i){ + // prepare colors for SPI transfer + uint16_t f = __builtin_bswap16(*fg++), b = __builtin_bswap16(*bg++); + uint8_t pix = *i; + if(Y==239){ + USB_sendstr("X="); USB_sendstr(i2str(X)); newline(); + USB_sendstr("f="); USB_sendstr(uhex2str(f)); newline();} + for(int idx = 0; idx < SPRITEWD; ++idx){ // now check bits in pixels mask + *o++ = (pix & 0x80) ? f : b; + pix <<= 1; + ++updidx; --rest; + } + } + ++Y; + } + return 1; +} + +// check SPI timeout +static uint32_t Tscr_last = 0; +static int chk_tmout(){ + if(Tms - Tscr_last > SCRN_SPI_TIMEOUT){ + ScrnState = SCREEN_INIT; + UpdateScreen(0, SCRNH-1); + return 1; + } + return 0; +} +/** + * @brief process_screen - screen state machine processing + */ +void process_screen(){ + switch(ScrnState){ + case SCREEN_INIT: // try to init SPI and screen + DBG("SCREEN_INIT"); + spi_setup(); + if(ili9341_init()) ScrnState = SCREEN_RELAX; + else{ + Tscr_last = Tms; + ScrnState = SCREEN_W4INIT; + } + break; + case SCREEN_W4INIT: + if(Tms - Tscr_last > SCRN_W4INI_TIMEOUT) ScrnState = SCREEN_INIT; + break; + case SCREEN_RELAX: // check need of updating + if(updidx > -1) return; + DBG("Need to update"); + if(!ili9341_setcol(0, SCRNW-1)) return; + if(!ili9341_setrow(uy0, uy1)) return; + if(!ili9341_writecmd(ILI9341_RAMWR)) return; + updidx = 0; + Tscr_last = Tms; + ScrnState = SCREEN_ACTIVE; // now we are ready to update screen + // fallthrough + case SCREEN_ACTIVE: // SPI transmission active + if(chk_tmout()){ + DBG("timeout"); + return; + } + if(spi_status != SPI_READY){ + DBG("SPI not ready"); + return; + } + // convert & update next field + ScrnState = SCREEN_CONVBUF; + // fallthrough + case SCREEN_CONVBUF: // convert buffer for sending + if(!convbuf()){ + ScrnState = SCREEN_RELAX; + return; + } + Tscr_last = Tms; // for DMA writing timeout + ScrnState = SCREEN_UPDATENXT; + // fallthrough + case SCREEN_UPDATENXT: // send next data portion + if(chk_tmout()){ + DBG("timeout"); + return; + } + // portionsz in pixels (uint16_t), sending size in bytes! + if(!ili9341_writedata((uint8_t*)colorbuf, portionsz * 2)) return; + Tscr_last = Tms; // wait DMA writing timeout + ScrnState = SCREEN_ACTIVE; + break; + default: + break; + } +} diff --git a/F3:F303/NitrogenFlooding/screen.h b/F3:F303/NitrogenFlooding/screen.h new file mode 100644 index 0000000..0095847 --- /dev/null +++ b/F3:F303/NitrogenFlooding/screen.h @@ -0,0 +1,55 @@ +/* + * This file is part of the nitrogen project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +typedef enum{ // screen states + SCREEN_INIT // init stage + ,SCREEN_W4INIT // wait after last unsuccessfull update + ,SCREEN_RELAX // nothing to do (screen is off) + ,SCREEN_CONVBUF // convert next buffer portion + ,SCREEN_UPDATENXT // update next block + ,SCREEN_ACTIVE // transmission active - wait for SPI transfer ends + +} screen_state; + +// timeout (ms) in case of SPI error - 100ms +#define SCRN_SPI_TIMEOUT (100) +// wait if failed on init +#define SCRN_W4INI_TIMEOUT (1000) + +// sprite width and height in pixels +#define SPRITEWD (8) +#define SPRITEHT (8) + +screen_state getScreenState(); +void ClearScreen(); +void UpdateScreen(int y0, int y1); +void setBGcolor(uint16_t c); +void setFGcolor(uint16_t c); +void invertSpriteColor(int xmin, int xmax, int ymin, int ymax); +void DrawPix(int X, int Y, uint8_t pix); +uint8_t DrawCharAt(int X, int Y, uint8_t Char); +int PutStringAt(int X, int Y, const char *str); +int CenterStringAt(int Y, const char *str); +int strpixlen(const char *str); +uint8_t *getScreenBuf(); +void process_screen(); + diff --git a/F3:F303/NitrogenFlooding/spi.c b/F3:F303/NitrogenFlooding/spi.c index 3effbb3..045b243 100644 --- a/F3:F303/NitrogenFlooding/spi.c +++ b/F3:F303/NitrogenFlooding/spi.c @@ -30,18 +30,35 @@ spiStatus spi_status = SPI_NOTREADY; volatile uint32_t wctr; #define WAITX(x) do{wctr = 0; while((x) && (++wctr < 360000)) IWDG->KR = IWDG_REFRESH; if(wctr==360000){ DBG("timeout"); return 0;}}while(0) +// SPI DMA Rx buffer (set by spi_write_dma call) +static uint8_t *rxbufptr = NULL; +static uint32_t rxbuflen = 0; + // init SPI2 to work with and without DMA // ILI9341: SCL 0->1; CS=0; command - DC=0, data - DC=1; 1 dummy clock pulse before 24/32 bit data read // Channel 4 - SPI2 Rx // Channel 5 - SPI2 Tx void spi_setup(){ + SPI2->CR1 = 0; // clear EN + //RCC->APB1RSTR = RCC_APB1RSTR_SPI2RST; // reset SPI RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; + RCC->AHBENR |= RCC_AHBENR_DMA1EN; // Baudrate = 0b011 - fpclk/16 = 2MHz; software slave management (without hardware NSS pin) - SPI2->CR1 = /*SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE |*/ SPI_CR1_MSTR | SPI_CR1_BR_0 | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI; + SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_0 | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI; // 8bit; RXNE generates after 8bit of data in FIFO - SPI2->CR2 = SPI_CR2_FRXTH | SPI_CR2_DS_2|SPI_CR2_DS_1|SPI_CR2_DS_0 /*| SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN*/; + SPI2->CR2 = SPI_CR2_FRXTH | SPI_CR2_DS_2|SPI_CR2_DS_1|SPI_CR2_DS_0 | SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN; + // setup SPI2 DMA + // Tx + DMA1_Channel5->CPAR = (uint32_t)&(SPI2->DR); // hardware + DMA1_Channel5->CCR = DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TEIE; // memory increment, mem->hw, error interrupt + // Rx + DMA1_Channel4->CPAR = (uint32_t)&(SPI2->DR); + DMA1_Channel4->CCR = DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_TEIE; // mem inc, hw->mem, Rx complete and error interrupt + NVIC_EnableIRQ(DMA1_Channel4_IRQn); // enable Rx interrupt + NVIC_EnableIRQ(DMA1_Channel5_IRQn); // enable Tx interrupt spi_status = SPI_READY; SPI2->CR1 |= SPI_CR1_SPE; + DBG("SPI works"); } int spi_waitbsy(){ @@ -63,21 +80,41 @@ int spi_write(const uint8_t *data, uint32_t n){ for(uint32_t x = 0; x < n; ++x){ WAITX(!(SPI2->SR & SPI_SR_TXE)); SPIDR = data[x]; - //WAITX(!(SPI2->SR & SPI_SR_RXNE)); - //data[x] = SPI2->DR; // clear RXNE after last things } return 1; } /** - * @brief spi_send_dma - send data over SPI2 through DMA + * @brief spi_send_dma - send data over SPI2 through DMA (used both for writing and reading) * @param data - data to read + * @param rxbuf - pointer to receiving buffer (at least n bytes), can be also `data` (if `data` isn't const) * @param n - length of data * @return 0 if failed + * !!! `data` buffer can be changed only after SPI_READY flag! */ -int spi_write_dma(const uint8_t _U_ *data, uint32_t _U_ n){ +int spi_write_dma(const uint8_t *data, uint8_t *rxbuf, uint32_t n){ if(spi_status != SPI_READY) return 0; - return 0; + rxbufptr = rxbuf; + rxbuflen = n; + if(!spi_waitbsy()) return 0; + // clear SPI Rx FIFO + (void) SPI2->DR; + while(SPI2->SR & SPI_SR_RXNE) (void) SPI2->DR; + //DMA1_Channel4->CCR &= ~DMA_CCR_EN; // turn off to reconfigure + //DMA1_Channel5->CCR &= ~DMA_CCR_EN; + DMA1_Channel5->CMAR = (uint32_t) data; + DMA1_Channel5->CNDTR = n; + // check if user want to receive data + if(rxbuf){ + DMA1_Channel4->CCR |= DMA_CCR_TCIE; + DMA1_Channel5->CCR &= ~DMA_CCR_TCIE; // turn off Tx ready interrupt + DMA1_Channel4->CMAR = (uint32_t) rxbuf; + DMA1_Channel4->CNDTR = n; + DMA1_Channel4->CCR |= DMA_CCR_EN; // turn on reception + }else DMA1_Channel5->CCR |= DMA_CCR_TCIE; // interrupt by Tx ready - user don't want reception + spi_status = SPI_BUSY; + DMA1_Channel5->CCR |= DMA_CCR_EN; // turn on transmission + return 1; } /** @@ -86,31 +123,52 @@ int spi_write_dma(const uint8_t _U_ *data, uint32_t _U_ n){ * @param n - length of data * @return n */ -int spi_read(uint8_t _U_ *data, uint32_t _U_ n){ +int spi_read(uint8_t *data, uint32_t n){ if(spi_status != SPI_READY){ DBG("not ready"); return 0; } - //SPI2->CR1 &= ~SPI_CR1_BIDIOE; // Rx + if(!spi_waitbsy()) return 0; + // clear SPI Rx FIFO + (void) SPI2->DR; while(SPI2->SR & SPI_SR_RXNE) (void) SPI2->DR; for(uint32_t x = 0; x < n; ++x){ WAITX(!(SPI2->SR & SPI_SR_TXE)); SPIDR = 0; WAITX(!(SPI2->SR & SPI_SR_RXNE)); - data[x] = SPI2->DR; + data[x] = SPIDR; + USB_sendstr("rd got "); USB_sendstr(uhex2str(data[x])); + newline(); } - //SPI2->CR1 |= SPI_CR1_BIDIOE; // turn off clocking return 1; } /** - * @brief spi_read_dma - read SPI2 data through DMA - * @param data - data to read - * @param n - length of data - * @return n + * @brief spi_read_dma - got buffer read by DMA + * @param n (o) - length of rxbuffer + * @return amount of bytes read */ -int spi_read_dma(uint8_t _U_ *data, uint32_t _U_ n){ - if(spi_status != SPI_READY) return 0; - return 0; +uint8_t *spi_read_dma(uint32_t *n){ + if(spi_status != SPI_READY || rxbuflen == 0) return NULL; + if(n) *n = rxbuflen - DMA1_Channel4->CNDTR; // in case of error buffer would be underfull + rxbuflen = 0; // prevent consequent readings + return rxbufptr; } +// Rx ready interrupt +void dma1_channel4_isr(){ + spi_status = SPI_READY; // ready independent on errors or Rx ready + DMA1->IFCR = DMA_IFCR_CTCIF4 | DMA_IFCR_CTEIF4; + // turn off DMA + DMA1_Channel4->CCR &= ~DMA_CCR_EN; + DMA1_Channel5->CCR &= ~DMA_CCR_EN; +} + +// Tx ready interrupt +void dma1_channel5_isr(){ + spi_status = SPI_READY; // ready independent on errors or Tx ready + DMA1->IFCR = DMA_IFCR_CTCIF5 | DMA_IFCR_CTEIF5; + // turn off DMA + DMA1_Channel4->CCR &= ~DMA_CCR_EN; + DMA1_Channel5->CCR &= ~DMA_CCR_EN; +} diff --git a/F3:F303/NitrogenFlooding/spi.h b/F3:F303/NitrogenFlooding/spi.h index e200cde..76cc335 100644 --- a/F3:F303/NitrogenFlooding/spi.h +++ b/F3:F303/NitrogenFlooding/spi.h @@ -30,6 +30,6 @@ extern spiStatus spi_status; void spi_setup(); int spi_waitbsy(); int spi_write(const uint8_t *data, uint32_t n); -int spi_write_dma(const uint8_t *data, uint32_t n); +int spi_write_dma(const uint8_t *data, uint8_t *rxbuf, uint32_t n); int spi_read(uint8_t *data, uint32_t n); -int spi_read_dma(uint8_t *data, uint32_t n); +uint8_t *spi_read_dma(uint32_t *n); diff --git a/F3:F303/NitrogenFlooding/version.inc b/F3:F303/NitrogenFlooding/version.inc index 0775c11..cccedd9 100644 --- a/F3:F303/NitrogenFlooding/version.inc +++ b/F3:F303/NitrogenFlooding/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "152" -#define BUILD_DATE "2023-05-09" +#define BUILD_NUMBER "217" +#define BUILD_DATE "2023-05-11"