From 0d20af47d6952c7b191715e29c3d9f232f44671f Mon Sep 17 00:00:00 2001 From: Stephen Crane Date: Wed, 12 Nov 2014 08:28:32 +0000 Subject: [PATCH] use smaller font; add shiftmap --- TinyFont.h | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ io.cpp | 97 ++++++++++++++++++++++++++++++++----------------- io.h | 10 +++--- 3 files changed, 173 insertions(+), 37 deletions(-) create mode 100644 TinyFont.h diff --git a/TinyFont.h b/TinyFont.h new file mode 100644 index 0000000..9dc8218 --- /dev/null +++ b/TinyFont.h @@ -0,0 +1,103 @@ +// TinyFont.c +// Font Size : 8x8 +// Memory usage : 764 bytes +// # characters : 95 + +const unsigned char TinyFont[764]={ +0x08,0x08,0x20,0x5F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // +0x18,0x3C,0x3C,0x18,0x18,0x00,0x18,0x00, // ! +0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00, // " +0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # +0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ +0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00, // % +0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00, // & +0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00, // ' +0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( +0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) +0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * +0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00, // + +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , +0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . +0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00, // / +0x7C,0xC6,0xCE,0xD6,0xE6,0xC6,0x7C,0x00, // 0 +0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00, // 1 +0x7C,0xC6,0x06,0x1C,0x30,0x66,0xFE,0x00, // 2 +0x7C,0xC6,0x06,0x3C,0x06,0xC6,0x7C,0x00, // 3 +0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00, // 4 +0xFE,0xC0,0xC0,0xFC,0x06,0xC6,0x7C,0x00, // 5 +0x38,0x60,0xC0,0xFC,0xC6,0xC6,0x7C,0x00, // 6 +0xFE,0xC6,0x0C,0x18,0x30,0x30,0x30,0x00, // 7 +0x7C,0xC6,0xC6,0x7C,0xC6,0xC6,0x7C,0x00, // 8 +0x7C,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00, // 9 +0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : +0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; +0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00, // < +0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = +0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00, // > +0x7C,0xC6,0x0C,0x18,0x18,0x00,0x18,0x00, // ? +0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00, // @ +0x38,0x6C,0xC6,0xFE,0xC6,0xC6,0xC6,0x00, // A +0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00, // B +0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00, // C +0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00, // D +0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00, // E +0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00, // F +0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3A,0x00, // G +0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00, // H +0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I +0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00, // J +0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00, // K +0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00, // L +0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00, // M +0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00, // N +0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00, // O +0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, // P +0x7C,0xC6,0xC6,0xC6,0xC6,0xCE,0x7C,0x0E, // Q +0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00, // R +0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00, // S +0x7E,0x7E,0x5A,0x18,0x18,0x18,0x3C,0x00, // T +0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00, // U +0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00, // V +0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00, // W +0xC6,0xC6,0x6C,0x38,0x6C,0xC6,0xC6,0x00, // X +0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y +0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00, // Z +0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ +0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00, // +0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, // ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ +0x30,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00, // a +0xE0,0x60,0x7C,0x66,0x66,0x66,0xDC,0x00, // b +0x00,0x00,0x7C,0xC6,0xC0,0xC6,0x7C,0x00, // c +0x1C,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00, // d +0x00,0x00,0x7C,0xC6,0xFE,0xC0,0x7C,0x00, // e +0x3C,0x66,0x60,0xF8,0x60,0x60,0xF0,0x00, // f +0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8, // g +0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00, // h +0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i +0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j +0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00, // k +0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l +0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0x00, // m +0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x00, // n +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0x00, // o +0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0, // p +0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E, // q +0x00,0x00,0xDC,0x76,0x60,0x60,0xF0,0x00, // r +0x00,0x00,0x7E,0xC0,0x7C,0x06,0xFC,0x00, // s +0x30,0x30,0xFC,0x30,0x30,0x36,0x1C,0x00, // t +0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00, // u +0x00,0x00,0xC6,0xC6,0xC6,0x6C,0x38,0x00, // v +0x00,0x00,0xC6,0xD6,0xD6,0xFE,0x6C,0x00, // w +0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00, // x +0x00,0x00,0xC6,0xC6,0xC6,0x7E,0x06,0xFC, // y +0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z +0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, // | +0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } +0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00, // ~ +}; diff --git a/io.cpp b/io.cpp index f4c9b3a..699fbc7 100644 --- a/io.cpp +++ b/io.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "io.h" #include "config.h" @@ -12,19 +13,27 @@ static unsigned kbd_int, dsp_out; #define ROWS 24 #define COLS 40 static unsigned r, c; -static char screen[ROWS * COLS]; +static char screen[ROWS][COLS]; + +#include "TinyFont.h" void io::reset() { + utft.setFont((uint8_t *)TinyFont); UTFTDisplay::begin(TFT_BG, TFT_FG); clear(); + r = c = 0; + for (int j = 0; j < ROWS; j++) + for (int i = 0; i < COLS; i++) + screen[j][i] = ' '; + + // PIA state dsp_cr = kbd_cr = 0; kbd_int = dsp_out = 0; - r = c = 0; } -// need ascii map for scan-codes -static const byte scanmap[] { +// ascii map for scan-codes +static const byte scanmap[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x00 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, // 0x08 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x31, 0xff, // 0x10 @@ -37,42 +46,73 @@ static const byte scanmap[] { 0xff, 0x2e, 0x2f, 0x4c, 0x3b, 0x50, 0x2d, 0xff, // 0x48 0xff, 0xff, 0x27, 0xff, 0x5b, 0x3d, 0xff, 0xff, // 0x50 0xff, 0xff, 0x0d, 0x5d, 0xff, 0x23, 0xff, 0xff, // 0x58 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, // 0x60 + 0xff, 0x5c, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, // 0x60 0xff, 0x31, 0xff, 0x34, 0x37, 0xff, 0xff, 0xff, // 0x68 0x30, 0xff, 0x32, 0x35, 0x36, 0x38, 0xff, 0xff, // 0x70 0xff, 0x2b, 0x33, 0x2d, 0x2a, 0x39, 0xff, 0xff, // 0x78 }; -void io::down(unsigned scan) { +static const byte shiftmap[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x00 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x08 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, // 0x10 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x22, 0xff, // 0x18 + 0xff, 0xff, 0xff, 0xff, 0xff, 0x24, 0x23, 0xff, // 0x20 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x25, 0xff, // 0x28 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, // 0x30 + 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x2a, 0xff, // 0x38 + 0xff, 0x3c, 0xff, 0xff, 0xff, 0x29, 0x28, 0xff, // 0x40 + 0xff, 0x3e, 0x3f, 0xff, 0x3a, 0xff, 0x5f, 0xff, // 0x48 + 0xff, 0xff, 0x40, 0xff, 0x7b, 0x2b, 0xff, 0xff, // 0x50 + 0xff, 0xff, 0xff, 0x7d, 0xff, 0x7e, 0xff, 0xff, // 0x58 + 0xff, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x60 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x68 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x70 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0x78 +}; + +void io::down(byte scan) { kbd = 0; + if (isshift(scan)) + _shift = true; } -void io::up(unsigned scan) { - kbd = scanmap[scan] + 0x80; +void io::up(byte scan) { + if (isshift(scan)) { + _shift = false; + return; + } + byte m = _shift? shiftmap[scan]: scanmap[scan]; + kbd = m + 0x80; kbd_cr = 0xa7; } -void io::display(byte b) { - int x = c * _cx, y = r * _cy; - char ch = (char)b; +void io::draw(char ch, int i, int j) { + if (screen[j][i] != ch) { + screen[j][i] = ch; + utft.print(&ch, i*_cx, j*_cy); + } +} - switch(b) { - case 0x5f: - if (--c < 0) { +void io::display(byte b) { + char ch = (char)b; + switch(ch) { + case 0x7f: + if (c-- == 0) { r--; c = COLS-1; } - ch = ' '; - utft.print(&ch, x, y); + draw(' ', c, r); break; - case 0x0a: +// case 0x0a: case 0x0d: c = 0; r++; break; default: - if (ch >= 0x20 && ch != 0x7f) { - utft.print(&ch, x, y); +// if (ch >= 0x20 && ch != 0x7f) { + if (ch >= 0x20) { + draw(ch, c, r); if (++c == COLS) { c = 0; r++; @@ -83,21 +123,12 @@ void io::display(byte b) { // scroll r--; for (int j = 0; j < (ROWS-1); j++) - for (int i = 0; i < COLS; i++) { - int o = j*COLS + i, p = o + COLS; - if (screen[p] != screen[o]) { - screen[p] = screen[o]; - utft.print(&screen[p], i*_cx, j*_cy); - } - } - for (int i = COLS; i-- > 0; ) { - int o = ROWS*COLS - i; - if (screen[o] != ' ') { - screen[o] = ' '; - utft.print(&screen[o], i*_cx, (ROWS-1)*_cy); - } - } + for (int i = 0; i < COLS; i++) + draw(screen[j+1][i], i, j); + for (int i = 0; i < COLS; i++) + draw(' ', i, ROWS-1); } + // FIXME: draw cursor? } void io::operator=(byte b) { diff --git a/io.h b/io.h index 3f3d565..fdf0a98 100644 --- a/io.h +++ b/io.h @@ -1,23 +1,25 @@ #ifndef _IO_H #define _IO_H -class io: public UTFTDisplay { +class io: public UTFTDisplay, public Keyboard { public: io(): UTFTDisplay(256) {} void operator=(byte); operator byte(); - void reset(); - void down(unsigned scan); - void up(unsigned scan); + virtual void reset(); + virtual void down(byte scan); + virtual void up(byte scan); void checkpoint(Stream &); void restore(Stream &); private: void display(byte); + void draw(char, int, int); + bool _shift; }; #endif