diff --git a/Arduino/libraries/Hi-Res Video Driver Source/Terminal.cpp b/Arduino/libraries/Hi-Res Video Driver Source/Terminal.cpp new file mode 100644 index 0000000..2f32565 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/Terminal.cpp @@ -0,0 +1,517 @@ +/* + * multi-mode tv out terminal library for Arduino + * + * Dave Curran 2013-09-06 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * 2013-09-06 - V0.1 - Initial Release + * 2013-09-13 - V0.2 - Added 4 bit mode plus minor tidy up + * 2013-09-16 - V0.3 - Added I2C mode + * 2013-09-23 - V0.4 - I2C mode writing direct and bypassing Wire + * 2013-09-28 - V0.5 - Added font and graphics options + */ + +#include "Terminal.h" +#include "Arduino.h" + +// *************************************** +// * CONSTRUCTORS +// *************************************** + +// Initialise the display for 8 bit mode +// The pins can be any that are convenient. +Terminal::Terminal(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t avail, uint8_t ack) +{ + // store pin numbers + _avail_pin = avail; + _ack_pin = ack; + + _data_pins[0] = d0; + _data_pins[1] = d1; + _data_pins[2] = d2; + _data_pins[3] = d3; + _data_pins[4] = d4; + _data_pins[5] = d5; + _data_pins[6] = d6; + _data_pins[7] = d7; + + // set pin modes + pinMode(_ack_pin, INPUT); + pinMode(_avail_pin, OUTPUT); + + for(uint8_t i=0; i<8; i++) + { + pinMode(_data_pins[i], OUTPUT); + digitalWrite(_data_pins[i], LOW); + } + + _4bit_mode = false; + _i2c_mode = false; + + clear(); +} + +// Initialise the display for 4 bit mode +// The pins can be any that are convenient. If using an Arduino, using pin 13 for ack will show activity +Terminal::Terminal(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t avail, uint8_t ack) +{ + // store pin numbers + _avail_pin = avail; + _ack_pin = ack; + + _data_pins[0] = d0; + _data_pins[1] = d1; + _data_pins[2] = d2; + _data_pins[3] = d3; + _data_pins[4] = 0; + _data_pins[5] = 0; + _data_pins[6] = 0; + _data_pins[7] = 0; + + // set pin modes + pinMode(_ack_pin, INPUT); + pinMode(_avail_pin, OUTPUT); + + for(uint8_t i=0; i<4; i++) + { + pinMode(_data_pins[i], OUTPUT); + digitalWrite(_data_pins[i], LOW); + } + + _4bit_mode = true; + _i2c_mode = false; + + clear(); +} + +// initialise for I2C mode +Terminal::Terminal() +{ + _4bit_mode = false; + _i2c_mode = true; + _transmitting = false; + + DDRC |= 0x30; // set the two I2C pins as outputs + + // Two wire speed initialisation + // SCL freq = CPU freq / (16+2*TWBR*Prescaler) + TWSR = 0; // Prescaler = 1 + TWBR = 12; // Bit rate 12 = 400KHz for 16MHz clk + + clear(); +} + +// *************************************** +// * Display control functions +// *************************************** + +// Clear the screen +void Terminal::clear() +{ + send(TERMINAL_CLEAR_SCREEN); +} + +// Blink the cursor +void Terminal::cursorBlink() +{ + send(TERMINAL_CURSOR_BLINKING); +} + +// use a solid cursor +void Terminal::cursorBlinkOff() +{ + send(TERMINAL_CURSOR_SOLID); +} + +// Change the cursor to a block +void Terminal::cursorBlock() +{ + cursorCustom(0xDB); +} + +// Change the cursor to an underscore (default) +void Terminal::cursorUnderscore() +{ + cursorCustom('_'); +} + +// no cursor +void Terminal::cursorOff() +{ + send(TERMINAL_CURSOR_SOLID); + cursorCustom(0x00); +} + +// set any character as the cursor character, 0x00 for off +void Terminal::cursorCustom(uint8_t c) +{ + send(TERMINAL_CURSOR_SET); + send(c); +} + +// set the font (use combinations of TERMAIN_FONT_x +void Terminal::setFont(uint8_t c) +{ + send(TERMINAL_SET_FONT); + send(c); +} + +// Set the cursor location +void Terminal::setCursor(uint8_t column, uint8_t row) +{ + setColumn(column); + setRow(row); +} + +// Set location to a given column +void Terminal::setColumn(uint8_t column) +{ + send(TERMINAL_SET_COLUMN); + send(column); +} + +// Set location to a given row +void Terminal::setRow(uint8_t row) +{ + send(TERMINAL_SET_ROW); + send(row); +} + +// Send the CTRL+LF pair +void Terminal::sendCRLF() +{ + send(TERMINAL_CARRIAGE_RETURN); + send(TERMINAL_LINE_FEED); +} + +// *************************************** +// * Graphics functions +// *************************************** + +// Set a pixel in 160x100 graphics - note any text on this line will be cleared +void Terminal::setPixel(uint8_t x, uint8_t y) +{ + if (x<160 && y<100) + { + send(TERMINAL_SET_PIXEL); + send(x); + send(y); + } +} + +// Clear a pixel in 160x100 graphics - note any text on this line will be cleared +void Terminal::clearPixel(uint8_t x, uint8_t y) +{ + if (x<160 && y<100) + { + send(TERMINAL_CLEAR_PIXEL); + send(x); + send(y); + } +} + +// draw a line from x1,y1 to x2,y2 +void Terminal::drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + int xdiff = x2 - x1; + int ydiff = y2 - y1; + int maxdiff = max(abs(xdiff),abs(ydiff)); + for(int n=0; n= y) + { + setPixel(x + x0, y + y0); + setPixel(y + x0, x + y0); + setPixel(-x + x0, y + y0); + setPixel(-y + x0, x + y0); + setPixel(-x + x0, -y + y0); + setPixel(-y + x0, -x + y0); + setPixel(x + x0, -y + y0); + setPixel(y + x0, -x + y0); + + y++; + if(radiusError<0) + radiusError+=2*y+1; + else + { + x--; + radiusError+=2*(y-x+1); + } + } +} + +// fill a circle centred on x0,y0 with a radius of radius +void Terminal::fillCircle(uint8_t x0, uint8_t y0, uint8_t radius) +{ + for(int y=-radius; y<=radius; y++) + { + for(int x=-radius; x<=radius; x++) + { + if(x*x+y*y <= radius*radius) + { + setPixel(x0+x, y0+y); + } + } + } +} + +// clear a circle centred on x0,y0 with a radius of radius +void Terminal::clearCircle(uint8_t x0, uint8_t y0, uint8_t radius) +{ + for(int y=-radius; y<=radius; y++) + { + for(int x=-radius; x<=radius; x++) + { + if(x*x+y*y <= radius*radius) + { + clearPixel(x0+x, y0+y); + } + } + } +} + +// *************************************** +// * Send functions +// *************************************** + +// Print a string with a linefeed at the end +void Terminal::printLine(String s) +{ + print(s); + sendCRLF(); +} + +// Print a string +void Terminal::print(String s) +{ + // send character by character + for(unsigned int n=0; n + +// Control Codes +#define TERMINAL_CURSOR_HOME 0x01 +#define TERMINAL_CURSOR_SET 0x02 +#define TERMINAL_CURSOR_BLINKING 0x03 +#define TERMINAL_CURSOR_SOLID 0x04 +#define TERMINAL_SET_PIXEL 0x05 +#define TERMINAL_CLEAR_PIXEL 0x06 +#define TERMINAL_BACKSPACE 0x08 +#define TERMINAL_TAB 0x09 +#define TERMINAL_LINE_FEED 0x0A +#define TERMINAL_CLEAR_SCREEN 0x0C +#define TERMINAL_CARRIAGE_RETURN 0x0D +// Set column 0 to 79 (2nd uint8_t is the column number) +#define TERMINAL_SET_COLUMN 0x0E +// Set row 0 to 24 (2nd uint8_t is the row number) +#define TERMINAL_SET_ROW 0x0F +// Delete to the start of the line +#define TERMINAL_DELETE_BEFORE_LINE 0x10 +// Delete to the end of the line +#define TERMINAL_DELETE_AFTER_LINE 0x11 +// Delete to start of screen +#define TERMINAL_DELETE_BEFORE_PAGE 0x12 +// Delete to end of screen +#define TERMINAL_DELETE_AFTER_PAGE 0x13 +#define TERMINAL_SCROLL_UP 0x14 +#define TERMINAL_SCROLL_DOWN 0x15 +#define TERMINAL_SCROLL_LEFT 0x16 +#define TERMINAL_SCROLL_RIGHT 0x17 +#define TERMINAL_SET_FONT 0x18 + +// Treat next uint8_t as a character (to allow PC DOS char codes 1 to 31 to be displayed on screen) +#define TERMINAL_NEXT_IS_CHAR 0x1A +// ESC - reserved for ANSI sequences +#define TERMINAL_ESCAPE 0x1B +#define TERMINAL_CURSOR_RIGHT 0x1C +#define TERMINAL_CURSOR_LEFT 0x1D +#define TERMINAL_CURSOR_UP 0x1E +#define TERMINAL_CURSOR_DOWN 0x1F + +#define TERMINAL_DELETE 0x7F + +// font options +#define TERMINAL_FONT_40_CHAR 0x00 +#define TERMINAL_FONT_80_CHAR 0x01 +#define TERMINAL_FONT_NORMAL 0x00 +#define TERMINAL_FONT_BOLD 0x02 +#define TERMINAL_FONT_SINGLE_HEIGHT 0x00 +#define TERMINAL_FONT_DOUBLE_HEIGHT 0x04 +#define TERMINAL_FONT_GRAPHICS 0x80 + +#define TERMINAL_FONT_40_NORMAL_SINGLE 0x00 +#define TERMINAL_FONT_80_NORMAL_SINGLE 0x01 +#define TERMINAL_FONT_40_BOLD_SINGLE 0x02 +#define TERMINAL_FONT_80_BOLD_SINGLE 0x03 +#define TERMINAL_FONT_40_NORMAL_DOUBLE 0x04 +#define TERMINAL_FONT_80_NORMAL_DOUBLE 0x05 +#define TERMINAL_FONT_40_BOLD_DOUBLE 0x06 +#define TERMINAL_FONT_80_BOLD_DOUBLE 0x07 + +class Terminal +{ +public: + Terminal(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t avail, uint8_t ack); + Terminal(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t avail, uint8_t ack); + Terminal(); + + void begin(); + void clear(); + void cursorBlink(); + void cursorBlinkOff(); + void cursorUnderscore(); + void cursorBlock(); + void cursorOff(); + void cursorCustom(uint8_t c); + void setFont(uint8_t c); + void setCursor(uint8_t column, uint8_t row); + void setColumn(uint8_t column); + void setRow(uint8_t row); + void setPixel(uint8_t x, uint8_t y); + void clearPixel(uint8_t x, uint8_t y); + void drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + void clearLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + void drawBox(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + void fillBox(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + void clearBox(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); + void drawCircle(uint8_t x0, uint8_t y0, uint8_t radius); + void fillCircle(uint8_t x0, uint8_t y0, uint8_t radius); + void clearCircle(uint8_t x0, uint8_t y0, uint8_t radius); + void sendCRLF(); + void printLine(String s); + void print(String s); + uint8_t send(uint8_t c); + +private: + uint8_t send4Bit(uint8_t c); + uint8_t send8Bit(uint8_t c); + uint8_t sendI2C(uint8_t c); + + uint8_t _data_pins[8]; // data outputs + uint8_t _avail_pin; // output, tell the display that new data is available + uint8_t _ack_pin; // input, the display acknowledges the input + bool _4bit_mode; // is the interface in 4 bit mode + bool _i2c_mode; // is this in I2C mode + bool _transmitting; // in the middle of an I2C packet +}; + +#endif + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Analogue_Input/Analogue_Input.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Analogue_Input/Analogue_Input.ino new file mode 100644 index 0000000..a5f5db0 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Analogue_Input/Analogue_Input.ino @@ -0,0 +1,51 @@ +/* + * This is a simple example of the multi-mode tv out terminal which displays the status of the 4 unused analogue inputs + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +// Analogue inputs +byte inputs[] = { A0, A1, A2, A3 }; + +void setup() { +} + +void loop() { + byte v; + for (byte a = 0; a<4; a++) + { + // read the input + v = analogRead(inputs[a]); + term.send('A'); + term.send(a+'0'); + term.print(" ["); + for(byte n=7; n>0; n--) + { + term.send(bitRead(v, n) ? '*' : '.'); + } + term.print("] "); + } + term.sendCRLF(); + + // add a delay if it's going too fast + //delay(1000); +} + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/BBC_Demo/BBC_Demo.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/BBC_Demo/BBC_Demo.ino new file mode 100644 index 0000000..6ac6f43 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/BBC_Demo/BBC_Demo.ino @@ -0,0 +1,38 @@ +/* + * This is a simple example of the multi-mode tv out terminal which shows an emulation of the BBC Micro Mode 7 startup message + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() { + // show startup messages + term.setFont(TERMINAL_FONT_40_BOLD_SINGLE); + term.printLine("BBC Computer 32K"); + term.sendCRLF(); + term.printLine("Acorn DFS"); + term.sendCRLF(); + term.printLine("BASIC"); + term.sendCRLF(); + term.print(">"); +} + +void loop() { + +} + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Font_Test/Font_Test.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Font_Test/Font_Test.ino new file mode 100644 index 0000000..04ee38f --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Font_Test/Font_Test.ino @@ -0,0 +1,68 @@ +/* + * This is a simple example of the multi-mode tv out terminal which shows the various font options in I2C mode + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() +{ + term.printLine("This is the default font set in hardware"); + + term.setFont(TERMINAL_FONT_80_NORMAL_SINGLE); + term.sendCRLF(); + term.printLine("80 Character normal single line"); + term.setFont(TERMINAL_FONT_80_BOLD_SINGLE); + term.printLine("80 Character bold single line"); + term.sendCRLF(); + + term.setFont(TERMINAL_FONT_80_NORMAL_DOUBLE); + term.printLine("80 Character normal double height"); + term.setFont(TERMINAL_FONT_80_BOLD_DOUBLE); + term.printLine("80 Character bold double height"); + + term.setFont(TERMINAL_FONT_40_NORMAL_SINGLE); + term.sendCRLF(); + term.printLine("40 Character normal single line"); + term.setFont(TERMINAL_FONT_40_BOLD_SINGLE); + term.printLine("40 Character bold single line"); + term.sendCRLF(); + + term.setFont(TERMINAL_FONT_40_NORMAL_DOUBLE); + term.printLine("40 Character normal double height"); + term.setFont(TERMINAL_FONT_40_BOLD_DOUBLE); + term.printLine("40 Character bold double height"); + + term.setFont(TERMINAL_FONT_80_NORMAL_SINGLE); + term.sendCRLF(); + term.printLine("Normal Font:"); + term.printLine("01234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz !\"#$%^&*()-+=*"); + + term.setFont(TERMINAL_FONT_80_BOLD_SINGLE); + term.printLine("Bold Font:"); + term.print("01234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz !\"#$%^&*()-+=*"); +} + +void loop() +{ +} + + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_4bit/Hello_World_4bit.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_4bit/Hello_World_4bit.ino new file mode 100644 index 0000000..6c81fb8 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_4bit/Hello_World_4bit.ino @@ -0,0 +1,146 @@ +/* + * This is a simple example of the multi-mode tv out terminal which sends a Hello World message and shows the character set using 4 bit mode + * + * Dave Curran 2013-09-06 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * Any available I/O pins can be used, adjust the initialisation code below to match your setup. + * + * Arduino D8 ==> Display pin 15 (PB1) - D0 + * Arduino D7 ==> Display pin 16 (PB2) - D1 + * Arduino D6 ==> Display pin 17 (PB3) - D2 + * Arduino D5 ==> Display pin 18 (PB4) - D3 + * Arduino PC5 ==> Display pin 28 (PC5) - Avail + * Arduino PC4 <== Display pin 27 (PC4) - ACK + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + */ + +#include +#include +// Initialise the terminal pins +Terminal term(8, 7, 6, 5, A5, A4); + +void setup() +{ + // Initialise the terminal + term.cursorOff(); + + // show hello world + term.setCursor(34,0); + term.printLine("Hello World!"); + term.printLine(""); + term.printLine(" 80x25 text output library for Arduino in two wire interface 4 bit Mode"); + term.printLine(""); + // Show the 80 character positions + term.print("00000000001111111111222222222233333333334444444444555555555566666666667777777777"); + term.printLine("01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + + // Show the character set + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + for(byte a=0; a<2; a++) + { + term.print(" \xDA"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xBF "); + } + + for (byte a=0; a<8; a++) + { + for (byte b=0; b<2; b++) + { + term.send(' '); + + byte msb = b*8 + a; + + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + + byte base = (msb * 0x10); + term.print("\xB3 "); + for (uint8_t n = 0; n<0x10; n++) + { + byte c=base + n; + if (c<0x20 || c==0x7f) + { + term.send(TERMINAL_NEXT_IS_CHAR); + } + term.send(c); + term.send(' '); + } + term.send(0xB3); + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + term.print(" "); + } + } + + for(byte a=0; a<2; a++) + { + term.print(" \xC0"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xD9 "); + } + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + + // useful web addresses + term.setCursor(28, 21); + term.printLine("searle.hostei.com/grant"); + + term.setCursor(26, 23); + term.printLine("www.tynemouthsoftware.co.uk"); + + +} + +#define DELAY 250 + +void loop() +{ + setCharacterAtCorners(0xC4); + delay(DELAY); + setCharacterAtCorners('\\'); + delay(DELAY); + setCharacterAtCorners(0xB3); + delay(DELAY); + setCharacterAtCorners('/'); + delay(DELAY); +} + +void setCharacterAtCorners(char c) +{ + // draw the corners (note if you draw at (79,24) it will scroll down to the next line and the top line will scroll off the top of the display) + term.setCursor(0,0); + term.send(c); + term.setCursor(79,0); + term.send(c); + term.setCursor(0,23); + term.send(c); + term.setCursor(79,23); + term.send(c); +} + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_8bit/Hello_World_8bit.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_8bit/Hello_World_8bit.ino new file mode 100644 index 0000000..d200456 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_8bit/Hello_World_8bit.ino @@ -0,0 +1,150 @@ +/* + * This is a simple example of the multi-mode tv out terminal which sends a Hello World message and shows the character set using 8 bit mode + * + * Dave Curran 2013-09-06 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * Any available I/O pins can be used, adjust the initialisation code below to match your setup. + * + * Arduino D8 ==> Display pin 15 (PB1) - D0 + * Arduino D7 ==> Display pin 16 (PB2) - D1 + * Arduino D6 ==> Display pin 17 (PB3) - D2 + * Arduino D5 ==> Display pin 18 (PB4) - D3 + * Arduino D13 ==> Display pin 19 (PB5) - D4 + * Arduino D4 ==> Display pin 23 (PC0) - D5 + * Arduino D3 ==> Display pin 24 (PC1) - D6 + * Arduino D2 ==> Display pin 25 (PC2) - D7 + * Arduino PC5 ==> Display pin 28 (PC5) - Avail + * Arduino PC4 <== Display pin 27 (PC4) - ACK + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + */ + +#include +#include +// Initialise the terminal pins +Terminal term(8, 7, 6, 5, 13, 4, 3, 2, A5, A4); + +void setup() +{ + // Initialise the terminal + term.cursorOff(); + + // show hello world + term.setCursor(34,0); + term.printLine("Hello World!"); + term.printLine(""); + term.printLine(" 80x25 text output library for Arduino in two wire interface 8 bit Mode"); + term.printLine(""); + // Show the 80 character positions + term.print("00000000001111111111222222222233333333334444444444555555555566666666667777777777"); + term.printLine("01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + + // Show the character set + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + for(byte a=0; a<2; a++) + { + term.print(" \xDA"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xBF "); + } + + for (byte a=0; a<8; a++) + { + for (byte b=0; b<2; b++) + { + term.send(' '); + + byte msb = b*8 + a; + + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + + byte base = (msb * 0x10); + term.print("\xB3 "); + for (uint8_t n = 0; n<0x10; n++) + { + byte c=base + n; + if (c<0x20 || c==0x7f) + { + term.send(TERMINAL_NEXT_IS_CHAR); + } + term.send(c); + term.send(' '); + } + term.send(0xB3); + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + term.print(" "); + } + } + + for(byte a=0; a<2; a++) + { + term.print(" \xC0"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xD9 "); + } + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + + // useful web addresses + term.setCursor(28, 21); + term.printLine("searle.hostei.com/grant"); + + term.setCursor(26, 23); + term.printLine("www.tynemouthsoftware.co.uk"); + + +} + +#define DELAY 250 + +void loop() +{ + setCharacterAtCorners(0xC4); + delay(DELAY); + setCharacterAtCorners('\\'); + delay(DELAY); + setCharacterAtCorners(0xB3); + delay(DELAY); + setCharacterAtCorners('/'); + delay(DELAY); +} + +void setCharacterAtCorners(char c) +{ + // draw the corners (note if you draw at (79,24) it will scroll down to the next line and the top line will scroll off the top of the display) + term.setCursor(0,0); + term.send(c); + term.setCursor(79,0); + term.send(c); + term.setCursor(0,23); + term.send(c); + term.setCursor(79,23); + term.send(c); +} + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_TWI/Hello_World_TWI.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_TWI/Hello_World_TWI.ino new file mode 100644 index 0000000..02b3e76 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Hello_World_TWI/Hello_World_TWI.ino @@ -0,0 +1,142 @@ +/* + * This is a simple example of the multi-mode tv out terminal which sends a Hello World message and shows the character set + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() +{ + // Initialise the terminal + term.cursorOff(); + + // show hello world + term.setCursor(34,0); + term.printLine("Hello World!"); + term.printLine(""); + term.printLine(" 80x25 text output library for Arduino in two wire interface (I" "\xFD" "C) Mode"); + term.printLine(""); + // Show the 80 character positions + term.print("00000000001111111111222222222233333333334444444444555555555566666666667777777777"); + term.printLine("01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + + // Show the character set + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + for(byte a=0; a<2; a++) + { + term.print(" \xDA"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xBF "); + } + + for (byte a=0; a<8; a++) + { + for (byte b=0; b<2; b++) + { + term.send(' '); + + byte msb = b*8 + a; + + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + + byte base = (msb * 0x10); + term.print("\xB3 "); + for (uint8_t n = 0; n<0x10; n++) + { + byte c=base + n; + if (c<0x20 || c==0x7f) + { + term.send(TERMINAL_NEXT_IS_CHAR); + } + term.send(c); + term.send(' '); + } + term.send(0xB3); + if (msb>9) + { + term.send(msb + 0x37); + } + else + { + term.send(msb + 0x30); + } + term.print(" "); + } + } + + for(byte a=0; a<2; a++) + { + term.print(" \xC0"); + for(int n=0; n<33; n++) + { + term.send(0xC4); + } + term.print("\xD9 "); + } + term.printLine(" 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + + // useful web addresses + term.setCursor(28, 21); + term.printLine("searle.hostei.com/grant"); + + term.setCursor(26, 23); + term.printLine("www.tynemouthsoftware.co.uk"); + + +} + +#define DELAY 250 + +void loop() +{ + setCharacterAtCorners(0xC4); + delay(DELAY); + setCharacterAtCorners('\\'); + delay(DELAY); + setCharacterAtCorners(0xB3); + delay(DELAY); + setCharacterAtCorners('/'); + delay(DELAY); +} + +void setCharacterAtCorners(char c) +{ + // draw the corners (note if you draw at (79,24) it will scroll down to the next line and the top line will scroll off the top of the display) + term.setCursor(0,0); + term.send(c); + term.setCursor(79,0); + term.send(c); + term.setCursor(0,23); + term.send(c); + term.setCursor(79,23); + term.send(c); +} + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Look_Around_You/Look_Around_You.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Look_Around_You/Look_Around_You.ino new file mode 100644 index 0000000..10f7b4f --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Look_Around_You/Look_Around_You.ino @@ -0,0 +1,51 @@ +/* + * This is a simple example of the multi-mode tv out terminal which pays homage to the title sequence of the tv series "Look Around You" + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() { + // show startup messages + term.setFont(TERMINAL_FONT_40_BOLD_SINGLE); + term.printLine("BBC Computer 32K"); + term.sendCRLF(); + term.printLine("Acorn DFS"); + term.sendCRLF(); + term.printLine("BASIC"); + term.sendCRLF(); + term.print(">"); + + delay(2000); + term.printLine("10 PRINT \"LOOK AROUND YOU \";"); + term.print(">"); + delay(2000); + term.printLine("20 GOTO 10"); + term.print(">"); + delay(2000); + term.printLine("RUN"); +} + +void loop() { + term.print("LOOK AROUND YOU "); + delay(100); +} + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Missile_Command_Demo/Missile_Command_Demo.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Missile_Command_Demo/Missile_Command_Demo.ino new file mode 100644 index 0000000..c6e39f1 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Missile_Command_Demo/Missile_Command_Demo.ino @@ -0,0 +1,101 @@ +/* + * This is a simple example of the multi-mode tv out terminal which shows graphics drawing capabilities with a missile command style demo + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() +{ + term.clear(); + term.cursorOff(); +} + +void loop() +{ + // clear the screen + term.clear(); + + // draw the base line + term.fillBox(0,99, 159,100); + + // draw the bases + for(int b=0; b<3; b++) + { + byte pos = 27 + (b*54); + term.setPixel(pos, 96); + term.drawLine(pos-2, 97, pos+2, 97); + term.drawLine(pos-4, 98, pos+4, 98); + } + + // fire 5 shots + for(int n=0; n<5; n++) + { + fireShot(); + delay(1000); + } + + // game over + term.clear(); + term.setFont(TERMINAL_FONT_40_BOLD_DOUBLE); + term.setCursor(15, 12); + term.setFont(TERMINAL_FONT_40_BOLD_DOUBLE); + term.print("GAME OVER!"); + + delay(5000); +} + +// fire a shot +void fireShot() +{ + // take aim + uint8_t origin = random(0,159); + uint8_t destination = random(0,159); + + // fire + // could have used term.drawLine(origin,0, destination,99);, but this adds a delay + int diff = destination-origin; + for(int y=0; y<99; y++) + { + term.setPixel(origin + (diff*y/99), y); + delay(100); + } + + // bang + term.fillCircle(destination,99, 10); + delay(200); + term.clearCircle(destination,99, 10); + delay(200); + + // clear it up + term.clearLine(origin,0, destination,99); + term.fillCircle(destination,99, 15); + delay(200); + term.clearCircle(destination,99, 15); + delay(200); +} + + + + + + + + + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Pet_Demo/Pet_Demo.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Pet_Demo/Pet_Demo.ino new file mode 100644 index 0000000..c0db29e --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Pet_Demo/Pet_Demo.ino @@ -0,0 +1,39 @@ +/* + * This is a simple example of the multi-mode tv out terminal which shows an emulation of the Commodore Pet startup message + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +void setup() { + // set the cursor to a block + term.cursorBlock(); + + // show startup messages + term.printLine("*** commodore basic 4.0 ***"); + term.sendCRLF(); + term.printLine(" 31743 bytes free"); + term.sendCRLF(); + term.printLine("ready."); +} + +void loop() { + +} + + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/examples/Tiny_BASIC/Tiny_BASIC.ino b/Arduino/libraries/Hi-Res Video Driver Source/examples/Tiny_BASIC/Tiny_BASIC.ino new file mode 100644 index 0000000..20b20ea --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/examples/Tiny_BASIC/Tiny_BASIC.ino @@ -0,0 +1,1195 @@ +/* + * This is an example of terminal being the output for Mike Field's Tiny BASIC interpreter + * Input comes from the serial monitor with the baud rate set to 9600. + * + * Dave Curran 2013-09-28 + * + * Arduino Terminal Library - Dave Curran (www.tynemouthsoftware.co.uk) + * Concept and Microcontroller Firmware - Daryl Rictor, Grant Searle + * Tiny BASIC - Mike Field + * + * The display microcontroller is wired as follows: + * pin 28 (SCL) ==> Display pin 28 (SCL) + * pin 27 (SDA) ==> Display pin 27 (SDA) + * Arduino Reset ==> Display pin 1 (Reset) - Reset (Optional) + * + * The two I2C data lines need to be pulled high to 5V via 2K2 resistors. + * + */ + +#include + +// Create a terminal in TWI mode +Terminal term; + +#define ARDUINO 1 + +// ASCII Characters +#define CR '\r' +#define NL '\n' +#define TAB '\t' +#define BELL '\b' +#define SPACE ' ' +#define CTRLC 0x03 +#define CTRLH 0x08 +#define CTRLS 0x13 +#define CTRLX 0x18 + +typedef short unsigned LINENUM; +#if ARDUINO +#define ECHO_CHARS 1 +#else +#define ECHO_CHARS 0 +#endif + +static unsigned char program[1128]; // gives 1024 bytes free at startup, +static unsigned char *txtpos,*list_line; +static unsigned char expression_error; +static unsigned char *tempsp; + +/***********************************************************/ +// Keyword table and constants - the last character has 0x80 added to it +static unsigned char keywords[] = { + 'L','I','S','T'+0x80, + 'L','O','A','D'+0x80, + 'N','E','W'+0x80, + 'R','U','N'+0x80, + 'S','A','V','E'+0x80, + 'N','E','X','T'+0x80, + 'L','E','T'+0x80, + 'I','F'+0x80, + 'G','O','T','O'+0x80, + 'G','O','S','U','B'+0x80, + 'R','E','T','U','R','N'+0x80, + 'R','E','M'+0x80, + 'F','O','R'+0x80, + 'I','N','P','U','T'+0x80, + 'P','R','I','N','T'+0x80, + 'P','O','K','E'+0x80, + 'S','T','O','P'+0x80, + 'B','Y','E'+0x80, + 0 +}; + +#define KW_LIST 0 +#define KW_LOAD 1 +#define KW_NEW 2 +#define KW_RUN 3 +#define KW_SAVE 4 +#define KW_NEXT 5 +#define KW_LET 6 +#define KW_IF 7 +#define KW_GOTO 8 +#define KW_GOSUB 9 +#define KW_RETURN 10 +#define KW_REM 11 +#define KW_FOR 12 +#define KW_INPUT 13 +#define KW_PRINT 14 +#define KW_POKE 15 +#define KW_STOP 16 +#define KW_BYE 17 +#define KW_DEFAULT 18 + +struct stack_for_frame { + char frame_type; + char for_var; + short int terminal; + short int step; + unsigned char *current_line; + unsigned char *txtpos; +}; + +struct stack_gosub_frame { + char frame_type; + unsigned char *current_line; + unsigned char *txtpos; +}; + +static unsigned char func_tab[] = { + 'P','E','E','K'+0x80, + 'A','B','S'+0x80, + 0 +}; +#define FUNC_PEEK 0 +#define FUNC_ABS 1 +#define FUNC_UNKNOWN 2 + +static unsigned char to_tab[] = { + 'T','O'+0x80, + 0 +}; + +static unsigned char step_tab[] = { + 'S','T','E','P'+0x80, + 0 +}; + +static unsigned char relop_tab[] = { + '>','='+0x80, + '<','>'+0x80, + '>'+0x80, + '='+0x80, + '<','='+0x80, + '<'+0x80, + 0 +}; + +#define RELOP_GE 0 +#define RELOP_NE 1 +#define RELOP_GT 2 +#define RELOP_EQ 3 +#define RELOP_LE 4 +#define RELOP_LT 5 +#define RELOP_UNKNOWN 6 + +#define STACK_SIZE (sizeof(struct stack_for_frame)*5) +#define VAR_SIZE sizeof(short int) // Size of variables in bytes + +static unsigned char *stack_limit; +static unsigned char *program_start; +static unsigned char *program_end; +static unsigned char *stack; // Software stack for things that should go on the CPU stack +static unsigned char *variables_begin; +static unsigned char *current_line; +static unsigned char *sp; +#define STACK_GOSUB_FLAG 'G' +#define STACK_FOR_FLAG 'F' +static unsigned char table_index; +static LINENUM linenum; + +static const unsigned char okmsg[] = "OK"; +static const unsigned char whatmsg[] = "What? "; +static const unsigned char howmsg[] = "How?"; +static const unsigned char sorrymsg[] = "Sorry!"; +static const unsigned char initmsg[] = "TinyBasic in C V0.02."; +static const unsigned char memorymsg[] = " bytes free."; +static const unsigned char breakmsg[] = "break!"; +static const unsigned char unimplimentedmsg[] = "Unimplemented"; +static const unsigned char backspacemsg[] = "\b \b"; + +static int inchar(void); +static void outchar(unsigned char c); +static void line_terminator(void); +static short int expression(void); +static unsigned char breakcheck(void); +/***************************************************************************/ +static void ignore_blanks(void) +{ + while(*txtpos == SPACE || *txtpos == TAB) + txtpos++; +} + +/***************************************************************************/ +static void scantable(unsigned char *table) +{ + int i = 0; + table_index = 0; + while(1) + { + // Run out of table entries? + if(table[0] == 0) + return; + + // Do we match this character? + if(txtpos[i] == table[0]) + { + i++; + table++; + } + else + { + // do we match the last character of keywork (with 0x80 added)? If so, return + if(txtpos[i]+0x80 == table[0]) + { + txtpos += i+1; // Advance the pointer to following the keyword + ignore_blanks(); + return; + } + + // Forward to the end of this keyword + while((table[0] & 0x80) == 0) + table++; + + // Now move on to the first character of the next word, and reset the position index + table++; + table_index++; + ignore_blanks(); + i = 0; + } + } +} + +/***************************************************************************/ +static void pushb(unsigned char b) +{ + sp--; + *sp = b; +} + +/***************************************************************************/ +static unsigned char popb() +{ + unsigned char b; + b = *sp; + sp++; + return b; +} + +/***************************************************************************/ +static void printnum(int num) +{ + int digits = 0; + + if(num < 0) + { + num = -num; + outchar('-'); + } + + do { + pushb(num%10+'0'); + num = num/10; + digits++; + } + while (num > 0); + + while(digits > 0) + { + outchar(popb()); + digits--; + } +} +/***************************************************************************/ +static unsigned short testnum(void) +{ + unsigned short num = 0; + ignore_blanks(); + + while(*txtpos>= '0' && *txtpos <= '9' ) + { + // Trap overflows + if(num >= 0xFFFF/10) + { + num = 0xFFFF; + break; + } + + num = num *10 + *txtpos - '0'; + txtpos++; + } + return num; +} + +/***************************************************************************/ +static void printmsgNoNL(const unsigned char *msg) +{ + while(*msg) + { + outchar(*msg); + msg++; + } +} + +/***************************************************************************/ +static unsigned char print_quoted_string(void) +{ + int i=0; + unsigned char delim = *txtpos; + if(delim != '"' && delim != '\'') + return 0; + txtpos++; + + // Check we have a closing delimiter + while(txtpos[i] != delim) + { + if(txtpos[i] == NL) + return 0; + i++; + } + + // Print the characters + while(*txtpos != delim) + { + outchar(*txtpos); + txtpos++; + } + txtpos++; // Skip over the last delimiter + + return 1; +} + +/***************************************************************************/ +static void printmsg(const unsigned char *msg) +{ + printmsgNoNL(msg); + line_terminator(); +} + +/***************************************************************************/ +static void getln(char prompt) +{ + outchar(prompt); + txtpos = program_end+sizeof(LINENUM); + + while(1) + { + char c = inchar(); + switch(c) + { + case NL: + break; + case CR: + line_terminator(); + // Terminate all strings with a NL + txtpos[0] = NL; + return; + case CTRLH: + if(txtpos == program_end) + break; + txtpos--; + printmsg(backspacemsg); + break; + default: + // We need to leave at least one space to allow us to shuffle the line into order + if(txtpos == variables_begin-2) + outchar(BELL); + else + { + txtpos[0] = c; + txtpos++; +#if ECHO_CHARS + outchar(c); +#endif + } + } + } +} + +/***************************************************************************/ +static unsigned char *findline(void) +{ + unsigned char *line = program_start; + while(1) + { + if(line == program_end) + return line; + + if(((LINENUM *)line)[0] >= linenum) + return line; + + // Add the line length onto the current address, to get to the next line; + line += line[sizeof(LINENUM)]; + } +} + +/***************************************************************************/ +static void toUppercaseBuffer(void) +{ + unsigned char *c = program_end+sizeof(LINENUM); + unsigned char quote = 0; + + while(*c != NL) + { + // Are we in a quoted string? + if(*c == quote) + quote = 0; + else if(*c == '"' || *c == '\'') + quote = *c; + else if(quote == 0 && *c >= 'a' && *c <= 'z') + *c = *c + 'A' - 'a'; + c++; + } +} + +/***************************************************************************/ +void printline() +{ + LINENUM line_num; + + line_num = *((LINENUM *)(list_line)); + list_line += sizeof(LINENUM) + sizeof(char); + + // Output the line */ + printnum(line_num); + outchar(' '); + while(*list_line != NL) + { + outchar(*list_line); + list_line++; + } + list_line++; + line_terminator(); +} + +/***************************************************************************/ +static short int expr4(void) +{ + + if(*txtpos == '0') + { + txtpos++; + return 0; + } + + if(*txtpos >= '1' && *txtpos <= '9') + { + short int a = 0; + do { + a = a*10 + *txtpos - '0'; + txtpos++; + } + while(*txtpos >= '0' && *txtpos <= '9'); + return a; + } + + // Is it a function or variable reference? + if(txtpos[0] >= 'A' && txtpos[0] <= 'Z') + { + short int a; + // Is it a variable reference (single alpha) + if(txtpos[1] < 'A' || txtpos[1] > 'Z') + { + a = ((short int *)variables_begin)[*txtpos - 'A']; + txtpos++; + return a; + } + + // Is it a function with a single parameter + scantable(func_tab); + if(table_index == FUNC_UNKNOWN) + goto expr4_error; + + unsigned char f = table_index; + + if(*txtpos != '(') + goto expr4_error; + + txtpos++; + a = expression(); + if(*txtpos != ')') + goto expr4_error; + txtpos++; + switch(f) + { + case FUNC_PEEK: + return program[a]; + case FUNC_ABS: + if(a < 0) + return -a; + return a; + } + } + + if(*txtpos == '(') + { + short int a; + txtpos++; + a = expression(); + if(*txtpos != ')') + goto expr4_error; + + txtpos++; + return a; + } + +expr4_error: + expression_error = 1; + return 0; + +} + +/***************************************************************************/ +static short int expr3(void) +{ + short int a,b; + + a = expr4(); + while(1) + { + if(*txtpos == '*') + { + txtpos++; + b = expr4(); + a *= b; + } + else if(*txtpos == '/') + { + txtpos++; + b = expr4(); + if(b != 0) + a /= b; + else + expression_error = 1; + } + else + return a; + } +} + +/***************************************************************************/ +static short int expr2(void) +{ + short int a,b; + + if(*txtpos == '-' || *txtpos == '+') + a = 0; + else + a = expr3(); + + while(1) + { + if(*txtpos == '-') + { + txtpos++; + b = expr3(); + a -= b; + } + else if(*txtpos == '+') + { + txtpos++; + b = expr3(); + a += b; + } + else + return a; + } +} +/***************************************************************************/ +static short int expression(void) +{ + short int a,b; + + a = expr2(); + // Check if we have an error + if(expression_error) return a; + + scantable(relop_tab); + if(table_index == RELOP_UNKNOWN) + return a; + + switch(table_index) + { + case RELOP_GE: + b = expr2(); + if(a >= b) return 1; + break; + case RELOP_NE: + b = expr2(); + if(a != b) return 1; + break; + case RELOP_GT: + b = expr2(); + if(a > b) return 1; + break; + case RELOP_EQ: + b = expr2(); + if(a == b) return 1; + break; + case RELOP_LE: + b = expr2(); + if(a <= b) return 1; + break; + case RELOP_LT: + b = expr2(); + if(a < b) return 1; + break; + } + return 0; +} + +/***************************************************************************/ +void loop() +{ + unsigned char *start; + unsigned char *newEnd; + unsigned char linelen; + + program_start = program; + program_end = program_start; + sp = program+sizeof(program); // Needed for printnum + stack_limit = program+sizeof(program)-STACK_SIZE; + variables_begin = stack_limit - 27*VAR_SIZE; + printmsg(initmsg); + printnum(variables_begin-program_end); + printmsg(memorymsg); + +warmstart: + // this signifies that it is running in 'direct' mode. + current_line = 0; + sp = program+sizeof(program); + printmsg(okmsg); + +prompt: + getln('>'); + toUppercaseBuffer(); + + txtpos = program_end+sizeof(unsigned short); + + // Find the end of the freshly entered line + while(*txtpos != NL) + txtpos++; + + // Move it to the end of program_memory + { + unsigned char *dest; + dest = variables_begin-1; + while(1) + { + *dest = *txtpos; + if(txtpos == program_end+sizeof(unsigned short)) + break; + dest--; + txtpos--; + } + txtpos = dest; + } + + // Now see if we have a line number + linenum = testnum(); + ignore_blanks(); + if(linenum == 0) + goto direct; + + if(linenum == 0xFFFF) + goto qhow; + + // Find the length of what is left, including the (yet-to-be-populated) line header + linelen = 0; + while(txtpos[linelen] != NL) + linelen++; + linelen++; // Include the NL in the line length + linelen += sizeof(unsigned short)+sizeof(char); // Add space for the line number and line length + + // Now we have the number, add the line header. + txtpos -= 3; + *((unsigned short *)txtpos) = linenum; + txtpos[sizeof(LINENUM)] = linelen; + + + // Merge it into the rest of the program + start = findline(); + + // If a line with that number exists, then remove it + if(start != program_end && *((LINENUM *)start) == linenum) + { + unsigned char *dest, *from; + unsigned tomove; + + from = start + start[sizeof(LINENUM)]; + dest = start; + + tomove = program_end - from; + while( tomove > 0) + { + *dest = *from; + from++; + dest++; + tomove--; + } + program_end = dest; + } + + if(txtpos[sizeof(LINENUM)+sizeof(char)] == NL) // If the line has no txt, it was just a delete + goto prompt; + + + + // Make room for the new line, either all in one hit or lots of little shuffles + while(linelen > 0) + { + unsigned int tomove; + unsigned char *from,*dest; + unsigned int space_to_make; + + space_to_make = txtpos - program_end; + + if(space_to_make > linelen) + space_to_make = linelen; + newEnd = program_end+space_to_make; + tomove = program_end - start; + + + // Source and destination - as these areas may overlap we need to move bottom up + from = program_end; + dest = newEnd; + while(tomove > 0) + { + from--; + dest--; + *dest = *from; + tomove--; + } + + // Copy over the bytes into the new space + for(tomove = 0; tomove < space_to_make; tomove++) + { + *start = *txtpos; + txtpos++; + start++; + linelen--; + } + program_end = newEnd; + } + goto prompt; + +unimplemented: + printmsg(unimplimentedmsg); + goto prompt; + +qhow: + printmsg(howmsg); + goto prompt; + +qwhat: + printmsgNoNL(whatmsg); + if(current_line != NULL) + { + unsigned char tmp = *txtpos; + if(*txtpos != NL) + *txtpos = '^'; + list_line = current_line; + printline(); + *txtpos = tmp; + } + line_terminator(); + goto prompt; + +qsorry: + printmsg(sorrymsg); + goto warmstart; + +run_next_statement: + while(*txtpos == ':') + txtpos++; + ignore_blanks(); + if(*txtpos == NL) + goto execnextline; + goto interperateAtTxtpos; + +direct: + txtpos = program_end+sizeof(LINENUM); + if(*txtpos == NL) + goto prompt; + +interperateAtTxtpos: + if(breakcheck()) + { + printmsg(breakmsg); + goto warmstart; + } + + scantable(keywords); + + switch(table_index) + { + case KW_LIST: + goto list; + case KW_LOAD: + goto unimplemented; ///////////////// + case KW_NEW: + if(txtpos[0] != NL) + goto qwhat; + program_end = program_start; + goto prompt; + case KW_RUN: + current_line = program_start; + goto execline; + case KW_SAVE: + goto unimplemented; ////////////////////// + case KW_NEXT: + goto next; + case KW_LET: + goto assignment; + case KW_IF: + short int val; + expression_error = 0; + val = expression(); + if(expression_error || *txtpos == NL) + goto qhow; + if(val != 0) + goto interperateAtTxtpos; + goto execnextline; + + case KW_GOTO: + expression_error = 0; + linenum = expression(); + if(expression_error || *txtpos != NL) + goto qhow; + current_line = findline(); + goto execline; + + case KW_GOSUB: + goto gosub; + case KW_RETURN: + goto gosub_return; + case KW_REM: + goto execnextline; // Ignore line completely + case KW_FOR: + goto forloop; + case KW_INPUT: + goto input; + case KW_PRINT: + goto print; + case KW_POKE: + goto poke; + case KW_STOP: + // This is the easy way to end - set the current line to the end of program attempt to run it + if(txtpos[0] != NL) + goto qwhat; + current_line = program_end; + goto execline; + case KW_BYE: + // Leave the basic interperater + return; + case KW_DEFAULT: + goto assignment; + default: + break; + } + +execnextline: + if(current_line == NULL) // Processing direct commands? + goto prompt; + current_line += current_line[sizeof(LINENUM)]; + +execline: + if(current_line == program_end) // Out of lines to run + goto warmstart; + txtpos = current_line+sizeof(LINENUM)+sizeof(char); + goto interperateAtTxtpos; + +input: + { + unsigned char var; + ignore_blanks(); + if(*txtpos < 'A' || *txtpos > 'Z') + goto qwhat; + var = *txtpos; + txtpos++; + ignore_blanks(); + if(*txtpos != NL && *txtpos != ':') + goto qwhat; + ((short int *)variables_begin)[var-'A'] = 99; + + goto run_next_statement; + } +forloop: + { + unsigned char var; + short int initial, step, terminal; + ignore_blanks(); + if(*txtpos < 'A' || *txtpos > 'Z') + goto qwhat; + var = *txtpos; + txtpos++; + ignore_blanks(); + if(*txtpos != '=') + goto qwhat; + txtpos++; + ignore_blanks(); + + expression_error = 0; + initial = expression(); + if(expression_error) + goto qwhat; + + scantable(to_tab); + if(table_index != 0) + goto qwhat; + + terminal = expression(); + if(expression_error) + goto qwhat; + + scantable(step_tab); + if(table_index == 0) + { + step = expression(); + if(expression_error) + goto qwhat; + } + else + step = 1; + ignore_blanks(); + if(*txtpos != NL && *txtpos != ':') + goto qwhat; + + + if(!expression_error && *txtpos == NL) + { + struct stack_for_frame *f; + if(sp + sizeof(struct stack_for_frame) < stack_limit) + goto qsorry; + + sp -= sizeof(struct stack_for_frame); + f = (struct stack_for_frame *)sp; + ((short int *)variables_begin)[var-'A'] = initial; + f->frame_type = STACK_FOR_FLAG; + f->for_var = var; + f->terminal = terminal; + f->step = step; + f->txtpos = txtpos; + f->current_line = current_line; + goto run_next_statement; + } + } + goto qhow; + +gosub: + expression_error = 0; + linenum = expression(); + if(!expression_error && *txtpos == NL) + { + struct stack_gosub_frame *f; + if(sp + sizeof(struct stack_gosub_frame) < stack_limit) + goto qsorry; + + sp -= sizeof(struct stack_gosub_frame); + f = (struct stack_gosub_frame *)sp; + f->frame_type = STACK_GOSUB_FLAG; + f->txtpos = txtpos; + f->current_line = current_line; + current_line = findline(); + goto execline; + } + goto qhow; + +next: + // Fnd the variable name + ignore_blanks(); + if(*txtpos < 'A' || *txtpos > 'Z') + goto qhow; + txtpos++; + ignore_blanks(); + if(*txtpos != ':' && *txtpos != NL) + goto qwhat; + +gosub_return: + // Now walk up the stack frames and find the frame we want, if present + tempsp = sp; + while(tempsp < program+sizeof(program)-1) + { + switch(tempsp[0]) + { + case STACK_GOSUB_FLAG: + if(table_index == KW_RETURN) + { + struct stack_gosub_frame *f = (struct stack_gosub_frame *)tempsp; + current_line = f->current_line; + txtpos = f->txtpos; + sp += sizeof(struct stack_gosub_frame); + goto run_next_statement; + } + // This is not the loop you are looking for... so Walk back up the stack + tempsp += sizeof(struct stack_gosub_frame); + break; + case STACK_FOR_FLAG: + // Flag, Var, Final, Step + if(table_index == KW_NEXT) + { + struct stack_for_frame *f = (struct stack_for_frame *)tempsp; + // Is the the variable we are looking for? + if(txtpos[-1] == f->for_var) + { + short int *varaddr = ((short int *)variables_begin) + txtpos[-1] - 'A'; + *varaddr = *varaddr + f->step; + // Use a different test depending on the sign of the step increment + if((f->step > 0 && *varaddr <= f->terminal) || (f->step < 0 && *varaddr >= f->terminal)) + { + // We have to loop so don't pop the stack + txtpos = f->txtpos; + current_line = f->current_line; + goto run_next_statement; + } + // We've run to the end of the loop. drop out of the loop, popping the stack + sp = tempsp + sizeof(struct stack_for_frame); + goto run_next_statement; + } + } + // This is not the loop you are looking for... so Walk back up the stack + tempsp += sizeof(struct stack_for_frame); + break; + default: + printf("Stack is stuffed!\n"); + goto warmstart; + } + } + // Didn't find the variable we've been looking for + goto qhow; + +assignment: + { + short int value; + short int *var; + + if(*txtpos < 'A' || *txtpos > 'Z') + goto qhow; + var = (short int *)variables_begin + *txtpos - 'A'; + txtpos++; + + ignore_blanks(); + + if (*txtpos != '=') + goto qwhat; + txtpos++; + ignore_blanks(); + expression_error = 0; + value = expression(); + if(expression_error) + goto qwhat; + // Check that we are at the end of the statement + if(*txtpos != NL && *txtpos != ':') + goto qwhat; + *var = value; + } + goto run_next_statement; +poke: + { + short int value; + unsigned char *address; + + // Work out where to put it + expression_error = 0; + value = expression(); + if(expression_error) + goto qwhat; + address = (unsigned char *)value; + + // check for a comma + ignore_blanks(); + if (*txtpos != ',') + goto qwhat; + txtpos++; + ignore_blanks(); + + // Now get the value to assign + expression_error = 0; + value = expression(); + if(expression_error) + goto qwhat; + printf("Poke %p value %i\n",address, (unsigned char)value); + // Check that we are at the end of the statement + if(*txtpos != NL && *txtpos != ':') + goto qwhat; + } + goto run_next_statement; + +list: + linenum = testnum(); // Retuns 0 if no line found. + + // Should be EOL + if(txtpos[0] != NL) + goto qwhat; + + // Find the line + list_line = findline(); + while(list_line != program_end) + printline(); + goto warmstart; + +print: + // If we have an empty list then just put out a NL + if(*txtpos == ':' ) + { + line_terminator(); + txtpos++; + goto run_next_statement; + } + if(*txtpos == NL) + { + goto execnextline; + } + + while(1) + { + ignore_blanks(); + if(print_quoted_string()) + { + ; + } + else if(*txtpos == '"' || *txtpos == '\'') + goto qwhat; + else + { + short int e; + expression_error = 0; + e = expression(); + if(expression_error) + goto qwhat; + printnum(e); + } + + // At this point we have three options, a comma or a new line + if(*txtpos == ',') + txtpos++; // Skip the comma and move onto the next + else if(txtpos[0] == ';' && (txtpos[1] == NL || txtpos[1] == ':')) + { + txtpos++; // This has to be the end of the print - no newline + break; + } + else if(*txtpos == NL || *txtpos == ':') + { + line_terminator(); // The end of the print statement + break; + } + else + goto qwhat; + } + goto run_next_statement; +} + +/***************************************************************************/ +static void line_terminator(void) +{ + outchar(NL); + outchar(CR); +} + +/***********************************************************/ +void setup() +{ +#if ARDUINO + Serial.begin(9600); // opens serial port, sets data rate to 9600 bps +#endif +} + +/***********************************************************/ +static unsigned char breakcheck(void) +{ +#if ARDUINO + if(Serial.available()) + return Serial.read() == CTRLC; + return 0; +#else + if(kbhit()) + return getch() == CTRLC; + else + return 0; +#endif +} +/***********************************************************/ +static int inchar() +{ +#if ARDUINO + while(1) + { + if(Serial.available()) + return Serial.read(); + } +#else + return getchar(); +#endif +} + +/***********************************************************/ +static void outchar(unsigned char c) +{ +#if ARDUINO + //Serial.write(c); + term.send(c); +#else + putchar(c); +#endif +} + diff --git a/Arduino/libraries/Hi-Res Video Driver Source/keywords.txt b/Arduino/libraries/Hi-Res Video Driver Source/keywords.txt new file mode 100644 index 0000000..b650345 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/keywords.txt @@ -0,0 +1,65 @@ +####################################### +# Syntax Colouring Map For Terminal +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Terminal KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +clear KEYWORD2 +cursorUnderscore KEYWORD2 +cursorBlock KEYWORD2 +cursorOff KEYWORD2 +cursorCustom KEYWORD2 +setFont KEYWORD2 +setCursor KEYWORD2 +setColumn KEYWORD2 +setRow KEYWORD2 +sendCRLF KEYWORD2 +printLine KEYWORD2 +print KEYWORD2 +send KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +TERMINAL_CURSOR_SET LITERAL1 +TERMINAL_CURSOR_BLINKING LITERAL1 +TERMINAL_CURSOR_SOLID LITERAL1 +TERMINAL_BACKSPACE LITERAL1 +TERMINAL_TAB LITERAL1 +TERMINAL_LINE_FEED LITERAL1 +TERMINAL_CLEAR_SCREEN LITERAL1 +TERMINAL_CARRIAGE_RETURN LITERAL1 +TERMINAL_SET_COLUMN LITERAL1 +TERMINAL_SET_ROW LITERAL1 +TERMINAL_DELETE_BEFORE_LINE LITERAL1 +TERMINAL_DELETE_AFTER_LINE LITERAL1 +TERMINAL_DELETE_BEFORE_PAGE LITERAL1 +TERMINAL_DELETE_AFTER_PAGE LITERAL1 +TERMINAL_SCROLL_UP LITERAL1 +TERMINAL_SCROLL_DOWN LITERAL1 +TERMINAL_SCROLL_LEFT LITERAL1 +TERMINAL_SCROLL_RIGHT LITERAL1 +TERMINAL_SET_FONT LITERAL1 +TERMINAL_NEXT_IS_CHAR LITERAL1 +TERMINAL_ESCAPE LITERAL1 +TERMINAL_CURSOR_RIGHT LITERAL1 +TERMINAL_CURSOR_LEFT LITERAL1 +TERMINAL_CURSOR_UP LITERAL1 +TERMINAL_CURSOR_DOWN LITERAL1 +TERMINAL_DELETE LITERAL1 +TERMINAL_FONT_40_CHAR LITERAL1 +TERMINAL_FONT_80_CHAR LITERAL1 +TERMINAL_FONT_BOLD LITERAL1 +TERMINAL_FONT_NORMAL LITERAL1 +TERMINAL_FONT_SINGLE_HEIGHT LITERAL1 +TERMINAL_FONT_DOUBLE_HEIGHT LITERAL1 +TERMINAL_FONT_GRAPHICS LITERAL1 diff --git a/Arduino/libraries/Hi-Res Video Driver Source/readme.txt b/Arduino/libraries/Hi-Res Video Driver Source/readme.txt new file mode 100644 index 0000000..c5adc33 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/readme.txt @@ -0,0 +1,24 @@ +To use this library you need an additional ATMega328P to act as a video processor, and a 74HCT166 shift register to generate the video bit stream. + +The video processor hex file needs to be programmed into an ATMega328P with the following fuses set: +E6 D9 FF + +In avrdude that is: (change the com port as appropriate) + +avrdude -P COM3 -b 19200 -c avrisp -p m328p -n +avrdude -P COM3 -b 19200 -c avrisp -p m328p -U lfuse:w:0xe6:m +avrdude -P COM3 -b 19200 -c avrisp -p m328p -U hfuse:w:0xd9:m +avrdude -P COM3 -b 19200 -c avrisp -p m328p -U efuse:w:0xff:m +avrdude -P COM3 -b 19200 -c avrisp -p m328p -U flash:w:SBCVideo.hex + +The video processor code is written by Grant Searle, based on code by Daryl Rictor. + +Their pages are as follows: + +http://searle.hostei.com/grant/MonitorKeyboard/index.html +http://sbc.rictor.org/vid3.html + +80x25 Terminal library by Dave Curran, based on code from the above. For more info see: + +http://blog.tynemouthsoftware.co.uk/2013/09/arduino-80x25-tv-video-output-library.html +http://blog.tynemouthsoftware.co.uk/2013/09/arduino-80x25-tv-video-output-library_15.html diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/BlockFont.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/BlockFont.inc new file mode 100644 index 0000000..22601fd --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/BlockFont.inc @@ -0,0 +1,163 @@ +;****************************************************** +; Block font for medium-res graphics +; +; by Grant Searle 2013 +;****************************************************** + +.CSEG +.ORG 0x1400 + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF + +; Character line 1 (same as 0): +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0xF0, 0x0F, 0xFF + + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF + +; Character line 3 (same as 2): +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + + +; Character line 5 (same as 4): +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + + +; Character line 7 (same as 6): +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFont.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFont.inc new file mode 100644 index 0000000..feb0aa6 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFont.inc @@ -0,0 +1,160 @@ +;****************************************************** +; COMPLETE CGA BOLD FONT +; +; Extracted by Grant Searle 2013 +;****************************************************** + +.CSEG +.ORG 0x2000 + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x7E, 0x7E, 0x6C, 0x10, 0x38, 0x10, 0x00, 0xFF, 0x00, 0xFF, 0x0F, 0x3C, 0x3F, 0x7F, 0x18 +.db 0x80, 0x02, 0x18, 0x66, 0x7F, 0x3E, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x30, 0x6C, 0x6C, 0x30, 0x00, 0x38, 0x60, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06 +.db 0x7C, 0x30, 0x78, 0x78, 0x1C, 0xFC, 0x38, 0xFC, 0x78, 0x78, 0x00, 0x00, 0x18, 0x00, 0x60, 0x78 +.db 0x7C, 0x30, 0xFC, 0x3C, 0xF8, 0xFE, 0xFE, 0x3C, 0xCC, 0x78, 0x1E, 0xE6, 0xF0, 0xC6, 0xC6, 0x38 +.db 0xFC, 0x78, 0xFC, 0x78, 0xFC, 0xCC, 0xCC, 0xC6, 0xC6, 0xCC, 0xFE, 0x78, 0xC0, 0x78, 0x10, 0x00 +.db 0x30, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x30, 0x0C, 0xE0, 0x70, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x18, 0xE0, 0x76, 0x00 +.db 0x78, 0x00, 0x1C, 0x7E, 0xCC, 0xE0, 0x30, 0x00, 0x7E, 0xCC, 0xE0, 0xCC, 0x7C, 0xE0, 0xC6, 0x30 +.db 0x1C, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xC3, 0xCC, 0x18, 0x38, 0xCC, 0xF8, 0x0E +.db 0x1C, 0x38, 0x00, 0x00, 0x00, 0xFC, 0x3C, 0x38, 0x30, 0x00, 0x00, 0xC3, 0xC3, 0x18, 0x00, 0x00 +.db 0x22, 0x55, 0xDB, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00 +.db 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18 +.db 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x38, 0x38, 0x1C, 0x00, 0x06, 0x38, 0x78 +.db 0x00, 0x30, 0x60, 0x18, 0x0E, 0x18, 0x30, 0x00, 0x38, 0x00, 0x00, 0x0F, 0x78, 0x70, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0xFE, 0x38, 0x7C, 0x10, 0x00, 0xFF, 0x3C, 0xC3, 0x07, 0x66, 0x33, 0x63, 0xDB +.db 0xE0, 0x0E, 0x3C, 0x66, 0xDB, 0x63, 0x00, 0x3C, 0x3C, 0x18, 0x18, 0x30, 0x00, 0x24, 0x18, 0xFF +.db 0x00, 0x78, 0x6C, 0x6C, 0x7C, 0xC6, 0x6C, 0x60, 0x30, 0x30, 0x66, 0x30, 0x00, 0x00, 0x00, 0x0C +.db 0xC6, 0x70, 0xCC, 0xCC, 0x3C, 0xC0, 0x60, 0xCC, 0xCC, 0xCC, 0x30, 0x30, 0x30, 0x00, 0x30, 0xCC +.db 0xC6, 0x78, 0x66, 0x66, 0x6C, 0x62, 0x62, 0x66, 0xCC, 0x30, 0x0C, 0x66, 0x60, 0xEE, 0xE6, 0x6C +.db 0x66, 0xCC, 0x66, 0xCC, 0xB4, 0xCC, 0xCC, 0xC6, 0xC6, 0xCC, 0xC6, 0x60, 0x60, 0x18, 0x38, 0x00 +.db 0x30, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x6C, 0x00, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x30, 0xDC, 0x10 +.db 0xCC, 0xCC, 0x00, 0xC3, 0x00, 0x00, 0x30, 0x00, 0xC3, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x38, 0x30 +.db 0x00, 0x00, 0x6C, 0xCC, 0xCC, 0xE0, 0xCC, 0xE0, 0xCC, 0x18, 0x00, 0x18, 0x6C, 0xCC, 0xCC, 0x1B +.db 0x00, 0x00, 0x1C, 0x1C, 0xF8, 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x18, 0x33, 0xCC +.db 0x88, 0xAA, 0x77, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00 +.db 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18 +.db 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0x78, 0xFC, 0xFE, 0xCC, 0x00, 0x66, 0x76, 0x30, 0x6C, 0x6C, 0x30, 0x00, 0x0C, 0x60, 0xCC +.db 0xFC, 0x30, 0x30, 0x30, 0x1B, 0x18, 0x30, 0x76, 0x6C, 0x00, 0x00, 0x0C, 0x6C, 0x18, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xA5, 0xDB, 0xFE, 0x7C, 0x38, 0x38, 0x18, 0xE7, 0x66, 0x99, 0x0F, 0x66, 0x3F, 0x7F, 0x3C +.db 0xF8, 0x3E, 0x7E, 0x66, 0xDB, 0x38, 0x00, 0x7E, 0x7E, 0x18, 0x0C, 0x60, 0xC0, 0x66, 0x3C, 0xFF +.db 0x00, 0x78, 0x6C, 0xFE, 0xC0, 0xCC, 0x38, 0xC0, 0x60, 0x18, 0x3C, 0x30, 0x00, 0x00, 0x00, 0x18 +.db 0xCE, 0x30, 0x0C, 0x0C, 0x6C, 0xF8, 0xC0, 0x0C, 0xCC, 0xCC, 0x30, 0x30, 0x60, 0xFC, 0x18, 0x0C +.db 0xDE, 0xCC, 0x66, 0xC0, 0x66, 0x68, 0x68, 0xC0, 0xCC, 0x30, 0x0C, 0x6C, 0x60, 0xFE, 0xF6, 0xC6 +.db 0x66, 0xCC, 0x66, 0x60, 0x30, 0xCC, 0xCC, 0xC6, 0x6C, 0xCC, 0x8C, 0x60, 0x30, 0x18, 0x6C, 0x00 +.db 0x18, 0x78, 0x60, 0x78, 0x0C, 0x78, 0x60, 0x76, 0x6C, 0x70, 0x0C, 0x66, 0x30, 0xCC, 0xF8, 0x78 +.db 0xDC, 0x76, 0xDC, 0x7C, 0x7C, 0xCC, 0xCC, 0xC6, 0xC6, 0xCC, 0xFC, 0x30, 0x18, 0x30, 0x00, 0x38 +.db 0xC0, 0x00, 0x78, 0x3C, 0x78, 0x78, 0x78, 0x78, 0x3C, 0x78, 0x78, 0x70, 0x38, 0x70, 0x6C, 0x00 +.db 0xFC, 0x7F, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xCC, 0x7E, 0x64, 0x78, 0xCC, 0x18 +.db 0x78, 0x70, 0x00, 0x00, 0x00, 0xCC, 0x6C, 0x6C, 0x30, 0x00, 0x00, 0xCC, 0xCC, 0x00, 0x66, 0x66 +.db 0x22, 0x55, 0xDB, 0x18, 0x18, 0xF8, 0x36, 0x00, 0xF8, 0xF6, 0x36, 0xFE, 0xF6, 0x36, 0xF8, 0x00 +.db 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x1F, 0x36, 0x37, 0x3F, 0xF7, 0xFF, 0x37, 0xFF, 0xF7, 0xFF +.db 0x36, 0xFF, 0x00, 0x36, 0x1F, 0x1F, 0x00, 0x36, 0xFF, 0x18, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x76, 0xCC, 0xCC, 0x6C, 0x60, 0x7E, 0x66, 0xDC, 0x78, 0xC6, 0xC6, 0x18, 0x7E, 0x7E, 0xC0, 0xCC +.db 0x00, 0xFC, 0x18, 0x60, 0x1B, 0x18, 0x00, 0xDC, 0x6C, 0x00, 0x00, 0x0C, 0x6C, 0x30, 0x3C, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0xFE, 0xFE, 0xFE, 0x7C, 0x3C, 0xC3, 0x42, 0xBD, 0x7D, 0x66, 0x30, 0x63, 0xE7 +.db 0xFE, 0xFE, 0x18, 0x66, 0x7B, 0x6C, 0x00, 0x18, 0x18, 0x18, 0xFE, 0xFE, 0xC0, 0xFF, 0x7E, 0x7E +.db 0x00, 0x30, 0x00, 0x6C, 0x78, 0x18, 0x76, 0x00, 0x60, 0x18, 0xFF, 0xFC, 0x00, 0xFC, 0x00, 0x30 +.db 0xDE, 0x30, 0x38, 0x38, 0xCC, 0x0C, 0xF8, 0x18, 0x78, 0x7C, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0x18 +.db 0xDE, 0xCC, 0x7C, 0xC0, 0x66, 0x78, 0x78, 0xC0, 0xFC, 0x30, 0x0C, 0x78, 0x60, 0xFE, 0xDE, 0xC6 +.db 0x7C, 0xCC, 0x7C, 0x30, 0x30, 0xCC, 0xCC, 0xD6, 0x38, 0x78, 0x18, 0x60, 0x18, 0x18, 0xC6, 0x00 +.db 0x00, 0x0C, 0x7C, 0xCC, 0x7C, 0xCC, 0xF0, 0xCC, 0x76, 0x30, 0x0C, 0x6C, 0x30, 0xFE, 0xCC, 0xCC +.db 0x66, 0xCC, 0x76, 0xC0, 0x30, 0xCC, 0xCC, 0xD6, 0x6C, 0xCC, 0x98, 0xE0, 0x00, 0x1C, 0x00, 0x6C +.db 0xCC, 0xCC, 0xCC, 0x06, 0x0C, 0x0C, 0x0C, 0xC0, 0x66, 0xCC, 0xCC, 0x30, 0x18, 0x30, 0xC6, 0x78 +.db 0x60, 0x0C, 0xFE, 0x78, 0x78, 0x78, 0xCC, 0xCC, 0xCC, 0x66, 0xCC, 0xC0, 0xF0, 0xFC, 0xFA, 0x3C +.db 0x0C, 0x30, 0x78, 0xCC, 0xF8, 0xEC, 0x3E, 0x38, 0x60, 0xFC, 0xFC, 0xDE, 0xDB, 0x18, 0xCC, 0x33 +.db 0x88, 0xAA, 0xEE, 0x18, 0x18, 0x18, 0x36, 0x00, 0x18, 0x06, 0x36, 0x06, 0x06, 0x36, 0x18, 0x00 +.db 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00 +.db 0x36, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0x36, 0x18, 0x18, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0xDC, 0xF8, 0xC0, 0x6C, 0x30, 0xD8, 0x66, 0x18, 0xCC, 0xFE, 0xC6, 0x7C, 0xDB, 0xDB, 0xF8, 0xCC +.db 0xFC, 0x30, 0x30, 0x30, 0x18, 0x18, 0xFC, 0x00, 0x38, 0x18, 0x00, 0x0C, 0x6C, 0x60, 0x3C, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xBD, 0xC3, 0x7C, 0x7C, 0xFE, 0xFE, 0x3C, 0xC3, 0x42, 0xBD, 0xCC, 0x3C, 0x30, 0x63, 0xE7 +.db 0xF8, 0x3E, 0x18, 0x66, 0x1B, 0x6C, 0x7E, 0x7E, 0x18, 0x7E, 0x0C, 0x60, 0xC0, 0x66, 0xFF, 0x3C +.db 0x00, 0x30, 0x00, 0xFE, 0x0C, 0x30, 0xDC, 0x00, 0x60, 0x18, 0x3C, 0x30, 0x00, 0x00, 0x00, 0x60 +.db 0xF6, 0x30, 0x60, 0x0C, 0xFE, 0x0C, 0xCC, 0x30, 0xCC, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x18, 0x30 +.db 0xDE, 0xFC, 0x66, 0xC0, 0x66, 0x68, 0x68, 0xCE, 0xCC, 0x30, 0xCC, 0x6C, 0x62, 0xD6, 0xCE, 0xC6 +.db 0x60, 0xDC, 0x6C, 0x18, 0x30, 0xCC, 0xCC, 0xFE, 0x38, 0x30, 0x32, 0x60, 0x0C, 0x18, 0x00, 0x00 +.db 0x00, 0x7C, 0x66, 0xC0, 0xCC, 0xFC, 0x60, 0xCC, 0x66, 0x30, 0x0C, 0x78, 0x30, 0xFE, 0xCC, 0xCC +.db 0x66, 0xCC, 0x66, 0x78, 0x30, 0xCC, 0xCC, 0xFE, 0x38, 0xCC, 0x30, 0x30, 0x18, 0x30, 0x00, 0xC6 +.db 0x78, 0xCC, 0xFC, 0x3E, 0x7C, 0x7C, 0x7C, 0xC0, 0x7E, 0xFC, 0xFC, 0x30, 0x18, 0x30, 0xFE, 0xCC +.db 0x78, 0x7F, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0xCC, 0xC0, 0x60, 0x30, 0xC6, 0x18 +.db 0x7C, 0x30, 0xCC, 0xCC, 0xCC, 0xFC, 0x00, 0x00, 0xC0, 0xC0, 0x0C, 0x33, 0x37, 0x18, 0x66, 0x66 +.db 0x22, 0x55, 0xDB, 0x18, 0xF8, 0xF8, 0xF6, 0xFE, 0xF8, 0xF6, 0x36, 0xF6, 0xFE, 0xFE, 0xF8, 0xF8 +.db 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0x37, 0x3F, 0x37, 0xFF, 0xF7, 0x37, 0xFF, 0xF7, 0xFF +.db 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x1F, 0x3F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0xC8, 0xCC, 0xC0, 0x6C, 0x60, 0xD8, 0x66, 0x18, 0xCC, 0xC6, 0x6C, 0xCC, 0xDB, 0xDB, 0xC0, 0xCC +.db 0x00, 0x30, 0x60, 0x18, 0x18, 0x18, 0x00, 0x76, 0x00, 0x18, 0x18, 0xEC, 0x6C, 0x78, 0x3C, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x99, 0xE7, 0x38, 0x38, 0xD6, 0x7C, 0x18, 0xE7, 0x66, 0x99, 0xCC, 0x18, 0x70, 0x67, 0x3C +.db 0xE0, 0x0E, 0x7E, 0x00, 0x1B, 0x38, 0x7E, 0x3C, 0x18, 0x3C, 0x18, 0x30, 0xFE, 0x24, 0xFF, 0x18 +.db 0x00, 0x00, 0x00, 0x6C, 0xF8, 0x66, 0xCC, 0x00, 0x30, 0x30, 0x66, 0x30, 0x30, 0x00, 0x30, 0xC0 +.db 0xE6, 0x30, 0xCC, 0xCC, 0x0C, 0xCC, 0xCC, 0x30, 0xCC, 0x18, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x00 +.db 0xC0, 0xCC, 0x66, 0x66, 0x6C, 0x62, 0x60, 0x66, 0xCC, 0x30, 0xCC, 0x66, 0x66, 0xC6, 0xC6, 0x6C +.db 0x60, 0x78, 0x66, 0xCC, 0x30, 0xCC, 0x78, 0xEE, 0x6C, 0x30, 0x66, 0x60, 0x06, 0x18, 0x00, 0x00 +.db 0x00, 0xCC, 0x66, 0xCC, 0xCC, 0xC0, 0x60, 0x7C, 0x66, 0x30, 0xCC, 0x6C, 0x30, 0xD6, 0xCC, 0xCC +.db 0x7C, 0x7C, 0x60, 0x0C, 0x34, 0xCC, 0x78, 0xFE, 0x6C, 0x7C, 0x64, 0x30, 0x18, 0x30, 0x00, 0xC6 +.db 0x18, 0xCC, 0xC0, 0x66, 0xCC, 0xCC, 0xCC, 0x78, 0x60, 0xC0, 0xC0, 0x30, 0x18, 0x30, 0xC6, 0xFC +.db 0x60, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x3C, 0xCC, 0x7E, 0xE6, 0xFC, 0xCF, 0x18 +.db 0xCC, 0x30, 0xCC, 0xCC, 0xCC, 0xDC, 0x7E, 0x7C, 0xCC, 0xC0, 0x0C, 0x66, 0x6F, 0x18, 0x33, 0xCC +.db 0x88, 0xAA, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18 +.db 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00 +.db 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0xDC, 0xF8, 0xC0, 0x6C, 0xCC, 0xD8, 0x7C, 0x18, 0x78, 0x6C, 0x6C, 0xCC, 0x7E, 0x7E, 0x60, 0xCC +.db 0xFC, 0x00, 0x00, 0x00, 0x18, 0xD8, 0x30, 0xDC, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x3C, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x00, 0xFF, 0x3C, 0xC3, 0xCC, 0x7E, 0xF0, 0xE6, 0xDB +.db 0x80, 0x02, 0x3C, 0x66, 0x1B, 0xCC, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x30, 0x00, 0x6C, 0x30, 0xC6, 0x76, 0x00, 0x18, 0x60, 0x00, 0x00, 0x30, 0x00, 0x30, 0x80 +.db 0x7C, 0xFC, 0xFC, 0x78, 0x1E, 0x78, 0x78, 0x30, 0x78, 0x70, 0x30, 0x30, 0x18, 0x00, 0x60, 0x30 +.db 0x78, 0xCC, 0xFC, 0x3C, 0xF8, 0xFE, 0xF0, 0x3E, 0xCC, 0x78, 0x78, 0xE6, 0xFE, 0xC6, 0xC6, 0x38 +.db 0xF0, 0x1C, 0xE6, 0x78, 0x78, 0xFC, 0x30, 0xC6, 0xC6, 0x78, 0xFE, 0x78, 0x02, 0x78, 0x00, 0x00 +.db 0x00, 0x76, 0xDC, 0x78, 0x76, 0x78, 0xF0, 0x0C, 0xE6, 0x78, 0xCC, 0xE6, 0x78, 0xC6, 0xCC, 0x78 +.db 0x60, 0x0C, 0xF0, 0xF8, 0x18, 0x76, 0x30, 0x6C, 0xC6, 0x0C, 0xFC, 0x1C, 0x18, 0xE0, 0x00, 0xFE +.db 0x0C, 0x7E, 0x78, 0x3F, 0x7E, 0x7E, 0x7E, 0x0C, 0x3C, 0x78, 0x78, 0x78, 0x3C, 0x78, 0xC6, 0xCC +.db 0xFC, 0x7F, 0xCE, 0x78, 0x78, 0x78, 0x7E, 0x7E, 0x0C, 0x18, 0x78, 0x18, 0xFC, 0x30, 0xC6, 0xD8 +.db 0x7E, 0x78, 0x78, 0x7E, 0xCC, 0xCC, 0x00, 0x00, 0x78, 0x00, 0x00, 0xCC, 0xCF, 0x18, 0x00, 0x00 +.db 0x22, 0x55, 0xDB, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18 +.db 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00 +.db 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x76, 0xC0, 0xC0, 0x6C, 0xFC, 0x70, 0x60, 0x18, 0x30, 0x38, 0xEE, 0x78, 0x00, 0x60, 0x38, 0xCC +.db 0x00, 0xFC, 0xFC, 0xFC, 0x18, 0xD8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x38, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x78, 0x18, 0xE0, 0xC0, 0x18 +.db 0x00, 0x00, 0x18, 0x00, 0x00, 0x78, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x30, 0xC7, 0x70 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00 +.db 0x88, 0xAA, 0xEE, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18 +.db 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00 +.db 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00 diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFontWide.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFontWide.inc new file mode 100644 index 0000000..ea4637f --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGABoldFontWide.inc @@ -0,0 +1,316 @@ +;****************************************************** +; COMPLETE CGA BOLD FONT - WIDE VERSERION +; +; Extracted by Grant Searle 2013 +;****************************************************** +.CSEG +.ORG 0x2800 + +; 40 Char / line font (double width) left half of each char + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x3F, 0x3F, 0x3C, 0x03, 0x0F, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0F, 0x0F, 0x3F, 0x03 +.db 0xC0, 0x00, 0x03, 0x3C, 0x3F, 0x0F, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x0F, 0x3C, 0x3C, 0x0F, 0x00, 0x0F, 0x3C, 0x03, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3F, 0x0F, 0x3F, 0x3F, 0x03, 0xFF, 0x0F, 0xFF, 0x3F, 0x3F, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x3F +.db 0x3F, 0x0F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xF0, 0x3F, 0x03, 0xFC, 0xFF, 0xF0, 0xF0, 0x0F +.db 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0x3F, 0xF0, 0x3F, 0x03, 0x00 +.db 0x0F, 0x00, 0xFC, 0x00, 0x03, 0x00, 0x0F, 0x00, 0xFC, 0x0F, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xFC, 0x3F, 0x00 +.db 0x3F, 0x00, 0x03, 0x3F, 0xF0, 0xFC, 0x0F, 0x00, 0x3F, 0xF0, 0xFC, 0xF0, 0x3F, 0xFC, 0xF0, 0x0F +.db 0x03, 0x00, 0x0F, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xF0, 0xF0, 0x03, 0x0F, 0xF0, 0xFF, 0x00 +.db 0x03, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0xF0, 0xF0, 0x03, 0x00, 0x00 +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0x03, 0x0F, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x0F, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x03 +.db 0x0F, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x0F, 0x3F +.db 0x00, 0x0F, 0x3C, 0x03, 0x00, 0x03, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x3F, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0x3C, 0x0F, 0x3C, 0xF3 +.db 0xFC, 0x00, 0x0F, 0x3C, 0xF3, 0x3C, 0x00, 0x0F, 0x0F, 0x03, 0x03, 0x0F, 0x00, 0x0C, 0x03, 0xFF +.db 0x00, 0x3F, 0x3C, 0x3C, 0x3F, 0xF0, 0x3C, 0x3C, 0x0F, 0x0F, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0x3F, 0xF0, 0xF0, 0x0F, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x00, 0x0F, 0xF0 +.db 0xF0, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xF0, 0x0F, 0x00, 0x3C, 0x3C, 0xFC, 0xFC, 0x3C +.db 0x3C, 0xF0, 0x3C, 0xF0, 0xCF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3C, 0x3C, 0x03, 0x0F, 0x00 +.db 0x0F, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x0F, 0xF3, 0x03 +.db 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x0F +.db 0x00, 0x00, 0x3C, 0xF0, 0xF0, 0xFC, 0xF0, 0xFC, 0xF0, 0x03, 0x00, 0x03, 0x3C, 0xF0, 0xF0, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0xFF, 0x00, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x03, 0x0F, 0xF0 +.db 0xC0, 0xCC, 0x3F, 0x03, 0x03, 0x03, 0x0F, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x0F, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x03 +.db 0x0F, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x00, 0x3F, 0xFF, 0xFF, 0xF0, 0x00, 0x3C, 0x3F, 0x0F, 0x3C, 0x3C, 0x0F, 0x00, 0x00, 0x3C, 0xF0 +.db 0xFF, 0x0F, 0x0F, 0x0F, 0x03, 0x03, 0x0F, 0x3F, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xCC, 0xF3, 0xFF, 0x3F, 0x0F, 0x0F, 0x03, 0xFC, 0x3C, 0xC3, 0x00, 0x3C, 0x0F, 0x3F, 0x0F +.db 0xFF, 0x0F, 0x3F, 0x3C, 0xF3, 0x0F, 0x00, 0x3F, 0x3F, 0x03, 0x00, 0x3C, 0xF0, 0x3C, 0x0F, 0xFF +.db 0x00, 0x3F, 0x3C, 0xFF, 0xF0, 0xF0, 0x0F, 0xF0, 0x3C, 0x03, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x03 +.db 0xF0, 0x0F, 0x00, 0x00, 0x3C, 0xFF, 0xF0, 0x00, 0xF0, 0xF0, 0x0F, 0x0F, 0x3C, 0xFF, 0x03, 0x00 +.db 0xF3, 0xF0, 0x3C, 0xF0, 0x3C, 0x3C, 0x3C, 0xF0, 0xF0, 0x0F, 0x00, 0x3C, 0x3C, 0xFF, 0xFF, 0xF0 +.db 0x3C, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0xC0, 0x3C, 0x0F, 0x03, 0x3C, 0x00 +.db 0x03, 0x3F, 0x3C, 0x3F, 0x00, 0x3F, 0x3C, 0x3F, 0x3C, 0x3F, 0x00, 0x3C, 0x0F, 0xF0, 0xFF, 0x3F +.db 0xF3, 0x3F, 0xF3, 0x3F, 0x3F, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0x0F, 0x03, 0x0F, 0x00, 0x0F +.db 0xF0, 0x00, 0x3F, 0x0F, 0x3F, 0x3F, 0x3F, 0x3F, 0x0F, 0x3F, 0x3F, 0x3F, 0x0F, 0x3F, 0x3C, 0x00 +.db 0xFF, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x3F, 0x3C, 0x3F, 0xF0, 0x03 +.db 0x3F, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x3C, 0x3C, 0x0F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x3C, 0x3C +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x0F, 0xFF, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF +.db 0x0F, 0xFF, 0x00, 0x0F, 0x03, 0x03, 0x00, 0x0F, 0xFF, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x3F, 0xF0, 0xF0, 0x3C, 0x3C, 0x3F, 0x3C, 0xF3, 0x3F, 0xF0, 0xF0, 0x03, 0x3F, 0x3F, 0xF0, 0xF0 +.db 0x00, 0xFF, 0x03, 0x3C, 0x03, 0x03, 0x00, 0xF3, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x0F, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0xF0, 0x30, 0xCF, 0x3F, 0x3C, 0x0F, 0x3C, 0xFC +.db 0xFF, 0xFF, 0x03, 0x3C, 0x3F, 0x3C, 0x00, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0x3F, 0x3F +.db 0x00, 0x0F, 0x00, 0x3C, 0x3F, 0x03, 0x3F, 0x00, 0x3C, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x0F +.db 0xF3, 0x0F, 0x0F, 0x0F, 0xF0, 0x00, 0xFF, 0x03, 0x3F, 0x3F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03 +.db 0xF3, 0xF0, 0x3F, 0xF0, 0x3C, 0x3F, 0x3F, 0xF0, 0xFF, 0x0F, 0x00, 0x3F, 0x3C, 0xFF, 0xF3, 0xF0 +.db 0x3F, 0xF0, 0x3F, 0x0F, 0x0F, 0xF0, 0xF0, 0xF3, 0x0F, 0x3F, 0x03, 0x3C, 0x03, 0x03, 0xF0, 0x00 +.db 0x00, 0x00, 0x3F, 0xF0, 0x3F, 0xF0, 0xFF, 0xF0, 0x3F, 0x0F, 0x00, 0x3C, 0x0F, 0xFF, 0xF0, 0xF0 +.db 0x3C, 0xF0, 0x3F, 0xF0, 0x0F, 0xF0, 0xF0, 0xF3, 0x3C, 0xF0, 0xC3, 0xFC, 0x00, 0x03, 0x00, 0x3C +.db 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3C, 0xF0, 0xF0, 0x0F, 0x03, 0x0F, 0xF0, 0x3F +.db 0x3C, 0x00, 0xFF, 0x3F, 0x3F, 0x3F, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F +.db 0x00, 0x0F, 0x3F, 0xF0, 0xFF, 0xFC, 0x0F, 0x0F, 0x3C, 0xFF, 0xFF, 0xF3, 0xF3, 0x03, 0xF0, 0x0F +.db 0xC0, 0xCC, 0xFC, 0x03, 0x03, 0x03, 0x0F, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00 +.db 0x0F, 0x00, 0x00, 0x0F, 0x03, 0x03, 0x00, 0x0F, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0xF3, 0xFF, 0xF0, 0x3C, 0x0F, 0xF3, 0x3C, 0x03, 0xF0, 0xFF, 0xF0, 0x3F, 0xF3, 0xF3, 0xFF, 0xF0 +.db 0xFF, 0x0F, 0x0F, 0x0F, 0x03, 0x03, 0xFF, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x3C, 0x3C, 0x0F, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xCF, 0xF0, 0x3F, 0x3F, 0xFF, 0xFF, 0x0F, 0xF0, 0x30, 0xCF, 0xF0, 0x0F, 0x0F, 0x3C, 0xFC +.db 0xFF, 0x0F, 0x03, 0x3C, 0x03, 0x3C, 0x3F, 0x3F, 0x03, 0x3F, 0x00, 0x3C, 0xF0, 0x3C, 0xFF, 0x0F +.db 0x00, 0x0F, 0x00, 0xFF, 0x00, 0x0F, 0xF3, 0x00, 0x3C, 0x03, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x3C +.db 0xFF, 0x0F, 0x3C, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x03, 0x0F +.db 0xF3, 0xFF, 0x3C, 0xF0, 0x3C, 0x3C, 0x3C, 0xF0, 0xF0, 0x0F, 0xF0, 0x3C, 0x3C, 0xF3, 0xF0, 0xF0 +.db 0x3C, 0xF3, 0x3C, 0x03, 0x0F, 0xF0, 0xF0, 0xFF, 0x0F, 0x0F, 0x0F, 0x3C, 0x00, 0x03, 0x00, 0x00 +.db 0x00, 0x3F, 0x3C, 0xF0, 0xF0, 0xFF, 0x3C, 0xF0, 0x3C, 0x0F, 0x00, 0x3F, 0x0F, 0xFF, 0xF0, 0xF0 +.db 0x3C, 0xF0, 0x3C, 0x3F, 0x0F, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0x0F, 0x03, 0x0F, 0x00, 0xF0 +.db 0x3F, 0xF0, 0xFF, 0x0F, 0x3F, 0x3F, 0x3F, 0xF0, 0x3F, 0xFF, 0xFF, 0x0F, 0x03, 0x0F, 0xFF, 0xF0 +.db 0x3F, 0x3F, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0x3C, 0x0F, 0xF0, 0x03 +.db 0x3F, 0x0F, 0xF0, 0xF0, 0xF0, 0xFF, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0x03, 0x3C, 0x3C +.db 0x0C, 0x33, 0xF3, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x03, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0x0F, 0x03, 0x03, 0x0F, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0x3C, 0x3C, 0xF3, 0x3C, 0x03, 0xF0, 0xF0, 0x3C, 0xF0, 0xF3, 0xF3, 0xF0, 0xF0 +.db 0x00, 0x0F, 0x3C, 0x03, 0x03, 0x03, 0x00, 0x3F, 0x00, 0x03, 0x03, 0xFC, 0x3C, 0x3F, 0x0F, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC3, 0xFC, 0x0F, 0x0F, 0xF3, 0x3F, 0x03, 0xFC, 0x3C, 0xC3, 0xF0, 0x03, 0x3F, 0x3C, 0x0F +.db 0xFC, 0x00, 0x3F, 0x00, 0x03, 0x0F, 0x3F, 0x0F, 0x03, 0x0F, 0x03, 0x0F, 0xFF, 0x0C, 0xFF, 0x03 +.db 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x3C, 0xF0, 0x00, 0x0F, 0x0F, 0x3C, 0x0F, 0x0F, 0x00, 0x0F, 0xF0 +.db 0xFC, 0x0F, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0x0F, 0xF0, 0x03, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x00 +.db 0xF0, 0xF0, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xF0, 0x0F, 0xF0, 0x3C, 0x3C, 0xF0, 0xF0, 0x3C +.db 0x3C, 0x3F, 0x3C, 0xF0, 0x0F, 0xF0, 0x3F, 0xFC, 0x3C, 0x0F, 0x3C, 0x3C, 0x00, 0x03, 0x00, 0x00 +.db 0x00, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0x3C, 0x3F, 0x3C, 0x0F, 0xF0, 0x3C, 0x0F, 0xF3, 0xF0, 0xF0 +.db 0x3F, 0x3F, 0x3C, 0x00, 0x0F, 0xF0, 0x3F, 0xFF, 0x3C, 0x3F, 0x3C, 0x0F, 0x03, 0x0F, 0x00, 0xF0 +.db 0x03, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0x3F, 0x3C, 0xF0, 0xF0, 0x0F, 0x03, 0x0F, 0xF0, 0xFF +.db 0x3C, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3F, 0x0F, 0xF0, 0x3F, 0xFC, 0xFF, 0xF0, 0x03 +.db 0xF0, 0x0F, 0xF0, 0xF0, 0xF0, 0xF3, 0x3F, 0x3F, 0xF0, 0xF0, 0x00, 0x3C, 0x3C, 0x03, 0x0F, 0xF0 +.db 0xC0, 0xCC, 0x3F, 0x03, 0x03, 0x03, 0x0F, 0x0F, 0x03, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x00 +.db 0x00, 0x03, 0x0F, 0x00, 0x00, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0xF3, 0xFF, 0xF0, 0x3C, 0xF0, 0xF3, 0x3F, 0x03, 0x3F, 0x3C, 0x3C, 0xF0, 0x3F, 0x3F, 0x3C, 0xF0 +.db 0xFF, 0x00, 0x00, 0x00, 0x03, 0xF3, 0x0F, 0xF3, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0xF0, 0x3F, 0xFF, 0xFC, 0xF3 +.db 0xC0, 0x00, 0x0F, 0x3C, 0x03, 0xF0, 0x3F, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x0F, 0x00, 0x3C, 0x0F, 0xF0, 0x3F, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0xC0 +.db 0x3F, 0xFF, 0xFF, 0x3F, 0x03, 0x3F, 0x3F, 0x0F, 0x3F, 0x3F, 0x0F, 0x0F, 0x03, 0x00, 0x3C, 0x0F +.db 0x3F, 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xF0, 0x3F, 0x3F, 0xFC, 0xFF, 0xF0, 0xF0, 0x0F +.db 0xFF, 0x03, 0xFC, 0x3F, 0x3F, 0xFF, 0x0F, 0xF0, 0xF0, 0x3F, 0xFF, 0x3F, 0x00, 0x3F, 0x00, 0x00 +.db 0x00, 0x3F, 0xF3, 0x3F, 0x3F, 0x3F, 0xFF, 0x00, 0xFC, 0x3F, 0xF0, 0xFC, 0x3F, 0xF0, 0xF0, 0x3F +.db 0x3C, 0x00, 0xFF, 0xFF, 0x03, 0x3F, 0x0F, 0x3C, 0xF0, 0x00, 0xFF, 0x03, 0x03, 0xFC, 0x00, 0xFF +.db 0x00, 0x3F, 0x3F, 0x0F, 0x3F, 0x3F, 0x3F, 0x00, 0x0F, 0x3F, 0x3F, 0x3F, 0x0F, 0x3F, 0xF0, 0xF0 +.db 0xFF, 0x3F, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x03, 0x3F, 0x03, 0xFF, 0x0F, 0xF0, 0xF3 +.db 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xF0, 0xF0, 0x03, 0x00, 0x00 +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0x03, 0x0F, 0x0F, 0x03, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x00 +.db 0x00, 0x03, 0x0F, 0x00, 0x00, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x3F, 0xF0, 0xF0, 0x3C, 0xFF, 0x3F, 0x3C, 0x03, 0x0F, 0x0F, 0xFC, 0x3F, 0x00, 0x3C, 0x0F, 0xF0 +.db 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xF3, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0x03, 0xFC, 0xF0, 0x03 +.db 0x00, 0x00, 0x03, 0x00, 0x00, 0x3F, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0x00, 0x0F, 0xF0, 0x3F +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xC0, 0xCC, 0xFC, 0x03, 0x03, 0x03, 0x0F, 0x0F, 0x03, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x00 +.db 0x00, 0x03, 0x0F, 0x00, 0x00, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x03, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 + + +; 40 Char / line font (double width) right half of each char + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xFC, 0xFC, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0 +.db 0x00, 0x0C, 0xC0, 0x3C, 0xFF, 0xFC, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C +.db 0xF0, 0x00, 0xC0, 0xC0, 0xF0, 0xF0, 0xC0, 0xF0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0 +.db 0xF0, 0x00, 0xF0, 0xF0, 0xC0, 0xFC, 0xFC, 0xF0, 0xF0, 0xC0, 0xFC, 0x3C, 0x00, 0x3C, 0x3C, 0xC0 +.db 0xF0, 0xC0, 0xF0, 0xC0, 0xF0, 0xF0, 0xF0, 0x3C, 0x3C, 0xF0, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0x00, 0x3C, 0x00 +.db 0xC0, 0x00, 0xF0, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0x3C, 0x00 +.db 0xF0, 0x00, 0xFC, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0xF0, 0xC0, 0xC0, 0xF0, 0xC0, 0xFC +.db 0xF0, 0xC0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xC0, 0x00, 0x00 +.db 0x0C, 0x33, 0xCF, 0xC0, 0xC0, 0xC0, 0x3C, 0x00, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x3C, 0xC0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0xC0 +.db 0x3C, 0x00, 0x00, 0x3C, 0xC0, 0x00, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0xF0, 0x00, 0x3C, 0xC0, 0xC0 +.db 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0xFC, 0xC0, 0xF0, 0x00, 0x00, 0xFF, 0xF0, 0x0F, 0x3F, 0x3C, 0x0F, 0x0F, 0xCF +.db 0x00, 0xFC, 0xF0, 0x3C, 0xCF, 0x0F, 0x00, 0xF0, 0xF0, 0xC0, 0xC0, 0x00, 0x00, 0x30, 0xC0, 0xFF +.db 0x00, 0xC0, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0xF0 +.db 0x3C, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0 +.db 0x3C, 0xC0, 0x3C, 0x3C, 0xF0, 0x0C, 0x0C, 0x3C, 0xF0, 0x00, 0xF0, 0x3C, 0x00, 0xFC, 0x3C, 0xF0 +.db 0x3C, 0xF0, 0x3C, 0xF0, 0x30, 0xF0, 0xF0, 0x3C, 0x3C, 0xF0, 0x3C, 0x00, 0x00, 0xC0, 0xC0, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xF0, 0x00 +.db 0xF0, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xC0, 0x00 +.db 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xC0, 0x00, 0xC0, 0xF0, 0xF0, 0xF0, 0xCF +.db 0x00, 0x00, 0xF0, 0xF0, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0xC0, 0x0F, 0xF0 +.db 0xC0, 0xCC, 0x3F, 0xC0, 0xC0, 0xC0, 0x3C, 0x00, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x3C, 0xC0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0xC0 +.db 0x3C, 0x00, 0x00, 0x3C, 0xC0, 0x00, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x00, 0xC0, 0xF0, 0xFC, 0xF0, 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0 +.db 0xF0, 0x00, 0x00, 0x00, 0xCF, 0xC0, 0x00, 0x3C, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0xC0, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x33, 0xCF, 0xFC, 0xF0, 0xC0, 0xC0, 0xC0, 0x3F, 0x3C, 0xC3, 0xFF, 0x3C, 0xFF, 0xFF, 0xF0 +.db 0xC0, 0xFC, 0xFC, 0x3C, 0xCF, 0xC0, 0x00, 0xFC, 0xFC, 0xC0, 0xF0, 0x00, 0x00, 0x3C, 0xF0, 0xFF +.db 0x00, 0xC0, 0xF0, 0xFC, 0x00, 0xF0, 0xC0, 0x00, 0x00, 0xC0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xC0 +.db 0xFC, 0x00, 0xF0, 0xF0, 0xF0, 0xC0, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xF0 +.db 0xFC, 0xF0, 0x3C, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xFC, 0x3C, 0x3C +.db 0x3C, 0xF0, 0x3C, 0x00, 0x00, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0xC0, 0xF0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0xF0, 0xC0, 0x00, 0x3C, 0xF0, 0x00, 0xF0, 0x3C, 0x00, 0xF0, 0xC0, 0xC0 +.db 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3C, 0x3C, 0xF0, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x00 +.db 0xF0, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xFC, 0x30, 0xC0, 0xF0, 0xC0 +.db 0xC0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x3C, 0x3C +.db 0x0C, 0x33, 0xCF, 0xC0, 0xC0, 0xC0, 0x3C, 0x00, 0xC0, 0x3C, 0x3C, 0xFC, 0x3C, 0x3C, 0xC0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0xFF, 0x3C, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF +.db 0x3C, 0xFF, 0x00, 0x3C, 0xFF, 0xFF, 0x00, 0x3C, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x3C, 0xF0, 0xF0, 0xF0, 0x00, 0xFC, 0x3C, 0xF0, 0xC0, 0x3C, 0x3C, 0xC0, 0xFC, 0xFC, 0x00, 0xF0 +.db 0x00, 0xF0, 0xC0, 0x00, 0xCF, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0xFC, 0xFC, 0xFC, 0xF0, 0xF0, 0x0F, 0x0C, 0xF3, 0xF3, 0x3C, 0x00, 0x0F, 0x3F +.db 0xFC, 0xFC, 0xC0, 0x3C, 0xCF, 0xF0, 0x00, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC, 0x00, 0xFF, 0xFC, 0xFC +.db 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0x3C, 0x00, 0x00, 0xC0, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0x00 +.db 0xFC, 0x00, 0xC0, 0xC0, 0xF0, 0xF0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xC0 +.db 0xFC, 0xF0, 0xF0, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0xF0, 0x00, 0xF0, 0xC0, 0x00, 0xFC, 0xFC, 0x3C +.db 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0x3C, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x00 +.db 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0x3C, 0x00, 0xF0, 0xF0, 0x00, 0xFC, 0xF0, 0xF0 +.db 0x3C, 0xF0, 0x3C, 0x00, 0x00, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0xF0 +.db 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0x00, 0x3C, 0xF0, 0xF0, 0x00, 0xC0, 0x00, 0x3C, 0xC0 +.db 0x00, 0xF0, 0xFC, 0xC0, 0xC0, 0xC0, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0x00, 0x00, 0xF0, 0xCC, 0xF0 +.db 0xF0, 0x00, 0xC0, 0xF0, 0xC0, 0xF0, 0xFC, 0xC0, 0x00, 0xF0, 0xF0, 0xFC, 0xCF, 0xC0, 0xF0, 0x0F +.db 0xC0, 0xCC, 0xFC, 0xC0, 0xC0, 0xC0, 0x3C, 0x00, 0xC0, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xC0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3C, 0x00, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0x3C, 0xC0, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0xF0, 0xC0, 0x00, 0xF0, 0x00, 0xC0, 0x3C, 0xC0, 0xF0, 0xFC, 0x3C, 0xF0, 0xCF, 0xCF, 0xC0, 0xF0 +.db 0xF0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xF0, 0x00, 0xC0, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xF3, 0x0F, 0xF0, 0xF0, 0xFC, 0xFC, 0xF0, 0x0F, 0x0C, 0xF3, 0xF0, 0xF0, 0x00, 0x0F, 0x3F +.db 0xC0, 0xFC, 0xC0, 0x3C, 0xCF, 0xF0, 0xFC, 0xFC, 0xC0, 0xFC, 0xF0, 0x00, 0x00, 0x3C, 0xFF, 0xF0 +.db 0x00, 0x00, 0x00, 0xFC, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0xC0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3C, 0x00, 0x00, 0xF0, 0xFC, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00 +.db 0xFC, 0xF0, 0x3C, 0x00, 0x3C, 0xC0, 0xC0, 0xFC, 0xF0, 0x00, 0xF0, 0xF0, 0x0C, 0x3C, 0xFC, 0x3C +.db 0x00, 0xF0, 0xF0, 0xC0, 0x00, 0xF0, 0xF0, 0xFC, 0xC0, 0x00, 0x0C, 0x00, 0xF0, 0xC0, 0x00, 0x00 +.db 0x00, 0xF0, 0x3C, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x3C, 0x00, 0xF0, 0xC0, 0x00, 0xFC, 0xF0, 0xF0 +.db 0x3C, 0xF0, 0x3C, 0xC0, 0x00, 0xF0, 0xF0, 0xFC, 0xC0, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x3C +.db 0xC0, 0xF0, 0xF0, 0xFC, 0xF0, 0xF0, 0xF0, 0x00, 0xFC, 0xF0, 0xF0, 0x00, 0xC0, 0x00, 0xFC, 0xF0 +.db 0xC0, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0xC0 +.db 0xF0, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x3F, 0xC0, 0x3C, 0x3C +.db 0x0C, 0x33, 0xCF, 0xC0, 0xC0, 0xC0, 0x3C, 0xFC, 0xC0, 0x3C, 0x3C, 0x3C, 0xFC, 0xFC, 0xC0, 0xC0 +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0x3F, 0xFF, 0x3F, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0xC0, 0xF0, 0x00, 0xF0, 0x00, 0xC0, 0x3C, 0xC0, 0xF0, 0x3C, 0xF0, 0xF0, 0xCF, 0xCF, 0x00, 0xF0 +.db 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x3C, 0x00, 0xC0, 0xC0, 0xF0, 0xF0, 0xC0, 0xF0, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC3, 0x3F, 0xC0, 0xC0, 0x3C, 0xF0, 0xC0, 0x3F, 0x3C, 0xC3, 0xF0, 0xC0, 0x00, 0x3F, 0xF0 +.db 0x00, 0xFC, 0xFC, 0x00, 0xCF, 0xC0, 0xFC, 0xF0, 0xC0, 0xF0, 0xC0, 0x00, 0xFC, 0x30, 0xFF, 0xC0 +.db 0x00, 0x00, 0x00, 0xF0, 0xC0, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3C, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00 +.db 0x00, 0xF0, 0x3C, 0x3C, 0xF0, 0x0C, 0x00, 0x3C, 0xF0, 0x00, 0xF0, 0x3C, 0x3C, 0x3C, 0x3C, 0xF0 +.db 0x00, 0xC0, 0x3C, 0xF0, 0x00, 0xF0, 0xC0, 0xFC, 0xF0, 0x00, 0x3C, 0x00, 0x3C, 0xC0, 0x00, 0x00 +.db 0x00, 0xF0, 0x3C, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0x3C, 0x00, 0xF0, 0xF0, 0x00, 0x3C, 0xF0, 0xF0 +.db 0xF0, 0xF0, 0x00, 0xF0, 0x30, 0xF0, 0xC0, 0xFC, 0xF0, 0xF0, 0x30, 0x00, 0xC0, 0x00, 0x00, 0x3C +.db 0xC0, 0xF0, 0x00, 0x3C, 0xF0, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x3C, 0xF0 +.db 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFC, 0x3C, 0xF0, 0xFF, 0xC0 +.db 0xF0, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xFC, 0xF0, 0xF0, 0x00, 0xF0, 0x3C, 0xFF, 0xC0, 0x0F, 0xF0 +.db 0xC0, 0xCC, 0x3F, 0xC0, 0xC0, 0xC0, 0x3C, 0x3C, 0xC0, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x00 +.db 0x00, 0xC0, 0x3C, 0x00, 0x00, 0xC0, 0x3C, 0x3C, 0xC0, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0xF0, 0xC0, 0x00, 0xF0, 0xF0, 0xC0, 0xF0, 0xC0, 0xC0, 0xF0, 0xF0, 0xF0, 0xFC, 0xFC, 0x00, 0xF0 +.db 0xF0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x0F, 0xF0, 0xFC, 0x00, 0x3C, 0xCF +.db 0x00, 0x0C, 0xF0, 0x3C, 0xCF, 0xF0, 0xFC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3C, 0x3C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xF0, 0xC0, 0xFC, 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00 +.db 0xC0, 0xF0, 0xF0, 0xF0, 0xC0, 0xFC, 0x00, 0xFC, 0xF0, 0xC0, 0xC0, 0x3C, 0xFC, 0x3C, 0x3C, 0xC0 +.db 0x00, 0xF0, 0x3C, 0xC0, 0xC0, 0xF0, 0x00, 0x3C, 0x3C, 0xC0, 0xFC, 0xC0, 0x0C, 0xC0, 0x00, 0x00 +.db 0x00, 0x3C, 0xF0, 0xC0, 0x3C, 0xC0, 0x00, 0xF0, 0x3C, 0xC0, 0xF0, 0x3C, 0xC0, 0x3C, 0xF0, 0xC0 +.db 0x00, 0xF0, 0x00, 0xC0, 0xC0, 0x3C, 0x00, 0xF0, 0x3C, 0xF0, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0xFC +.db 0xF0, 0xFC, 0xC0, 0xFF, 0xFC, 0xFC, 0xFC, 0xF0, 0xF0, 0xC0, 0xC0, 0xC0, 0xF0, 0xC0, 0x3C, 0xF0 +.db 0xF0, 0xFF, 0xFC, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC, 0xF0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, 0x3C, 0xC0 +.db 0xFC, 0xC0, 0xC0, 0xFC, 0xF0, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0xFF, 0xC0, 0x00, 0x00 +.db 0x0C, 0x33, 0xCF, 0xC0, 0xC0, 0xC0, 0x3C, 0x3C, 0xC0, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x00 +.db 0x00, 0xC0, 0x3C, 0x00, 0x00, 0xC0, 0x3C, 0x3C, 0xC0, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0x3C, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0xFC, 0xC0, 0x00, 0x00, 0xC0, 0xF0 +.db 0x00, 0xF0, 0xF0, 0xF0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xFF, 0x00, 0xFF, 0xC0, 0xC0, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x3F, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00 +.db 0xC0, 0xCC, 0xFC, 0xC0, 0xC0, 0xC0, 0x3C, 0x3C, 0xC0, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x00 +.db 0x00, 0xC0, 0x3C, 0x00, 0x00, 0xC0, 0x3C, 0x3C, 0xC0, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00 diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFont.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFont.inc new file mode 100644 index 0000000..640ab85 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFont.inc @@ -0,0 +1,159 @@ +;****************************************************** +; COMPLETE CGA NORMAL FONT +; +; Extracted by Grant Searle 2013 +;****************************************************** +.CSEG +.ORG 0x1000 + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x7E, 0x7E, 0x6C, 0x10, 0x38, 0x10, 0x00, 0xFF, 0x00, 0xFF, 0x0F, 0x3C, 0x3F, 0x3F, 0x18 +.db 0x80, 0x02, 0x18, 0x24, 0x7F, 0x3E, 0x00, 0x18, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x10, 0x24, 0x24, 0x18, 0x00, 0x30, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3C, 0x10, 0x3C, 0x3C, 0x08, 0x7E, 0x1C, 0x7E, 0x3C, 0x3C, 0x00, 0x00, 0x08, 0x00, 0x10, 0x3C +.db 0x3C, 0x18, 0x7C, 0x1C, 0x78, 0x7E, 0x7E, 0x1C, 0x42, 0x38, 0x0E, 0x62, 0x70, 0x63, 0x62, 0x18 +.db 0x7C, 0x3C, 0x7C, 0x3C, 0x7F, 0x42, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x78, 0x80, 0x78, 0x10, 0x00 +.db 0x10, 0x00, 0x60, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x60, 0x10, 0x02, 0x60, 0x30, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x30, 0x32, 0x00 +.db 0x3C, 0x00, 0x0C, 0x3C, 0x42, 0x30, 0x10, 0x00, 0x3C, 0x42, 0x30, 0x24, 0x7C, 0x30, 0x42, 0x18 +.db 0x0C, 0x00, 0x1F, 0x18, 0x00, 0x20, 0x18, 0x20, 0x00, 0x42, 0x42, 0x08, 0x18, 0x44, 0xF8, 0x1C +.db 0x0C, 0x0C, 0x04, 0x00, 0x32, 0x34, 0x3C, 0x38, 0x10, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x00 +.db 0x22, 0x55, 0xDB, 0x10, 0x10, 0x10, 0x14, 0x00, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x10, 0x00 +.db 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x14, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x10 +.db 0x14, 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, 0x14, 0x10, 0x10, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x18, 0x18, 0x1C, 0x00, 0x02, 0x0C, 0x3C +.db 0x00, 0x10, 0x10, 0x08, 0x0C, 0x10, 0x18, 0x00, 0x30, 0x00, 0x00, 0x0F, 0x78, 0x30, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0xFE, 0x38, 0x7C, 0x10, 0x00, 0xFF, 0x3C, 0xC3, 0x03, 0x42, 0x21, 0x21, 0xDB +.db 0xE0, 0x0E, 0x3C, 0x24, 0x92, 0x63, 0x00, 0x3C, 0x38, 0x10, 0x18, 0x30, 0x00, 0x24, 0x10, 0xFE +.db 0x00, 0x38, 0x24, 0x24, 0x3E, 0x62, 0x48, 0x10, 0x20, 0x10, 0x44, 0x10, 0x00, 0x00, 0x00, 0x02 +.db 0x42, 0x30, 0x42, 0x42, 0x18, 0x40, 0x20, 0x42, 0x42, 0x42, 0x10, 0x10, 0x10, 0x00, 0x08, 0x42 +.db 0x42, 0x24, 0x22, 0x22, 0x24, 0x22, 0x22, 0x22, 0x42, 0x10, 0x04, 0x24, 0x20, 0x55, 0x52, 0x24 +.db 0x22, 0x42, 0x22, 0x42, 0x49, 0x42, 0x41, 0x41, 0x22, 0x22, 0x42, 0x40, 0x40, 0x08, 0x28, 0x00 +.db 0x10, 0x00, 0x20, 0x00, 0x02, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x4C, 0x08 +.db 0x42, 0x44, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x82, 0x00, 0x18, 0x18 +.db 0x00, 0x00, 0x24, 0x24, 0x42, 0x10, 0x24, 0x10, 0x42, 0x18, 0x00, 0x08, 0x24, 0x28, 0x4C, 0x12 +.db 0x00, 0x00, 0x08, 0x04, 0x4C, 0x4C, 0x44, 0x44, 0x00, 0x00, 0x00, 0xC4, 0xC4, 0x10, 0x12, 0x48 +.db 0x88, 0xAA, 0x77, 0x10, 0x10, 0x10, 0x14, 0x00, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x10, 0x00 +.db 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x14, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x10 +.db 0x14, 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, 0x14, 0x10, 0x10, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x00, 0x3C, 0x7E, 0x3F, 0x42, 0x00, 0x44, 0x33, 0x10, 0x24, 0x24, 0x20, 0x62, 0x04, 0x10, 0x42 +.db 0x7E, 0x10, 0x08, 0x10, 0x12, 0x10, 0x18, 0x32, 0x48, 0x00, 0x00, 0x08, 0x44, 0x48, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xA5, 0xDB, 0xFE, 0x7C, 0x38, 0x38, 0x18, 0xE7, 0x66, 0x99, 0x05, 0x42, 0x3F, 0x3F, 0x3C +.db 0xF8, 0x3E, 0x7E, 0x24, 0x92, 0x38, 0x00, 0x7E, 0x7C, 0x10, 0x0C, 0x60, 0x40, 0x66, 0x38, 0xFE +.db 0x00, 0x38, 0x24, 0x7E, 0x40, 0x64, 0x30, 0x20, 0x40, 0x08, 0x38, 0x10, 0x00, 0x00, 0x00, 0x04 +.db 0x46, 0x50, 0x02, 0x02, 0x28, 0x7C, 0x40, 0x04, 0x42, 0x42, 0x10, 0x10, 0x20, 0x7E, 0x04, 0x02 +.db 0x5E, 0x42, 0x22, 0x40, 0x22, 0x28, 0x28, 0x40, 0x42, 0x10, 0x04, 0x28, 0x20, 0x49, 0x4A, 0x42 +.db 0x22, 0x42, 0x22, 0x40, 0x08, 0x42, 0x41, 0x41, 0x14, 0x14, 0x04, 0x40, 0x20, 0x08, 0x44, 0x00 +.db 0x08, 0x3C, 0x20, 0x3C, 0x02, 0x3C, 0x10, 0x3D, 0x2C, 0x30, 0x06, 0x24, 0x10, 0x76, 0x5C, 0x3C +.db 0x6C, 0x36, 0x6C, 0x3E, 0x7C, 0x42, 0x41, 0x41, 0x44, 0x42, 0x7C, 0x10, 0x10, 0x08, 0x00, 0x14 +.db 0x40, 0x00, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x3C, 0x3C, 0x3C, 0x3C, 0x18, 0x30, 0x18, 0x24, 0x00 +.db 0x7C, 0x33, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x42, 0x3E, 0x20, 0x7C, 0x78, 0x10 +.db 0x38, 0x18, 0x00, 0x08, 0x00, 0x00, 0x44, 0x44, 0x10, 0x00, 0x00, 0x48, 0x4A, 0x00, 0x24, 0x24 +.db 0x22, 0x55, 0xDB, 0x10, 0x10, 0xF0, 0x14, 0x00, 0xF0, 0xF4, 0x14, 0xFC, 0xF4, 0x14, 0xF0, 0x00 +.db 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x1F, 0x14, 0x17, 0x1F, 0xF7, 0xFF, 0x17, 0xFF, 0xF7, 0xFF +.db 0x14, 0xFF, 0x00, 0x14, 0x1F, 0x1F, 0x00, 0x14, 0xFF, 0x10, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x31, 0x42, 0x42, 0x54, 0x20, 0x3E, 0x44, 0x4C, 0x38, 0x42, 0x42, 0x18, 0x95, 0x3C, 0x20, 0x42 +.db 0x00, 0x7C, 0x04, 0x20, 0x12, 0x10, 0x00, 0x4C, 0x48, 0x00, 0x00, 0x08, 0x44, 0x10, 0x3C, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0xFE, 0xFE, 0xFE, 0x7C, 0x3C, 0xC3, 0x42, 0xBD, 0x7D, 0x42, 0x20, 0x21, 0xE7 +.db 0xFE, 0xFE, 0x18, 0x24, 0x72, 0x44, 0x00, 0x18, 0x54, 0x54, 0xFE, 0xFE, 0x40, 0xFF, 0x7C, 0x7C +.db 0x00, 0x10, 0x00, 0x24, 0x3C, 0x08, 0x56, 0x00, 0x40, 0x08, 0xFE, 0x7C, 0x00, 0x7E, 0x00, 0x08 +.db 0x4A, 0x10, 0x0C, 0x1C, 0x48, 0x02, 0x7C, 0x08, 0x3C, 0x3E, 0x00, 0x00, 0x40, 0x00, 0x02, 0x04 +.db 0x52, 0x42, 0x3C, 0x40, 0x22, 0x38, 0x38, 0x40, 0x7E, 0x10, 0x04, 0x30, 0x20, 0x41, 0x46, 0x42 +.db 0x3C, 0x42, 0x3C, 0x3C, 0x08, 0x42, 0x41, 0x49, 0x08, 0x08, 0x08, 0x40, 0x10, 0x08, 0x82, 0x00 +.db 0x00, 0x02, 0x2E, 0x42, 0x3A, 0x42, 0x38, 0x42, 0x32, 0x10, 0x02, 0x28, 0x10, 0x49, 0x62, 0x42 +.db 0x32, 0x4C, 0x32, 0x40, 0x10, 0x42, 0x41, 0x49, 0x28, 0x42, 0x08, 0x60, 0x00, 0x06, 0x00, 0x22 +.db 0x42, 0x44, 0x42, 0x04, 0x04, 0x04, 0x04, 0x40, 0x42, 0x42, 0x42, 0x08, 0x10, 0x08, 0x42, 0x3C +.db 0x20, 0x0C, 0x7F, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x40, 0x70, 0x10, 0x44, 0x7C +.db 0x04, 0x08, 0x3C, 0x42, 0x7C, 0x62, 0x3E, 0x38, 0x20, 0x7E, 0x7E, 0xF6, 0xF6, 0x10, 0x48, 0x12 +.db 0x88, 0xAA, 0xEE, 0x10, 0x10, 0x10, 0x14, 0x00, 0x10, 0x04, 0x14, 0x04, 0x04, 0x14, 0x10, 0x00 +.db 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x14, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 +.db 0x14, 0x00, 0x00, 0x14, 0x10, 0x10, 0x00, 0x14, 0x10, 0x10, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF +.db 0x4A, 0x7C, 0x40, 0x14, 0x18, 0x48, 0x44, 0x08, 0x44, 0x7E, 0x42, 0x3C, 0x89, 0x4A, 0x3C, 0x42 +.db 0x7E, 0x10, 0x08, 0x10, 0x10, 0x10, 0x7E, 0x00, 0x30, 0x18, 0x00, 0x08, 0x44, 0x20, 0x3C, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xBD, 0xC3, 0x7C, 0x7C, 0xFE, 0xFE, 0x3C, 0xC3, 0x42, 0xBD, 0x84, 0x3C, 0x20, 0x23, 0xE7 +.db 0xF8, 0x3E, 0x18, 0x24, 0x12, 0x44, 0x7E, 0x7E, 0x10, 0x7C, 0x0C, 0x60, 0x40, 0x66, 0xFE, 0x38 +.db 0x00, 0x10, 0x00, 0x7E, 0x02, 0x10, 0x88, 0x00, 0x40, 0x08, 0x38, 0x10, 0x00, 0x00, 0x00, 0x10 +.db 0x52, 0x10, 0x30, 0x02, 0xFE, 0x02, 0x42, 0x10, 0x42, 0x02, 0x00, 0x00, 0x20, 0x00, 0x04, 0x08 +.db 0x5E, 0x7E, 0x22, 0x40, 0x22, 0x28, 0x28, 0x4E, 0x42, 0x10, 0x44, 0x28, 0x20, 0x41, 0x42, 0x42 +.db 0x20, 0x4A, 0x28, 0x02, 0x08, 0x42, 0x22, 0x49, 0x14, 0x08, 0x10, 0x40, 0x08, 0x08, 0x00, 0x00 +.db 0x00, 0x3E, 0x31, 0x40, 0x46, 0x7E, 0x10, 0x42, 0x22, 0x10, 0x02, 0x30, 0x10, 0x49, 0x42, 0x42 +.db 0x32, 0x4C, 0x22, 0x3C, 0x10, 0x42, 0x22, 0x49, 0x10, 0x42, 0x10, 0x10, 0x10, 0x08, 0x00, 0x41 +.db 0x3C, 0x44, 0x7E, 0x3C, 0x3C, 0x3C, 0x3C, 0x40, 0x7E, 0x7E, 0x7E, 0x08, 0x10, 0x08, 0x7E, 0x42 +.db 0x38, 0x3F, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x40, 0x20, 0x7C, 0x4F, 0x10 +.db 0x3C, 0x08, 0x42, 0x42, 0x42, 0x52, 0x00, 0x00, 0x40, 0x40, 0x02, 0x29, 0x2A, 0x10, 0x24, 0x24 +.db 0x22, 0x55, 0xDB, 0x10, 0xF0, 0xF0, 0xF4, 0xFC, 0xF0, 0xF4, 0x14, 0xF4, 0xFC, 0xFC, 0xF0, 0xF0 +.db 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0x17, 0x1F, 0x17, 0xFF, 0xF7, 0x17, 0xFF, 0xF7, 0xFF +.db 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x44, 0x42, 0x40, 0x14, 0x20, 0x48, 0x7A, 0x08, 0x44, 0x42, 0x24, 0x42, 0x95, 0x52, 0x20, 0x42 +.db 0x00, 0x10, 0x10, 0x08, 0x10, 0x10, 0x00, 0x32, 0x00, 0x18, 0x18, 0x08, 0x44, 0x78, 0x3C, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x99, 0xE7, 0x38, 0x38, 0xD6, 0x7C, 0x18, 0xE7, 0x66, 0x99, 0x84, 0x18, 0x60, 0x67, 0x3C +.db 0xE0, 0x0E, 0x7E, 0x00, 0x12, 0x38, 0x7E, 0x3C, 0x10, 0x38, 0x18, 0x30, 0x7E, 0x24, 0xFE, 0x10 +.db 0x00, 0x00, 0x00, 0x24, 0x7C, 0x26, 0x88, 0x00, 0x20, 0x10, 0x44, 0x10, 0x10, 0x00, 0x10, 0x20 +.db 0x62, 0x10, 0x42, 0x42, 0x08, 0x42, 0x42, 0x10, 0x42, 0x04, 0x10, 0x10, 0x10, 0x7E, 0x08, 0x00 +.db 0x40, 0x42, 0x22, 0x22, 0x24, 0x22, 0x20, 0x22, 0x42, 0x10, 0x44, 0x24, 0x22, 0x41, 0x42, 0x24 +.db 0x20, 0x3C, 0x24, 0x42, 0x08, 0x42, 0x14, 0x49, 0x22, 0x08, 0x21, 0x40, 0x04, 0x08, 0x00, 0x00 +.db 0x00, 0x42, 0x31, 0x42, 0x46, 0x40, 0x10, 0x3E, 0x22, 0x10, 0x42, 0x28, 0x10, 0x49, 0x42, 0x42 +.db 0x2C, 0x34, 0x20, 0x02, 0x12, 0x46, 0x14, 0x49, 0x28, 0x3E, 0x20, 0x10, 0x10, 0x08, 0x00, 0x41 +.db 0x0C, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x3C, 0x40, 0x40, 0x40, 0x08, 0x10, 0x08, 0x42, 0x7E +.db 0x20, 0x44, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x24, 0x42, 0x3E, 0x42, 0x10, 0x44, 0x10 +.db 0x44, 0x08, 0x42, 0x42, 0x42, 0x4A, 0x7E, 0x7C, 0x42, 0x40, 0x02, 0x43, 0x5F, 0x10, 0x12, 0x48 +.db 0x88, 0xAA, 0x77, 0x10, 0x10, 0x10, 0x14, 0x14, 0x10, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x10 +.db 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x14, 0x00, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x00 +.db 0x00, 0x10, 0x14, 0x00, 0x00, 0x10, 0x14, 0x14, 0x10, 0x00, 0x10, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x4A, 0x7C, 0x40, 0x14, 0x42, 0x48, 0x40, 0x08, 0x38, 0x24, 0x24, 0x42, 0x62, 0x3C, 0x10, 0x42 +.db 0x7E, 0x00, 0x00, 0x00, 0x10, 0x90, 0x18, 0x4C, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x3C, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x81, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x00, 0xFF, 0x3C, 0xC3, 0x84, 0x7E, 0xE0, 0xE6, 0xDB +.db 0x80, 0x02, 0x3C, 0x24, 0x12, 0xCC, 0x7E, 0x18, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x10, 0x00, 0x24, 0x18, 0x46, 0x76, 0x00, 0x10, 0x20, 0x00, 0x00, 0x10, 0x00, 0x10, 0x40 +.db 0x3C, 0x7C, 0x7E, 0x3C, 0x1C, 0x3C, 0x3C, 0x10, 0x3C, 0x38, 0x10, 0x10, 0x08, 0x00, 0x10, 0x08 +.db 0x3C, 0x42, 0x7C, 0x1C, 0x78, 0x7E, 0x70, 0x1E, 0x42, 0x38, 0x38, 0x63, 0x7E, 0x41, 0x42, 0x18 +.db 0x70, 0x03, 0x72, 0x3C, 0x1C, 0x3C, 0x08, 0x36, 0x41, 0x1C, 0x7F, 0x78, 0x02, 0x78, 0x00, 0x00 +.db 0x00, 0x3F, 0x2E, 0x3C, 0x3B, 0x3C, 0x38, 0x02, 0x62, 0x38, 0x42, 0x26, 0x38, 0x49, 0x42, 0x3C +.db 0x20, 0x04, 0x70, 0x7C, 0x0C, 0x3A, 0x08, 0x36, 0x44, 0x02, 0x7C, 0x0C, 0x10, 0x30, 0x00, 0x7F +.db 0x02, 0x3E, 0x3C, 0x3E, 0x3E, 0x3E, 0x3E, 0x06, 0x3C, 0x3C, 0x3C, 0x1C, 0x38, 0x1C, 0x42, 0x42 +.db 0x7C, 0x3B, 0x47, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x02, 0x18, 0x3C, 0x08, 0x7C, 0x10, 0x45, 0x90 +.db 0x3E, 0x1C, 0x3C, 0x3C, 0x42, 0x46, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x8C, 0x82, 0x10, 0x00, 0x00 +.db 0x22, 0x55, 0xDB, 0x10, 0x10, 0x10, 0x14, 0x14, 0x10, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x10 +.db 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x14, 0x00, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x00 +.db 0x00, 0x10, 0x14, 0x00, 0x00, 0x10, 0x14, 0x14, 0x10, 0x00, 0x10, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x31, 0x40, 0x40, 0x14, 0x7E, 0x30, 0x40, 0x08, 0x10, 0x18, 0x66, 0x3C, 0x00, 0x40, 0x0C, 0x42 +.db 0x00, 0x7C, 0x7E, 0x7E, 0x10, 0x90, 0x18, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x38, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x78, 0x18, 0xC0, 0xC0, 0x18 +.db 0x00, 0x00, 0x18, 0x00, 0x00, 0x78, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x08, 0x00, 0x00, 0xE6, 0x60 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x00 +.db 0x88, 0xAA, 0xEE, 0x10, 0x10, 0x10, 0x14, 0x14, 0x10, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x10 +.db 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x14, 0x00, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x00 +.db 0x00, 0x10, 0x14, 0x00, 0x00, 0x10, 0x14, 0x14, 0x10, 0x00, 0x10, 0xFF, 0xFF, 0xF0, 0x0F, 0x00 +.db 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00 diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFontWide.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFontWide.inc new file mode 100644 index 0000000..42cd6e5 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/CGANormalFontWide.inc @@ -0,0 +1,315 @@ +;****************************************************** +; COMPLETE CGA NORMAL FONT - WIDE VERSION +; +; Extracted by Grant Searle 2013 +;****************************************************** +.CSEG +.ORG 0x1800 + +; 40 Char / line font (double width) left half of each char + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x3F, 0x3F, 0x3C, 0x03, 0x0F, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0F, 0x0F, 0x0F, 0x03 +.db 0xC0, 0x00, 0x03, 0x0C, 0x3F, 0x0F, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x03, 0x0C, 0x0C, 0x03, 0x00, 0x0F, 0x03, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x0F, 0x03, 0x0F, 0x0F, 0x00, 0x3F, 0x03, 0x3F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F +.db 0x0F, 0x03, 0x3F, 0x03, 0x3F, 0x3F, 0x3F, 0x03, 0x30, 0x0F, 0x00, 0x3C, 0x3F, 0x3C, 0x3C, 0x03 +.db 0x3F, 0x0F, 0x3F, 0x0F, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x3F, 0xC0, 0x3F, 0x03, 0x00 +.db 0x03, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0F, 0x00 +.db 0x0F, 0x00, 0x00, 0x0F, 0x30, 0x0F, 0x03, 0x00, 0x0F, 0x30, 0x0F, 0x0C, 0x3F, 0x0F, 0x30, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x0C, 0x03, 0x0C, 0x00, 0x30, 0x30, 0x00, 0x03, 0x30, 0xFF, 0x03 +.db 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00 +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03 +.db 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x0F +.db 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3F, 0x0F, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x3F, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0x30, 0x0C, 0x0C, 0xF3 +.db 0xFC, 0x00, 0x0F, 0x0C, 0xC3, 0x3C, 0x00, 0x0F, 0x0F, 0x03, 0x03, 0x0F, 0x00, 0x0C, 0x03, 0xFF +.db 0x00, 0x0F, 0x0C, 0x0C, 0x0F, 0x3C, 0x30, 0x03, 0x0C, 0x03, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00 +.db 0x30, 0x0F, 0x30, 0x30, 0x03, 0x30, 0x0C, 0x30, 0x30, 0x30, 0x03, 0x03, 0x03, 0x00, 0x00, 0x30 +.db 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x00, 0x0C, 0x0C, 0x33, 0x33, 0x0C +.db 0x0C, 0x30, 0x0C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0C, 0x0C, 0x30, 0x30, 0x30, 0x00, 0x0C, 0x00 +.db 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x30, 0x00 +.db 0x30, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x03 +.db 0x00, 0x00, 0x0C, 0x0C, 0x30, 0x03, 0x0C, 0x03, 0x30, 0x03, 0x00, 0x00, 0x0C, 0x0C, 0x30, 0x03 +.db 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x03, 0x03, 0x30 +.db 0xC0, 0xCC, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03 +.db 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x00, 0x0F, 0x3F, 0x0F, 0x30, 0x00, 0x30, 0x0F, 0x03, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x03, 0x30 +.db 0x3F, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xCC, 0xF3, 0xFF, 0x3F, 0x0F, 0x0F, 0x03, 0xFC, 0x3C, 0xC3, 0x00, 0x30, 0x0F, 0x0F, 0x0F +.db 0xFF, 0x0F, 0x3F, 0x0C, 0xC3, 0x0F, 0x00, 0x3F, 0x3F, 0x03, 0x00, 0x3C, 0x30, 0x3C, 0x0F, 0xFF +.db 0x00, 0x0F, 0x0C, 0x3F, 0x30, 0x3C, 0x0F, 0x0C, 0x30, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00 +.db 0x30, 0x33, 0x00, 0x00, 0x0C, 0x3F, 0x30, 0x00, 0x30, 0x30, 0x03, 0x03, 0x0C, 0x3F, 0x00, 0x00 +.db 0x33, 0x30, 0x0C, 0x30, 0x0C, 0x0C, 0x0C, 0x30, 0x30, 0x03, 0x00, 0x0C, 0x0C, 0x30, 0x30, 0x30 +.db 0x0C, 0x30, 0x0C, 0x30, 0x00, 0x30, 0x30, 0x30, 0x03, 0x03, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x00 +.db 0x00, 0x0F, 0x0C, 0x0F, 0x00, 0x0F, 0x03, 0x0F, 0x0C, 0x0F, 0x00, 0x0C, 0x03, 0x3F, 0x33, 0x0F +.db 0x3C, 0x0F, 0x3C, 0x0F, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x03, 0x03, 0x00, 0x00, 0x03 +.db 0x30, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x03, 0x0F, 0x03, 0x0C, 0x00 +.db 0x3F, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30, 0x0F, 0x0C, 0x3F, 0x3F, 0x03 +.db 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x03, 0x00, 0x00, 0x30, 0x30, 0x00, 0x0C, 0x0C +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF +.db 0x03, 0xFF, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, 0xFF, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x0F, 0x30, 0x30, 0x33, 0x0C, 0x0F, 0x30, 0x30, 0x0F, 0x30, 0x30, 0x03, 0xC3, 0x0F, 0x0C, 0x30 +.db 0x00, 0x3F, 0x00, 0x0C, 0x03, 0x03, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x03, 0x0F, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0xF0, 0x30, 0xCF, 0x3F, 0x30, 0x0C, 0x0C, 0xFC +.db 0xFF, 0xFF, 0x03, 0x0C, 0x3F, 0x30, 0x00, 0x03, 0x33, 0x33, 0xFF, 0xFF, 0x30, 0xFF, 0x3F, 0x3F +.db 0x00, 0x03, 0x00, 0x0C, 0x0F, 0x00, 0x33, 0x00, 0x30, 0x00, 0xFF, 0x3F, 0x00, 0x3F, 0x00, 0x00 +.db 0x30, 0x03, 0x00, 0x03, 0x30, 0x00, 0x3F, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00 +.db 0x33, 0x30, 0x0F, 0x30, 0x0C, 0x0F, 0x0F, 0x30, 0x3F, 0x03, 0x00, 0x0F, 0x0C, 0x30, 0x30, 0x30 +.db 0x0F, 0x30, 0x0F, 0x0F, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0xC0, 0x00 +.db 0x00, 0x00, 0x0C, 0x30, 0x0F, 0x30, 0x0F, 0x30, 0x0F, 0x03, 0x00, 0x0C, 0x03, 0x30, 0x3C, 0x30 +.db 0x0F, 0x30, 0x0F, 0x30, 0x03, 0x30, 0x30, 0x30, 0x0C, 0x30, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x0C +.db 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x00, 0x03, 0x00, 0x30, 0x0F +.db 0x0C, 0x00, 0x3F, 0x0F, 0x0F, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x03, 0x30, 0x3F +.db 0x00, 0x00, 0x0F, 0x30, 0x3F, 0x3C, 0x0F, 0x0F, 0x0C, 0x3F, 0x3F, 0xFF, 0xFF, 0x03, 0x30, 0x03 +.db 0xC0, 0xCC, 0xFC, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00 +.db 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 +.db 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF +.db 0x30, 0x3F, 0x30, 0x03, 0x03, 0x30, 0x30, 0x00, 0x30, 0x3F, 0x30, 0x0F, 0xC0, 0x30, 0x0F, 0x30 +.db 0x3F, 0x03, 0x00, 0x03, 0x03, 0x03, 0x3F, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x30, 0x0C, 0x0F, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xCF, 0xF0, 0x3F, 0x3F, 0xFF, 0xFF, 0x0F, 0xF0, 0x30, 0xCF, 0xC0, 0x0F, 0x0C, 0x0C, 0xFC +.db 0xFF, 0x0F, 0x03, 0x0C, 0x03, 0x30, 0x3F, 0x3F, 0x03, 0x3F, 0x00, 0x3C, 0x30, 0x3C, 0xFF, 0x0F +.db 0x00, 0x03, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x03 +.db 0x33, 0x03, 0x0F, 0x00, 0xFF, 0x00, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00 +.db 0x33, 0x3F, 0x0C, 0x30, 0x0C, 0x0C, 0x0C, 0x30, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x30, 0x30, 0x30 +.db 0x0C, 0x30, 0x0C, 0x00, 0x00, 0x30, 0x0C, 0x30, 0x03, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x0F, 0x0F, 0x30, 0x30, 0x3F, 0x03, 0x30, 0x0C, 0x03, 0x00, 0x0F, 0x03, 0x30, 0x30, 0x30 +.db 0x0F, 0x30, 0x0C, 0x0F, 0x03, 0x30, 0x0C, 0x30, 0x03, 0x30, 0x03, 0x03, 0x03, 0x00, 0x00, 0x30 +.db 0x0F, 0x30, 0x3F, 0x0F, 0x0F, 0x0F, 0x0F, 0x30, 0x3F, 0x3F, 0x3F, 0x00, 0x03, 0x00, 0x3F, 0x30 +.db 0x0F, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0C, 0x3F, 0x30, 0x03 +.db 0x0F, 0x00, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, 0x30, 0x30, 0x00, 0x0C, 0x0C, 0x03, 0x0C, 0x0C +.db 0x0C, 0x33, 0xF3, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +.db 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF +.db 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x30, 0x30, 0x30, 0x03, 0x0C, 0x30, 0x3F, 0x00, 0x30, 0x30, 0x0C, 0x30, 0xC3, 0x33, 0x0C, 0x30 +.db 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x0F, 0x00, 0x03, 0x03, 0x00, 0x30, 0x3F, 0x0F, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC3, 0xFC, 0x0F, 0x0F, 0xF3, 0x3F, 0x03, 0xFC, 0x3C, 0xC3, 0xC0, 0x03, 0x3C, 0x3C, 0x0F +.db 0xFC, 0x00, 0x3F, 0x00, 0x03, 0x0F, 0x3F, 0x0F, 0x03, 0x0F, 0x03, 0x0F, 0x3F, 0x0C, 0xFF, 0x03 +.db 0x00, 0x00, 0x00, 0x0C, 0x3F, 0x0C, 0xC0, 0x00, 0x0C, 0x03, 0x30, 0x03, 0x03, 0x00, 0x03, 0x0C +.db 0x3C, 0x03, 0x30, 0x30, 0x00, 0x30, 0x30, 0x03, 0x30, 0x00, 0x03, 0x03, 0x03, 0x3F, 0x00, 0x00 +.db 0x30, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x30, 0x30, 0x0C +.db 0x0C, 0x0F, 0x0C, 0x30, 0x00, 0x30, 0x03, 0x30, 0x0C, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x30, 0x0F, 0x30, 0x30, 0x30, 0x03, 0x0F, 0x0C, 0x03, 0x30, 0x0C, 0x03, 0x30, 0x30, 0x30 +.db 0x0C, 0x0F, 0x0C, 0x00, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0F, 0x0C, 0x03, 0x03, 0x00, 0x00, 0x30 +.db 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0F, 0x30, 0x30, 0x30, 0x00, 0x03, 0x00, 0x30, 0x3F +.db 0x0C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0F, 0x0C, 0x30, 0x0F, 0x30, 0x03, 0x30, 0x03 +.db 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x3F, 0x30, 0x30, 0x00, 0x30, 0x33, 0x03, 0x03, 0x30 +.db 0xC0, 0xCC, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00 +.db 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x30, 0x3F, 0x30, 0x03, 0x30, 0x30, 0x30, 0x00, 0x0F, 0x0C, 0x0C, 0x30, 0x3C, 0x0F, 0x03, 0x30 +.db 0x3F, 0x00, 0x00, 0x00, 0x03, 0xC3, 0x03, 0x30, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC0, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0xC0, 0x3F, 0xFC, 0xFC, 0xF3 +.db 0xC0, 0x00, 0x0F, 0x0C, 0x03, 0xF0, 0x3F, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x03, 0x00, 0x0C, 0x03, 0x30, 0x3F, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x03, 0x30 +.db 0x0F, 0x3F, 0x3F, 0x0F, 0x03, 0x0F, 0x0F, 0x03, 0x0F, 0x0F, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00 +.db 0x0F, 0x30, 0x3F, 0x03, 0x3F, 0x3F, 0x3F, 0x03, 0x30, 0x0F, 0x0F, 0x3C, 0x3F, 0x30, 0x30, 0x03 +.db 0x3F, 0x00, 0x3F, 0x0F, 0x03, 0x0F, 0x00, 0x0F, 0x30, 0x03, 0x3F, 0x3F, 0x00, 0x3F, 0x00, 0x00 +.db 0x00, 0x0F, 0x0C, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x3C, 0x0F, 0x30, 0x0C, 0x0F, 0x30, 0x30, 0x0F +.db 0x0C, 0x00, 0x3F, 0x3F, 0x00, 0x0F, 0x00, 0x0F, 0x30, 0x00, 0x3F, 0x00, 0x03, 0x0F, 0x00, 0x3F +.db 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x0F, 0x0F, 0x0F, 0x03, 0x0F, 0x03, 0x30, 0x30 +.db 0x3F, 0x0F, 0x30, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x03, 0x0F, 0x00, 0x3F, 0x03, 0x30, 0xC3 +.db 0x0F, 0x03, 0x0F, 0x0F, 0x30, 0x30, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xC0, 0xC0, 0x03, 0x00, 0x00 +.db 0x0C, 0x33, 0xF3, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00 +.db 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x0F, 0x30, 0x30, 0x03, 0x3F, 0x0F, 0x30, 0x00, 0x03, 0x03, 0x3C, 0x0F, 0x00, 0x30, 0x00, 0x30 +.db 0x00, 0x3F, 0x3F, 0x3F, 0x03, 0xC3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0x03, 0xF0, 0xF0, 0x03 +.db 0x00, 0x00, 0x03, 0x00, 0x00, 0x3F, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3C +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 +.db 0xC0, 0xCC, 0xFC, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03 +.db 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00 +.db 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +.db 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 + +; 40 Char / line font (double width) right half of each char + +; Character line 0: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xFC, 0xFC, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0 +.db 0x00, 0x0C, 0xC0, 0x30, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x30, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0x00, 0xF0, 0xF0, 0xC0, 0xFC, 0xF0, 0xFC, 0xF0, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0 +.db 0xF0, 0xC0, 0xF0, 0xF0, 0xC0, 0xFC, 0xFC, 0xF0, 0x0C, 0xC0, 0xFC, 0x0C, 0x00, 0x0F, 0x0C, 0xC0 +.db 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0x0C, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xC0, 0x00, 0xC0, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0C, 0x00 +.db 0xF0, 0x00, 0xF0, 0xF0, 0x0C, 0x00, 0x00, 0x00, 0xF0, 0x0C, 0x00, 0x30, 0xF0, 0x00, 0x0C, 0xC0 +.db 0xF0, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0x0C, 0xC0, 0xC0, 0x30, 0xC0, 0xF0 +.db 0xF0, 0xF0, 0x30, 0x00, 0x0C, 0x30, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00 +.db 0x0C, 0x33, 0xCF, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00 +.db 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0xF0, 0x00, 0x0C, 0xF0, 0xF0 +.db 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00 + +; Character line 1: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0xFC, 0xC0, 0xF0, 0x00, 0x00, 0xFF, 0xF0, 0x0F, 0x0F, 0x0C, 0x03, 0x03, 0xCF +.db 0x00, 0xFC, 0xF0, 0x30, 0x0C, 0x0F, 0x00, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x00, 0xFC +.db 0x00, 0xC0, 0x30, 0x30, 0xFC, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C +.db 0x0C, 0x00, 0x0C, 0x0C, 0xC0, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C +.db 0x0C, 0x30, 0x0C, 0x0C, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x30, 0x30, 0x00, 0x33, 0x0C, 0x30 +.db 0x0C, 0x0C, 0x0C, 0x0C, 0xC3, 0x0C, 0x03, 0x03, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0xC0, 0xC0, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xC0 +.db 0x0C, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xC0, 0xC0 +.db 0x00, 0x00, 0x30, 0x30, 0x0C, 0x00, 0x30, 0x00, 0x0C, 0xC0, 0x00, 0xC0, 0x30, 0xC0, 0xF0, 0x0C +.db 0x00, 0x00, 0xC0, 0x30, 0xF0, 0xF0, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x0C, 0xC0 +.db 0xC0, 0xCC, 0x3F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00 +.db 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x00, 0xF0, 0xFC, 0xFF, 0x0C, 0x00, 0x30, 0x0F, 0x00, 0x30, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x0C +.db 0xFC, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0xC0, 0x0C, 0xC0, 0x00, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0x00 + +; Character line 2: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x33, 0xCF, 0xFC, 0xF0, 0xC0, 0xC0, 0xC0, 0x3F, 0x3C, 0xC3, 0x33, 0x0C, 0xFF, 0xFF, 0xF0 +.db 0xC0, 0xFC, 0xFC, 0x30, 0x0C, 0xC0, 0x00, 0xFC, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0xC0, 0xFC +.db 0x00, 0xC0, 0x30, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x30 +.db 0x3C, 0x00, 0x0C, 0x0C, 0xC0, 0xF0, 0x00, 0x30, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0xFC, 0x30, 0x0C +.db 0xFC, 0x0C, 0x0C, 0x00, 0x0C, 0xC0, 0xC0, 0x00, 0x0C, 0x00, 0x30, 0xC0, 0x00, 0xC3, 0xCC, 0x0C +.db 0x0C, 0x0C, 0x0C, 0x00, 0xC0, 0x0C, 0x03, 0x03, 0x30, 0x30, 0x30, 0x00, 0x00, 0xC0, 0x30, 0x00 +.db 0xC0, 0xF0, 0x00, 0xF0, 0x0C, 0xF0, 0x00, 0xF3, 0xF0, 0x00, 0x3C, 0x30, 0x00, 0x3C, 0xF0, 0xF0 +.db 0xF0, 0x3C, 0xF0, 0xFC, 0xF0, 0x0C, 0x03, 0x03, 0x30, 0x0C, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x30 +.db 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xF0, 0xF0, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00 +.db 0xF0, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0xFC, 0x00, 0xF0, 0xC0, 0x00 +.db 0xC0, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0xC0, 0xCC, 0x00, 0x30, 0x30 +.db 0x0C, 0x33, 0xCF, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x30, 0xF0, 0x30, 0x30, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x30, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF +.db 0x30, 0xFF, 0x00, 0x30, 0xFF, 0xFF, 0x00, 0x30, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0x03, 0x0C, 0x0C, 0x30, 0x00, 0xFC, 0x30, 0xF0, 0xC0, 0x0C, 0x0C, 0xC0, 0x33, 0xF0, 0x00, 0x0C +.db 0x00, 0xF0, 0x30, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0xC0, 0x00, 0x00, 0xC0, 0x30, 0x00, 0xF0, 0x00 + +; Character line 3: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0xFC, 0xFC, 0xFC, 0xF0, 0xF0, 0x0F, 0x0C, 0xF3, 0xF3, 0x0C, 0x00, 0x03, 0x3F +.db 0xFC, 0xFC, 0xC0, 0x30, 0x0C, 0x30, 0x00, 0xC0, 0x30, 0x30, 0xFC, 0xFC, 0x00, 0xFF, 0xF0, 0xF0 +.db 0x00, 0x00, 0x00, 0x30, 0xF0, 0xC0, 0x3C, 0x00, 0x00, 0xC0, 0xFC, 0xF0, 0x00, 0xFC, 0x00, 0xC0 +.db 0xCC, 0x00, 0xF0, 0xF0, 0xC0, 0x0C, 0xF0, 0xC0, 0xF0, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30 +.db 0x0C, 0x0C, 0xF0, 0x00, 0x0C, 0xC0, 0xC0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x03, 0x3C, 0x0C +.db 0xF0, 0x0C, 0xF0, 0xF0, 0xC0, 0x0C, 0x03, 0xC3, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0x0C, 0x00 +.db 0x00, 0x0C, 0xFC, 0x0C, 0xCC, 0x0C, 0xC0, 0x0C, 0x0C, 0x00, 0x0C, 0xC0, 0x00, 0xC3, 0x0C, 0x0C +.db 0x0C, 0xF0, 0x0C, 0x00, 0x00, 0x0C, 0x03, 0xC3, 0xC0, 0x0C, 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x0C +.db 0x0C, 0x30, 0x0C, 0x30, 0x30, 0x30, 0x30, 0x00, 0x0C, 0x0C, 0x0C, 0xC0, 0x00, 0xC0, 0x0C, 0xF0 +.db 0x00, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x30, 0xF0 +.db 0x30, 0xC0, 0xF0, 0x0C, 0xF0, 0x0C, 0xFC, 0xC0, 0x00, 0xFC, 0xFC, 0x3C, 0x3C, 0x00, 0xC0, 0x0C +.db 0xC0, 0xCC, 0xFC, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF +.db 0xCC, 0xF0, 0x00, 0x30, 0xC0, 0xC0, 0x30, 0xC0, 0x30, 0xFC, 0x0C, 0xF0, 0xC3, 0xCC, 0xF0, 0x0C +.db 0xFC, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0xF0, 0x00 + +; Character line 4: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xF3, 0x0F, 0xF0, 0xF0, 0xFC, 0xFC, 0xF0, 0x0F, 0x0C, 0xF3, 0x30, 0xF0, 0x00, 0x0F, 0x3F +.db 0xC0, 0xFC, 0xC0, 0x30, 0x0C, 0x30, 0xFC, 0xFC, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x3C, 0xFC, 0xC0 +.db 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x0C, 0x00, 0x00, 0x0C, 0xFC, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0 +.db 0xFC, 0xFC, 0x0C, 0x00, 0x0C, 0xC0, 0xC0, 0xFC, 0x0C, 0x00, 0x30, 0xC0, 0x00, 0x03, 0x0C, 0x0C +.db 0x00, 0xCC, 0xC0, 0x0C, 0xC0, 0x0C, 0x0C, 0xC3, 0x30, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00 +.db 0x00, 0xFC, 0x03, 0x00, 0x3C, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0xC3, 0x0C, 0x0C +.db 0x0C, 0xF0, 0x0C, 0xF0, 0x00, 0x0C, 0x0C, 0xC3, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03 +.db 0xF0, 0x30, 0xFC, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0xFC, 0xFC, 0xFC, 0xC0, 0x00, 0xC0, 0xFC, 0x0C +.db 0xC0, 0xFF, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0xF0, 0xFF, 0x00 +.db 0xF0, 0xC0, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC3, 0xCC, 0x00, 0x30, 0x30 +.db 0x0C, 0x33, 0xCF, 0x00, 0x00, 0x00, 0x30, 0xF0, 0x00, 0x30, 0x30, 0x30, 0xF0, 0xF0, 0x00, 0x00 +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0x3F, 0xFF, 0x3F, 0xFF +.db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0x30, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0xCC, 0xC0, 0x30, 0x0C, 0x30, 0x0C, 0x33, 0x0C, 0x00, 0x0C +.db 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xC0, 0xC0, 0xC0, 0x30, 0xC0, 0xF0, 0x00 + +; Character line 5: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xC3, 0x3F, 0xC0, 0xC0, 0x3C, 0xF0, 0xC0, 0x3F, 0x3C, 0xC3, 0x30, 0xC0, 0x00, 0x3F, 0xF0 +.db 0x00, 0xFC, 0xFC, 0x00, 0x0C, 0xC0, 0xFC, 0xF0, 0x00, 0xC0, 0xC0, 0x00, 0xFC, 0x30, 0xFC, 0x00 +.db 0x00, 0x00, 0x00, 0x30, 0xF0, 0x3C, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x0C, 0x00, 0x0C, 0x0C, 0xC0, 0x0C, 0x0C, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x00, 0xFC, 0xC0, 0x00 +.db 0x00, 0x0C, 0x0C, 0x0C, 0x30, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x30, 0x30, 0x0C, 0x03, 0x0C, 0x30 +.db 0x00, 0xF0, 0x30, 0x0C, 0xC0, 0x0C, 0x30, 0xC3, 0x0C, 0xC0, 0x03, 0x00, 0x30, 0xC0, 0x00, 0x00 +.db 0x00, 0x0C, 0x03, 0x0C, 0x3C, 0x00, 0x00, 0xFC, 0x0C, 0x00, 0x0C, 0xC0, 0x00, 0xC3, 0x0C, 0x0C +.db 0xF0, 0x30, 0x00, 0x0C, 0x0C, 0x3C, 0x30, 0xC3, 0xC0, 0xFC, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03 +.db 0xF0, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x0C, 0xFC +.db 0x00, 0x30, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFC, 0x30, 0x0C, 0xFC, 0x0C, 0x00, 0x30, 0x00 +.db 0x30, 0xC0, 0x0C, 0x0C, 0x0C, 0xCC, 0xFC, 0xF0, 0x0C, 0x00, 0x0C, 0x0F, 0xFF, 0x00, 0x0C, 0xC0 +.db 0xC0, 0xCC, 0x3F, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00 +.db 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0xCC, 0xF0, 0x00, 0x30, 0x0C, 0xC0, 0x00, 0xC0, 0xC0, 0x30, 0x30, 0x0C, 0x0C, 0xF0, 0x00, 0x0C +.db 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00 + +; Character line 6: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x0F, 0x30, 0xFC, 0x00, 0x3C, 0xCF +.db 0x00, 0x0C, 0xF0, 0x30, 0x0C, 0xF0, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x30, 0xC0, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0xF0, 0xFC, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0 +.db 0xF0, 0x0C, 0xF0, 0xF0, 0xC0, 0xFC, 0x00, 0xFC, 0x0C, 0xC0, 0xC0, 0x0F, 0xFC, 0x03, 0x0C, 0xC0 +.db 0x00, 0x0F, 0x0C, 0xF0, 0xF0, 0xF0, 0xC0, 0x3C, 0x03, 0xF0, 0xFF, 0xC0, 0x0C, 0xC0, 0x00, 0x00 +.db 0x00, 0xFF, 0xFC, 0xF0, 0xCF, 0xF0, 0xC0, 0x0C, 0x0C, 0xC0, 0x0C, 0x3C, 0xC0, 0xC3, 0x0C, 0xF0 +.db 0x00, 0x30, 0x00, 0xF0, 0xF0, 0xCC, 0xC0, 0x3C, 0x30, 0x0C, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xFF +.db 0x0C, 0xFC, 0xF0, 0xFC, 0xFC, 0xFC, 0xFC, 0x3C, 0xF0, 0xF0, 0xF0, 0xF0, 0xC0, 0xF0, 0x0C, 0x0C +.db 0xF0, 0xCF, 0x3F, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x0C, 0xC0, 0xF0, 0xC0, 0xF0, 0x00, 0x33, 0x00 +.db 0xFC, 0xF0, 0xF0, 0xF0, 0x0C, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x0C, 0x00, 0x00, 0x00 +.db 0x0C, 0x33, 0xCF, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00 +.db 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0x03, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x3C, 0xF0, 0x00, 0x00, 0xF0, 0x0C +.db 0x00, 0xF0, 0xFC, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00 + +; Character line 7: +; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +.db 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xFF, 0x00, 0xFF, 0xC0, 0xC0, 0x00, 0x00, 0xC0 +.db 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x3C, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0C, 0x00, 0x00, 0x00 +.db 0xC0, 0xCC, 0xFC, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00 +.db 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00 diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/Defs.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/Defs.inc new file mode 100644 index 0000000..48808d0 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/Defs.inc @@ -0,0 +1,74 @@ +; +; Originally designed and written by Daryl Rictor (c)2003-2004 +; +; Modified by Grant Searle 2007-13 +; + +; Define Registers and Port Pins +; Acc = R00, R01 (results of multiply command) +.def Acc = R0 ; Reserved - maths accumulator for multiply operations +.def Acch = R1 ; " + +.def nibbleTemp= R2 ; Temp storage for 4-bit (nibble) transfer + +.def configByte = R3 ; As read from PORT D at startup +.set CONFIG_PAL = 7 ; 0xxxxxxx = NTSC, 0xxxxxxx = PAL +.set CONFIG_8_OR_4_BIT = 6 ; x0xxxxxx = 4 bit, x1xxxxxx= 8 bit +.set CONFIG_N_TWI = 5 ; xx1xxxxx = 4/8 bit, xx0xxxxx= Two wire +.set CONFIG_80_CHAR_PER_LINE = 4 ; xxx0xxxx = 40, xxx1xxxx=80 +.set CONFIG_SINGLE_HEIGHT = 3 ; xxxx1xxx = Normal, xxxx0xxx = Double height +.set CONFIG_BOLD = 2 ; xxxxx0xx = Normal, xxxxx1xx = Bold + +.def currLineAtt = R4 ; Reserved for scanline processing +.set ATT_80_CHAR_PER_LINE = 0 ; xxxxxxx0 = 40, xxxxxxx1=80 +.set ATT_BOLD = 1 +.set ATT_DBL_TOP = 2 ; xxxx00xx = Normal, xxxx01xx = Double top row, xxxx10xx = Double bottom row +.set ATT_DBL_BOTTOM = 3 + +.def activeLineAtt = R5 ; Font/graphic style currently being used +.set ATT_DBL_HEIGHT = 2 +.set ATT_GRAPHICS = 7 + +.def previousInpt = R6 +.def charUnderCursor = R7 ; character under the cursor +.def temp1s = R8 +.def temp0s = R9 +.def lastline = R10 +.def line1 = R11 +.def cmdVal = R12 +.def temp = R13 ; General purpose temp +.def temp2 = R14 ; General purpose temp +.def temp3 = R15 ; General purpose temp + +;------------------------------------------------- +.def J = R16 ; scratch 8 bit reg +.def K = R17 ; scratch 8 bit reg +.def column = R18 ; hor cursor pos 0-79 +.def row = R19 ; vert cursor pos 0-24 +.def vline = R20 ;\ vertical display line counter 0-261 +.def vlineh = R21 ;/ hi byte of vline counter +.def chrln = R22 ; display chr line 0 - 199 +.def inpt = R23 ; host input +.def cursorChar= R24 ; cursor character +.def cursorClk = R25 ; the cursor blink timer + +; X pair = R26,27 +; Y pair = R28,29 +; Z pair = R30,31 +; +; X pair used to point to SRAM by refresh routines +; Y pair used to point to SRAM by HOST processor +; Z pair used to point to Font data in Program Memory & scrolling + + +;PORT pin defs +.set syncpin = PB0 ; output +.set ldsrpin = PC3 ; output +.set ackdpin = PC4 ; output +.set availpin = PC5 ; input +.set ntscpin = PD7 +.set datalenpin = PD6 +.set twowireselpin = PD5 + +; TWI defs +.equ TW_SR_DATA_ACK = 0x80 ; x80 10000000 (the previously addressed (SLA + W) data has been received , ACK has been returned diff --git a/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/ProcChr.inc b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/ProcChr.inc new file mode 100644 index 0000000..55f9762 --- /dev/null +++ b/Arduino/libraries/Hi-Res Video Driver Source/video processor source and hex/ProcChr.inc @@ -0,0 +1,1008 @@ +;****************************************************** +; ProcChr - decode host command and update display +; +; Original design by Daryl Rictor (c)2003-2004 +; +; Major redesign by Grant Searle 2007-13 +; - Commands modified +; - 40 char or 80 char support +; - Multi fonts and sizes +; - Medium resolution graphics +; - Line attributes to define text/graphics and font +;****************************************************** +processChar: + rcall setYfromRowCol + + ; restore chr under cursor + mov temp,inpt + mov inpt,charUnderCursor + rcall putCharAtY + mov inpt,temp + + mov J,cmdVal ; Was previous byte 1st char of a multi-byte command? + cpi J, 0x00 + brne processCommandPart2 + mov J, inpt + ; If delete char then jump + cpi J,0x7F + brne notDelete + rjmp delete +notDelete: + ; If control code then handle it + cpi J,0x20 + brlo controlCode + ; Otherwise print the character + rjmp printableASCII +controlCode: + ldi ZH, 0x08 ; no, setup jump table page address + mov ZL, inpt ; put the input chr into Z + ijmp ; jump table based on INPT + + +;--------------------------------------------------------------------------------------------------------------------------- +processCommandPart2: +cmd1: + mov J,cmdVal + cpi J, 0x0E ; set column + brne cmd2 + cpi inpt, 0x50 ; check column = 0-79 + brlo setColumn + rjmp cmdComplete +setColumn: + mov column, inpt ; update hpos + rcall putCursorOnScreen ; put cursor back on screen if >39 on a 40 char line + rcall setYfromRowCol + ld charUnderCursor, Y ; save chr under cursor + rjmp cmdComplete + +cmd2: + cpi J, 0x0F ; set row + brne cmd3 + cpi inpt, 0x19 ; check row = 0-24 + brlo setRow + rjmp cmdComplete +setRow: + mov row, inpt ; save new vertical position + rcall getCurrentLineAtt ; set the current attribute to match the cursor line + rcall setLineAtt ; to ensure double-height lines are reset to top line at cursor + rcall setYfromRowCol + ld charUnderCursor, Y ; save chr under cursor + rjmp cmdComplete + +cmd3: + cpi J, 0x1A ; Force Char Into RAM + brne cmd4 + rcall printableASCII + rjmp cmdComplete + +cmd4: + cpi J, 0x18 ; Set font attribute + brne cmd5 + mov activeLineAtt, inpt ; Set the attribute to use for all subsequent lines + rcall setLineAtt ; Set the attribute on the current line to match + rcall putCursorOnScreen ; put cursor back on screen if >39 on a 40 char line + rjmp cmdComplete + +cmd5: + cpi J, 0x02 ; Set cursor character + brne cmd6 + mov cursorChar, inpt + rjmp cmdComplete + +cmd6: + cpi J, 0x05 ; Set pixel + brne cmd7 + mov J,previousInpt + cpi J, 0xFF ; If previous input was FF then this is first param + brne setPixel ; otherwise this is second param so method can be called + mov previousInpt, inpt ; Store current input as the previous input value + ret ; Just return, don't terminate command + +cmd7: + cpi J, 0x06 ; Reset pixel + brne cmdComplete + mov J,previousInpt + cpi J, 0xFF + brne resetPixel + mov previousInpt, inpt + ret ; Just return, don't terminate command + +cmdComplete: + ldi J,0x00 + mov cmdVal, J + ret + +;--------------------------------------------------------------------------------------------------------------------------- +resetPixel: + ldi J,0x00 + mov temp,J + rjmp setOrResetPixel +setPixel: + ldi J,0x01 + mov temp,J + +setOrResetPixel: + ; Validate coordinates and exit if out of range + mov J,inpt ; Y=0..99 + cpi J,100 + brsh cmdComplete + mov J,previousInpt ; X=0..159 + cpi J,160 + brsh cmdComplete + + ; inpt contains the Y coordinate, previousInpt contains X coordinate + push row + push column + ; Get the row of location that needs to be manipulated + mov J,inpt + lsr J + lsr J + andi J,0x1F + mov row,J + + ; Get attribute location into Z + ldi ZH, 0x08 + ldi ZL, 0xD0 + add ZL, row + + ; Get line attribute into J + ld J,Z + + ; If already set then skip + sbrc J,ATT_GRAPHICS + rjmp graphicsLineSet + + ; If not already graphics then set the attribute and clear the line + ldi column,0x00 + ; Get the location for start of line + rcall setYfromRowCol + + ldi J, 0x00 +clrGraphics: + st Y+, J + inc column + cpi column, 0x50 + brne clrGraphics ; clear to end of line + + ; Force graphics property for the row + ldi J,0x00 + ori J, 1<25, show Cursor + mov inpt,charUnderCursor + call setYfromRowCol + call putCharAtY + rjmp endOfCursor +solidCursor: + mov inpt,cursorChar + call setYfromRowCol + call putCharAtY + rjmp endOfCursor +blinkCursor: + mov inpt,cursorChar + call setYfromRowCol + call putCharAtY + cpi cursorClk, 0x37 ; is clock >56 + brmi endOfCursor ; no + clr cursorClk ; reset timer +endOfCursor: + + sbrs configByte,CONFIG_N_TWI ; low = TWI + rjmp twiMode ; Yes, set TWI mode + +eightOrFourBit: + ; If the ack and data rdy are the same state then there is no + ; data waiting + in J,PORTC + andi J,0x10 + in K,PINC + andi K,0x20 + lsr K + eor J,K + breq Main + + ; Data ready, so check if 4bit or 8bit data transfer is being used + sbrs configByte,CONFIG_8_OR_4_BIT + rjmp fourBit ; Low = 4 bit + +eightBit: + ; 8 bit Input is split between portB and portC + ; so read both, shift then OR together to form the 8 bit data + in J,PINB + andi J,0x3E + lsr J + in inpt,PINC + andi inpt,0x07 + lsl inpt + lsl inpt + lsl inpt + lsl inpt + lsl inpt + or inpt,J + + ; Data read, so flip the ack bit + in K,PORTC + ldi J,0x10 + eor K,J + out PORTC,K + + rcall processChar ; process the host data + rjmp Main ; repeat + +fourBit: + ; 4 bit Input is on portB only + sbis PINC,availpin + rjmp Nibble2 ; Process lower 4 bits if clear +nibble1: + in inpt,PINB + andi inpt,0x1E + lsl inpt ; Move to upper 4 bits + lsl inpt + lsl inpt + mov nibbleTemp,inpt + ; Data read, so flip the ack bit + in K,PORTC + ldi J,0x10 + eor K,J + out PORTC,K + rjmp Main ; repeat + +nibble2: + in J,PINB + andi J,0x1E + lsr J ; Move to lower 4 bits + or nibbleTemp,J ; Combine it with the first 4 bits + mov inpt,nibbleTemp + + ; Data read, so flip the ack bit + in K,PORTC + ldi J,0x10 + eor K,J + out PORTC,K + rcall processChar ; process the host data + rjmp main ; repeat + +twiMode: + lds J, TWCR ; check the twi status register + sbrs J, TWINT ; is the twint bit set? + rjmp main ; no, back to main loop + + lds J, TWSR ; Check status register + andi J, 0xF8 ; Ignore bits 0..2 (prescaler and reserved bit) + +; cpi J, 0xA0 ; Stop - ignore +; breq toMain ; no new data + + cpi J, TW_SR_DATA_ACK ; 0x80 - address already received received, ACK had been returned + brne noTWIdata ; no new data + + lds inpt, TWDR ; Store the received data + ldi J, (1<