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 83130e5..32c58c2 100755 Binary files a/F3:F303/NitrogenFlooding/nitrogen.bin and b/F3:F303/NitrogenFlooding/nitrogen.bin differ 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"