diff options
45 files changed, 1071 insertions, 170 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 57ddfee..5bb896a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,16 @@ +# B.0 + +* Add error screen; +* Implement some standard library features; +* Add logo; +* Add signed integral types; +* Add function for trapping; +* Don't use nodiscard; +* Add more error codes; +* Remove badmd error; +* Add type limit macros; +* Update readme; + # A.3 * Implement rec (excluding hrec); diff --git a/README.html b/README.html index 87041d2..e9fa4a5 100644 --- a/README.html +++ b/README.html @@ -13,7 +13,7 @@ <p>A: Colour the selected pixel;</p> </li> <li> - <p>+CONTROL PAD: Move one pixel to the specified direction on the canvas;</p> + <p>+CONTROL PAD: Move one pixel in the specified direction on the canvas;</p> </li> <li> <p>R: Rotate the palette counterclockwise;</p> @@ -0,0 +1,11 @@ +<!-- Copyright 2022 Gabriel Jensen. This work is licensed under a Creative Commons Attribution 4.0 International License. --> +<svg height="108" width="108" xmlns="http://www.w3.org/2000/svg"> + <!-- background --> + <polygon fill="#422984" points="0,0 108,0 108,108 0,108" /> + <!-- a --> + <polygon fill="#FFFFFF" points="24,36 36,36 48,72 36,72 30,54 24,72 12,72 18,54" stroke="#FFFFFF" stroke-width="4" /> + <polygon fill="#422984" points="24,36 36,36 48,72 36,72 30,54 24,72 12,72 18,54 17,54 30,54 21,45" /> + <!-- x --> + <polygon fill="#FFFFFF" points="60,36 72,36 78,45 84,36 96,36 84,54 96,72 84,72 78,63 72,72 60,72 72,54" stroke="#FFFFFF" stroke-width="4" /> + <polygon fill="#422984" points="60,36 72,36 78,45 84,36 96,36 84,54 96,72 84,72 78,63 72,72 60,72 72,54 78,54" /> +</svg> diff --git a/ax/GNUmakefile b/ax/GNUmakefile index d5a07ba..1e37bab 100644 --- a/ax/GNUmakefile +++ b/ax/GNUmakefile @@ -5,31 +5,31 @@ # TOOLS AS := arm-none-eabi-as -#CC := arm-none-eabi-gcc -Dbool="_Bool" -Dfalse="((_Bool)+0x0u)" -Dfalse="((_Bool)+0x0u)" -CC := clang --target=arm-none-eabi -#CXX := arm-none-eabi-g++ -CXX := clang++ --target=arm-none-eabi +CC := arm-none-eabi-gcc +#CC := clang --target=arm-none-eabi +CXX := arm-none-eabi-g++ +#CXX := clang++ --target=arm-none-eabi OBJCOPY := arm-none-eabi-objcopy # TOOL FLAGS CFLAGS := \ - -Iinclude \ - -Iinclude-private \ - -Ofast \ - -Wall \ - -Wextra \ - -Wpedantic \ - -Wno-gnu-binary-literal \ - -Wno-gnu-empty-initializer \ - -ffreestanding \ - -fno-builtin \ - -fno-strict-aliasing \ - -fshort-enums \ - -mcpu=arm7tdmi \ - -mthumb \ - -mtune=arm7tdmi \ - -nostdlib \ + -Iinclude \ + -Iinclude-private \ + -Oz \ + -Wall \ + -Wextra \ + -Wpadded \ + -Wpedantic \ + -ffreestanding \ + -fno-strict-aliasing \ + -fshort-enums \ + -mabi=aapcs \ + -mcpu=arm7tdmi \ + -mthumb \ + -mtune=arm7tdmi \ + -nostdlib \ + -pipe \ -std=c2x CXXFLAGS := \ @@ -40,14 +40,15 @@ CXXFLAGS := \ -Wextra \ -Wpedantic \ -ffreestanding \ - -fno-builtin \ -fno-exceptions \ -fno-strict-aliasing \ -fshort-enums \ + -mabi=aapcs \ -mcpu=arm7tdmi \ -mthumb \ -mtune=arm7tdmi \ -nostdlib \ + -pipe \ -std=c++2b # HEADERS @@ -57,28 +58,48 @@ HDRS := \ include/ax/bs.h \ include/ax/gfx.h \ include/ax/key.h \ + include/float.h \ + include/iso646.h \ + include/limits.h \ + include/stdalign.h \ + include/stdarg.h \ + include/stdbit.h \ + include/stdbool.h \ + include/stddef.h \ + include/stdint.h \ + include/stdlib.h \ + include/stdnoreturn.h \ + include/string.h \ include-private/ax/priv.h # ARTEFACTS OBJS := \ - source/algo/cp.o \ - source/algo/fill.o \ - source/bs/done.o \ - source/bs/get.o \ - source/bs/set.o \ - source/gfx/blnk.o \ - source/gfx/clrscrn.o \ - source/gfx/flip.o \ - source/gfx/getvbnk.o \ - source/gfx/plot.o \ - source/gfx/plottex.o \ - source/gfx/rd.o \ - source/gfx/rec.o \ - source/gfx/setcol.o \ - source/gfx/vsync.o \ - source/key/getkeymap.o \ - source/priv/init.o + source/algo/cp.o \ + source/algo/fill.o \ + source/bs/done.o \ + source/bs/get.o \ + source/bs/set.o \ + source/bs/trap.o \ + source/gfx/blnk.o \ + source/gfx/clrscrn.o \ + source/gfx/flip.o \ + source/gfx/getvbnk.o \ + source/gfx/plot.o \ + source/gfx/plottex.o \ + source/gfx/rd.o \ + source/gfx/rec.o \ + source/gfx/setcol.o \ + source/gfx/vsync.o \ + source/key/getkeymap.o \ + source/priv/init.o \ + source/setjmp/longjmp.o \ + source/setjmp/setjmp.o \ + source/stdlib/memalignement.o \ + source/string/memcpy.o \ + source/string/memset.o \ + source/string/memset_explicit.o \ + source/string/strlen.o LIB := libax.a diff --git a/ax/include-private/ax/priv.h b/ax/include-private/ax/priv.h index e38ed64..4d4791f 100644 --- a/ax/include-private/ax/priv.h +++ b/ax/include-private/ax/priv.h @@ -4,8 +4,10 @@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. */ -#if !defined(__ax_hdr_priv) -#define __ax_hdr_priv +#if !defined(__ax_hdr_ax_priv) +#define __ax_hdr_ax_priv + +#include <ax/bs.h> #include <ax/bs.h> diff --git a/ax/include/ax/algo.h b/ax/include/ax/algo.h index 6347ac4..f9cff8b 100644 --- a/ax/include/ax/algo.h +++ b/ax/include/ax/algo.h @@ -4,8 +4,10 @@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. */ -#if !defined(__ax_hdr_algo) -#define __ax_hdr_algo +#if !defined(__ax_hdr_ax_algo) +#define __ax_hdr_ax_algo + +#include <ax/bs.h> #include <ax/bs.h> diff --git a/ax/include/ax/bs.h b/ax/include/ax/bs.h index 0e65cf2..4e6de79 100644 --- a/ax/include/ax/bs.h +++ b/ax/include/ax/bs.h @@ -4,8 +4,8 @@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. */ -#if !defined(__ax_hdr_bs) -#define __ax_hdr_bs +#if !defined(__ax_hdr_ax_bs) +#define __ax_hdr_ax_bs #if defined(__cplusplus) extern "C" { @@ -13,36 +13,87 @@ extern "C" { #if !defined(__cplusplus) /* C23 compatibility: */ -#define constexpr static const +#define alignas _Alignas +#define alignof _Alignof +#define bool _Bool +#define constexpr static const +#define false ((_Bool)+0x0u) +#define nullptr ((void *)0x0) +#define static_assert _Static_assert +#define thread_local _Thread_local +#define true ((_Bool)+0x1u) +#define typeof __typeof__ +#define typeof_unqual __typeof__ #endif +#define ax_maxval_i ((int)+0x7FFFFFFF) +#define ax_minval_i ((int)-0x80000000) + +#define ax_maxval_l ((long)+0x7FFFFFFF) +#define ax_minval_l ((long)-0x80000000) + +#define ax_maxval_ll ((long long)+0x7FFFFFFFFFFFFFFF) +#define ax_minval_ll ((long long)-0x8000000000000000) + +#define ax_maxval_s ((short)+0x7FFF) +#define ax_minval_s ((short)-0x8000) + +#define ax_maxval_sc ((signed char)+0x7F) +#define ax_minval_sc ((signed char)-0x80) + +#define ax_maxval_uc ((unsigned char)+0xFFu) +#define ax_minval_uc ((unsigned char)+0x0u) + +#define ax_maxval_ui ((unsigned int)+0xFFFFFFFFu) +#define ax_minval_ui ((unsigned int)+0x0u) + +#define ax_maxval_ul ((unsigned long)+0xFFFFFFFFu) +#define ax_minval_ul ((unsigned long)+0x0u) + +#define ax_maxval_ull ((unsigned long long)+0xFFFFFFFFFFFFFFFFu) +#define ax_minval_ull ((unsigned long long)+0x0u) + +#define ax_maxval_c ((char)+ax_maxval_uc) +#define ax_minval_c ((char)+ax_minval_uc) + typedef unsigned short ax_i01; typedef unsigned int ax_i02; typedef unsigned long long ax_i04; typedef unsigned char ax_i8; +typedef short ax_i01s; +typedef int ax_i02s; +typedef long long ax_i04s; +typedef char ax_i8s; + typedef enum { - ax_err_ok = 0x0u, - ax_err_badaddr, - ax_err_badalgn, - ax_err_badcol, - ax_err_badmd, - ax_err_pos2big, - ax_err_px2big, - ax_err_max = 0xFFu, + ax_err_ok = 0x0u, + ax_err_badaddr, /* bad address */ + ax_err_badalgn, /* bad alignment */ + ax_err_badcol, /* bad colour */ + ax_err_badgfxmd, /* bad graphics mode */ + ax_err_badparam, /* bad parameter */ + ax_err_divzero, /* division by zero */ + ax_err_misc, /* miscellaneous */ + ax_err_nullptr, /* null pointer */ + ax_err_oflow, /* overflow */ + ax_err_pos2big, /* position too big */ + ax_err_px2big, /* pixel number too big */ + ax_err_max = 0xFFu, } ax_err; -constexpr ax_i04 ax_ver = 0xAu; +constexpr ax_i04 ax_ver = 0xBu; -[[nodiscard]] ax_i01 ax_get01(ax_i02 addr); -[[nodiscard]] ax_i02 ax_get02(ax_i02 addr); -[[nodiscard]] ax_i8 ax_get8( ax_i02 addr); +ax_i01 ax_get01(ax_i02 addr); +ax_i02 ax_get02(ax_i02 addr); +ax_i8 ax_get8( ax_i02 addr); void ax_set01(ax_i02 addr,ax_i01 val); void ax_set02(ax_i02 addr,ax_i02 val); void ax_set8( ax_i02 addr,ax_i8 val); [[noreturn]] void ax_done(ax_err err); +[[noreturn]] void ax_trap(void); #if defined(__cplusplus) } diff --git a/ax/include/ax/gfx.h b/ax/include/ax/gfx.h index c378bf8..3e413a7 100644 --- a/ax/include/ax/gfx.h +++ b/ax/include/ax/gfx.h @@ -4,8 +4,10 @@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. */ -#if !defined(__ax_hdr_gfx) -#define __ax_hdr_gfx +#if !defined(__ax_hdr_ax_gfx) +#define __ax_hdr_ax_gfx + +#include <ax/bs.h> #include <ax/bs.h> @@ -20,7 +22,7 @@ constexpr ax_i8 ax_scrnh5 = 0x80u; #define ax_coord(_scrnw,_x,_y) ((ax_i01)((ax_i01)(_y) * (ax_i01)(_scrnw) + (ax_i01)(_x))) -#define ax_col(_r,_g,_b) ((ax_i01)(((ax_i01)(_r) | (ax_i01)(_g) << 0x5u | (ax_i01)(_b) << 0xAu) & 0b000000111111111111111)) +#define ax_col(_r,_g,_b) ((ax_i01)(((ax_i01)_r | (ax_i01)_g << 0x5u | (ax_i01)_b << 0xAu) & 0b000000111111111111111)) void ax_blnk( void); ax_i02 ax_flip( void); diff --git a/ax/include/ax/key.h b/ax/include/ax/key.h index ad70743..f7a1799 100644 --- a/ax/include/ax/key.h +++ b/ax/include/ax/key.h @@ -4,8 +4,8 @@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. */ -#if !defined(__ax_hdr_key) -#define __ax_hdr_key +#if !defined(__ax_hdr_ax_key) +#define __ax_hdr_ax_key #include <ax/bs.h> @@ -26,7 +26,7 @@ typedef struct { ax_i01 _keys; } ax_keymap; -#define ax_chkkey(_map,_key) ((bool)((_map)._keys & (ax_i01)(_key) ^ (ax_i01)(_key))) +#define ax_chkkey(_map,_key) ((bool)(((_map)._keys & (ax_i01)(_key)) ^ (ax_i01)(_key))) ax_keymap ax_getkeymap(void); diff --git a/ax/include/float.h b/ax/include/float.h new file mode 100644 index 0000000..c70bb82 --- /dev/null +++ b/ax/include/float.h @@ -0,0 +1,12 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_float) +#define __ax_hdr_float + +#include <ax/bs.h> + +#endif diff --git a/ax/include/iso646.h b/ax/include/iso646.h new file mode 100644 index 0000000..9560a53 --- /dev/null +++ b/ax/include/iso646.h @@ -0,0 +1,24 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_iso646) +#define __ax_hdr_iso646 + +#include <ax/bs.h> + +#define and && +#define and_eq &= +#define bitand & +#define bitor | +#define compl ~ +#define not ! +#define not_eq != +#define or || +#define or_eq |= +#define xor ^ +#define xor_eq ^= + +#endif diff --git a/ax/include/limits.h b/ax/include/limits.h new file mode 100644 index 0000000..80da416 --- /dev/null +++ b/ax/include/limits.h @@ -0,0 +1,63 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_limits) +#define __ax_hdr_limits + +#include <ax/bs.h> + +#define __STDC_VERSION_LIMITS_H__ (202311l) + +#define BOOL_WIDTH (0x8) + +#define CHAR_BIT (0x8) +#define CHAR_WIDTH CHAR_BIT +#define SCHAR_WIDTH CHAR_BIT +#define UCHAR_WIDTH CHAR_BIT + +#define USHRT_WIDTH (0x10) +#define SHRT_WIDTH USHRT_WIDTH + +#define UINT_WIDTH (0x20) +#define INT_WIDTH UINT_WIDTH + +#define ULONG_WIDTH (0x20) +#define LONG_WIDTH ULONG_WIDTH + +#define ULLONG_WIDTH (0x40) +#define LLONG_WIDTH ULLONG_WIDTH + +#define BITINT_MAXWIDTH ULLONG_WIDTH + +#define MB_LEN_MAX (0x4) + +#define UCHAR_MAX ((unsigned int)+ax_maxval_uc) +#define CHAR_MAX CHAR_MAX + +#define USHRT_MAX ((unsigned int)+ax_maxval_us) + +#define UINT_MAX ax_maxval_ui + +#define ULONG_MAX ax_maxval_ul + +#define ULLONG_MAX ax_maxval_ull + +#define SCHAR_MAX ((int)+ax_maxval_sc) +#define SCHAR_MIN ((int)+ax_minval_sc) + +#define SHRT_MAX ((int)+ax_maxval_s) +#define SHRT_MIN ((int)+ax_minval_s) + +#define INT_MAX ax_maxval_i +#define INT_MIN ax_minval_i + +#define LONG_MAX ax_maxval_l +#define LONG_MIN ax_minval_l + +#define LLONG_MAX ax_maxval_ll +#define LLONG_MIN ax_minval_ll + +#endif diff --git a/ax/include/setjmp.h b/ax/include/setjmp.h new file mode 100644 index 0000000..73a6b95 --- /dev/null +++ b/ax/include/setjmp.h @@ -0,0 +1,20 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_setjmp) +#define __ax_hdr_setjmp + +#include <ax/bs.h> + +#define __STDC_VERSION_SETJMP_H__ (202311l) + +typedef ax_i02 jmp_buf[0xBu]; + +int setjmp(jmp_buf env); + +[[noreturn]] void longjmp(jmp_buf env,int val); + +#endif diff --git a/ax/include/stdalign.h b/ax/include/stdalign.h new file mode 100644 index 0000000..2f79d04 --- /dev/null +++ b/ax/include/stdalign.h @@ -0,0 +1,10 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdalign) +#define __ax_hdr_stdalign + +#endif diff --git a/ax/include/stdarg.h b/ax/include/stdarg.h new file mode 100644 index 0000000..476691e --- /dev/null +++ b/ax/include/stdarg.h @@ -0,0 +1,14 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdarg) +#define __ax_hdr_stdarg + +#include <ax/bs.h> + +/* This is gonna be complicated. */ + +#endif diff --git a/ax/include/stdbit.h b/ax/include/stdbit.h new file mode 100644 index 0000000..58c3579 --- /dev/null +++ b/ax/include/stdbit.h @@ -0,0 +1,124 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdbit) +#define __ax_hdr_stdbit + +#include <ax/bs.h> + +#define __STDC_VERSION_STDBIT_H__ (202311l) + +#define __STDC_ENDIAN_LITTLE__ ax_minval_i +#define __STDC_ENDIAN_BIG__ ax_maxval_i +#define __STDC_ENDIAN_NATIVE__ (0x0) /* This CPU can use both. */ + +typedef ax_i02 size_t; + +typedef ax_i8s int8_t; +typedef ax_i01s int16_t; +typedef ax_i02s int32_t; +typedef ax_i04s int64_t; + +typedef ax_i8 uint8_t; +typedef ax_i01 uint16_t; +typedef ax_i02 uint32_t; +typedef ax_i04 uint64_t; + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +int stdc_leading_zerosuc( unsigned char value); +int stdc_leading_zerosus( unsigned short value); +int stdc_leading_zerosui( unsigned int value); +int stdc_leading_zerosul( unsigned long value); +int stdc_leading_zerosull(unsigned long long value); + +int stdc_leading_onesuc( unsigned char value); +int stdc_leading_onesus( unsigned short value); +int stdc_leading_onesui( unsigned int value); +int stdc_leading_onesul( unsigned long value); +int stdc_leading_onesull(unsigned long long value); + +int stdc_trailing_zerosuc( unsigned char value); +int stdc_trailing_zerosus( unsigned short value); +int stdc_trailing_zerosui( unsigned int value); +int stdc_trailing_zerosul( unsigned long value); +int stdc_trailing_zerosull(unsigned long long value); + +int stdc_trailing_onesuc( unsigned char value); +int stdc_trailing_onesus( unsigned short value); +int stdc_trailing_onesui( unsigned int value); +int stdc_trailing_onesul( unsigned long value); +int stdc_trailing_onesull(unsigned long long value); + +int stdc_first_leading_zerouc( unsigned char value); +int stdc_first_leading_zerous( unsigned short value); +int stdc_first_leading_zeroui( unsigned int value); +int stdc_first_leading_zeroul( unsigned long value); +int stdc_first_leading_zeroull(unsigned long long value); + +int stdc_first_leading_oneuc( unsigned char value); +int stdc_first_leading_oneus( unsigned short value); +int stdc_first_leading_oneui( unsigned int value); +int stdc_first_leading_oneul( unsigned long value); +int stdc_first_leading_oneull(unsigned long long value); + +int stdc_first_trailing_zerouc( unsigned char value); +int stdc_first_trailing_zerous( unsigned short value); +int stdc_first_trailing_zeroui( unsigned int value); +int stdc_first_trailing_zeroul( unsigned long value); +int stdc_first_trailing_zeroull(unsigned long long value); + +int stdc_first_trailing_oneuc( unsigned char value); +int stdc_first_trailing_oneus( unsigned short value); +int stdc_first_trailing_oneui( unsigned int value); +int stdc_first_trailing_oneul( unsigned long value); +int stdc_first_trailing_oneull(unsigned long long value); + +int stdc_count_zerosuc( unsigned char value); +int stdc_count_zerosus( unsigned short value); +int stdc_count_zerosui( unsigned int value); +int stdc_count_zerosul( unsigned long value); +int stdc_count_zerosull(unsigned long long value); + +int stdc_count_onesuc( unsigned char value); +int stdc_count_onesus( unsigned short value); +int stdc_count_onesui( unsigned int value); +int stdc_count_onesul( unsigned long value); +int stdc_count_onesull(unsigned long long value); + +bool stdc_has_single_bituc( unsigned char value); +bool stdc_has_single_bitus( unsigned short value); +bool stdc_has_single_bitui( unsigned int value); +bool stdc_has_single_bitul( unsigned long value); +bool stdc_has_single_bitull(unsigned long long value); + +int stdc_bit_widthuc( unsigned char value); +int stdc_bit_widthus( unsigned short value); +int stdc_bit_widthui( unsigned int value); +int stdc_bit_widthul( unsigned long value); +int stdc_bit_widthull(unsigned long long value); + +unsigned char stdc_bit_flooruc( unsigned char value); +unsigned short stdc_bit_floorus( unsigned short value); +unsigned int stdc_bit_floorui( unsigned int value); +unsigned long stdc_bit_floorul( unsigned long value); +unsigned long long stdc_bit_floorull(unsigned long long value); + +unsigned char stdc_bit_ceiluc( unsigned char value); +unsigned short stdc_bit_ceilus( unsigned short value); +unsigned int stdc_bit_ceilui( unsigned int value); +unsigned long stdc_bit_ceilul( unsigned long value); +unsigned long long stdc_bit_ceilull(unsigned long long value); + +#endif diff --git a/ax/include/stdbool.h b/ax/include/stdbool.h new file mode 100644 index 0000000..d5263cc --- /dev/null +++ b/ax/include/stdbool.h @@ -0,0 +1,14 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdbool) +#define __ax_hdr_stdbool + +#include <ax/bs.h> + +#define __bool_true_false_are_defined (0x1) + +#endif diff --git a/ax/include/stddef.h b/ax/include/stddef.h new file mode 100644 index 0000000..ea5a04e --- /dev/null +++ b/ax/include/stddef.h @@ -0,0 +1,35 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stddef) +#define __ax_hdr_stddef + +#include <ax/bs.h> + +#define __STDC_VERSION_STDDEF_H__ (202311l) + +#define NULL nullptr + +#if __has_builtin(__builtin_unreachable) +#define unreachable() __builtin_unreachable() +#else +#define unreachable() ax_trap() +#endif + +#if __has_builtin(__builtin_offsetof) +#define offsetof(_typ,_memb) __builtin_offsetof((_typ),(_memb)) +#else +/* uhmmm */ +#define offsetof(_typ,_memb) ((size_t)+0x0u) +#endif + +typedef ax_i02s ptrdiff_t; +typedef ax_i02 size_t; +typedef long double max_align_t; +typedef ax_i02 wchar_t; +typedef typeof_unqual (nullptr) nullptr_t; + +#endif diff --git a/ax/include/stdint.h b/ax/include/stdint.h new file mode 100644 index 0000000..f356128 --- /dev/null +++ b/ax/include/stdint.h @@ -0,0 +1,177 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdint) +#define __ax_hdr_stdint + +#include <ax/bs.h> + +#define __STDC_VERSION_STDINT_H__ (202311l) + +#define INT8_WIDTH (0x8) +#define INT16_WIDTH (0x10) +#define INT32_WIDTH (0x20) +#define INT64_WIDTH (0x40) + +#define UINT8_WIDTH (0x8) +#define UINT16_WIDTH (0x10) +#define UINT32_WIDTH (0x20) +#define UINT64_WIDTH (0x40) + +#define INT_LEAST8_WIDTH INT8_WIDTH +#define INT_LEAST16_WIDTH INT16_WIDTH +#define INT_LEAST32_WIDTH INT32_WIDTH +#define INT_LEAST64_WIDTH INT64_WIDTH + +#define UINT_LEAST8_WIDTH UINT8_WIDTH +#define UINT_LEAST16_WIDTH UINT16_WIDTH +#define UINT_LEAST32_WIDTH UINT32_WIDTH +#define UINT_LEAST64_WIDTH UINT64_WIDTH + +#define INT_FAST8_WIDTH INT8_WIDTH +#define INT_FAST16_WIDTH INT16_WIDTH +#define INT_FAST32_WIDTH INT32_WIDTH +#define INT_FAST64_WIDTH INT64_WIDTH + +#define UINT_FAST8_WIDTH UINT8_WIDTH +#define UINT_FAST16_WIDTH UINT16_WIDTH +#define UINT_FAST32_WIDTH UINT32_WIDTH +#define UINT_FAST64_WIDTH UINT64_WIDTH + +#define INTPTR_WIDTH (0x20) + +#define UINTPTR_WIDTH (0x20) + +#define INTMAX_WIDTH (0x40) + +#define UINTMAX_WIDTH (0x40) + +#define PTRDIFF_WIDTH (0x20) + +#define SIG_ATOMIC_WIDTH (0x20) + +#define SIZE_WIDTH (0x20) + +#define WCHAR_WIDTH (0x20) + +#define INT8_C( _val) (_val) +#define INT16_C(_val) (_val) +#define INT32_C(_val) (_val) +#define INT64_C(_val) (_val##ll) + +#define UINT8_C( _val) (_val##u) +#define UINT16_C(_val) (_val##u) +#define UINT32_C(_val) (_val##u) +#define UINT64_C(_val) (_val##ull) + +#define INTMAX_C(_val) (_val##ll) + +#define UINTMAX_C(_val) (_val##ull) + +#define INT8_MAX ax_maxval_sc +#define INT16_MAX ax_maxval_s +#define INT32_MAX ax_maxval_i +#define INT64_MAX ax_maxval_ll +#define UINT8_MAX ax_maxval_uc +#define UINT16_MAX ax_maxval_us +#define UINT32_MAX ax_maxval_ui +#define UINT64_MAX ax_maxval_ull + +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +#define INTPTR_MAX ax_maxval_i +#define UINTPTR_MAX ax_maxval_ui + +#define INTMAX_MAX ax_maxval_ll +#define UINTMAX_MAX ax_maxval_ull + +#define PTRDIFF_MAX ax_maxval_i + +#define SIG_ATOMIC_MAX ax_maxval_ui + +#define SIZE_MAX ax_maxval_ui + +#define WCHAR_MAX ax_maxval_ui + +#define INT8_MIN ax_minval_sc +#define INT16_MIN ax_minval_s +#define INT32_MIN ax_minval_i +#define INT64_MIN ax_minval_ll + +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN + +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN + +#define INTPTR_MIN ax_minval_i + +#define INTMAX_MIN ax_minval_ll + +#define PTRDIFF_MIN ax_minval_i + +#define SIG_ATOMIC_MIN ax_minval_ui + +#define WCHAR_MIN ax_minval_ui +#define WINT_MIN ax_minval_ui + +typedef ax_i8s int8_t; +typedef ax_i01s int16_t; +typedef ax_i02s int32_t; +typedef ax_i04s int64_t; + +typedef ax_i8 uint8_t; +typedef ax_i01 uint16_t; +typedef ax_i02 uint32_t; +typedef ax_i04 uint64_t; + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +typedef int8_t int_fast8_t; +typedef int32_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; + +typedef uint8_t uint_fast8_t; +typedef uint32_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +typedef int32_t intptr_t; +typedef uint32_t uintptr_t; + +typedef long long intmax_t; +typedef unsigned long long uintmax_t; + +#endif diff --git a/ax/include/stdlib.h b/ax/include/stdlib.h new file mode 100644 index 0000000..e5e8c14 --- /dev/null +++ b/ax/include/stdlib.h @@ -0,0 +1,21 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdlib) +#define __ax_hdr_stdlib + +#include <ax/bs.h> + +#define __STDC_VERSION_STDLIB_H__ (202311l) + +#define NULL nullptr + +typedef ax_i02 size_t; +typedef ax_i02 wchar_t; + +size_t memalignment(void const * p); + +#endif diff --git a/ax/include/stdnoreturn.h b/ax/include/stdnoreturn.h new file mode 100644 index 0000000..338a19d --- /dev/null +++ b/ax/include/stdnoreturn.h @@ -0,0 +1,14 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_stdnoreturn) +#define __ax_hdr_stdnoreturn + +#include <ax/bs.h> + +#define noreturn _Noreturn + +#endif diff --git a/ax/include/string.h b/ax/include/string.h new file mode 100644 index 0000000..4365228 --- /dev/null +++ b/ax/include/string.h @@ -0,0 +1,40 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#if !defined(__ax_hdr_string) +#define __ax_hdr_string + +#include <ax/bs.h> + +#define __STDC_VERSION_STRING_H__ (202311l) + +#define NULL nullptr + +typedef ax_i02 size_t; + +void * memcpy( void * restrict s1,void const * restrict s2,size_t n); +void * memccpy(void * restrict s1,void const * restrict s2,int c,size_t n); +void * memmove(void * restrict s1,void const * restrict s2,size_t n); +char * strcpy( char * restrict s1,char const * restrict s2); +char * strncpy(char * restrict s1,char const * restrict s2,size_t n); +/* strdup not required. */ +/* strndup not required. */ + +char * strcat( char * restrict s1,char const * restrict s2); +char * strncat(char * restrict s1,char const * restrict s2,size_t n); + +int memcmp( void const * s1,void const * s2,size_t n); +int strcmp( char const * s1,char const * s2); +/* strcoll not required. */ +int strncmp(char const * s1,char const * s2); +/* strxfrm not required. */ + +void * memset( void * s,int c,size_t n); +void * memset_explicit(void * s,int c,size_t n); +/* strerror is not required. */ +size_t strlen( char const * s); + +#endif diff --git a/ax/source/bs/done.c b/ax/source/bs/done.c index 17b55c6..3c0019c 100644 --- a/ax/source/bs/done.c +++ b/ax/source/bs/done.c @@ -15,8 +15,22 @@ void ax_done(ax_err const _err) { ); __builtin_unreachable(); } - __asm__ ( - "svc 0x2\n" - ); - for (;;) {} + { + ax_set01(0x400'0000u,0b00000100'10000100u); + ax_setcol(0x0u,ax_col(0x0Fu,0x0Fu,0x0Fu)); + ax_setcol(0x1u,ax_col(0x1Fu,0x1Fu,0x1Fu)); + ax_setcol(0x2u,ax_col(0x00u,0x00u,0x00u)); + ax_blnk(); + ax_i02 const vaddr = 0x600'0000u; + ax_rec1(vaddr,ax_scrnw3,0x0u,0x11u,0x3u,0x2u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x01u,0x1u),(ax_i8)_err & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x03u,0x1u),(ax_i8)_err >> 0x1u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x05u,0x1u),(ax_i8)_err >> 0x2u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x07u,0x1u),(ax_i8)_err >> 0x3u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x09u,0x1u),(ax_i8)_err >> 0x4u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x0Bu,0x1u),(ax_i8)_err >> 0x5u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x0Du,0x1u),(ax_i8)_err >> 0x6u & 0b00000001u); + ax_plot1(vaddr,ax_coord(ax_scrnw3,0x0Fu,0x1u),(ax_i8)_err >> 0x7u & 0b00000001u); + } + ax_trap(); } diff --git a/ax/source/bs/trap.s b/ax/source/bs/trap.s new file mode 100644 index 0000000..e6dd868 --- /dev/null +++ b/ax/source/bs/trap.s @@ -0,0 +1,20 @@ +@ Copyright 2022 Gabriel Jensen. +@ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. + +.syntax unified + +.cpu arm7tdmi +.thumb + +.globl ax_trap + +.func +.thumb_func + +ax_trap: + svc 0x2 +.loop: + b .loop + +.endfunc diff --git a/ax/source/gfx/blnk.s b/ax/source/gfx/blnk.s index c66c533..35a046f 100644 --- a/ax/source/gfx/blnk.s +++ b/ax/source/gfx/blnk.s @@ -13,23 +13,23 @@ .thumb_func ax_blnk: - @ Get the current value of dispcnt: - ldr r0,.dispcntaddr @ ax_i02 dispcntaddr = 0x4000000u; - ldrh r1,[r0] @ ax_i01 dispcnt = *(ax_i01 *)dispcntaddr; + @ Get the current value of dispcntrl: + ldr r0,.dispcntrladdr @ ax_i02 dispcntrladdr = 0x4000000u; + ldrh r1,[r0] @ ax_i01 dispcntrl = *(ax_i01 *)dispcntrladdr; @ XOR bit seven: movs r2,0b10000000 - eors r1,r2 @ dispcnt ^= 0b10000000u; + eors r1,r2 @ dispcntrl ^= 0b10000000u; - @ Save dispcnt: - strh r1,[r0] @ *(ax_i01 *)dispcntaddr = dispcnt; + @ Save dispcntrl: + strh r1,[r0] @ *(ax_i01 *)dispcntrladdr = dispcntrl; @ Return: - bx lr @ return vaddr; + bx lr @ return vaddr; .endfunc .align -.dispcntaddr: - .long 0x4000000 +.dispcntrladdr: + .word 0x4000000 diff --git a/ax/source/gfx/flip.s b/ax/source/gfx/flip.s index 2b09b04..2676d95 100644 --- a/ax/source/gfx/flip.s +++ b/ax/source/gfx/flip.s @@ -15,16 +15,16 @@ .thumb_func ax_flip: - @ Get the current value of dispcnt: - ldr r0,.dispcntaddr @ ax_i02 dispcntaddr = 0x4000000u; - ldrh r1,[r0] @ ax_i01 dispcnt = *(ax_i01 *)dispcntaddr; + @ Get the current value of dispcntrl: + ldr r0,.dispcntrladdr @ ax_i02 dispcntrladdr = 0x4000000u; + ldrh r1,[r0] @ ax_i01 dispcntrl = *(ax_i01 *)dispcntrladdr; @ XOR bit four: movs r2,0b10000 - eors r1,r2 @ dispcnt ^= 0b10000u; + eors r1,r2 @ dispcntrl ^= 0b10000u; - @ Save dispcnt: - strh r1,[r0] @ *(ax_i01 *)dispcntaddr = dispcnt; + @ Save dispcntrl: + strh r1,[r0] @ *(ax_i01 *)dispcntrladdr = dispcntrl; @ Get the address of the video bank: b __ax_getvbnk @ ax_i02 vaddr = __ax_getvbnk(); @@ -36,5 +36,5 @@ ax_flip: .align -.dispcntaddr: - .long 0x4000000 +.dispcntrladdr: + .word 0x4000000 diff --git a/ax/source/gfx/getvbnk.s b/ax/source/gfx/getvbnk.s index d3dcbcf..da4c30a 100644 --- a/ax/source/gfx/getvbnk.s +++ b/ax/source/gfx/getvbnk.s @@ -14,9 +14,9 @@ .thumb_func ax_getvbnk: - @ Get the current value of dispcnt: - ldr r0,.dispcntaddr @ ax_i02 dispcntaddr = 0x4000000u; - ldrh r1,[r0] @ ax_i01 dispcnt = *(ax_i01 *)dispcntaddr; + @ Get the current value of dispcntrl: + ldr r0,.dispcntrladdr @ ax_i02 dispcntrladdr = 0x4000000u; + ldrh r1,[r0] @ ax_i01 dispcntrl = *(ax_i01 *)dispcntrladdr; @ Get the address: b __ax_getvbnk @ ax_i02 vaddr = __ax_getvbnk(); @@ -28,7 +28,7 @@ ax_getvbnk: .func .thumb_func -__ax_getvbnk: @ Takes the value of dispcnt in r1. +__ax_getvbnk: @ Takes the value of dispcntrl in r1. @ Check if the fifth bit is set: movs r0,0b10000 tst r1,r0 @@ -48,15 +48,15 @@ __ax_getvbnk: @ Takes the value of dispcnt in r1. .align -.dispcntaddr: - .long 0x4000000 +.dispcntrladdr: + .word 0x4000000 .align .vbnk0addr: - .long 0x6000000 + .word 0x6000000 .align .vbnk1addr: - .long 0x600A000 + .word 0x600A000 diff --git a/ax/source/gfx/setcol.s b/ax/source/gfx/setcol.s index bdf99f0..4738099 100644 --- a/ax/source/gfx/setcol.s +++ b/ax/source/gfx/setcol.s @@ -29,4 +29,4 @@ ax_setcol: .align .paladdr: - .long 0x5000000 + .word 0x5000000 diff --git a/ax/source/gfx/vsync.s b/ax/source/gfx/vsync.s index 6b2908c..b792e7e 100644 --- a/ax/source/gfx/vsync.s +++ b/ax/source/gfx/vsync.s @@ -39,4 +39,4 @@ ax_vsync: .align .vcntaddr: - .long 0x4000006 + .word 0x4000006 diff --git a/ax/source/key/getkeymap.s b/ax/source/key/getkeymap.s index 6c9835c..08f3f22 100644 --- a/ax/source/key/getkeymap.s +++ b/ax/source/key/getkeymap.s @@ -25,4 +25,4 @@ ax_getkeymap: .align .addr: - .long 0x4000130 + .word 0x4000130 diff --git a/ax/source/priv/init.s b/ax/source/priv/init.s index e8bd8ee..c2c2dc6 100644 --- a/ax/source/priv/init.s +++ b/ax/source/priv/init.s @@ -10,17 +10,30 @@ .extern ax_done .extern ax_start +.globl __ax_font .globl __ax_init .func __ax_init: - @ Call main: + @ Call start: ldr r0,=ax_start @ We load the address of start into a register so we can use bx to call it, allowing for the programmer to implement the function in either ARM or THUMB. This processor doesn't support blx, so we aren't able to use that instead. mov lr,pc @ bx doesn't set the return address, so we do it ourselves. pc stores the instruction after the next one, so we don't have to apply any arithmetic on it. THUMB doesn't support using pc in a mov expression, which is why this function is ARM. bx r0 @ Call done: - bl ax_done @ The error code (returned by ax_start) is already in r0, so there's no need to move it. + ldr r1,=ax_done + mov lr,pc + bx r1 @ The error code (returned by ax_start) is already in r0, so there's no need to move it. .endfunc + +.section .bss + +.align + +__ax_font: + .byte + .byte + .short + .word diff --git a/ax/source/setjmp/longjmp.s b/ax/source/setjmp/longjmp.s new file mode 100644 index 0000000..c69193b --- /dev/null +++ b/ax/source/setjmp/longjmp.s @@ -0,0 +1,19 @@ +@ Copyright 2022 Gabriel Jensen. +@ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. + +.syntax unified + +.cpu arm7tdmi +.arm + +.globl longjmp + +.func + +longjmp: + ldm r0,{r4,r5,r6,r7,r8,r9,r10,fp,ip,sp,lr} @ Load registers from buffer. + mov r0,r1 @ Set the return code for setjmp. + bx lr @ We loaded the return address of setjmp. + +.endfunc diff --git a/ax/source/setjmp/setjmp.s b/ax/source/setjmp/setjmp.s new file mode 100644 index 0000000..715b536 --- /dev/null +++ b/ax/source/setjmp/setjmp.s @@ -0,0 +1,19 @@ +@ Copyright 2022 Gabriel Jensen. +@ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. + +.syntax unified + +.cpu arm7tdmi +.arm + +.globl setjmp + +.func + +setjmp: + stm r0,{r4,r5,r6,r7,r8,r9,r10,fp,ip,sp,lr} @ Save the registers into the registers. + mov r0,0x0 @ Set the return code. + bx lr + +.endfunc diff --git a/ax/source/stdlib/memalignement.c b/ax/source/stdlib/memalignement.c new file mode 100644 index 0000000..59eea8d --- /dev/null +++ b/ax/source/stdlib/memalignement.c @@ -0,0 +1,21 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#include <ax/priv.h> + +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> + +size_t memalignment(void const * const _p) { + if (_p == nullptr) { + return 0x0u; + } + uintptr_t const ptr = (uintptr_t)_p; + size_t algn; + for (algn = alignof (max_align_t);(ptr & (algn - 0x1u)) == 0x0u;algn >>= 0x1u) {} /* Check if the pointer value is a multiple of the alignment. We know that all alignments are powers of two. */ + return algn; +} diff --git a/ax/source/string/memcpy.c b/ax/source/string/memcpy.c new file mode 100644 index 0000000..c38ca09 --- /dev/null +++ b/ax/source/string/memcpy.c @@ -0,0 +1,15 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#include <ax/priv.h> + +#include <ax/algo.h> +#include <string.h> + +void * memcpy(void * const restrict _dest,void const * const restrict _src,size_t const _count) { + ax_cp(_src,_count,_dest); + return _dest; +} diff --git a/ax/source/string/memset.c b/ax/source/string/memset.c new file mode 100644 index 0000000..3bf5545 --- /dev/null +++ b/ax/source/string/memset.c @@ -0,0 +1,16 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#include <ax/priv.h> + +#include <ax/algo.h> +#include <string.h> + +void * memset(void * const _dest,int const _ch,size_t const _count) { + unsigned char const byte = (unsigned char)_ch; + ax_fill(_dest,_count,byte); + return _dest; +} diff --git a/ax/source/string/memset_explicit.s b/ax/source/string/memset_explicit.s new file mode 100644 index 0000000..36590be --- /dev/null +++ b/ax/source/string/memset_explicit.s @@ -0,0 +1,20 @@ +@ Copyright 2022 Gabriel Jensen. +@ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +@ If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. + +.syntax unified + +.cpu arm7tdmi +.thumb + +.extern memset + +.globl memset_explicit + +.func +.thumb_func + +memset_explicit: + b memset + +.endfunc diff --git a/ax/source/string/strlen.c b/ax/source/string/strlen.c new file mode 100644 index 0000000..401a8a4 --- /dev/null +++ b/ax/source/string/strlen.c @@ -0,0 +1,16 @@ +/* + Copyright 2022 Gabriel Jensen. + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>. +*/ + +#include <ax/priv.h> + +#include <ax/algo.h> +#include <string.h> + +size_t strlen(char const * const _s) { + char const * pos = _s; + while (*pos++) {} + return (size_t)(pos - _s); +} diff --git a/demo/GNUmakefile b/demo/GNUmakefile index d5c5a81..31b7b87 100644 --- a/demo/GNUmakefile +++ b/demo/GNUmakefile @@ -5,25 +5,25 @@ # TOOLS AS := arm-none-eabi-as -CC := clang --target=arm-none-eabi -#CC := arm-none-eabi-gcc +CC := arm-none-eabi-gcc +#CC := clang --target=arm-none-eabi LD := arm-none-eabi-ld OBJCOPY := arm-none-eabi-objcopy # TOOL FLAGS CFLAGS := \ - -I../ax/include \ - -Iinclude \ - -O3 \ - -Wall \ - -Wextra \ - -Wpedantic \ - -Wno-gnu-binary-literal \ - -Wno-gnu-empty-initializer \ - -fshort-enums \ - -mcpu=arm7tdmi \ - -nostdlib \ + -I../ax/include \ + -Iinclude \ + -Oz \ + -Wall \ + -Wextra \ + -Wpedantic \ + -ffreestanding \ + -fshort-enums \ + -mcpu=arm7tdmi \ + -mthumb \ + -nostdlib \ -std=c2x LDFLAGS := \ diff --git a/demo/script.ld b/demo/script.ld index c5dbf9a..6eb58e4 100644 --- a/demo/script.ld +++ b/demo/script.ld @@ -1,20 +1,20 @@ OUTPUT_ARCH(arm) MEMORY { - bios : ORIGIN = 0x0000000,LENGTH = 0x10K - ewram : ORIGIN = 0x2000000,LENGTH = 0x100K - iwram : ORIGIN = 0x3000000,LENGTH = 0x20K + bios : ORIGIN = 0x0000000,LENGTH = 0x4000 + ewram : ORIGIN = 0x2000000,LENGTH = 0x40000 + iwram : ORIGIN = 0x3000000,LENGTH = 0x8000 io : ORIGIN = 0x4000000,LENGTH = 0x3FF - pal : ORIGIN = 0x5000000,LENGTH = 0x1K - vram : ORIGIN = 0x6000000,LENGTH = 0x60K - oam : ORIGIN = 0x7000000,LENGTH = 0x1K - rom : ORIGIN = 0x8000000,LENGTH = 0x20M - sram : ORIGIN = 0xE000000,LENGTH = 0x40K + pal : ORIGIN = 0x5000000,LENGTH = 0x400 + vram : ORIGIN = 0x6000000,LENGTH = 0x18000 + oam : ORIGIN = 0x7000000,LENGTH = 0x400 + rom : ORIGIN = 0x8000000,LENGTH = 0x2000000 + sram : ORIGIN = 0xE000000,LENGTH = 0x10000 } SECTIONS { - .bss : {*(.bss*)} > ewram - .data : {*(.data*)} > ewram + .bss : {*(.bss*)} > iwram + .data : {*(.data*)} > iwram .text : {*(.text*)} > rom .rodata : {*(.rodata*)} > rom } diff --git a/demo/source/chgcol.c b/demo/source/chgcol.c index 6b99abb..b486891 100644 --- a/demo/source/chgcol.c +++ b/demo/source/chgcol.c @@ -3,7 +3,7 @@ #include <ax/gfx.h> void axd_chgcol(axd_dat * _dat,ax_i8 const _dir) { - constexpr ax_i8 maxcol = 0xEu; + constexpr ax_i8 maxcol = 0x10u; ax_i8 col = _dat->col; if (!_dir) { if (!col) {col = maxcol;} diff --git a/demo/source/chkkeys.c b/demo/source/chkkeys.c index 2de80bd..8731dd6 100644 --- a/demo/source/chkkeys.c +++ b/demo/source/chkkeys.c @@ -30,28 +30,28 @@ axd_upd axd_chkkeys(axd_dat * _dat) { return upd; } axd_chk(ax_key_pade) { - if (_dat->pos.x != 0xEEu) { + if (_dat->pos.x != 0xEDu) { upd.mv = true; ++_dat->pos.x; return upd; } } axd_chk(ax_key_padn) { - if (_dat->pos.y != 0x1u) { + if (_dat->pos.y != 0x2u) { upd.mv = true; --_dat->pos.y; return upd; } } axd_chk(ax_key_pads) { - if (_dat->pos.y != 0x9Eu) { + if (_dat->pos.y != 0x9Du) { upd.mv = true; ++_dat->pos.y; return upd; } } axd_chk(ax_key_padw) { - if (_dat->pos.x != 0x1u) { + if (_dat->pos.x != 0x2u) { upd.mv = true; --_dat->pos.x; return upd; diff --git a/demo/source/initdat.c b/demo/source/initdat.c index 4d0b420..c6e8749 100644 --- a/demo/source/initdat.c +++ b/demo/source/initdat.c @@ -4,7 +4,7 @@ void axd_initdat(axd_dat * const _dat) { _dat->col = 0x4u; - _dat->pos.x = 0x1u; - _dat->pos.y = 0x1u; + _dat->pos.x = 0x2u; + _dat->pos.y = 0x2u; _dat->vaddr = 0x600'0000u; } diff --git a/demo/source/initgfx.c b/demo/source/initgfx.c index de95d29..136e52f 100644 --- a/demo/source/initgfx.c +++ b/demo/source/initgfx.c @@ -23,7 +23,7 @@ void axd_initgfx(void) { ax_setcol(0x0Cu,ax_col(0x04u,0x11u,0x0Du)); /* Teal */ ax_setcol(0x0Du,ax_col(0x04u,0x08u,0x16u)); /* Blue */ ax_setcol(0x0Eu,ax_col(0x08u,0x05u,0x10u)); /* Violet */ - ax_setcol(0x0Fu,ax_col(0x0Au,0x05u,0x11u)); /* Purple */ - ax_setcol(0x10u,ax_col(0x11u,0x03u,0x15u)); /* Magenta */ + ax_setcol(0x0Fu,ax_col(0x13u,0x09u,0x17u)); /* Purple */ + ax_setcol(0x10u,ax_col(0x1Bu,0x03u,0x15u)); /* Magenta */ ax_clrscrn1(0x600'0000u,0x4u); } diff --git a/demo/source/start.c b/demo/source/start.c index f7c2d0d..eb4bb9d 100644 --- a/demo/source/start.c +++ b/demo/source/start.c @@ -3,50 +3,107 @@ #include <ax/key.h> #include <ax/gfx.h> -static ax_i8 const axd_logo[] = { - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, +#include <float.h> +#include <iso646.h> +#include <limits.h> +#include <setjmp.h> +#include <stdalign.h> +#include <stdarg.h> +#include <stdbit.h> +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdnoreturn.h> +#include <string.h> + +/*static ax_i8 const axd_logo[] = { + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x00u, 0x04u,0x04u,0x04u,0x00u,0x04u,0x04u,0x04u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x00u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x04u,0x04u,0x04u,0x00u,0x04u,0x04u,0x04u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, - 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x00u, + 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, - 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x04u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x04u, - 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, - 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, - 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x04u,0x04u,0x04u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, - 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x00u,0x00u,0x04u,0x00u,0x04u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, - 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, - 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x04u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x04u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x04u, 0x04u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x0Eu,0x0Eu,0x04u,0x0Eu,0x04u,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, + 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x04u, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x04u, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x04u, 0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x04u, +};*/ + +static ax_i8 const axd_logo[] = { + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu, + 0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu, + 0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x02u,0x04u,0x04u,0x01u,0x0Eu, + 0x02u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x02u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x01u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x01u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu, + 0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x03u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x03u, }; -constexpr ax_i8 axd_logow = (0x7u * 0x4u) + (0x1u * 0x5u); -constexpr ax_i8 axd_logoh = (0x7u * 0x2u) + (0x2u) + (0x1u * 0x2u); +#define axd_logow ((ax_i8)+0x5Bu) +#define axd_logoh ((ax_i8)+0x28u) static_assert(sizeof (axd_logo) == axd_logow * axd_logoh); static ax_i8 const axd_startmsg[] = { - 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, - 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x00u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x00u,0x00u,0x04u,0x04u, - 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x00u,0x04u,0x04u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x00u,0x04u,0x04u, - 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x04u,0x04u,0x04u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, - 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x04u,0x04u,0x04u,0x04u, - 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x04u,0x04u,0x04u, - 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x00u,0x00u,0x00u,0x00u, 0x0u, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x00u,0x00u,0x04u,0x00u,0x00u,0x00u, 0x0u, 0x00u,0x04u,0x04u,0x04u,0x04u,0x04u,0x00u, 0x0u, 0x04u,0x04u,0x00u,0x00u,0x00u,0x04u,0x04u, + 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, + 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x04u,0x04u, + 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x0Eu,0x04u,0x04u, + 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, + 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x04u,0x04u,0x04u,0x04u, + 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x04u,0x04u,0x04u, + 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x04u,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x0Eu,0x0Eu,0x04u,0x0Eu,0x0Eu,0x0Eu, 0x0Eu, 0x0Eu,0x04u,0x04u,0x04u,0x04u,0x04u,0x0Eu, 0x0Eu, 0x04u,0x04u,0x0Eu,0x0Eu,0x0Eu,0x04u,0x04u, }; constexpr ax_i8 axd_startmsgw = (0x7u * 0x10u) + (0x1u * 0xFu); constexpr ax_i8 axd_startmsgh = (0x7u * 0x1u); -static_assert(sizeof (axd_startmsg) == axd_startmsgw * axd_startmsgh); +//static_assert(sizeof (axd_startmsg) == axd_startmsgw * axd_startmsgh); ax_err ax_start(void) { axd_dat dat; @@ -54,7 +111,7 @@ ax_err ax_start(void) { axd_initgfx(); ax_vsync(); ax_blnk(); - ax_clrscrn1(dat.vaddr,0x0u); + ax_clrscrn1(dat.vaddr,0xEu); ax_plottex1(dat.vaddr,ax_scrnw3,axd_logo,ax_coord(ax_scrnw3,ax_scrnw3 / 0x2u - axd_logow / 0x2u,ax_scrnh3 / 0x2u - axd_logoh / 0x2u),axd_logow,axd_logoh); ax_plottex1(dat.vaddr,ax_scrnw3,axd_startmsg,ax_coord(ax_scrnw3,ax_scrnw3 / 0x2u - axd_startmsgw / 0x2u,ax_scrnh3 - 0x7u - axd_startmsgh),axd_startmsgw,axd_startmsgh); ax_key startkey; @@ -102,21 +159,22 @@ ax_err ax_start(void) { } } ax_vsync(); - ax_rec1(dat.vaddr,ax_scrnw3,ax_coord(ax_scrnw3,ax_scrnw3 / 0x2u - axd_startmsgw / 0x2u,ax_scrnh3 - 0x7u - axd_startmsgh),axd_startmsgw,axd_startmsgh,0x0u); - for (;;) { /* Wait for the key to be released. */ - ax_keymap const keymap = ax_getkeymap(); - if (!ax_chkkey(keymap,startkey)) { - break; - } - } + ax_rec1(dat.vaddr,ax_scrnw3,ax_coord(ax_scrnw3,ax_scrnw3 / 0x2u - axd_startmsgw / 0x2u,ax_scrnh3 - 0x7u - axd_startmsgh),axd_startmsgw,axd_startmsgh,0xEu); + while (ax_chkkey(ax_getkeymap(),startkey)) {} /* Wait for the key to be released. */ ax_clrscrn1(dat.vaddr,0x0u); bool const err = axd_loop(&dat); if (err) { - for (ax_i01 px = 0x0u;px != 0x9600u;++px) { - ax_plot1(dat.vaddr,px,dat.col); - axd_chgcol(&dat,0x1u); - } - return ax_err_max; + ax_i8 x; + x = dat.pos.x; + x -= 0x2u; + x &= 0b00001111u; + ax_i8 y; + y = dat.pos.y; + y -= 0x2u; + y &= 0b00001111u; + y <<= 0x4u; + ax_i8 const err = x | y; + return (ax_err)err; } return ax_err_ok; } |