From c66e9a06cff8d3522b5031771ba99ccefd10eaad Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sat, 14 Oct 2017 01:41:51 +0300 Subject: [PATCH] Added basic menu --- SDL/font.c | 1594 +++++++++++++++++++++++++++------------------------- SDL/font.h | 7 +- SDL/gui.c | 213 +++++-- SDL/gui.h | 15 +- SDL/main.c | 30 +- 5 files changed, 1013 insertions(+), 846 deletions(-) diff --git a/SDL/font.c b/SDL/font.c index fe6bbe7..1ee3999 100644 --- a/SDL/font.c +++ b/SDL/font.c @@ -5,952 +5,1024 @@ uint8_t font[] = { /* */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* ! */ - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* " */ - X, X, _, X, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + X, X, _, X, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* # */ - _, X, _, X, _, _ , - _, X, _, X, _, _ , - X, X, X, X, X, _ , - _, X, _, X, _, _ , - X, X, X, X, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, _, _, _, _ , + _, X, _, X, _, _, + _, X, _, X, _, _, + X, X, X, X, X, _, + _, X, _, X, _, _, + X, X, X, X, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, _, _, _, _, /* $ */ - _, _, X, _, _, _ , - _, X, X, X, _, _ , - X, _, X, _, X, _ , - _, X, X, _, _, _ , - _, _, X, X, _, _ , - X, _, X, _, X, _ , - _, X, X, X, _, _ , - _, _, X, _, _, _ , + _, _, X, _, _, _, + _, X, X, X, _, _, + X, _, X, _, X, _, + _, X, X, _, _, _, + _, _, X, X, _, _, + X, _, X, _, X, _, + _, X, X, X, _, _, + _, _, X, _, _, _, /* % */ - _, _, _, _, _, _ , - X, X, _, _, _, X , - X, X, _, _, X, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, _, X, X , - X, _, _, _, X, X , - _, _, _, _, _, _ , + _, _, _, _, _, _, + X, X, _, _, _, X, + X, X, _, _, X, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, X, _, _, X, X, + X, _, _, _, X, X, + _, _, _, _, _, _, /* & */ - _, X, X, _, _, _ , - X, _, _, X, _, _ , - X, _, _, X, _, _ , - _, X, X, _, X, _ , - X, _, _, X, _, _ , - X, _, _, X, _, _ , - _, X, X, _, X, _ , - _, _, _, _, _, _ , + _, X, X, _, _, _, + X, _, _, X, _, _, + X, _, _, X, _, _, + _, X, X, _, X, _, + X, _, _, X, _, _, + X, _, _, X, _, _, + _, X, X, _, X, _, + _, _, _, _, _, _, /* ' */ - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* ( */ - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, _, _ , + _, _, _, X, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, X, _, _, _, + _, _, _, X, _, _, /* ) */ - _, X, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , + _, X, _, _, _, _, + _, _, X, _, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, /* * */ - _, _, _, _, _, _ , - _, _, X, _, _, _ , - X, _, X, _, X, _ , - _, X, X, X, _, _ , - X, _, X, _, X, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, X, _, _, _, + X, _, X, _, X, _, + _, X, X, X, _, _, + X, _, X, _, X, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* + */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - X, X, X, X, X, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + X, X, X, X, X, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, - /* , */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , + /*, */ + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, /* - */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* . */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* / */ - _, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , + _, _, _, _, X, _, + _, _, _, _, X, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, /* 0 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* 1 */ - _, _, X, _, _, _ , - X, X, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + X, X, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* 2 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, X, X, _, _ , - _, X, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + _, _, _, _, X, _, + _, _, X, X, _, _, + _, X, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* 3 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, X, X, _, _ , - _, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + _, _, _, _, X, _, + _, _, X, X, _, _, + _, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* 4 */ - _, _, _, X, _, _ , - _, _, X, X, _, _ , - _, X, _, X, _, _ , - X, _, _, X, _, _ , - X, X, X, X, X, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, _, _, _ , + _, _, _, X, _, _, + _, _, X, X, _, _, + _, X, _, X, _, _, + X, _, _, X, _, _, + X, X, X, X, X, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, _, _, _, /* 5 */ - X, X, X, X, X, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, _, _ , - _, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, _, _, + _, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* 6 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, _, _ , - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, _, _, + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* 7 */ - X, X, X, X, X, _ , - _, _, _, _, X, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + _, _, _, _, X, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* 8 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* 9 */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, X, _ , - _, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, X, _, + _, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* : */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* ; */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, /* < */ - _, _, _, _, _, _ , - _, _, _, _, X, _ , - _, _, X, X, _, _ , - X, X, _, _, _, _ , - X, X, _, _, _, _ , - _, _, X, X, _, _ , - _, _, _, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, X, _, + _, _, X, X, _, _, + X, X, _, _, _, _, + X, X, _, _, _, _, + _, _, X, X, _, _, + _, _, _, _, X, _, + _, _, _, _, _, _, /* = */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* > */ - _, _, _, _, _, _ , - X, _, _, _, _, _ , - _, X, X, _, _, _ , - _, _, _, X, X, _ , - _, _, _, X, X, _ , - _, X, X, _, _, _ , - X, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + X, _, _, _, _, _, + _, X, X, _, _, _, + _, _, _, X, X, _, + _, _, _, X, X, _, + _, X, X, _, _, _, + X, _, _, _, _, _, + _, _, _, _, _, _, /* ? */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, X, X, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + _, _, _, _, X, _, + _, _, X, X, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* @ */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, X, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, _, X, X, _ , - X, _, _, _, _, _ , - _, X, X, X, X, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, X, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, _, X, X, _, + X, _, _, _, _, _, + _, X, X, X, X, _, /* A */ - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + _, _, X, _, _, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* B */ - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - _, _, _, _, _, _ , + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + _, _, _, _, _, _, /* C */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* D */ - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - _, _, _, _, _, _ , + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + _, _, _, _, _, _, /* E */ - X, X, X, X, X, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* F */ - X, X, X, X, X, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + _, _, _, _, _, _, /* G */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, _, _ , - X, _, X, X, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, _, _, + X, _, X, X, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* H */ - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* I */ - X, X, X, X, X, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* J */ - _, _, X, X, X, _ , - _, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, _, _, X, _ , - _, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, _, X, X, X, _, + _, _, _, _, X, _, + _, _, _, _, X, _, + _, _, _, _, X, _, + _, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* K */ - X, _, _, _, X, _ , - X, _, _, X, _, _ , - X, _, X, _, _, _ , - X, X, _, _, _, _ , - X, _, X, _, _, _ , - X, _, _, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, X, _, _, + X, _, X, _, _, _, + X, X, _, _, _, _, + X, _, X, _, _, _, + X, _, _, X, _, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* L */ - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* M */ - X, _, _, _, X, _ , - X, X, _, X, X, _ , - X, X, _, X, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, X, _, X, X, _, + X, X, _, X, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* N */ - X, _, _, _, X, _ , - X, X, _, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, _, X, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, X, _, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, _, X, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* O */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* P */ - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - X, _, _, _, _, _ , - X, _, _, _, _, _ , - _, _, _, _, _, _ , + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + _, _, _, _, _, _, /* Q */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, X, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, X, X , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, X, _, X, _, + _, X, X, X, _, _, + _, _, _, _, X, X, /* R */ - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - X, _, X, _, _, _ , - X, _, _, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + X, _, X, _, _, _, + X, _, _, X, _, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* S */ - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, _, _ , - _, X, X, X, _, _ , - _, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, _, _, + _, X, X, X, _, _, + _, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* T */ - X, X, X, X, X, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* U */ - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* V */ - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* W */ - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, X, _, X, X, _ , - X, X, _, X, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, X, _, X, X, _, + X, X, _, X, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* X */ - X, _, _, _, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, X, _, _, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* Y */ - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, _, X, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, _, X, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* Z */ - X, X, X, X, X, _ , - _, _, _, _, X, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , - X, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + X, X, X, X, X, _, + _, _, _, _, X, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, + X, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* [ */ - _, X, X, X, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, X, X, _, _ , + _, X, X, X, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, X, X, _, _, /* \ */ - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, _, X, _ , - _, _, _, _, X, _ , + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, _, X, _, + _, _, _, _, X, _, /* ] */ - _, X, X, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, X, X, X, _, _ , + _, X, X, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, X, X, X, _, _, /* ^ */ - _, _, X, _, _, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* _ */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, X, X , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, X, X, /* ` */ - _, X, _, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, X, _, _, _, _, + _, _, X, _, _, _, + _, _, _, X, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, /* a */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, _, _, _ , - _, _, _, X, _, _ , - _, X, X, X, _, _ , - X, _, _, X, _, _ , - _, X, X, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, _, _, _, + _, _, _, X, _, _, + _, X, X, X, _, _, + X, _, _, X, _, _, + _, X, X, _, X, _, + _, _, _, _, _, _, /* b */ - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, X, X, _, _ , - X, X, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, X, X, _, _ , - _, _, _, _, _, _ , + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, X, X, _, _, + X, X, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, X, X, _, _, + _, _, _, _, _, _, /* c */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, _, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, _, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* d */ - _, _, _, _, X, _ , - _, _, _, _, X, _ , - _, X, X, X, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, X, _ , - _, _, _, _, _, _ , + _, _, _, _, X, _, + _, _, _, _, X, _, + _, X, X, X, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, X, _, + _, _, _, _, _, _, /* e */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, X, X, X, X, _ , - X, _, _, _, _, _ , - _, X, X, X, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, _, _, + X, _, _, _, X, _, + X, X, X, X, X, _, + X, _, _, _, _, _, + _, X, X, X, X, _, + _, _, _, _, _, _, /* f */ - _, _, X, X, _, _ , - _, X, _, _, _, _ , - X, X, X, X, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, _, _, _, _ , + _, _, X, X, _, _, + _, X, _, _, _, _, + X, X, X, X, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, _, _, _, _, /* g */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, X, _ , - X, _, _, X, _, _ , - _, X, X, _, _, _ , - _, _, _, X, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, X, _, + X, _, _, X, _, _, + _, X, X, _, _, _, + _, _, _, X, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, /* h */ - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, X, X, _, _ , - X, X, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, X, X, _, _, + X, X, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* i */ - _, _, X, _, _, _ , - _, _, _, _, _, _ , - X, X, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, X, _, _, _, + _, _, _, _, _, _, + X, X, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* j */ - _, _, X, _, _, _ , - _, _, _, _, _, _ , - X, X, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - X, X, _, _, _, _ , + _, _, X, _, _, _, + _, _, _, _, _, _, + X, X, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + X, X, _, _, _, _, /* k */ - X, _, _, _, _, _ , - X, _, _, _, _, _ , - X, _, _, _, X, _ , - X, _, X, X, _, _ , - X, X, _, _, _, _ , - X, _, X, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, X, _, + X, _, X, X, _, _, + X, X, _, _, _, _, + X, _, X, X, _, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* l */ - X, X, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, X, _ , - _, _, _, _, _, _ , + X, X, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, X, X, _, + _, _, _, _, _, _, /* m */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, _, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, _, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + _, _, _, _, _, _, /* n */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, X, X, _, _ , - X, X, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, X, X, _, _, + X, X, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* o */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, X, X, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, X, X, _, _, + _, _, _, _, _, _, /* p */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, X, _, _, X, _ , - X, _, X, X, _, _ , - X, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, X, _, _, X, _, + X, _, X, X, _, _, + X, _, _, _, _, _, /* q */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, X, X, _ , - _, X, X, _, X, _ , - _, _, _, _, X, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, X, X, _, + _, X, X, _, X, _, + _, _, _, _, X, _, /* r */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, _, X, _, _ , - _, X, X, _, X, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, _, X, _, _, + _, X, X, _, X, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, _, _, _, _, /* s */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, X, X, X, X, _ , - X, _, _, _, _, _ , - _, X, X, X, _, _ , - _, _, _, _, X, _ , - X, X, X, X, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + _, X, X, X, X, _, + X, _, _, _, _, _, + _, X, X, X, _, _, + _, _, _, _, X, _, + X, X, X, X, _, _, + _, _, _, _, _, _, /* t */ - _, _, _, _, _, _ , - _, X, _, _, _, _ , - X, X, X, X, X, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, X, X, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, X, _, _, _, _, + X, X, X, X, X, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, X, X, X, _, + _, _, _, _, _, _, /* u */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, X, X, _ , - _, X, X, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, X, X, _, + _, X, X, _, X, _, + _, _, _, _, _, _, /* v */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, X, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, X, _, _, _, + _, _, _, _, _, _, /* w */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, _, _, X, _ , - X, _, X, _, X, _ , - X, _, X, _, X, _ , - _, X, _, X, _, _ , - _, X, _, X, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, _, _, X, _, + X, _, X, _, X, _, + X, _, X, _, X, _, + _, X, _, X, _, _, + _, X, _, X, _, _, + _, _, _, _, _, _, /* x */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, _, _, X, _ , - _, X, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, X, _, _ , - X, _, _, _, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, _, _, X, _, + _, X, _, X, _, _, + _, _, X, _, _, _, + _, X, _, X, _, _, + X, _, _, _, X, _, + _, _, _, _, _, _, /* y */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, _, _, _, X, _ , - X, _, _, _, X, _ , - X, _, _, X, X, _ , - _, X, X, _, X, _ , - _, _, _, _, X, _ , - _, X, X, X, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, _, _, _, X, _, + X, _, _, _, X, _, + X, _, _, X, X, _, + _, X, X, _, X, _, + _, _, _, _, X, _, + _, X, X, X, _, _, /* z */ - _, _, _, _, _, _ , - _, _, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , - X, X, X, X, X, _ , - _, _, _, _, _, _ , + _, _, _, _, _, _, + _, _, _, _, _, _, + X, X, X, X, X, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, + X, X, X, X, X, _, + _, _, _, _, _, _, /* { */ - _, _, X, X, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, X, _, _, _, _ , - _, X, _, _, _, _ , - _, _, X, X, _, _ , + _, _, X, X, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, X, _, _, _, _, + _, X, _, _, _, _, + _, _, X, X, _, _, /* | */ - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, /* } */ - _, X, X, _, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, _, X, _, _, _ , - _, _, X, _, _, _ , - _, _, _, X, _, _ , - _, _, _, X, _, _ , - _, X, X, _, _, _ , + _, X, X, _, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + _, _, _, X, _, _, + _, _, _, X, _, _, + _, X, X, _, _, _, /* ~ */ - _, _, _, _, _, X , - _, _, _, _, _, _ , - _, _, X, _, _, X , - _, X, _, X, _, X , - _, X, _, _, X, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , - _, _, _, _, _, _ , + _, _, _, _, _, X, + _, _, _, _, _, _, + _, _, X, _, _, X, + _, X, _, X, _, X, + _, X, _, _, X, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, _, + + /* Custom characters */ + /* Selection */ + _, X, _, _, _, _, + _, X, X, _, _, _, + _, X, X, X, _, _, + _, X, X, X, X, _, + _, X, X, X, _, _, + _, X, X, _, _, _, + _, X, _, _, _, _, + _, _, _, _, _, _, + + + /* CTRL symbol */ + _, X, X, X, _, X, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + X, _, _, _, _, _, + _, X, X, X, _, _, + _, _, _, _, _, _, + + X, X, _, X, X, X, + X, _, _, X, _, _, + X, _, _, X, _, _, + X, _, _, X, _, _, + X, _, _, X, X, X, + X, _, _, X, _, X, + X, _, _, X, _, _, + _, _, _, _, _, _, + + _, _, X, _, _, _, + X, _, X, _, _, _, + X, _, X, _, _, _, + X, _, X, _, _, _, + _, _, X, _, _, _, + _, _, X, _, _, _, + X, _, X, X, X, X, + _, _, _, _, _, _, + + /* Shift symbol */ + _, _, X, X, _, _, + _, X, X, X, X, _, + X, X, X, X, X, X, + _, X, X, X, X, _, + _, X, X, X, X, _, + _, X, X, X, X, _, + _, X, X, X, X, _, + _, _, _, _, _, _, + + /* Cmd symbol */ + + _, _, _, _, _, X, + _, _, _, _, X, _, + _, _, _, _, _, X, + _, _, _, _, _, _, + _, _, _, _, _, _, + _, _, _, _, _, X, + _, _, _, _, X, _, + _, _, _, _, _, X, + + _, _, _, _, X, _, + X, _, _, X, _, X, + X, X, X, X, X, _, + X, _, _, X, _, _, + X, _, _, X, _, _, + X, X, X, X, X, _, + X, _, _, X, _, X, + _, _, _, _, X, _, }; + +const uint8_t font_max = sizeof(font) / GLYPH_HEIGHT / GLYPH_WIDTH + ' '; diff --git a/SDL/font.h b/SDL/font.h index 0c2c78a..e4bc9ca 100644 --- a/SDL/font.h +++ b/SDL/font.h @@ -3,7 +3,12 @@ #include extern uint8_t font[]; +extern const uint8_t font_max; #define GLYPH_HEIGHT 8 #define GLYPH_WIDTH 6 - +#define SELECTION_STRING "\x7f" +#define CTRL_STRING "\x80\x81\x82" +#define SHIFT_STRING "\x83" +#define CMD_STRING "\x84\x85" #endif /* font_h */ + diff --git a/SDL/gui.c b/SDL/gui.c index dab10ef..afb9c5d 100644 --- a/SDL/gui.c +++ b/SDL/gui.c @@ -12,39 +12,48 @@ SDL_Renderer *renderer = NULL; SDL_Texture *texture = NULL; SDL_PixelFormat *pixel_format = NULL; enum scaling_mode scaling_mode = GB_SDL_SCALING_INTEGER_FACTOR; +enum pending_command pending_command; +unsigned command_parameter; #ifdef __APPLE__ -#define MODIFIER_NAME "Cmd" +#define MODIFIER_NAME " " CMD_STRING #else -#define MODIFIER_NAME "Ctrl" +#define MODIFIER_NAME CTRL_STRING #endif -static const char help[] = -"Drop a GB or GBC ROM file to play.\n" +static const char *help[] ={ +"Drop a GB or GBC ROM\n" +"file to play.\n" "\n" + "Controls:\n" -" D-Pad: Arrow Keys\n" -" A: X\n" -" B: Z\n" -" Start: Enter\n" -" Select: Backspace\n" +" D-Pad: Arrow Keys\n" +" A: X\n" +" B: Z\n" +" Start: Enter\n" +" Select: Backspace\n" "\n" +" Turbo: Space\n" +" Menu: Escape\n", "Keyboard Shortcuts: \n" -" Restart: " MODIFIER_NAME "+R\n" -" Pause: " MODIFIER_NAME "+P\n" -" Turbo: Space\n" +" Reset: " MODIFIER_NAME "+R\n" +" Pause: " MODIFIER_NAME "+P\n" +" Toggle DMG/CGB: " MODIFIER_NAME "+T\n" +"\n" +" Save state: " MODIFIER_NAME "+(0-9)\n" +" Load state: " MODIFIER_NAME "+" SHIFT_STRING "+(0-9)\n" +"\n" #ifdef __APPLE__ -" Mute/Unmute: " MODIFIER_NAME "+Shift+M\n" +" Mute/Unmute: " MODIFIER_NAME "+" SHIFT_STRING "+M\n" #else -" Mute/Unmute: " MODIFIER_NAME "+M\n" +" Mute/Unmute: " MODIFIER_NAME "+M\n" #endif -" Save state: " MODIFIER_NAME "+Number (0-9)\n" -" Load state: " MODIFIER_NAME "+Shift+Number (0-9)\n" -" Cycle between DMG/CGB emulation: " MODIFIER_NAME "+T\n" -" Cycle scaling modes: Tab" -; +" Cycle scaling modes: Tab" +"\n" +" Break Debugger: " CTRL_STRING "+C" +}; void cycle_scaling(void) { @@ -85,15 +94,10 @@ void update_viewport(void) SDL_RenderSetViewport(renderer, &rect); } -void show_help(void) -{ - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Help", help, window); -} - /* Does NOT check for bounds! */ static void draw_char(uint32_t *buffer, unsigned char ch, uint32_t color) { - if (ch < ' ' || ch > '~') { + if (ch < ' ' || ch > font_max) { ch = '?'; } @@ -110,17 +114,7 @@ static void draw_char(uint32_t *buffer, unsigned char ch, uint32_t color) } } -/* Does NOT check for bounds! */ -static void draw_bordered_char(uint32_t *buffer, unsigned char ch, uint32_t color, uint32_t border) -{ - draw_char(buffer - 1, ch, border); - draw_char(buffer + 1, ch, border); - draw_char(buffer - 160, ch, border); - draw_char(buffer + 160, ch, border); - draw_char(buffer, ch, color); -} - -static void draw_text(uint32_t *buffer, unsigned x, unsigned y, const char *string, uint32_t color, uint32_t border) +static void draw_unbordered_text(uint32_t *buffer, unsigned x, unsigned y, const char *string, uint32_t color) { unsigned orig_x = x; while (*string) { @@ -131,24 +125,75 @@ static void draw_text(uint32_t *buffer, unsigned x, unsigned y, const char *stri continue; } - if (x == 0 || x > 160 - GLYPH_WIDTH - 1 || y == 0 || y > 144 - GLYPH_HEIGHT - 1) { + if (x > 160 - GLYPH_WIDTH || y == 0 || y > 144 - GLYPH_HEIGHT) { break; } - draw_bordered_char(&buffer[x + 160 * y], *string, color, border); + draw_char(&buffer[x + 160 * y], *string, color); x += GLYPH_WIDTH; string++; } } -static void draw_text_centered(uint32_t *buffer, unsigned y, const char *string, uint32_t color, uint32_t border) +static void draw_text(uint32_t *buffer, unsigned x, unsigned y, const char *string, uint32_t color, uint32_t border) { - draw_text(buffer, 160 / 2 - (unsigned) strlen(string) * GLYPH_WIDTH / 2, y, string, color, border); + draw_unbordered_text(buffer, x - 1, y, string, border); + draw_unbordered_text(buffer, x + 1, y, string, border); + draw_unbordered_text(buffer, x, y - 1, string, border); + draw_unbordered_text(buffer, x, y + 1, string, border); + draw_unbordered_text(buffer, x, y, string, color); } +static void draw_text_centered(uint32_t *buffer, unsigned y, const char *string, uint32_t color, uint32_t border, bool show_selection) +{ + unsigned x = 160 / 2 - (unsigned) strlen(string) * GLYPH_WIDTH / 2; + draw_text(buffer, x, y, string, color, border); + if (show_selection) { + draw_text(buffer, x - GLYPH_WIDTH, y, SELECTION_STRING, color, border); + } +} + +struct menu_item { + const char *string; + void (*handler)(void); +}; +static const struct menu_item *current_menu = NULL; +static unsigned current_selection = 0; + +static enum { + SHOWING_DROP_MESSAGE, + SHOWING_MENU, + SHOWING_HELP, +} gui_state; + +static void item_exit(void) +{ + exit(0); +} + +static unsigned current_help_page = 0; +static void item_help(void) +{ + current_help_page = 0; + gui_state = SHOWING_HELP; +} + +static const struct menu_item paused_menu[] = { + {"Resume", NULL}, + {"Help", item_help}, + {"Exit", item_exit}, + {NULL,} +}; + +static const struct menu_item nonpaused_menu[] = { + {"Help", item_help}, + {"Exit", item_exit}, + {NULL,} +}; + extern void set_filename(const char *new_filename, bool new_should_free); -void run_gui(void) +void run_gui(bool is_running) { /* Draw the "Drop file" screen */ static SDL_Surface *converted_background = NULL; @@ -165,18 +210,37 @@ void run_gui(void) } uint32_t pixels[160 * 144]; - memcpy(pixels, converted_background->pixels, sizeof(pixels)); - - draw_text_centered(pixels, 116, "Drop a GB or GBC", gui_palette_native[3], gui_palette_native[0]); - draw_text_centered(pixels, 128, "file to play", gui_palette_native[3], gui_palette_native[0]); - - SDL_UpdateTexture(texture, NULL, pixels, 160 * sizeof (uint32_t)); - SDL_RenderClear(renderer); - SDL_RenderCopy(renderer, texture, NULL, NULL); - SDL_RenderPresent(renderer); - SDL_Event event; + gui_state = is_running? SHOWING_MENU : SHOWING_DROP_MESSAGE; + bool should_render = true; + current_menu = is_running? paused_menu : nonpaused_menu; while (SDL_WaitEvent(&event)) { + if (should_render) { + should_render = false; + memcpy(pixels, converted_background->pixels, sizeof(pixels)); + + switch (gui_state) { + case SHOWING_DROP_MESSAGE: + draw_text_centered(pixels, 116, "Drop a GB or GBC", gui_palette_native[3], gui_palette_native[0], false); + draw_text_centered(pixels, 128, "file to play", gui_palette_native[3], gui_palette_native[0], false); + break; + case SHOWING_MENU: + draw_text_centered(pixels, 16, "SameBoy", gui_palette_native[3], gui_palette_native[0], false); + unsigned i = 0; + for (const struct menu_item *item = current_menu; item->string; item++, i++) { + draw_text_centered(pixels, 12 * i + 40, item->string, gui_palette_native[3], gui_palette_native[0], i == current_selection); + } + break; + case SHOWING_HELP: + draw_text(pixels, 2, 2, help[current_help_page], gui_palette_native[3], gui_palette_native[0]); + break; + } + + SDL_UpdateTexture(texture, NULL, pixels, 160 * sizeof (uint32_t)); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + } switch (event.type) { case SDL_QUIT: { exit(0); @@ -192,21 +256,54 @@ void run_gui(void) } case SDL_DROPFILE: { set_filename(event.drop.file, true); + pending_command = GB_SDL_NEW_FILE_COMMAND; return; } case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_TAB) { cycle_scaling(); } -#ifndef __APPLE__ - else if (event.key.keysym.sym == SDLK_F1) { - show_help(); + else if (event.key.keysym.sym == SDLK_ESCAPE) { + if (is_running) { + return; + } + else { + if (gui_state == SHOWING_DROP_MESSAGE) { + gui_state = SHOWING_MENU; + } + else if (gui_state == SHOWING_MENU) { + gui_state = SHOWING_DROP_MESSAGE; + } + should_render = true; + } } -#else - else if (event.key.keysym.sym == SDLK_QUESTION || (event.key.keysym.sym && (event.key.keysym.mod & KMOD_SHIFT))) { - show_help(); + + if (gui_state == SHOWING_MENU) { + if (event.key.keysym.sym == SDLK_DOWN && current_menu[current_selection + 1].string) { + current_selection++; + should_render = true; + } + else if (event.key.keysym.sym == SDLK_UP && current_selection) { + current_selection--; + should_render = true; + } + else if (event.key.keysym.sym == SDLK_RETURN) { + if (current_menu[current_selection].handler) { + current_menu[current_selection].handler(); + should_render = true; + } + else { + return; + } + } + } + else if(gui_state == SHOWING_HELP) { + current_help_page++; + if (current_help_page == sizeof(help) / sizeof(help[0])) { + gui_state = SHOWING_MENU; + } + should_render = true; } -#endif break; } } diff --git a/SDL/gui.h b/SDL/gui.h index 28ffc55..35458b3 100644 --- a/SDL/gui.h +++ b/SDL/gui.h @@ -17,9 +17,20 @@ enum scaling_mode { extern enum scaling_mode scaling_mode; +enum pending_command { + GB_SDL_NO_COMMAND, + GB_SDL_SAVE_STATE_COMMAND, + GB_SDL_LOAD_STATE_COMMAND, + GB_SDL_RESET_COMMAND, + GB_SDL_NEW_FILE_COMMAND, + GB_SDL_TOGGLE_MODEL_COMMAND, +}; + +extern enum pending_command pending_command; +extern unsigned command_parameter; + void update_viewport(void); void cycle_scaling(void); -void show_help(void); -void run_gui(void); +void run_gui(bool is_running); #endif diff --git a/SDL/main.c b/SDL/main.c index ebd2779..2ee4aa1 100755 --- a/SDL/main.c +++ b/SDL/main.c @@ -71,17 +71,6 @@ static const char *end_capturing_logs(bool show_popup, bool should_exit) return captured_log; } -static enum { - GB_SDL_NO_COMMAND, - GB_SDL_SAVE_STATE_COMMAND, - GB_SDL_LOAD_STATE_COMMAND, - GB_SDL_RESET_COMMAND, - GB_SDL_NEW_FILE_COMMAND, - GB_SDL_TOGGLE_MODEL_COMMAND, -} pending_command; - -static unsigned command_parameter; - static void handle_events(GB_gameboy_t *gb) { #ifdef __APPLE__ @@ -111,6 +100,10 @@ static void handle_events(GB_gameboy_t *gb) case SDL_KEYDOWN: switch (event.key.keysym.sym) { + case SDLK_ESCAPE: + run_gui(true); + break; + case SDLK_c: if (event.type == SDL_KEYDOWN && (event.key.keysym.mod & KMOD_CTRL)) { GB_debugger_break(gb); @@ -151,18 +144,6 @@ static void handle_events(GB_gameboy_t *gb) case SDLK_TAB: cycle_scaling(); break; -#ifndef __APPLE__ - case SDLK_F1: - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Help", help, window); - break; -#else - case SDLK_SLASH: - if (!(event.key.keysym.sym && (event.key.keysym.mod & KMOD_SHIFT))) { - break; - } - case SDLK_QUESTION: - show_help(); -#endif default: /* Save states */ @@ -292,6 +273,7 @@ static bool handle_pending_command(void) static void run(void) { + pending_command = GB_SDL_NO_COMMAND; restart: if (GB_is_inited(&gb)) { GB_switch_model_and_reset(&gb, !dmg); @@ -420,7 +402,7 @@ usage: SDL_EventState(SDL_DROPFILE, SDL_ENABLE); if (filename == NULL) { - run_gui(); + run_gui(false); } run(); // Never returns return 0;