summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/video
diff options
context:
space:
mode:
author Wilbert Pol <wilbert@jdg.info>2013-01-12 21:54:10 +0000
committer Wilbert Pol <wilbert@jdg.info>2013-01-12 21:54:10 +0000
commit5df1c82e6db4ba50ca24ef051f7961cbab2d89cb (patch)
tree6a247f7958b14885fa2f36c5027407e029155b64 /src/emu/video
parentc972bc6cafd4369d9248decf17a03c7f7ba84854 (diff)
(MESS) g7400: Moved the EF9340/1 code into a separate device. Merged all the odyseey2 code into the driver file. (nw)
Diffstat (limited to 'src/emu/video')
-rw-r--r--src/emu/video/ef9340_1.c331
-rw-r--r--src/emu/video/ef9340_1.h85
-rw-r--r--src/emu/video/ef9341_chargen.h267
3 files changed, 683 insertions, 0 deletions
diff --git a/src/emu/video/ef9340_1.c b/src/emu/video/ef9340_1.c
new file mode 100644
index 00000000000..03a23571940
--- /dev/null
+++ b/src/emu/video/ef9340_1.c
@@ -0,0 +1,331 @@
+/***************************************************************************
+
+ ef9340_1.h
+
+ Thomson EF9340 + EF9341 teletext graphics chips with 1KB external
+ character ram.
+
+***************************************************************************/
+
+#include "ef9340_1.h"
+#include "ef9341_chargen.h"
+
+
+// device type definition
+const device_type EF9340_1 = &device_creator<ef9340_1_device>;
+
+
+static const UINT8 bgr2rgb[8] =
+{
+ 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07
+};
+
+
+ef9340_1_device::ef9340_1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, EF9340_1, "EF9340+EF9341", tag, owner, clock)
+ , m_screen_tag(NULL)
+ , m_screen(NULL)
+ //, m_start_vpos(START_Y)
+ //, m_start_vblank(START_Y + SCREEN_HEIGHT)
+ //, m_screen_lines(LINES)
+{
+}
+
+
+void ef9340_1_device::device_start()
+{
+ assert( m_screen_tag != NULL );
+ m_screen = machine().device<screen_device>(m_screen_tag);
+ assert( m_screen != NULL );
+
+ // Let the screen create our temporary bitmap with the screen's dimensions
+ m_screen->register_screen_bitmap(m_tmp_bitmap);
+
+ m_line_timer = timer_alloc(TIMER_LINE);
+ m_line_timer->adjust( m_screen->time_until_pos(0, 0), 0, m_screen->scan_period() );
+
+ // register our state
+ save_item(NAME(m_ef9341.TA));
+ save_item(NAME(m_ef9341.TB));
+ save_item(NAME(m_ef9341.busy));
+ save_item(NAME(m_ef9340.X));
+ save_item(NAME(m_ef9340.Y));
+ save_item(NAME(m_ef9340.Y0));
+ save_item(NAME(m_ef9340.R));
+ save_item(NAME(m_ef9340.M));
+ save_pointer(NAME(m_ef934x_ram_a), 1024);
+ save_pointer(NAME(m_ef934x_ram_b), 1024);
+ save_pointer(NAME(m_ef934x_ext_char_ram), 1024);
+}
+
+
+void ef9340_1_device::device_reset()
+{
+ m_ef9340.X = 0;
+ m_ef9340.Y = 0;
+ m_ef9340.Y0 = 0;
+ m_ef9340.R = 0;
+ m_ef9340.M = 0;
+ m_ef9341.TA = 0;
+ m_ef9341.TB = 0;
+ m_ef9341.busy = 0;
+}
+
+
+void ef9340_1_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch ( id )
+ {
+ case TIMER_LINE:
+ ef9340_scanline(m_screen->vpos());
+ break;
+ }
+}
+
+
+UINT16 ef9340_1_device::ef9340_get_c_addr(UINT8 x, UINT8 y)
+{
+ if ( ( y & 0x18 ) == 0x18 )
+ {
+ return 0x318 | ( ( x & 0x38 ) << 2 ) | ( x & 0x07 );
+ }
+ if ( x & 0x20 )
+ {
+ return 0x300 | ( ( y & 0x07 ) << 5 ) | ( y & 0x18 ) | ( x & 0x07 );
+ }
+ return y << 5 | x;
+}
+
+
+void ef9340_1_device::ef9340_inc_c()
+{
+ m_ef9340.X++;
+ if ( m_ef9340.X >= 40 )
+ {
+ m_ef9340.Y = ( m_ef9340.Y + 1 ) % 24;
+ m_ef9340.X = 0;
+ }
+}
+
+
+UINT16 ef9340_1_device::external_chargen_address(UINT8 b, UINT8 slice)
+{
+ UINT8 cc = b & 0x7f;
+
+ if ( slice & 8 )
+ {
+ // 0 0 CCE4 CCE3 CCE2 CCE1 CCE0 CCE6 CCE5 ADR0
+ return ( ( cc << 3 ) & 0xf8 ) | ( ( cc >> 4 ) & 0x06) | ( slice & 0x01 );
+ }
+ // CCE6 CCE5 CCE4 CCE3 CCE2 CCE1 CCE0 ADR2 ADR1 ADR0
+ return ( cc << 3 ) | ( slice & 0x07 );
+}
+
+
+void ef9340_1_device::ef9341_write( UINT8 command, UINT8 b, UINT8 data )
+{
+ logerror("ef9341 %s write, t%s, data %02X\n", command ? "command" : "data", b ? "B" : "A", data );
+
+ if ( command )
+ {
+ if ( b )
+ {
+ m_ef9341.TB = data;
+ m_ef9341.busy = 0x80;
+ switch( m_ef9341.TB & 0xE0 )
+ {
+ case 0x00: /* Begin row */
+ m_ef9340.X = 0;
+ m_ef9340.Y = m_ef9341.TA & 0x1F;
+ break;
+ case 0x20: /* Load Y */
+ m_ef9340.Y = m_ef9341.TA & 0x1F;
+ break;
+ case 0x40: /* Load X */
+ m_ef9340.X = m_ef9341.TA & 0x3F;
+ break;
+ case 0x60: /* INC C */
+ ef9340_inc_c();
+ break;
+ case 0x80: /* Load M */
+ m_ef9340.M = m_ef9341.TA;
+ break;
+ case 0xA0: /* Load R */
+ m_ef9340.R = m_ef9341.TA;
+ break;
+ case 0xC0: /* Load Y0 */
+ m_ef9340.Y0 = m_ef9341.TA & 0x3F;
+ break;
+ }
+ m_ef9341.busy = 0;
+ }
+ else
+ {
+ m_ef9341.TA = data;
+ }
+ }
+ else
+ {
+ if ( b )
+ {
+ UINT16 addr = ef9340_get_c_addr( m_ef9340.X, m_ef9340.Y ) & 0x3ff;
+
+ m_ef9341.TB = data;
+ m_ef9341.busy = 0x80;
+ switch ( m_ef9340.M & 0xE0 )
+ {
+ case 0x00: /* Write */
+ m_ef934x_ram_a[addr] = m_ef9341.TA;
+ m_ef934x_ram_b[addr] = m_ef9341.TB;
+ ef9340_inc_c();
+ break;
+
+ case 0x20: /* Read */
+ m_ef9341.TA = m_ef934x_ram_a[addr];
+ m_ef9341.TB = m_ef934x_ram_b[addr];
+ ef9340_inc_c();
+ break;
+
+ case 0x40: /* Write without increment */
+ m_ef934x_ram_a[addr] = m_ef9341.TA;
+ m_ef934x_ram_b[addr] = m_ef9341.TB;
+ break;
+
+ case 0x60: /* Read without increment */
+ m_ef9341.TA = m_ef934x_ram_a[addr];
+ m_ef9341.TB = m_ef934x_ram_b[addr];
+ break;
+
+ case 0x80: /* Write slice */
+ {
+ UINT8 b = m_ef934x_ram_b[addr];
+ UINT8 slice = ( m_ef9340.M & 0x0f ) % 10;
+
+ if ( b >= 0xa0 )
+ {
+ m_ef934x_ext_char_ram[ external_chargen_address( b, slice ) ] = m_ef9341.TA;
+ }
+
+ // Increment slice number
+ m_ef9340.M = ( m_ef9340.M & 0xf0) | ( ( slice + 1 ) % 10 );
+ }
+ break;
+
+ case 0xA0: /* Read slice */
+ fatalerror/*logerror*/("ef9341 unimplemented data action %02X\n", m_ef9340.M & 0xE0 );
+ break;
+ }
+ m_ef9341.busy = 0;
+ }
+ else
+ {
+ m_ef9341.TA = data;
+ }
+ }
+}
+
+
+UINT8 ef9340_1_device::ef9341_read( UINT8 command, UINT8 b )
+{
+ UINT8 data = 0xFF;
+
+ logerror("ef9341 %s read, t%s\n", command ? "command" : "data", b ? "B" : "A" );
+ if ( command )
+ {
+ if ( b )
+ {
+ data = 0xFF;
+ }
+ else
+ {
+ data = m_ef9341.busy;
+ }
+ }
+ else
+ {
+ if ( b )
+ {
+ data = m_ef9341.TB;
+ }
+ else
+ {
+ data = m_ef9341.TA;
+ }
+ }
+ return data;
+}
+
+
+void ef9340_1_device::ef9340_scanline(int vpos)
+{
+ if ( vpos < 250 )
+ {
+ int y = vpos - 0;
+ int y_row, slice;
+
+ if ( y < 10 )
+ {
+ // Service row
+
+ if ( m_ef9340.R & 0x08 )
+ {
+ // Service row is enabled
+
+ y_row = 31;
+ slice = y;
+ }
+ else
+ {
+ // Service row is disabled
+
+ for ( int i = 0; i < 40 * 8; i++ )
+ {
+ m_tmp_bitmap.pix16(vpos, 0 + i ) = 24;
+ }
+ return;
+ }
+ }
+ else
+ {
+ // Displaying regular row
+ y_row = (y - 10) / 10;
+ slice = (y - 10) % 10;
+ }
+
+ for ( int x = 0; x < 40; x++ )
+ {
+ UINT16 addr = ef9340_get_c_addr( x, y_row );
+ UINT8 a = m_ef934x_ram_a[addr];
+ UINT8 b = m_ef934x_ram_b[addr];
+ UINT8 fg = 0;
+ UINT8 bg = 0;
+ UINT8 char_data = 0x00;
+
+ if ( a & 0x80 )
+ {
+ // Graphics
+ }
+ else
+ {
+ // Alphannumeric
+ if ( b & 0x80 )
+ {
+ // Special (DEL or Extension)
+ }
+ else
+ {
+ // Normal
+ char_data = ef9341_char_set[0][b & 0x7f][slice];
+ fg = bgr2rgb[ a & 0x07 ];
+ }
+ }
+
+ for ( int i = 0; i < 8; i++ )
+ {
+ m_tmp_bitmap.pix16(vpos, 0 + x*8 + i ) = (char_data & 0x80) ? fg : bg;
+ char_data <<= 1;
+ }
+ }
+ }
+}
+
diff --git a/src/emu/video/ef9340_1.h b/src/emu/video/ef9340_1.h
new file mode 100644
index 00000000000..da99d9ef069
--- /dev/null
+++ b/src/emu/video/ef9340_1.h
@@ -0,0 +1,85 @@
+/***************************************************************************
+
+ ef9340_1.h
+
+ Thomson EF9340 + EF9341 teletext graphics chips with 1KB external
+ character ram.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __EF9340_1_H__
+#define __EF9340_1_H__
+
+#include "emu.h"
+
+
+#define MCFG_EF9340_1_ADD(_tag, _clock, _screen_tag) \
+ MCFG_DEVICE_ADD(_tag, EF9340_1, _clock) \
+ ef9340_1_device::set_screen_tag(*device, _screen_tag); \
+
+
+class ef9340_1_device : public device_t
+{
+public:
+ // construction/destruction
+ ef9340_1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // static configuration helpers
+ static void set_screen_tag(device_t &device, const char *screen_tag) { downcast<ef9340_1_device &>(device).m_screen_tag = screen_tag; }
+
+ inline bitmap_ind16 *get_bitmap() { return &m_tmp_bitmap; }
+
+ void ef9341_write( UINT8 command, UINT8 b, UINT8 data );
+ UINT8 ef9341_read( UINT8 command, UINT8 b );
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+ inline UINT16 ef9340_get_c_addr(UINT8 x, UINT8 y);
+ inline void ef9340_inc_c();
+
+ // Calculate the external chargen address for a character and slice
+ inline UINT16 external_chargen_address(UINT8 b, UINT8 slice);
+
+ void ef9340_scanline(int vpos);
+
+ /* timers */
+ static const device_timer_id TIMER_LINE = 0;
+
+ emu_timer *m_line_timer;
+
+ const char *m_screen_tag;
+ screen_device *m_screen;
+
+ bitmap_ind16 m_tmp_bitmap;
+
+ struct
+ {
+ UINT8 TA;
+ UINT8 TB;
+ UINT8 busy;
+ } m_ef9341;
+ struct
+ {
+ UINT8 X;
+ UINT8 Y;
+ UINT8 Y0;
+ UINT8 R;
+ UINT8 M;
+ } m_ef9340;
+ UINT8 m_ef934x_ram_a[1024];
+ UINT8 m_ef934x_ram_b[1024];
+ UINT8 m_ef934x_ext_char_ram[1024];
+};
+
+
+// device type definition
+extern const device_type EF9340_1;
+
+#endif /* __EF9340_1_H__ */
+
diff --git a/src/emu/video/ef9341_chargen.h b/src/emu/video/ef9341_chargen.h
new file mode 100644
index 00000000000..b8c72f65b26
--- /dev/null
+++ b/src/emu/video/ef9341_chargen.h
@@ -0,0 +1,267 @@
+static const UINT8 ef9341_char_set[2][128][10] = {
+ // Alphanumeric character set (128 characters)
+ {
+ { 0x00,0x38,0x44,0x40,0x20,0x10,0x00,0x10,0x00,0x00 },
+ { 0x00,0x10,0x28,0x00,0x38,0x44,0x7c,0x44,0x00,0x00 },
+ { 0x00,0x08,0x10,0x3c,0x20,0x30,0x20,0x3c,0x00,0x00 },
+ { 0x00,0x08,0x14,0x10,0x38,0x10,0x24,0x3c,0x00,0x00 },
+ { 0x00,0x10,0x38,0x50,0x38,0x14,0x54,0x38,0x10,0x00 },
+ { 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x10,0x20 },
+ { 0x00,0x28,0x28,0x7c,0x28,0x7c,0x28,0x28,0x00,0x00 },
+ { 0x00,0x20,0x18,0x00,0x38,0x44,0x7c,0x44,0x00,0x00 },
+ { 0x00,0x20,0x18,0x00,0x44,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x10,0x08,0x3c,0x20,0x30,0x20,0x3c,0x00,0x00 },
+ { 0x00,0x3c,0x50,0x50,0x58,0x50,0x50,0x3c,0x00,0x00 },
+ { 0x00,0x08,0x14,0x3c,0x20,0x30,0x20,0x3c,0x00,0x00 },
+ { 0x00,0x00,0x10,0x20,0x7f,0x20,0x10,0x00,0x00,0x00 },
+ { 0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x10,0x10,0x10 },
+ { 0x00,0x00,0x08,0x04,0xfe,0x04,0x08,0x00,0x00,0x00 },
+ { 0x10,0x10,0x10,0x10,0x10,0x10,0x54,0x38,0x10,0x00 },
+ { 0x00,0x18,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x7c,0x00,0x00 },
+ { 0x00,0x08,0x10,0x38,0x44,0x7c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x28,0x00,0x38,0x44,0x7c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x28,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x10,0x20 },
+ { 0x00,0x10,0x28,0x00,0x44,0x44,0x4c,0x34,0x00,0x00 },
+ { 0x00,0x20,0x10,0x34,0x4c,0x44,0x4c,0x34,0x00,0x00 },
+ { 0x00,0x00,0x10,0x00,0x7c,0x00,0x10,0x00,0x00,0x00 },
+ { 0x00,0x20,0x10,0x38,0x44,0x7c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x3c,0x52,0x5e,0x50,0x3e,0x00,0x00 },
+ { 0x00,0x10,0x28,0x38,0x44,0x7c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x40,0xc0,0x40,0x44,0x4c,0x14,0x3e,0x04,0x00 },
+ { 0x00,0x40,0xc0,0x40,0x4c,0x52,0x04,0x08,0x1e,0x00 },
+ { 0x00,0xe0,0x20,0x40,0x24,0xcc,0x14,0x3e,0x04,0x00 },
+ { 0x00,0x10,0x28,0x00,0x38,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00 },
+ { 0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x28,0x00,0x3c,0x20,0x30,0x20,0x3c,0x00,0x00 },
+ { 0x00,0x10,0x28,0x34,0x4c,0x44,0x4c,0x34,0x00,0x00 },
+ { 0x00,0x60,0x64,0x08,0x10,0x20,0x4c,0x0c,0x00,0x00 },
+ { 0x00,0x20,0x50,0x50,0x20,0x54,0x48,0x34,0x00,0x00 },
+ { 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00,0x00 },
+ { 0x00,0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00,0x00 },
+ { 0x00,0x10,0x54,0x38,0x10,0x38,0x54,0x10,0x00,0x00 },
+ { 0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00 },
+ { 0x01,0x02,0x02,0x04,0x08,0x10,0x20,0x20,0x40,0x80 },
+ { 0x00,0x10,0x28,0x44,0x44,0x44,0x28,0x10,0x00,0x00 },
+ { 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x00,0x00 },
+ { 0x00,0x38,0x44,0x04,0x18,0x20,0x40,0x7c,0x00,0x00 },
+ { 0x00,0x7c,0x04,0x08,0x18,0x04,0x44,0x38,0x00,0x00 },
+ { 0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08,0x00,0x00 },
+ { 0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00 },
+ { 0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x7c,0x04,0x08,0x10,0x20,0x20,0x20,0x00,0x00 },
+ { 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x38,0x44,0x44,0x3c,0x04,0x04,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00 },
+ { 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40,0x00 },
+ { 0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,0x00 },
+ { 0x00,0x00,0x00,0x7c,0x00,0x7c,0x00,0x00,0x00,0x00 },
+ { 0x00,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00 },
+ { 0x00,0x38,0x44,0x04,0x08,0x10,0x00,0x10,0x00,0x00 },
+ { 0x00,0x38,0x44,0x5c,0x54,0x5c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x38,0x44,0x44,0x44,0x7c,0x44,0x44,0x00,0x00 },
+ { 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00,0x00 },
+ { 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00 },
+ { 0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00 },
+ { 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x7c,0x00,0x00 },
+ { 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x00,0x00 },
+ { 0x00,0x38,0x44,0x40,0x40,0x4c,0x44,0x3c,0x00,0x00 },
+ { 0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00 },
+ { 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00 },
+ { 0x00,0x1c,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00 },
+ { 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00 },
+ { 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00 },
+ { 0x00,0x44,0x6c,0x54,0x44,0x44,0x44,0x44,0x00,0x00 },
+ { 0x00,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x00,0x00 },
+ { 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00 },
+ { 0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00 },
+ { 0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00 },
+ { 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00 },
+ { 0x00,0x7c,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00 },
+ { 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00 },
+ { 0x00,0x44,0x44,0x44,0x54,0x54,0x54,0x28,0x00,0x00 },
+ { 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00 },
+ { 0x00,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00 },
+ { 0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x7c,0x00,0x00 },
+ { 0x00,0x1c,0x10,0x10,0x10,0x10,0x10,0x1c,0x00,0x00 },
+ { 0x80,0x40,0x40,0x20,0x10,0x08,0x04,0x04,0x02,0x01 },
+ { 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00 },
+ { 0x00,0x10,0x28,0x00,0x30,0x10,0x10,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff },
+ { 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x34,0x4c,0x44,0x4c,0x34,0x00,0x00 },
+ { 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x78,0x00,0x00 },
+ { 0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x00,0x00 },
+ { 0x00,0x04,0x04,0x3c,0x44,0x44,0x44,0x3c,0x00,0x00 },
+ { 0x00,0x00,0x00,0x38,0x44,0x7c,0x40,0x38,0x00,0x00 },
+ { 0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x00,0x00 },
+ { 0x00,0x00,0x00,0x3c,0x44,0x44,0x3c,0x04,0x24,0x18 },
+ { 0x00,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x00,0x00 },
+ { 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00 },
+ { 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30 },
+ { 0x00,0x20,0x20,0x24,0x28,0x30,0x28,0x24,0x00,0x00 },
+ { 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x54,0x00,0x00 },
+ { 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x00,0x00 },
+ { 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00 },
+ { 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40 },
+ { 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x3c,0x04,0x04 },
+ { 0x00,0x00,0x00,0x58,0x64,0x40,0x40,0x40,0x00,0x00 },
+ { 0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,0x00 },
+ { 0x00,0x20,0x20,0x38,0x20,0x20,0x20,0x18,0x00,0x00 },
+ { 0x00,0x00,0x00,0x44,0x44,0x44,0x4c,0x34,0x00,0x00 },
+ { 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x00,0x00 },
+ { 0x00,0x00,0x00,0x44,0x44,0x54,0x54,0x28,0x00,0x00 },
+ { 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00 },
+ { 0x00,0x00,0x00,0x44,0x44,0x4c,0x34,0x04,0x44,0x38 },
+ { 0x00,0x00,0x00,0x7c,0x08,0x10,0x20,0x7c,0x00,0x00 },
+ { 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80 },
+ { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
+ { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 },
+ { 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }
+ },
+
+ {
+ // Separated semi-graphic character set (64 characters)
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00 },
+ { 0x70,0x70,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00 },
+ { 0x07,0x07,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00 },
+ { 0x77,0x77,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x00 },
+ { 0x70,0x70,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x00 },
+ { 0x07,0x07,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x00 },
+ { 0x77,0x77,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x77,0x77,0x77,0x00,0x00,0x00,0x00 },
+ { 0x70,0x70,0x00,0x77,0x77,0x77,0x00,0x00,0x00,0x00 },
+ { 0x07,0x07,0x00,0x77,0x77,0x77,0x00,0x00,0x00,0x00 },
+ { 0x77,0x77,0x00,0x77,0x77,0x77,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00 },
+ { 0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00 },
+ { 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00 },
+ { 0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00 },
+ { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x70,0x70,0x00 },
+ { 0x70,0x70,0x00,0x70,0x70,0x70,0x00,0x70,0x70,0x00 },
+ { 0x07,0x07,0x00,0x70,0x70,0x70,0x00,0x70,0x70,0x00 },
+ { 0x77,0x77,0x00,0x70,0x70,0x70,0x00,0x70,0x70,0x00 },
+ { 0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x70,0x70,0x00 },
+ { 0x70,0x70,0x00,0x07,0x07,0x07,0x00,0x70,0x70,0x00 },
+ { 0x07,0x07,0x00,0x07,0x07,0x07,0x00,0x70,0x70,0x00 },
+ { 0x77,0x77,0x00,0x07,0x07,0x07,0x00,0x70,0x70,0x00 },
+ { 0x00,0x00,0x00,0x77,0x77,0x77,0x00,0x70,0x70,0x00 },
+ { 0x70,0x70,0x00,0x77,0x77,0x77,0x00,0x70,0x70,0x00 },
+ { 0x07,0x07,0x00,0x77,0x77,0x77,0x00,0x70,0x70,0x00 },
+ { 0x77,0x77,0x00,0x77,0x77,0x77,0x00,0x70,0x70,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00 },
+ { 0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00 },
+ { 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00 },
+ { 0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00 },
+ { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x07,0x07,0x00 },
+ { 0x70,0x70,0x00,0x70,0x70,0x70,0x00,0x07,0x07,0x00 },
+ { 0x07,0x07,0x00,0x70,0x70,0x70,0x00,0x07,0x07,0x00 },
+ { 0x77,0x77,0x00,0x70,0x70,0x70,0x00,0x07,0x07,0x00 },
+ { 0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x07,0x07,0x00 },
+ { 0x70,0x70,0x00,0x07,0x07,0x07,0x00,0x07,0x07,0x00 },
+ { 0x07,0x07,0x00,0x07,0x07,0x07,0x00,0x07,0x07,0x00 },
+ { 0x77,0x77,0x00,0x07,0x07,0x07,0x00,0x07,0x07,0x00 },
+ { 0x00,0x00,0x00,0x77,0x77,0x77,0x00,0x07,0x07,0x00 },
+ { 0x70,0x70,0x00,0x77,0x77,0x77,0x00,0x07,0x07,0x00 },
+ { 0x07,0x07,0x00,0x77,0x77,0x77,0x00,0x07,0x07,0x00 },
+ { 0x77,0x77,0x00,0x77,0x77,0x77,0x00,0x07,0x07,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x00 },
+ { 0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x00 },
+ { 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x00 },
+ { 0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x00 },
+ { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x77,0x77,0x00 },
+ { 0x70,0x70,0x00,0x70,0x70,0x70,0x00,0x77,0x77,0x00 },
+ { 0x07,0x07,0x00,0x70,0x70,0x70,0x00,0x77,0x77,0x00 },
+ { 0x77,0x77,0x00,0x70,0x70,0x70,0x00,0x77,0x77,0x00 },
+ { 0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x77,0x77,0x00 },
+ { 0x70,0x70,0x00,0x07,0x07,0x07,0x00,0x77,0x77,0x00 },
+ { 0x07,0x07,0x00,0x07,0x07,0x07,0x00,0x77,0x77,0x00 },
+ { 0x77,0x77,0x00,0x07,0x07,0x07,0x00,0x77,0x77,0x00 },
+ { 0x00,0x00,0x00,0x77,0x77,0x77,0x00,0x77,0x77,0x00 },
+ { 0x70,0x70,0x00,0x77,0x77,0x77,0x00,0x77,0x77,0x00 },
+ { 0x07,0x07,0x00,0x77,0x77,0x77,0x00,0x77,0x77,0x00 },
+ { 0x77,0x77,0x00,0x77,0x77,0x77,0x00,0x77,0x77,0x00 },
+
+ // Mosaic semi-graphic character set (64 characters)
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00 },
+ { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00 },
+ { 0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00 },
+ { 0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00 },
+ { 0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00 },
+ { 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00 },
+ { 0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00 },
+ { 0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0x00,0x00,0x00 },
+ { 0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00 },
+ { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0 },
+ { 0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0 },
+ { 0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0 },
+ { 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0 },
+ { 0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0 },
+ { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0 },
+ { 0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0 },
+ { 0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0 },
+ { 0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0 },
+ { 0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0 },
+ { 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0 },
+ { 0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0 },
+ { 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0 },
+ { 0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0 },
+ { 0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0 },
+ { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f },
+ { 0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f },
+ { 0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f },
+ { 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f },
+ { 0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f },
+ { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f },
+ { 0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f },
+ { 0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f },
+ { 0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f },
+ { 0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f },
+ { 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f },
+ { 0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f },
+ { 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f },
+ { 0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f },
+ { 0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f },
+ { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff },
+ { 0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xff },
+ { 0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0xff,0xff,0xff },
+ { 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff },
+ { 0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff },
+ { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff },
+ { 0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff },
+ { 0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff },
+ { 0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff },
+ { 0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff },
+ { 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff },
+ { 0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff },
+ { 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
+ { 0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
+ { 0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
+ { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }
+ }
+};