All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 00/40] UI patches
@ 2026-04-22 10:40 marcandre.lureau
  2026-04-22 10:40 ` [PULL 01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails marcandre.lureau
                   ` (41 more replies)
  0 siblings, 42 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The following changes since commit 98b060da3a4f92b2a994ead5b16a87e783baf77c:

  Update version for v11.0.0 release (2026-04-21 16:28:47 +0100)

are available in the Git repository at:

  https://gitlab.com/marcandre.lureau/qemu.git tags/ui-pull-request

for you to fetch changes up to 4a36e9d6693806c02eae75db346bc6043abbfafc:

  tests: rename the dbus-daemon helper script (2026-04-22 12:54:24 +0400)

----------------------------------------------------------------
UI-related fixes and cleanups

----------------------------------------------------------------

GuoHan Zhao (3):
  ui/input-linux: close evdev fd when qemu_set_blocking fails
  ui/spice-app: detect runtime directory creation failures
  ui/clipboard: clear deferred serial reset flag on resume

Marc-André Lureau (36):
  ui/vnc-jobs: remove needless buffer_reset() before end
  ui/vnc: clarify intent using buffer_empty() function
  ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL
  ui/vnc-jobs: remove dead VncJobQueue.exit
  ui/vnc-jobs: remove vnc_queue_clear()
  ui/vnc-jobs: narrow taking the queue lock
  ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self()
  ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)
  ui/console-vc: ignore string-type escape sequences
  ui/console-vc: fix comment shift-out/in comments
  ui/console: dispatch get_label() through QOM virtual method
  ui/console-vc: introduce QemuVT100
  ui/console-vc: set vt100 associated pixman image
  ui/console-vc: vga_putcharxy()->vt100_putcharxy()
  ui/console-vc: make invalidate_xy() take vt100
  ui/console-vc: make show_cursor() take vt100
  ui/console-vc: decouple VT100 display updates via function pointer
  ui/console-vc: console_refresh() -> vt100_refresh()
  ui/console-vc: move cursor blinking logic into VT100 layer
  ui/console-vc: console_scroll() -> vt100_scroll()
  ui/console-vc: refactor text_console_resize() into vt100_set_image()
  ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf()
  ui/console-vc: unify the write path
  ui: avoid duplicating vgafont16 in each translation unit
  ui/vgafont: add SPDX license header
  util: move datadir.c from system/
  system: make qemu_del_vm_change_state_handler accept NULL
  ui/vnc: assert preconditions instead of silently returning
  ui/vnc: simplify vnc_init_func error handling
  ui/vnc: VncDisplay.id is not const
  ui/keymaps: introduce kbd_layout_free()
  ui/vnc: fix vnc_display_init() leak on failure
  ui/vnc: make vnc_disconnect_finish() private
  ui/vnc: remove left-over dead code
  ui/vnc: explicitly link with png
  tests: rename the dbus-daemon helper script

Werner de Carne (1):
  serial COM: windows serial COM PollingFunc don't sleep

 include/ui/console.h                          |    3 +-
 ui/console-priv.h                             |    3 +-
 ui/keymaps.h                                  |    1 +
 ui/vgafont.h                                  | 4616 +----------------
 ui/vnc.h                                      |    4 +-
 chardev/char-win.c                            |   16 +-
 system/runstate.c                             |    3 +
 ui/clipboard.c                                |    1 +
 ui/console-vc-stubs.c                         |    8 +-
 ui/console-vc.c                               |  612 ++-
 ui/console.c                                  |  120 +-
 ui/input-linux.c                              |    2 +-
 ui/keymaps.c                                  |   13 +-
 ui/spice-app.c                                |    2 +-
 ui/vgafont.c                                  | 4616 +++++++++++++++++
 ui/vnc-jobs.c                                 |   44 +-
 ui/vnc.c                                      |   71 +-
 {system => util}/datadir.c                    |    0
 system/meson.build                            |    1 -
 system/trace-events                           |    1 -
 ...{dbus-vmstate-daemon.sh => dbus-daemon.sh} |    0
 tests/qtest/meson.build                       |    2 +-
 ui/meson.build                                |    3 +-
 util/meson.build                              |    1 +
 util/trace-events                             |    3 +
 25 files changed, 5113 insertions(+), 5033 deletions(-)
 create mode 100644 ui/vgafont.c
 rename {system => util}/datadir.c (100%)
 rename tests/{dbus-vmstate-daemon.sh => dbus-daemon.sh} (100%)

-- 
2.53.0



^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PULL 01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 02/40] ui/spice-app: detect runtime directory creation failures marcandre.lureau
                   ` (40 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, GuoHan Zhao, Marc-André Lureau

From: GuoHan Zhao <zhaoguohan@kylinos.cn>

input_linux_complete() opens the evdev node before switching it to
non-blocking mode. If qemu_set_blocking() fails, the function returns
without closing the file descriptor.

The finalize path only closes initialized devices, so this leaks the fd
on an error path.

Jump to err_close when qemu_set_blocking() fails so the descriptor is
released before returning.

Fixes: c7b1172026a0 ("ui: replace qemu_set_nonblock()")
Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260408024024.606222-1-zhaoguohan@kylinos.cn>
---
 ui/input-linux.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/input-linux.c b/ui/input-linux.c
index c16726a3b79..74bc8511428 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -316,7 +316,7 @@ static void input_linux_complete(UserCreatable *uc, Error **errp)
         return;
     }
     if (!qemu_set_blocking(il->fd, false, errp)) {
-        return;
+        goto err_close;
     }
 
     rc = ioctl(il->fd, EVIOCGVERSION, &ver);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 02/40] ui/spice-app: detect runtime directory creation failures
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
  2026-04-22 10:40 ` [PULL 01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 03/40] serial COM: windows serial COM PollingFunc don't sleep marcandre.lureau
                   ` (39 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, GuoHan Zhao, Marc-André Lureau

From: GuoHan Zhao <zhaoguohan@kylinos.cn>

spice_app_display_early_init() creates the per-VM runtime directory
with g_mkdir_with_parents() before setting up the Spice socket. The
code checks for "< -1", but g_mkdir_with_parents() returns -1 on
failure, so the error path is never taken.

This lets spice-app continue after a directory creation failure and
defers the problem to later setup steps.

Check for "< 0" instead so the failure is reported immediately and
spice-app exits before using an invalid runtime directory.

Fixes: d8aec9d9f129 ("display: add -display spice-app launching a Spice client")
Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260408031725.641417-1-zhaoguohan@kylinos.cn>
---
 ui/spice-app.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/spice-app.c b/ui/spice-app.c
index 9e55f273715..0df7325e679 100644
--- a/ui/spice-app.c
+++ b/ui/spice-app.c
@@ -151,7 +151,7 @@ static void spice_app_display_early_init(DisplayOptions *opts)
     if (qemu_name) {
         app_dir = g_build_filename(g_get_user_runtime_dir(),
                                    "qemu", qemu_name, NULL);
-        if (g_mkdir_with_parents(app_dir, S_IRWXU) < -1) {
+        if (g_mkdir_with_parents(app_dir, S_IRWXU) < 0) {
             error_report("Failed to create directory %s: %s",
                          app_dir, strerror(errno));
             exit(1);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 03/40] serial COM: windows serial COM PollingFunc don't sleep
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
  2026-04-22 10:40 ` [PULL 01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails marcandre.lureau
  2026-04-22 10:40 ` [PULL 02/40] ui/spice-app: detect runtime directory creation failures marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 04/40] ui/clipboard: clear deferred serial reset flag on resume marcandre.lureau
                   ` (38 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, Werner de Carne, Marc-André Lureau,
	Paolo Bonzini

From: Werner de Carne <werner@carne.de>

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1802
Signed-off-by: Werner de Carne <werner@carne.de>
[ Marc-André - indentation fixes ]
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20230807201443.2668-1-werner@carne.de>
---
 chardev/char-win.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/chardev/char-win.c b/chardev/char-win.c
index fef45e83aad..e194242c9f9 100644
--- a/chardev/char-win.c
+++ b/chardev/char-win.c
@@ -28,7 +28,7 @@
 #include "qapi/error.h"
 #include "chardev/char-win.h"
 
-static void win_chr_read(Chardev *chr, DWORD len)
+static int win_chr_read(Chardev *chr, DWORD len)
 {
     WinChardev *s = WIN_CHARDEV(chr);
     int max_size = qemu_chr_be_can_write(chr);
@@ -40,7 +40,7 @@ static void win_chr_read(Chardev *chr, DWORD len)
         len = max_size;
     }
     if (len == 0) {
-        return;
+        return 0;
     }
 
     ZeroMemory(&s->orecv, sizeof(s->orecv));
@@ -56,6 +56,8 @@ static void win_chr_read(Chardev *chr, DWORD len)
     if (size > 0) {
         qemu_chr_be_write(chr, buf, size);
     }
+
+    return size > 0 ? 1 : 0;
 }
 
 static int win_chr_serial_poll(void *opaque)
@@ -67,8 +69,9 @@ static int win_chr_serial_poll(void *opaque)
 
     ClearCommError(s->file, &comerr, &status);
     if (status.cbInQue > 0) {
-        win_chr_read(chr, status.cbInQue);
-        return 1;
+        if (win_chr_read(chr, status.cbInQue)) {
+            return 1;
+        }
     }
     return 0;
 }
@@ -147,8 +150,9 @@ int win_chr_pipe_poll(void *opaque)
 
     PeekNamedPipe(s->file, NULL, 0, NULL, &size, NULL);
     if (size > 0) {
-        win_chr_read(chr, size);
-        return 1;
+        if (win_chr_read(chr, size)) {
+            return 1;
+        }
     }
     return 0;
 }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 04/40] ui/clipboard: clear deferred serial reset flag on resume
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (2 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 03/40] serial COM: windows serial COM PollingFunc don't sleep marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 05/40] ui/vnc-jobs: remove needless buffer_reset() before end marcandre.lureau
                   ` (37 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, GuoHan Zhao, Marc-André Lureau

From: GuoHan Zhao <zhaoguohan@kylinos.cn>

cb_reset_serial_on_resume defers a clipboard serial reset until the
machine runs again. qemu_clipboard_change_state() performs that reset
on resume, but leaves the flag set.

As a result, every later transition back to RUNNING triggers another
QEMU_CLIPBOARD_RESET_SERIAL notification even when no reset is pending.
That causes unnecessary reset handling in clipboard backends such as
vdagent and dbus.

Clear the deferred flag before resetting so the reset is performed only
once for each deferred request.

Fixes: c967ff606b99 ("ui/clipboard: delay clipboard update when not running")
Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260416070403.1683648-1-zhaoguohan@kylinos.cn>
---
 ui/clipboard.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ui/clipboard.c b/ui/clipboard.c
index ec00a0b8ec7..e3d8a31ba9f 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -47,6 +47,7 @@ static void qemu_clipboard_change_state(void *opaque, bool running, RunState sta
     }
 
     if (cb_reset_serial_on_resume) {
+        cb_reset_serial_on_resume = false;
         qemu_clipboard_reset_serial();
     }
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 05/40] ui/vnc-jobs: remove needless buffer_reset() before end
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (3 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 04/40] ui/clipboard: clear deferred serial reset flag on resume marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 06/40] ui/vnc: clarify intent using buffer_empty() function marcandre.lureau
                   ` (36 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

vnc_async_encoding_end() does buffer_free() next.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index ec90ae6d5fc..a6ab733faa1 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -326,7 +326,6 @@ static int vnc_worker_thread_loop(VncJobQueue *queue)
 
         qemu_bh_schedule(job->vs->bh);
     }  else {
-        buffer_reset(&vs.output);
         /* Copy persistent encoding data */
         vnc_async_encoding_end(job->vs, &vs);
     }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 06/40] ui/vnc: clarify intent using buffer_empty() function
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (4 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 05/40] ui/vnc-jobs: remove needless buffer_reset() before end marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 07/40] ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL marcandre.lureau
                   ` (35 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 2 +-
 ui/vnc.c      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index a6ab733faa1..4dd7ccad969 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -160,7 +160,7 @@ void vnc_jobs_consume_buffer(VncState *vs)
     bool flush;
 
     vnc_lock_output(vs);
-    if (vs->jobs_buffer.offset) {
+    if (!buffer_empty(&vs->jobs_buffer)) {
         if (vs->ioc != NULL && buffer_empty(&vs->output)) {
             g_clear_handle_id(&vs->ioc_tag, g_source_remove);
             if (vs->disconnecting == FALSE) {
diff --git a/ui/vnc.c b/ui/vnc.c
index ccc73bd7aa4..4aa446a48d7 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -1718,7 +1718,7 @@ void vnc_write_u8(VncState *vs, uint8_t value)
 void vnc_flush(VncState *vs)
 {
     vnc_lock_output(vs);
-    if (vs->ioc != NULL && vs->output.offset) {
+    if (vs->ioc != NULL && !buffer_empty(&vs->output)) {
         vnc_client_write_locked(vs);
     }
     if (vs->disconnecting) {
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 07/40] ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (5 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 06/40] ui/vnc: clarify intent using buffer_empty() function marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 08/40] ui/vnc-jobs: remove dead VncJobQueue.exit marcandre.lureau
                   ` (34 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The only caller, vnc_jobs_join() cannot take vs == NULL argument, or it
would later crash.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 4dd7ccad969..8cb30e72276 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -138,7 +138,7 @@ static bool vnc_has_job_locked(VncState *vs)
     VncJob *job;
 
     QTAILQ_FOREACH(job, &queue->jobs, next) {
-        if (job->vs == vs || !vs) {
+        if (job->vs == vs) {
             return true;
         }
     }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 08/40] ui/vnc-jobs: remove dead VncJobQueue.exit
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (6 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 07/40] ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 09/40] ui/vnc-jobs: remove vnc_queue_clear() marcandre.lureau
                   ` (33 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Since commit 09526058d0a5 ("ui/vnc: Remove vnc_stop_worker_thread()"),
it's not used anymore. It seems stopping worker thread hasn't been
supported ever.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 8cb30e72276..9e536b07b90 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -56,7 +56,6 @@ struct VncJobQueue {
     QemuCond cond;
     QemuMutex mutex;
     QemuThread thread;
-    bool exit;
     QTAILQ_HEAD(, VncJob) jobs;
 };
 
@@ -124,7 +123,7 @@ static void vnc_job_free(VncJob *job)
 void vnc_job_push(VncJob *job)
 {
     vnc_lock_queue(queue);
-    if (queue->exit || QLIST_EMPTY(&job->rectangles)) {
+    if (QLIST_EMPTY(&job->rectangles)) {
         vnc_job_free(job);
     } else {
         QTAILQ_INSERT_TAIL(&queue->jobs, job, next);
@@ -248,17 +247,12 @@ static int vnc_worker_thread_loop(VncJobQueue *queue)
     int saved_offset;
 
     vnc_lock_queue(queue);
-    while (QTAILQ_EMPTY(&queue->jobs) && !queue->exit) {
+    while (QTAILQ_EMPTY(&queue->jobs)) {
         qemu_cond_wait(&queue->cond, &queue->mutex);
     }
-    /* Here job can only be NULL if queue->exit is true */
     job = QTAILQ_FIRST(&queue->jobs);
     vnc_unlock_queue(queue);
 
-    if (queue->exit) {
-        return -1;
-    }
-
     assert(job->vs->magic == VNC_MAGIC);
     vc = container_of(job->vs, VncConnection, vs);
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 09/40] ui/vnc-jobs: remove vnc_queue_clear()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (7 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 08/40] ui/vnc-jobs: remove dead VncJobQueue.exit marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 10/40] ui/vnc-jobs: narrow taking the queue lock marcandre.lureau
                   ` (32 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The function was never called, since the worker thread was never
exiting. Also it was incomplete (not clearing pending job list) and
mixing global queue and argument. Let's remove it.

Note: maybe the worker thread could be torn down when vnc_jobs_join()
realizes there is no job left.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 9e536b07b90..28a4738f1ec 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -345,14 +345,6 @@ static VncJobQueue *vnc_queue_init(void)
     return queue;
 }
 
-static void vnc_queue_clear(VncJobQueue *q)
-{
-    qemu_cond_destroy(&queue->cond);
-    qemu_mutex_destroy(&queue->mutex);
-    g_free(q);
-    queue = NULL; /* Unset global queue */
-}
-
 static void *vnc_worker_thread(void *arg)
 {
     VncJobQueue *queue = arg;
@@ -360,7 +352,7 @@ static void *vnc_worker_thread(void *arg)
     qemu_thread_get_self(&queue->thread);
 
     while (!vnc_worker_thread_loop(queue)) ;
-    vnc_queue_clear(queue);
+    g_assert_not_reached();
     return NULL;
 }
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 10/40] ui/vnc-jobs: narrow taking the queue lock
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (8 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 09/40] ui/vnc-jobs: remove vnc_queue_clear() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 11/40] ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self() marcandre.lureau
                   ` (31 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

It's not needed unless manipulating the queue.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 28a4738f1ec..9c17d684c9e 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -83,26 +83,26 @@ VncJob *vnc_job_new(VncState *vs)
 
     assert(vs->magic == VNC_MAGIC);
     job->vs = vs;
-    vnc_lock_queue(queue);
     QLIST_INIT(&job->rectangles);
-    vnc_unlock_queue(queue);
     return job;
 }
 
+/*
+ * Do not call this after pushing the job.
+ */
 int vnc_job_add_rect(VncJob *job, int x, int y, int w, int h)
 {
     VncRectEntry *entry = g_new0(VncRectEntry, 1);
 
     trace_vnc_job_add_rect(job->vs, job, x, y, w, h);
+    assert(!QTAILQ_IN_USE(job, next));
 
     entry->rect.x = x;
     entry->rect.y = y;
     entry->rect.w = w;
     entry->rect.h = h;
 
-    vnc_lock_queue(queue);
     QLIST_INSERT_HEAD(&job->rectangles, entry, next);
-    vnc_unlock_queue(queue);
     return 1;
 }
 
@@ -120,16 +120,21 @@ static void vnc_job_free(VncJob *job)
     g_free(job);
 }
 
+/*
+ * Push a job onto the queue. Ownership of the job is transferred.
+ */
 void vnc_job_push(VncJob *job)
 {
-    vnc_lock_queue(queue);
+    assert(!QTAILQ_IN_USE(job, next));
+
     if (QLIST_EMPTY(&job->rectangles)) {
         vnc_job_free(job);
     } else {
+        vnc_lock_queue(queue);
         QTAILQ_INSERT_TAIL(&queue->jobs, job, next);
         qemu_cond_broadcast(&queue->cond);
+        vnc_unlock_queue(queue);
     }
-    vnc_unlock_queue(queue);
 }
 
 static bool vnc_has_job_locked(VncState *vs)
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 11/40] ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (9 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 10/40] ui/vnc-jobs: narrow taking the queue lock marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 12/40] ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen) marcandre.lureau
                   ` (30 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The call is unnecessary, since "thread" is already set at creation time.
Furthermore, the "thread" field is mostly useless as the thread is
created DETACHED and isn't used for anything but perhaps debugging.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc-jobs.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 9c17d684c9e..5b17ef54091 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -354,8 +354,6 @@ static void *vnc_worker_thread(void *arg)
 {
     VncJobQueue *queue = arg;
 
-    qemu_thread_get_self(&queue->thread);
-
     while (!vnc_worker_thread_loop(queue)) ;
     g_assert_not_reached();
     return NULL;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 12/40] ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (10 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 11/40] ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 13/40] ui/console-vc: ignore string-type escape sequences marcandre.lureau
                   ` (29 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The loop condition used `y <= s->height` instead of `y < s->height`,
causing vc_clear_xy() to be called with y == s->height. This clears
a row in the scrollback buffer beyond the visible screen.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index f22806fed79..8dee1f9bd01 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -899,7 +899,7 @@ static void vc_putchar(VCChardev *vc, int ch)
                     break;
                 case 2:
                     /* clear entire screen */
-                    for (y = 0; y <= s->height; y++) {
+                    for (y = 0; y < s->height; y++) {
                         for (x = 0; x < s->width; x++) {
                             vc_clear_xy(vc, x, y);
                         }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 13/40] ui/console-vc: ignore string-type escape sequences
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (11 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 12/40] ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen) marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 14/40] ui/console-vc: fix comment shift-out/in comments marcandre.lureau
                   ` (28 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Modern terminals and applications emit OSC (Operating System Command),
DCS, SOS, PM, and APC escape sequences (e.g. for setting window
titles).  The text console currently does not recognise these
string-type introducers, so each byte of the payload is interpreted as
a normal character or a new escape, producing garbage on screen.

Add a TTY_STATE_OSC state that silently consumes all bytes until the
sequence is terminated by BEL or ST (ESC \).

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 8dee1f9bd01..62114d89ddd 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -44,6 +44,7 @@ enum TTYState {
     TTY_STATE_CSI,
     TTY_STATE_G0,
     TTY_STATE_G1,
+    TTY_STATE_OSC,
 };
 
 typedef struct QemuTextConsole {
@@ -807,6 +808,10 @@ static void vc_putchar(VCChardev *vc, int ch)
             vc->state = TTY_STATE_G0;
         } else if (ch == ')') {
             vc->state = TTY_STATE_G1;
+        } else if (ch == ']' || ch == 'P' || ch == 'X'
+                   || ch == '^' || ch == '_') {
+            /* String sequences: OSC, DCS, SOS, PM, APC */
+            vc->state = TTY_STATE_OSC;
         } else if (ch == '7') {
             vc_save_cursor(vc);
             vc->state = TTY_STATE_NORM;
@@ -965,6 +970,16 @@ static void vc_putchar(VCChardev *vc, int ch)
             break;
         }
         break;
+    case TTY_STATE_OSC: /* Operating System Command: ESC ] ... BEL/ST */
+        if (ch == '\a') {
+            /* BEL terminates OSC */
+            vc->state = TTY_STATE_NORM;
+        } else if (ch == 27) {
+            /* ESC might start ST (ESC \) */
+            vc->state = TTY_STATE_ESC;
+        }
+        /* All other bytes are silently consumed */
+        break;
     case TTY_STATE_G0: /* set character sets */
     case TTY_STATE_G1: /* set character sets */
         switch (ch) {
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 14/40] ui/console-vc: fix comment shift-out/in comments
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (12 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 13/40] ui/console-vc: ignore string-type escape sequences marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 15/40] ui/console: dispatch get_label() through QOM virtual method marcandre.lureau
                   ` (27 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

14 is shift-out
15 is shift-in

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 62114d89ddd..0881a2148c1 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -785,10 +785,10 @@ static void vc_putchar(VCChardev *vc, int ch)
             /* TODO: has to be implemented */
             break;
         case 14:
-            /* SI (shift in), character set 0 (ignored) */
+            /* SO (shift out), character set 1 (ignored) */
             break;
         case 15:
-            /* SO (shift out), character set 1 (ignored) */
+            /* SI (shift in), character set 0 (ignored) */
             break;
         case 27:    /* esc (introducing an escape sequence) */
             vc->state = TTY_STATE_ESC;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 15/40] ui/console: dispatch get_label() through QOM virtual method
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (13 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 14/40] ui/console-vc: fix comment shift-out/in comments marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 16/40] ui/console-vc: introduce QemuVT100 marcandre.lureau
                   ` (26 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Replace the type-checking chain in qemu_console_get_label() (using
QEMU_IS_GRAPHIC_CONSOLE/QEMU_IS_TEXT_CONSOLE) with a QemuConsoleClass
virtual method, allowing each console subclass to provide its own
get_label implementation.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/console.h  |   2 +
 ui/console-priv.h     |   1 -
 ui/console-vc-stubs.c |   6 ---
 ui/console-vc.c       |  12 +++--
 ui/console.c          | 101 ++++++++++++++++++++++--------------------
 5 files changed, 65 insertions(+), 57 deletions(-)

diff --git a/include/ui/console.h b/include/ui/console.h
index 08082389f71..788ff103ada 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -129,6 +129,8 @@ void console_handle_touch_event(QemuConsole *con,
 
 struct QemuConsoleClass {
     ObjectClass parent_class;
+
+    char * (*get_label)(const QemuConsole *con);
 };
 
 typedef struct ScanoutTexture {
diff --git a/ui/console-priv.h b/ui/console-priv.h
index 43ceb8122f1..2c2cfd99570 100644
--- a/ui/console-priv.h
+++ b/ui/console-priv.h
@@ -36,7 +36,6 @@ struct QemuConsole {
 };
 
 void qemu_text_console_update_size(QemuTextConsole *c);
-const char * qemu_text_console_get_label(QemuTextConsole *c);
 void qemu_text_console_update_cursor(void);
 void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym);
 
diff --git a/ui/console-vc-stubs.c b/ui/console-vc-stubs.c
index b63e2fb2345..8a7f19c1f44 100644
--- a/ui/console-vc-stubs.c
+++ b/ui/console-vc-stubs.c
@@ -14,12 +14,6 @@ void qemu_text_console_update_size(QemuTextConsole *c)
 {
 }
 
-const char *
-qemu_text_console_get_label(QemuTextConsole *c)
-{
-    return NULL;
-}
-
 void qemu_text_console_update_cursor(void)
 {
 }
diff --git a/ui/console-vc.c b/ui/console-vc.c
index 0881a2148c1..ce35abaf402 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -122,10 +122,12 @@ static const pixman_color_t color_table_rgb[2][8] = {
 static bool cursor_visible_phase;
 static QEMUTimer *cursor_timer;
 
-const char *
-qemu_text_console_get_label(QemuTextConsole *c)
+static char *
+qemu_text_console_get_label(const QemuConsole *c)
 {
-    return c->chr ? c->chr->label : NULL;
+    QemuTextConsole *tc = QEMU_TEXT_CONSOLE(c);
+
+    return tc->chr ? g_strdup(tc->chr->label) : NULL;
 }
 
 static void qemu_console_fill_rect(QemuConsole *con, int posx, int posy,
@@ -1053,9 +1055,13 @@ qemu_text_console_finalize(Object *obj)
 static void
 qemu_text_console_class_init(ObjectClass *oc, const void *data)
 {
+    QemuConsoleClass *cc = QEMU_CONSOLE_CLASS(oc);
+
     if (!cursor_timer) {
         cursor_timer = timer_new_ms(QEMU_CLOCK_REALTIME, cursor_timer_cb, NULL);
     }
+
+    cc->get_label = qemu_text_console_get_label;
 }
 
 static const GraphicHwOps text_console_ops = {
diff --git a/ui/console.c b/ui/console.c
index f445db11389..beaef4ad8b8 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -436,9 +436,58 @@ qemu_graphic_console_prop_get_head(Object *obj, Visitor *v, const char *name,
     visit_type_uint32(v, name, &c->head, errp);
 }
 
+static bool
+qemu_graphic_console_is_multihead(QemuGraphicConsole *c)
+{
+    QemuConsole *con;
+
+    QTAILQ_FOREACH(con, &consoles, next) {
+        QemuGraphicConsole *candidate;
+
+        if (!QEMU_IS_GRAPHIC_CONSOLE(con)) {
+            continue;
+        }
+
+        candidate = QEMU_GRAPHIC_CONSOLE(con);
+        if (candidate->device != c->device) {
+            continue;
+        }
+
+        if (candidate->head != c->head) {
+            return true;
+        }
+    }
+    return false;
+}
+
+static char *
+qemu_graphic_console_get_label(const QemuConsole *con)
+{
+    QemuGraphicConsole *c = QEMU_GRAPHIC_CONSOLE(con);
+
+    if (c->device) {
+        DeviceState *dev;
+        bool multihead;
+
+        dev = DEVICE(c->device);
+        multihead = qemu_graphic_console_is_multihead(c);
+        if (multihead) {
+            return g_strdup_printf("%s.%d", dev->id ?
+                                   dev->id :
+                                   object_get_typename(c->device),
+                                   c->head);
+        } else {
+            return g_strdup(dev->id ? : object_get_typename(c->device));
+        }
+    }
+    return g_strdup("VGA");
+}
+
 static void
 qemu_graphic_console_class_init(ObjectClass *oc, const void *data)
 {
+    QemuConsoleClass *cc = QEMU_CONSOLE_CLASS(oc);
+
     object_class_property_add_link(oc, "device", TYPE_DEVICE,
                                    offsetof(QemuGraphicConsole, device),
                                    object_property_allow_set_link,
@@ -446,6 +495,8 @@ qemu_graphic_console_class_init(ObjectClass *oc, const void *data)
     object_class_property_add(oc, "head", "uint32",
                               qemu_graphic_console_prop_get_head,
                               NULL, NULL, NULL);
+
+    cc->get_label = qemu_graphic_console_get_label;
 }
 
 static void
@@ -1347,56 +1398,12 @@ bool qemu_console_is_gl_blocked(QemuConsole *con)
     return con->gl_block;
 }
 
-static bool qemu_graphic_console_is_multihead(QemuGraphicConsole *c)
-{
-    QemuConsole *con;
-
-    QTAILQ_FOREACH(con, &consoles, next) {
-        QemuGraphicConsole *candidate;
-
-        if (!QEMU_IS_GRAPHIC_CONSOLE(con)) {
-            continue;
-        }
-
-        candidate = QEMU_GRAPHIC_CONSOLE(con);
-        if (candidate->device != c->device) {
-            continue;
-        }
-
-        if (candidate->head != c->head) {
-            return true;
-        }
-    }
-    return false;
-}
-
 char *qemu_console_get_label(QemuConsole *con)
 {
-    if (QEMU_IS_GRAPHIC_CONSOLE(con)) {
-        QemuGraphicConsole *c = QEMU_GRAPHIC_CONSOLE(con);
-        if (c->device) {
-            DeviceState *dev;
-            bool multihead;
-
-            dev = DEVICE(c->device);
-            multihead = qemu_graphic_console_is_multihead(c);
-            if (multihead) {
-                return g_strdup_printf("%s.%d", dev->id ?
-                                       dev->id :
-                                       object_get_typename(c->device),
-                                       c->head);
-            } else {
-                return g_strdup(dev->id ? : object_get_typename(c->device));
-            }
-        }
-        return g_strdup("VGA");
-    } else if (QEMU_IS_TEXT_CONSOLE(con)) {
-        const char *label = qemu_text_console_get_label(QEMU_TEXT_CONSOLE(con));
-        if (label) {
-            return g_strdup(label);
-        }
+    char *label = QEMU_CONSOLE_GET_CLASS(con)->get_label(con);
+    if (label) {
+        return label;
     }
-
     return g_strdup_printf("vc%d", con->index);
 }
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 16/40] ui/console-vc: introduce QemuVT100
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (14 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 15/40] ui/console: dispatch get_label() through QOM virtual method marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 17/40] ui/console-vc: set vt100 associated pixman image marcandre.lureau
                   ` (25 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Start moving VT100 emulation specific code in a different structure.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 399 +++++++++++++++++++++++++-----------------------
 1 file changed, 210 insertions(+), 189 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index ce35abaf402..6cdb5893d32 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -47,9 +47,7 @@ enum TTYState {
     TTY_STATE_OSC,
 };
 
-typedef struct QemuTextConsole {
-    QemuConsole parent;
-
+typedef struct QemuVT100 {
     int width;
     int height;
     int total_height;
@@ -65,7 +63,12 @@ typedef struct QemuTextConsole {
     int update_y0;
     int update_x1;
     int update_y1;
+} QemuVT100;
 
+typedef struct QemuTextConsole {
+    QemuConsole parent;
+
+    QemuVT100 vt;
     Chardev *chr;
     /* fifo for key pressed */
     Fifo8 out_fifo;
@@ -180,37 +183,40 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,
 
 static void invalidate_xy(QemuTextConsole *s, int x, int y)
 {
+    QemuVT100 *vt = &s->vt;
+
     if (!qemu_console_is_visible(QEMU_CONSOLE(s))) {
         return;
     }
-    if (s->update_x0 > x * FONT_WIDTH)
-        s->update_x0 = x * FONT_WIDTH;
-    if (s->update_y0 > y * FONT_HEIGHT)
-        s->update_y0 = y * FONT_HEIGHT;
-    if (s->update_x1 < (x + 1) * FONT_WIDTH)
-        s->update_x1 = (x + 1) * FONT_WIDTH;
-    if (s->update_y1 < (y + 1) * FONT_HEIGHT)
-        s->update_y1 = (y + 1) * FONT_HEIGHT;
+    if (vt->update_x0 > x * FONT_WIDTH)
+        vt->update_x0 = x * FONT_WIDTH;
+    if (vt->update_y0 > y * FONT_HEIGHT)
+        vt->update_y0 = y * FONT_HEIGHT;
+    if (vt->update_x1 < (x + 1) * FONT_WIDTH)
+        vt->update_x1 = (x + 1) * FONT_WIDTH;
+    if (vt->update_y1 < (y + 1) * FONT_HEIGHT)
+        vt->update_y1 = (y + 1) * FONT_HEIGHT;
 }
 
 static void console_show_cursor(QemuTextConsole *s, int show)
 {
+    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int y, y1;
-    int x = s->x;
+    int x = vt->x;
 
-    s->cursor_invalidate = 1;
+    vt->cursor_invalidate = 1;
 
-    if (x >= s->width) {
-        x = s->width - 1;
+    if (x >= vt->width) {
+        x = vt->width - 1;
     }
-    y1 = (s->y_base + s->y) % s->total_height;
-    y = y1 - s->y_displayed;
+    y1 = (vt->y_base + vt->y) % vt->total_height;
+    y = y1 - vt->y_displayed;
     if (y < 0) {
-        y += s->total_height;
+        y += vt->total_height;
     }
-    if (y < s->height) {
-        c = &s->cells[y1 * s->width + x];
+    if (y < vt->height) {
+        c = &vt->cells[y1 * vt->width + x];
         if (show && cursor_visible_phase) {
             TextAttributes t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
@@ -225,27 +231,28 @@ static void console_show_cursor(QemuTextConsole *s, int show)
 static void console_refresh(QemuTextConsole *s)
 {
     DisplaySurface *surface = qemu_console_surface(QEMU_CONSOLE(s));
+    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int x, y, y1;
 
     assert(surface);
-    s->text_x[0] = 0;
-    s->text_y[0] = 0;
-    s->text_x[1] = s->width - 1;
-    s->text_y[1] = s->height - 1;
-    s->cursor_invalidate = 1;
+    vt->text_x[0] = 0;
+    vt->text_y[0] = 0;
+    vt->text_x[1] = vt->width - 1;
+    vt->text_y[1] = vt->height - 1;
+    vt->cursor_invalidate = 1;
 
     qemu_console_fill_rect(QEMU_CONSOLE(s), 0, 0, surface_width(surface), surface_height(surface),
                            color_table_rgb[0][QEMU_COLOR_BLACK]);
-    y1 = s->y_displayed;
-    for (y = 0; y < s->height; y++) {
-        c = s->cells + y1 * s->width;
-        for (x = 0; x < s->width; x++) {
+    y1 = vt->y_displayed;
+    for (y = 0; y < vt->height; y++) {
+        c = vt->cells + y1 * vt->width;
+        for (x = 0; x < vt->width; x++) {
             vga_putcharxy(QEMU_CONSOLE(s), x, y, c->ch,
                           &(c->t_attrib));
             c++;
         }
-        if (++y1 == s->total_height) {
+        if (++y1 == vt->total_height) {
             y1 = 0;
         }
     }
@@ -256,28 +263,29 @@ static void console_refresh(QemuTextConsole *s)
 
 static void console_scroll(QemuTextConsole *s, int ydelta)
 {
+    QemuVT100 *vt = &s->vt;
     int i, y1;
 
     if (ydelta > 0) {
         for(i = 0; i < ydelta; i++) {
-            if (s->y_displayed == s->y_base)
+            if (vt->y_displayed == vt->y_base)
                 break;
-            if (++s->y_displayed == s->total_height)
-                s->y_displayed = 0;
+            if (++vt->y_displayed == vt->total_height)
+                vt->y_displayed = 0;
         }
     } else {
         ydelta = -ydelta;
-        i = s->backscroll_height;
-        if (i > s->total_height - s->height)
-            i = s->total_height - s->height;
-        y1 = s->y_base - i;
+        i = vt->backscroll_height;
+        if (i > vt->total_height - vt->height)
+            i = vt->total_height - vt->height;
+        y1 = vt->y_base - i;
         if (y1 < 0)
-            y1 += s->total_height;
+            y1 += vt->total_height;
         for(i = 0; i < ydelta; i++) {
-            if (s->y_displayed == y1)
+            if (vt->y_displayed == y1)
                 break;
-            if (--s->y_displayed < 0)
-                s->y_displayed = s->total_height - 1;
+            if (--vt->y_displayed < 0)
+                vt->y_displayed = vt->total_height - 1;
         }
     }
     console_refresh(s);
@@ -303,6 +311,7 @@ static void kbd_send_chars(QemuTextConsole *s)
 /* called when an ascii key is pressed */
 void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
 {
+    QemuVT100 *vt = &s->vt;
     uint8_t buf[16], *q;
     int c;
     uint32_t num_free;
@@ -335,13 +344,13 @@ void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
             *q++ = '\033';
             *q++ = '[';
             *q++ = keysym & 0xff;
-        } else if (s->echo && (keysym == '\r' || keysym == '\n')) {
+        } else if (vt->echo && (keysym == '\r' || keysym == '\n')) {
             qemu_chr_write(s->chr, (uint8_t *)"\r", 1, true);
             *q++ = '\n';
         } else {
             *q++ = keysym;
         }
-        if (s->echo) {
+        if (vt->echo) {
             qemu_chr_write(s->chr, buf, q - buf, true);
         }
         num_free = fifo8_num_free(&s->out_fifo);
@@ -354,29 +363,30 @@ void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
 static void text_console_update(void *opaque, console_ch_t *chardata)
 {
     QemuTextConsole *s = QEMU_TEXT_CONSOLE(opaque);
+    QemuVT100 *vt = &s->vt;
     int i, j, src;
 
-    if (s->text_x[0] <= s->text_x[1]) {
-        src = (s->y_base + s->text_y[0]) * s->width;
-        chardata += s->text_y[0] * s->width;
-        for (i = s->text_y[0]; i <= s->text_y[1]; i ++)
-            for (j = 0; j < s->width; j++, src++) {
+    if (vt->text_x[0] <= vt->text_x[1]) {
+        src = (vt->y_base + vt->text_y[0]) * vt->width;
+        chardata += vt->text_y[0] * vt->width;
+        for (i = vt->text_y[0]; i <= vt->text_y[1]; i ++)
+            for (j = 0; j < vt->width; j++, src++) {
                 console_write_ch(chardata ++,
-                                 ATTR2CHTYPE(s->cells[src].ch,
-                                             s->cells[src].t_attrib.fgcol,
-                                             s->cells[src].t_attrib.bgcol,
-                                             s->cells[src].t_attrib.bold));
+                                 ATTR2CHTYPE(vt->cells[src].ch,
+                                             vt->cells[src].t_attrib.fgcol,
+                                             vt->cells[src].t_attrib.bgcol,
+                                             vt->cells[src].t_attrib.bold));
             }
-        dpy_text_update(QEMU_CONSOLE(s), s->text_x[0], s->text_y[0],
-                        s->text_x[1] - s->text_x[0], i - s->text_y[0]);
-        s->text_x[0] = s->width;
-        s->text_y[0] = s->height;
-        s->text_x[1] = 0;
-        s->text_y[1] = 0;
+        dpy_text_update(QEMU_CONSOLE(s), vt->text_x[0], vt->text_y[0],
+                        vt->text_x[1] - vt->text_x[0], i - vt->text_y[0]);
+        vt->text_x[0] = vt->width;
+        vt->text_y[0] = vt->height;
+        vt->text_x[1] = 0;
+        vt->text_y[1] = 0;
     }
-    if (s->cursor_invalidate) {
-        dpy_text_cursor(QEMU_CONSOLE(s), s->x, s->y);
-        s->cursor_invalidate = 0;
+    if (vt->cursor_invalidate) {
+        dpy_text_cursor(QEMU_CONSOLE(s), vt->x, vt->y);
+        vt->cursor_invalidate = 0;
     }
 }
 
@@ -390,76 +400,77 @@ static void text_console_resize(QemuTextConsole *t)
 
     w = surface_width(s->surface) / FONT_WIDTH;
     h = surface_height(s->surface) / FONT_HEIGHT;
-    if (w == t->width && h == t->height) {
+    if (w == t->vt.width && h == t->vt.height) {
         return;
     }
 
-    last_width = t->width;
-    t->width = w;
-    t->height = h;
+    last_width = t->vt.width;
+    t->vt.width = w;
+    t->vt.height = h;
 
-    w1 = MIN(t->width, last_width);
+    w1 = MIN(t->vt.width, last_width);
 
-    cells = g_new(TextCell, t->width * t->total_height + 1);
-    for (y = 0; y < t->total_height; y++) {
-        c = &cells[y * t->width];
+    cells = g_new(TextCell, t->vt.width * t->vt.total_height + 1);
+    for (y = 0; y < t->vt.total_height; y++) {
+        c = &cells[y * t->vt.width];
         if (w1 > 0) {
-            c1 = &t->cells[y * last_width];
+            c1 = &t->vt.cells[y * last_width];
             for (x = 0; x < w1; x++) {
                 *c++ = *c1++;
             }
         }
-        for (x = w1; x < t->width; x++) {
+        for (x = w1; x < t->vt.width; x++) {
             c->ch = ' ';
             c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             c++;
         }
     }
-    g_free(t->cells);
-    t->cells = cells;
+    g_free(t->vt.cells);
+    t->vt.cells = cells;
 }
 
 static void vc_put_lf(VCChardev *vc)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int x, y1;
 
-    s->y++;
-    if (s->y >= s->height) {
-        s->y = s->height - 1;
+    vt->y++;
+    if (vt->y >= vt->height) {
+        vt->y = vt->height - 1;
 
-        if (s->y_displayed == s->y_base) {
-            if (++s->y_displayed == s->total_height)
-                s->y_displayed = 0;
+        if (vt->y_displayed == vt->y_base) {
+            if (++vt->y_displayed == vt->total_height)
+                vt->y_displayed = 0;
         }
-        if (++s->y_base == s->total_height)
-            s->y_base = 0;
-        if (s->backscroll_height < s->total_height)
-            s->backscroll_height++;
-        y1 = (s->y_base + s->height - 1) % s->total_height;
-        c = &s->cells[y1 * s->width];
-        for(x = 0; x < s->width; x++) {
+        if (++vt->y_base == vt->total_height)
+            vt->y_base = 0;
+        if (vt->backscroll_height < vt->total_height)
+            vt->backscroll_height++;
+        y1 = (vt->y_base + vt->height - 1) % vt->total_height;
+        c = &vt->cells[y1 * vt->width];
+        for(x = 0; x < vt->width; x++) {
             c->ch = ' ';
             c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             c++;
         }
-        if (s->y_displayed == s->y_base) {
-            s->text_x[0] = 0;
-            s->text_y[0] = 0;
-            s->text_x[1] = s->width - 1;
-            s->text_y[1] = s->height - 1;
+        if (vt->y_displayed == vt->y_base) {
+            vt->text_x[0] = 0;
+            vt->text_y[0] = 0;
+            vt->text_x[1] = vt->width - 1;
+            vt->text_y[1] = vt->height - 1;
 
             qemu_console_bitblt(QEMU_CONSOLE(s), 0, FONT_HEIGHT, 0, 0,
-                                s->width * FONT_WIDTH,
-                                (s->height - 1) * FONT_HEIGHT);
-            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (s->height - 1) * FONT_HEIGHT,
-                                   s->width * FONT_WIDTH, FONT_HEIGHT,
+                                vt->width * FONT_WIDTH,
+                                (vt->height - 1) * FONT_HEIGHT);
+            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (vt->height - 1) * FONT_HEIGHT,
+                                   vt->width * FONT_WIDTH, FONT_HEIGHT,
                                    color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);
-            s->update_x0 = 0;
-            s->update_y0 = 0;
-            s->update_x1 = s->width * FONT_WIDTH;
-            s->update_y1 = s->height * FONT_HEIGHT;
+            vt->update_x0 = 0;
+            vt->update_y0 = 0;
+            vt->update_x1 = vt->width * FONT_WIDTH;
+            vt->update_y1 = vt->height * FONT_HEIGHT;
         }
     }
 }
@@ -564,24 +575,25 @@ static void vc_handle_escape(VCChardev *vc)
 static void vc_update_xy(VCChardev *vc, int x, int y)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int y1, y2;
 
-    s->text_x[0] = MIN(s->text_x[0], x);
-    s->text_x[1] = MAX(s->text_x[1], x);
-    s->text_y[0] = MIN(s->text_y[0], y);
-    s->text_y[1] = MAX(s->text_y[1], y);
+    vt->text_x[0] = MIN(vt->text_x[0], x);
+    vt->text_x[1] = MAX(vt->text_x[1], x);
+    vt->text_y[0] = MIN(vt->text_y[0], y);
+    vt->text_y[1] = MAX(vt->text_y[1], y);
 
-    y1 = (s->y_base + y) % s->total_height;
-    y2 = y1 - s->y_displayed;
+    y1 = (vt->y_base + y) % vt->total_height;
+    y2 = y1 - vt->y_displayed;
     if (y2 < 0) {
-        y2 += s->total_height;
+        y2 += vt->total_height;
     }
-    if (y2 < s->height) {
-        if (x >= s->width) {
-            x = s->width - 1;
+    if (y2 < vt->height) {
+        if (x >= vt->width) {
+            x = vt->width - 1;
         }
-        c = &s->cells[y1 * s->width + x];
+        c = &vt->cells[y1 * vt->width + x];
         vga_putcharxy(QEMU_CONSOLE(s), x, y2, c->ch,
                       &(c->t_attrib));
         invalidate_xy(s, x, y2);
@@ -591,11 +603,12 @@ static void vc_update_xy(VCChardev *vc, int x, int y)
 static void vc_clear_xy(VCChardev *vc, int x, int y)
 {
     QemuTextConsole *s = vc->console;
-    int y1 = (s->y_base + y) % s->total_height;
-    if (x >= s->width) {
-        x = s->width - 1;
+    QemuVT100 *vt = &s->vt;
+    int y1 = (vt->y_base + y) % vt->total_height;
+    if (x >= vt->width) {
+        x = vt->width - 1;
     }
-    TextCell *c = &s->cells[y1 * s->width + x];
+    TextCell *c = &vt->cells[y1 * vt->width + x];
     c->ch = ' ';
     c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
     vc_update_xy(vc, x, y);
@@ -604,19 +617,20 @@ static void vc_clear_xy(VCChardev *vc, int x, int y)
 static void vc_put_one(VCChardev *vc, int ch)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int y1;
-    if (s->x >= s->width) {
+    if (vt->x >= vt->width) {
         /* line wrap */
-        s->x = 0;
+        vt->x = 0;
         vc_put_lf(vc);
     }
-    y1 = (s->y_base + s->y) % s->total_height;
-    c = &s->cells[y1 * s->width + s->x];
+    y1 = (vt->y_base + vt->y) % vt->total_height;
+    c = &vt->cells[y1 * vt->width + vt->x];
     c->ch = ch;
     c->t_attrib = vc->t_attrib;
-    vc_update_xy(vc, s->x, s->y);
-    s->x++;
+    vc_update_xy(vc, vt->x, vt->y);
+    vt->x++;
 }
 
 static void vc_respond_str(VCChardev *vc, const char *buf)
@@ -630,6 +644,7 @@ static void vc_respond_str(VCChardev *vc, const char *buf)
 static void vc_set_cursor(VCChardev *vc, int x, int y)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
 
     if (x < 0) {
         x = 0;
@@ -637,15 +652,15 @@ static void vc_set_cursor(VCChardev *vc, int x, int y)
     if (y < 0) {
         y = 0;
     }
-    if (y >= s->height) {
-        y = s->height - 1;
+    if (y >= vt->height) {
+        y = vt->height - 1;
     }
-    if (x >= s->width) {
-        x = s->width - 1;
+    if (x >= vt->width) {
+        x = vt->width - 1;
     }
 
-    s->x = x;
-    s->y = y;
+    vt->x = x;
+    vt->y = y;
 }
 
 /**
@@ -657,6 +672,7 @@ static void vc_set_cursor(VCChardev *vc, int x, int y)
 static void vc_csi_P(struct VCChardev *vc, unsigned int nr)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     TextCell *c1, *c2;
     unsigned int x1, x2, y;
     unsigned int end, len;
@@ -664,28 +680,28 @@ static void vc_csi_P(struct VCChardev *vc, unsigned int nr)
     if (!nr) {
         nr = 1;
     }
-    if (nr > s->width - s->x) {
-        nr = s->width - s->x;
+    if (nr > vt->width - vt->x) {
+        nr = vt->width - vt->x;
         if (!nr) {
             return;
         }
     }
 
-    x1 = s->x;
-    x2 = s->x + nr;
-    len = s->width - x2;
+    x1 = vt->x;
+    x2 = vt->x + nr;
+    len = vt->width - x2;
     if (len) {
-        y = (s->y_base + s->y) % s->total_height;
-        c1 = &s->cells[y * s->width + x1];
-        c2 = &s->cells[y * s->width + x2];
+        y = (vt->y_base + vt->y) % vt->total_height;
+        c1 = &vt->cells[y * vt->width + x1];
+        c2 = &vt->cells[y * vt->width + x2];
         memmove(c1, c2, len * sizeof(*c1));
         for (end = x1 + len; x1 < end; x1++) {
-            vc_update_xy(vc, x1, s->y);
+            vc_update_xy(vc, x1, vt->y);
         }
     }
     /* Clear the rest */
-    for (; x1 < s->width; x1++) {
-        vc_clear_xy(vc, x1, s->y);
+    for (; x1 < vt->width; x1++) {
+        vc_clear_xy(vc, x1, vt->y);
     }
 }
 
@@ -698,6 +714,7 @@ static void vc_csi_P(struct VCChardev *vc, unsigned int nr)
 static void vc_csi_at(struct VCChardev *vc, unsigned int nr)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     TextCell *c1, *c2;
     unsigned int x1, x2, y;
     unsigned int end, len;
@@ -705,28 +722,28 @@ static void vc_csi_at(struct VCChardev *vc, unsigned int nr)
     if (!nr) {
         nr = 1;
     }
-    if (nr > s->width - s->x) {
-        nr = s->width - s->x;
+    if (nr > vt->width - vt->x) {
+        nr = vt->width - vt->x;
         if (!nr) {
             return;
         }
     }
 
-    x1 = s->x + nr;
-    x2 = s->x;
-    len = s->width - x1;
+    x1 = vt->x + nr;
+    x2 = vt->x;
+    len = vt->width - x1;
     if (len) {
-        y = (s->y_base + s->y) % s->total_height;
-        c1 = &s->cells[y * s->width + x1];
-        c2 = &s->cells[y * s->width + x2];
+        y = (vt->y_base + vt->y) % vt->total_height;
+        c1 = &vt->cells[y * vt->width + x1];
+        c2 = &vt->cells[y * vt->width + x2];
         memmove(c1, c2, len * sizeof(*c1));
         for (end = x1 + len; x1 < end; x1++) {
-            vc_update_xy(vc, x1, s->y);
+            vc_update_xy(vc, x1, vt->y);
         }
     }
     /* Insert blanks */
-    for (x1 = s->x; x1 < s->x + nr; x1++) {
-        vc_clear_xy(vc, x1, s->y);
+    for (x1 = vt->x; x1 < vt->x + nr; x1++) {
+        vc_clear_xy(vc, x1, vt->y);
     }
 }
 
@@ -736,9 +753,10 @@ static void vc_csi_at(struct VCChardev *vc, unsigned int nr)
 static void vc_save_cursor(VCChardev *vc)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
 
-    vc->x_saved = s->x;
-    vc->y_saved = s->y;
+    vc->x_saved = vt->x;
+    vc->y_saved = vt->y;
     vc->t_attrib_saved = vc->t_attrib;
 }
 
@@ -749,15 +767,17 @@ static void vc_save_cursor(VCChardev *vc)
 static void vc_restore_cursor(VCChardev *vc)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
 
-    s->x = vc->x_saved;
-    s->y = vc->y_saved;
+    vt->x = vc->x_saved;
+    vt->y = vc->y_saved;
     vc->t_attrib = vc->t_attrib_saved;
 }
 
 static void vc_putchar(VCChardev *vc, int ch)
 {
     QemuTextConsole *s = vc->console;
+    QemuVT100 *vt = &s->vt;
     int i;
     int x, y;
     g_autofree char *response = NULL;
@@ -766,21 +786,21 @@ static void vc_putchar(VCChardev *vc, int ch)
     case TTY_STATE_NORM:
         switch(ch) {
         case '\r':  /* carriage return */
-            s->x = 0;
+            vt->x = 0;
             break;
         case '\n':  /* newline */
             vc_put_lf(vc);
             break;
         case '\b':  /* backspace */
-            if (s->x > 0)
-                s->x--;
+            if (vt->x > 0)
+                vt->x--;
             break;
         case '\t':  /* tabspace */
-            if (s->x + (8 - (s->x % 8)) > s->width) {
-                s->x = 0;
+            if (vt->x + (8 - (vt->x % 8)) > vt->width) {
+                vt->x = 0;
                 vc_put_lf(vc);
             } else {
-                s->x = s->x + (8 - (s->x % 8));
+                vt->x = vt->x + (8 - (vt->x % 8));
             }
             break;
         case '\a':  /* alert aka. bell */
@@ -848,32 +868,32 @@ static void vc_putchar(VCChardev *vc, int ch)
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x, s->y - vc->esc_params[0]);
+                vc_set_cursor(vc, vt->x, vt->y - vc->esc_params[0]);
                 break;
             case 'B':
                 /* move cursor down */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x, s->y + vc->esc_params[0]);
+                vc_set_cursor(vc, vt->x, vt->y + vc->esc_params[0]);
                 break;
             case 'C':
                 /* move cursor right */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x + vc->esc_params[0], s->y);
+                vc_set_cursor(vc, vt->x + vc->esc_params[0], vt->y);
                 break;
             case 'D':
                 /* move cursor left */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x - vc->esc_params[0], s->y);
+                vc_set_cursor(vc, vt->x - vc->esc_params[0], vt->y);
                 break;
             case 'G':
                 /* move cursor to column */
-                vc_set_cursor(vc, vc->esc_params[0] - 1, s->y);
+                vc_set_cursor(vc, vc->esc_params[0] - 1, vt->y);
                 break;
             case 'f':
             case 'H':
@@ -884,9 +904,9 @@ static void vc_putchar(VCChardev *vc, int ch)
                 switch (vc->esc_params[0]) {
                 case 0:
                     /* clear to end of screen */
-                    for (y = s->y; y < s->height; y++) {
-                        for (x = 0; x < s->width; x++) {
-                            if (y == s->y && x < s->x) {
+                    for (y = vt->y; y < vt->height; y++) {
+                        for (x = 0; x < vt->width; x++) {
+                            if (y == vt->y && x < vt->x) {
                                 continue;
                             }
                             vc_clear_xy(vc, x, y);
@@ -895,9 +915,9 @@ static void vc_putchar(VCChardev *vc, int ch)
                     break;
                 case 1:
                     /* clear from beginning of screen */
-                    for (y = 0; y <= s->y; y++) {
-                        for (x = 0; x < s->width; x++) {
-                            if (y == s->y && x > s->x) {
+                    for (y = 0; y <= vt->y; y++) {
+                        for (x = 0; x < vt->width; x++) {
+                            if (y == vt->y && x > vt->x) {
                                 break;
                             }
                             vc_clear_xy(vc, x, y);
@@ -906,8 +926,8 @@ static void vc_putchar(VCChardev *vc, int ch)
                     break;
                 case 2:
                     /* clear entire screen */
-                    for (y = 0; y < s->height; y++) {
-                        for (x = 0; x < s->width; x++) {
+                    for (y = 0; y < vt->height; y++) {
+                        for (x = 0; x < vt->width; x++) {
                             vc_clear_xy(vc, x, y);
                         }
                     }
@@ -918,20 +938,20 @@ static void vc_putchar(VCChardev *vc, int ch)
                 switch (vc->esc_params[0]) {
                 case 0:
                     /* clear to eol */
-                    for(x = s->x; x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for(x = vt->x; x < vt->width; x++) {
+                        vc_clear_xy(vc, x, vt->y);
                     }
                     break;
                 case 1:
                     /* clear from beginning of line */
-                    for (x = 0; x <= s->x && x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for (x = 0; x <= vt->x && x < vt->width; x++) {
+                        vc_clear_xy(vc, x, vt->y);
                     }
                     break;
                 case 2:
                     /* clear entire line */
-                    for(x = 0; x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for(x = 0; x < vt->width; x++) {
+                        vc_clear_xy(vc, x, vt->y);
                     }
                     break;
                 }
@@ -951,7 +971,7 @@ static void vc_putchar(VCChardev *vc, int ch)
                 case 6:
                     /* report cursor position */
                     response = g_strdup_printf("\033[%d;%dR",
-                                               s->y + 1, s->x + 1);
+                                               vt->y + 1, vt->x + 1);
                     vc_respond_str(vc, response);
                     break;
                 }
@@ -1002,21 +1022,22 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len)
 {
     VCChardev *drv = VC_CHARDEV(chr);
     QemuTextConsole *s = drv->console;
+    QemuVT100 *vt = &s->vt;
     int i;
 
-    s->update_x0 = s->width * FONT_WIDTH;
-    s->update_y0 = s->height * FONT_HEIGHT;
-    s->update_x1 = 0;
-    s->update_y1 = 0;
+    vt->update_x0 = vt->width * FONT_WIDTH;
+    vt->update_y0 = vt->height * FONT_HEIGHT;
+    vt->update_x1 = 0;
+    vt->update_y1 = 0;
     console_show_cursor(s, 0);
     for(i = 0; i < len; i++) {
         vc_putchar(drv, buf[i]);
     }
     console_show_cursor(s, 1);
-    if (s->update_x0 < s->update_x1) {
-        dpy_gfx_update(QEMU_CONSOLE(s), s->update_x0, s->update_y0,
-                       s->update_x1 - s->update_x0,
-                       s->update_y1 - s->update_y0);
+    if (vt->update_x0 < vt->update_x1) {
+        dpy_gfx_update(QEMU_CONSOLE(s), vt->update_x0, vt->update_y0,
+                       vt->update_x1 - vt->update_x0,
+                       vt->update_y1 - vt->update_y0);
     }
     return len;
 }
@@ -1075,7 +1096,7 @@ qemu_text_console_init(Object *obj)
     QemuTextConsole *c = QEMU_TEXT_CONSOLE(obj);
 
     fifo8_create(&c->out_fifo, 16);
-    c->total_height = DEFAULT_BACKSCROLL;
+    c->vt.total_height = DEFAULT_BACKSCROLL;
     QEMU_CONSOLE(c)->hw_ops = &text_console_ops;
     QEMU_CONSOLE(c)->hw = c;
 }
@@ -1106,12 +1127,12 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
 {
     VCChardev *drv = VC_CHARDEV(chr);
 
-    drv->console->echo = echo;
+    drv->console->vt.echo = echo;
 }
 
 void qemu_text_console_update_size(QemuTextConsole *c)
 {
-    dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);
+    dpy_text_resize(QEMU_CONSOLE(c), c->vt.width, c->vt.height);
 }
 
 static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 17/40] ui/console-vc: set vt100 associated pixman image
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (15 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 16/40] ui/console-vc: introduce QemuVT100 marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 18/40] ui/console-vc: vga_putcharxy()->vt100_putcharxy() marcandre.lureau
                   ` (24 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Start removing dependency on DisplaySurface for vt100 handling.

Note that before, the rendering is done on the current DisplaySurface.
It's not obvious the QemuTextConsole associated surface isn't changed
over time, in particular if it was doing resize. But
qemu_console_resize() is only implemented for QemuGraphicConsole.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 54 +++++++++++++++++++++++--------------------------
 1 file changed, 25 insertions(+), 29 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 6cdb5893d32..272240712ad 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -48,6 +48,8 @@ enum TTYState {
 };
 
 typedef struct QemuVT100 {
+    pixman_image_t *image;
+
     int width;
     int height;
     int total_height;
@@ -133,28 +135,22 @@ qemu_text_console_get_label(const QemuConsole *c)
     return tc->chr ? g_strdup(tc->chr->label) : NULL;
 }
 
-static void qemu_console_fill_rect(QemuConsole *con, int posx, int posy,
-                                   int width, int height, pixman_color_t color)
+static void image_fill_rect(pixman_image_t *image, int posx, int posy,
+                            int width, int height, pixman_color_t color)
 {
-    DisplaySurface *surface = qemu_console_surface(con);
     pixman_rectangle16_t rect = {
         .x = posx, .y = posy, .width = width, .height = height
     };
 
-    assert(surface);
-    pixman_image_fill_rectangles(PIXMAN_OP_SRC, surface->image,
-                                 &color, 1, &rect);
+    pixman_image_fill_rectangles(PIXMAN_OP_SRC, image, &color, 1, &rect);
 }
 
 /* copy from (xs, ys) to (xd, yd) a rectangle of size (w, h) */
-static void qemu_console_bitblt(QemuConsole *con,
-                                int xs, int ys, int xd, int yd, int w, int h)
+static void image_bitblt(pixman_image_t *image,
+                         int xs, int ys, int xd, int yd, int w, int h)
 {
-    DisplaySurface *surface = qemu_console_surface(con);
-
-    assert(surface);
     pixman_image_composite(PIXMAN_OP_SRC,
-                           surface->image, NULL, surface->image,
+                           image, NULL, image,
                            xs, ys, 0, 0, xd, yd, w, h);
 }
 
@@ -162,10 +158,10 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,
                           TextAttributes *t_attrib)
 {
     static pixman_image_t *glyphs[256];
-    DisplaySurface *surface = qemu_console_surface(s);
+    pixman_image_t *image = QEMU_TEXT_CONSOLE(s)->vt.image;
     pixman_color_t fgcol, bgcol;
 
-    assert(surface);
+    assert(image);
     if (t_attrib->invers) {
         bgcol = color_table_rgb[t_attrib->bold][t_attrib->fgcol];
         fgcol = color_table_rgb[t_attrib->bold][t_attrib->bgcol];
@@ -177,7 +173,7 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,
     if (!glyphs[ch]) {
         glyphs[ch] = qemu_pixman_glyph_from_vgafont(FONT_HEIGHT, vgafont16, ch);
     }
-    qemu_pixman_glyph_render(glyphs[ch], surface->image,
+    qemu_pixman_glyph_render(glyphs[ch], image,
                              &fgcol, &bgcol, x, y, FONT_WIDTH, FONT_HEIGHT);
 }
 
@@ -230,20 +226,20 @@ static void console_show_cursor(QemuTextConsole *s, int show)
 
 static void console_refresh(QemuTextConsole *s)
 {
-    DisplaySurface *surface = qemu_console_surface(QEMU_CONSOLE(s));
     QemuVT100 *vt = &s->vt;
     TextCell *c;
     int x, y, y1;
+    int w = pixman_image_get_width(vt->image);
+    int h = pixman_image_get_height(vt->image);
 
-    assert(surface);
     vt->text_x[0] = 0;
     vt->text_y[0] = 0;
     vt->text_x[1] = vt->width - 1;
     vt->text_y[1] = vt->height - 1;
     vt->cursor_invalidate = 1;
 
-    qemu_console_fill_rect(QEMU_CONSOLE(s), 0, 0, surface_width(surface), surface_height(surface),
-                           color_table_rgb[0][QEMU_COLOR_BLACK]);
+    image_fill_rect(vt->image, 0, 0, w, h,
+                    color_table_rgb[0][QEMU_COLOR_BLACK]);
     y1 = vt->y_displayed;
     for (y = 0; y < vt->height; y++) {
         c = vt->cells + y1 * vt->width;
@@ -257,8 +253,7 @@ static void console_refresh(QemuTextConsole *s)
         }
     }
     console_show_cursor(s, 1);
-    dpy_gfx_update(QEMU_CONSOLE(s), 0, 0,
-                   surface_width(surface), surface_height(surface));
+    dpy_gfx_update(QEMU_CONSOLE(s), 0, 0, w, h);
 }
 
 static void console_scroll(QemuTextConsole *s, int ydelta)
@@ -398,8 +393,9 @@ static void text_console_resize(QemuTextConsole *t)
 
     assert(s->scanout.kind == SCANOUT_SURFACE);
 
-    w = surface_width(s->surface) / FONT_WIDTH;
-    h = surface_height(s->surface) / FONT_HEIGHT;
+    t->vt.image = s->surface->image;
+    w = pixman_image_get_width(t->vt.image) / FONT_WIDTH;
+    h = pixman_image_get_height(t->vt.image) / FONT_HEIGHT;
     if (w == t->vt.width && h == t->vt.height) {
         return;
     }
@@ -461,12 +457,12 @@ static void vc_put_lf(VCChardev *vc)
             vt->text_x[1] = vt->width - 1;
             vt->text_y[1] = vt->height - 1;
 
-            qemu_console_bitblt(QEMU_CONSOLE(s), 0, FONT_HEIGHT, 0, 0,
-                                vt->width * FONT_WIDTH,
-                                (vt->height - 1) * FONT_HEIGHT);
-            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (vt->height - 1) * FONT_HEIGHT,
-                                   vt->width * FONT_WIDTH, FONT_HEIGHT,
-                                   color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);
+            image_bitblt(vt->image, 0, FONT_HEIGHT, 0, 0,
+                         vt->width * FONT_WIDTH,
+                         (vt->height - 1) * FONT_HEIGHT);
+            image_fill_rect(vt->image, 0, (vt->height - 1) * FONT_HEIGHT,
+                            vt->width * FONT_WIDTH, FONT_HEIGHT,
+                            color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);
             vt->update_x0 = 0;
             vt->update_y0 = 0;
             vt->update_x1 = vt->width * FONT_WIDTH;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 18/40] ui/console-vc: vga_putcharxy()->vt100_putcharxy()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (16 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 17/40] ui/console-vc: set vt100 associated pixman image marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 19/40] ui/console-vc: make invalidate_xy() take vt100 marcandre.lureau
                   ` (23 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Have the character rendering function operate on QemuVT100 directly
instead of taking a QemuConsole and extracting the VT100 state
internally. This decouples glyph rendering from the console object,
continuing the QemuVT100 abstraction introduced in the previous commits.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 272240712ad..3d73bdf2982 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -154,14 +154,13 @@ static void image_bitblt(pixman_image_t *image,
                            xs, ys, 0, 0, xd, yd, w, h);
 }
 
-static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,
-                          TextAttributes *t_attrib)
+static void vt100_putcharxy(QemuVT100 *vt, int x, int y, int ch,
+                            TextAttributes *t_attrib)
 {
     static pixman_image_t *glyphs[256];
-    pixman_image_t *image = QEMU_TEXT_CONSOLE(s)->vt.image;
     pixman_color_t fgcol, bgcol;
 
-    assert(image);
+    assert(vt->image);
     if (t_attrib->invers) {
         bgcol = color_table_rgb[t_attrib->bold][t_attrib->fgcol];
         fgcol = color_table_rgb[t_attrib->bold][t_attrib->bgcol];
@@ -173,7 +172,7 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,
     if (!glyphs[ch]) {
         glyphs[ch] = qemu_pixman_glyph_from_vgafont(FONT_HEIGHT, vgafont16, ch);
     }
-    qemu_pixman_glyph_render(glyphs[ch], image,
+    qemu_pixman_glyph_render(glyphs[ch], vt->image,
                              &fgcol, &bgcol, x, y, FONT_WIDTH, FONT_HEIGHT);
 }
 
@@ -216,9 +215,9 @@ static void console_show_cursor(QemuTextConsole *s, int show)
         if (show && cursor_visible_phase) {
             TextAttributes t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
-            vga_putcharxy(QEMU_CONSOLE(s), x, y, c->ch, &t_attrib);
+            vt100_putcharxy(&s->vt, x, y, c->ch, &t_attrib);
         } else {
-            vga_putcharxy(QEMU_CONSOLE(s), x, y, c->ch, &(c->t_attrib));
+            vt100_putcharxy(&s->vt, x, y, c->ch, &(c->t_attrib));
         }
         invalidate_xy(s, x, y);
     }
@@ -244,7 +243,7 @@ static void console_refresh(QemuTextConsole *s)
     for (y = 0; y < vt->height; y++) {
         c = vt->cells + y1 * vt->width;
         for (x = 0; x < vt->width; x++) {
-            vga_putcharxy(QEMU_CONSOLE(s), x, y, c->ch,
+            vt100_putcharxy(vt, x, y, c->ch,
                           &(c->t_attrib));
             c++;
         }
@@ -590,7 +589,7 @@ static void vc_update_xy(VCChardev *vc, int x, int y)
             x = vt->width - 1;
         }
         c = &vt->cells[y1 * vt->width + x];
-        vga_putcharxy(QEMU_CONSOLE(s), x, y2, c->ch,
+        vt100_putcharxy(vt, x, y2, c->ch,
                       &(c->t_attrib));
         invalidate_xy(s, x, y2);
     }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 19/40] ui/console-vc: make invalidate_xy() take vt100
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (17 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 18/40] ui/console-vc: vga_putcharxy()->vt100_putcharxy() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 20/40] ui/console-vc: make show_cursor() " marcandre.lureau
                   ` (22 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This decouples glyph rendering from the console object, continuing the
QemuVT100 abstraction introduced in the previous commits.

Style fixes.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 3d73bdf2982..34d9101679a 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -176,21 +176,20 @@ static void vt100_putcharxy(QemuVT100 *vt, int x, int y, int ch,
                              &fgcol, &bgcol, x, y, FONT_WIDTH, FONT_HEIGHT);
 }
 
-static void invalidate_xy(QemuTextConsole *s, int x, int y)
+static void vt100_invalidate_xy(QemuVT100 *vt, int x, int y)
 {
-    QemuVT100 *vt = &s->vt;
-
-    if (!qemu_console_is_visible(QEMU_CONSOLE(s))) {
-        return;
-    }
-    if (vt->update_x0 > x * FONT_WIDTH)
+    if (vt->update_x0 > x * FONT_WIDTH) {
         vt->update_x0 = x * FONT_WIDTH;
-    if (vt->update_y0 > y * FONT_HEIGHT)
+    }
+    if (vt->update_y0 > y * FONT_HEIGHT) {
         vt->update_y0 = y * FONT_HEIGHT;
-    if (vt->update_x1 < (x + 1) * FONT_WIDTH)
+    }
+    if (vt->update_x1 < (x + 1) * FONT_WIDTH) {
         vt->update_x1 = (x + 1) * FONT_WIDTH;
-    if (vt->update_y1 < (y + 1) * FONT_HEIGHT)
+    }
+    if (vt->update_y1 < (y + 1) * FONT_HEIGHT) {
         vt->update_y1 = (y + 1) * FONT_HEIGHT;
+    }
 }
 
 static void console_show_cursor(QemuTextConsole *s, int show)
@@ -219,7 +218,7 @@ static void console_show_cursor(QemuTextConsole *s, int show)
         } else {
             vt100_putcharxy(&s->vt, x, y, c->ch, &(c->t_attrib));
         }
-        invalidate_xy(s, x, y);
+        vt100_invalidate_xy(&s->vt, x, y);
     }
 }
 
@@ -591,7 +590,7 @@ static void vc_update_xy(VCChardev *vc, int x, int y)
         c = &vt->cells[y1 * vt->width + x];
         vt100_putcharxy(vt, x, y2, c->ch,
                       &(c->t_attrib));
-        invalidate_xy(s, x, y2);
+        vt100_invalidate_xy(&s->vt, x, y2);
     }
 }
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 20/40] ui/console-vc: make show_cursor() take vt100
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (18 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 19/40] ui/console-vc: make invalidate_xy() take vt100 marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 21/40] ui/console-vc: decouple VT100 display updates via function pointer marcandre.lureau
                   ` (21 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Decouples glyph rendering from the console object,
continuing the QemuVT100 abstraction introduced in the previous commits.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 34d9101679a..fb1c8866a03 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -192,9 +192,8 @@ static void vt100_invalidate_xy(QemuVT100 *vt, int x, int y)
     }
 }
 
-static void console_show_cursor(QemuTextConsole *s, int show)
+static void vt100_show_cursor(QemuVT100 *vt, int show)
 {
-    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int y, y1;
     int x = vt->x;
@@ -214,11 +213,11 @@ static void console_show_cursor(QemuTextConsole *s, int show)
         if (show && cursor_visible_phase) {
             TextAttributes t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
-            vt100_putcharxy(&s->vt, x, y, c->ch, &t_attrib);
+            vt100_putcharxy(vt, x, y, c->ch, &t_attrib);
         } else {
-            vt100_putcharxy(&s->vt, x, y, c->ch, &(c->t_attrib));
+            vt100_putcharxy(vt, x, y, c->ch, &(c->t_attrib));
         }
-        vt100_invalidate_xy(&s->vt, x, y);
+        vt100_invalidate_xy(vt, x, y);
     }
 }
 
@@ -250,7 +249,7 @@ static void console_refresh(QemuTextConsole *s)
             y1 = 0;
         }
     }
-    console_show_cursor(s, 1);
+    vt100_show_cursor(&s->vt, 1);
     dpy_gfx_update(QEMU_CONSOLE(s), 0, 0, w, h);
 }
 
@@ -1023,11 +1022,11 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len)
     vt->update_y0 = vt->height * FONT_HEIGHT;
     vt->update_x1 = 0;
     vt->update_y1 = 0;
-    console_show_cursor(s, 0);
+    vt100_show_cursor(vt, 0);
     for(i = 0; i < len; i++) {
         vc_putchar(drv, buf[i]);
     }
-    console_show_cursor(s, 1);
+    vt100_show_cursor(vt, 1);
     if (vt->update_x0 < vt->update_x1) {
         dpy_gfx_update(QEMU_CONSOLE(s), vt->update_x0, vt->update_y0,
                        vt->update_x1 - vt->update_x0,
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 21/40] ui/console-vc: decouple VT100 display updates via function pointer
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (19 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 20/40] ui/console-vc: make show_cursor() " marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 22/40] ui/console-vc: console_refresh() -> vt100_refresh() marcandre.lureau
                   ` (20 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Replace direct dpy_gfx_update() calls from the VT100 emulation code
with an indirect call through a new image_update function pointer in
QemuVT100. This decouples the VT100 terminal emulation from the
QEMU display layer, allowing different backends to provide their own
image update implementation.

The QemuVT100 typedef is changed to a forward-declared struct so the
function pointer signature can reference QemuVT100 itself.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index fb1c8866a03..bc8462f979e 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -47,8 +47,11 @@ enum TTYState {
     TTY_STATE_OSC,
 };
 
-typedef struct QemuVT100 {
+typedef struct QemuVT100 QemuVT100;
+
+struct QemuVT100 {
     pixman_image_t *image;
+    void (*image_update)(QemuVT100 *vt, int x, int y, int width, int height);
 
     int width;
     int height;
@@ -65,7 +68,7 @@ typedef struct QemuVT100 {
     int update_y0;
     int update_x1;
     int update_y1;
-} QemuVT100;
+};
 
 typedef struct QemuTextConsole {
     QemuConsole parent;
@@ -221,6 +224,11 @@ static void vt100_show_cursor(QemuVT100 *vt, int show)
     }
 }
 
+static void vt100_image_update(QemuVT100 *vt, int x, int y, int width, int height)
+{
+    vt->image_update(vt, x, y, width, height);
+}
+
 static void console_refresh(QemuTextConsole *s)
 {
     QemuVT100 *vt = &s->vt;
@@ -250,7 +258,7 @@ static void console_refresh(QemuTextConsole *s)
         }
     }
     vt100_show_cursor(&s->vt, 1);
-    dpy_gfx_update(QEMU_CONSOLE(s), 0, 0, w, h);
+    vt100_image_update(&s->vt, 0, 0, w, h);
 }
 
 static void console_scroll(QemuTextConsole *s, int ydelta)
@@ -1028,9 +1036,9 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len)
     }
     vt100_show_cursor(vt, 1);
     if (vt->update_x0 < vt->update_x1) {
-        dpy_gfx_update(QEMU_CONSOLE(s), vt->update_x0, vt->update_y0,
-                       vt->update_x1 - vt->update_x0,
-                       vt->update_y1 - vt->update_y0);
+        vt100_image_update(vt, vt->update_x0, vt->update_y0,
+                           vt->update_x1 - vt->update_x0,
+                           vt->update_y1 - vt->update_y0);
     }
     return len;
 }
@@ -1128,6 +1136,13 @@ void qemu_text_console_update_size(QemuTextConsole *c)
     dpy_text_resize(QEMU_CONSOLE(c), c->vt.width, c->vt.height);
 }
 
+static void text_console_image_update(QemuVT100 *vt, int x, int y, int width, int height)
+{
+    QemuTextConsole *console = container_of(vt, QemuTextConsole, vt);
+
+    dpy_gfx_update(QEMU_CONSOLE(console), x, y, width, height);
+}
+
 static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)
 {
     ChardevVC *vc = backend->u.vc.data;
@@ -1158,6 +1173,7 @@ static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)
     }
 
     dpy_gfx_replace_surface(QEMU_CONSOLE(s), qemu_create_displaysurface(width, height));
+    s->vt.image_update = text_console_image_update;
 
     s->chr = chr;
     drv->console = s;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 22/40] ui/console-vc: console_refresh() -> vt100_refresh()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (20 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 21/40] ui/console-vc: decouple VT100 display updates via function pointer marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 23/40] ui/console-vc: move cursor blinking logic into VT100 layer marcandre.lureau
                   ` (19 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This decouples glyph rendering from the console object, continuing the
QemuVT100 abstraction introduced in the previous commits.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index bc8462f979e..fca04fe57df 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -229,9 +229,8 @@ static void vt100_image_update(QemuVT100 *vt, int x, int y, int width, int heigh
     vt->image_update(vt, x, y, width, height);
 }
 
-static void console_refresh(QemuTextConsole *s)
+static void vt100_refresh(QemuVT100 *vt)
 {
-    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int x, y, y1;
     int w = pixman_image_get_width(vt->image);
@@ -257,8 +256,8 @@ static void console_refresh(QemuTextConsole *s)
             y1 = 0;
         }
     }
-    vt100_show_cursor(&s->vt, 1);
-    vt100_image_update(&s->vt, 0, 0, w, h);
+    vt100_show_cursor(vt, 1);
+    vt100_image_update(vt, 0, 0, w, h);
 }
 
 static void console_scroll(QemuTextConsole *s, int ydelta)
@@ -288,7 +287,7 @@ static void console_scroll(QemuTextConsole *s, int ydelta)
                 vt->y_displayed = vt->total_height - 1;
         }
     }
-    console_refresh(s);
+    vt100_refresh(&s->vt);
 }
 
 static void kbd_send_chars(QemuTextConsole *s)
@@ -1066,7 +1065,7 @@ static void text_console_invalidate(void *opaque)
     if (!QEMU_IS_FIXED_TEXT_CONSOLE(s)) {
         text_console_resize(QEMU_TEXT_CONSOLE(s));
     }
-    console_refresh(s);
+    vt100_refresh(&s->vt);
 }
 
 static void
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 23/40] ui/console-vc: move cursor blinking logic into VT100 layer
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (21 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 22/40] ui/console-vc: console_refresh() -> vt100_refresh() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 24/40] ui/console-vc: console_scroll() -> vt100_scroll() marcandre.lureau
                   ` (18 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Maintain a list of QemuVT100 instances so the cursor timer can directly
iterate over them and call vt100_refresh(), instead of going through
qemu_invalidate_text_consoles() which iterated over all consoles
(including graphic ones) and called back into the generic display layer.

This removes the qemu_invalidate_text_consoles() function from
console.c, further decoupling VT100 text rendering from the console
core.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/console.h  |  1 -
 ui/console-priv.h     |  2 +-
 ui/console-vc-stubs.c |  2 +-
 ui/console-vc.c       | 28 +++++++++++++++++++++++-----
 ui/console.c          | 19 +------------------
 5 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/include/ui/console.h b/include/ui/console.h
index 788ff103ada..e2e5ff76ec1 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -416,7 +416,6 @@ void qemu_console_set_window_id(QemuConsole *con, int window_id);
 void qemu_console_resize(QemuConsole *con, int width, int height);
 DisplaySurface *qemu_console_surface(QemuConsole *con);
 void coroutine_fn qemu_console_co_wait_update(QemuConsole *con);
-int qemu_invalidate_text_consoles(void);
 
 /* console-gl.c */
 #ifdef CONFIG_OPENGL
diff --git a/ui/console-priv.h b/ui/console-priv.h
index 2c2cfd99570..8bcdb79d914 100644
--- a/ui/console-priv.h
+++ b/ui/console-priv.h
@@ -36,7 +36,7 @@ struct QemuConsole {
 };
 
 void qemu_text_console_update_size(QemuTextConsole *c);
-void qemu_text_console_update_cursor(void);
+void vt100_update_cursor(void);
 void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym);
 
 #endif
diff --git a/ui/console-vc-stubs.c b/ui/console-vc-stubs.c
index 8a7f19c1f44..d911a82f263 100644
--- a/ui/console-vc-stubs.c
+++ b/ui/console-vc-stubs.c
@@ -14,7 +14,7 @@ void qemu_text_console_update_size(QemuTextConsole *c)
 {
 }
 
-void qemu_text_console_update_cursor(void)
+void vt100_update_cursor(void)
 {
 }
 
diff --git a/ui/console-vc.c b/ui/console-vc.c
index fca04fe57df..931693a7b0c 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -8,6 +8,7 @@
 #include "qapi/error.h"
 #include "qemu/fifo8.h"
 #include "qemu/option.h"
+#include "qemu/queue.h"
 #include "ui/console.h"
 
 #include "trace.h"
@@ -68,8 +69,13 @@ struct QemuVT100 {
     int update_y0;
     int update_x1;
     int update_y1;
+
+    QTAILQ_ENTRY(QemuVT100) list;
 };
 
+static QTAILQ_HEAD(QemuVT100Head, QemuVT100) vt100s =
+    QTAILQ_HEAD_INITIALIZER(vt100s);
+
 typedef struct QemuTextConsole {
     QemuConsole parent;
 
@@ -1042,20 +1048,28 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len)
     return len;
 }
 
-void qemu_text_console_update_cursor(void)
+void vt100_update_cursor(void)
 {
+    QemuVT100 *vt;
+
     cursor_visible_phase = !cursor_visible_phase;
 
-    if (qemu_invalidate_text_consoles()) {
-        timer_mod(cursor_timer,
-                  qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + CONSOLE_CURSOR_PERIOD / 2);
+    if (QTAILQ_EMPTY(&vt100s)) {
+        return;
+    }
+
+    QTAILQ_FOREACH(vt, &vt100s, list) {
+        vt100_refresh(vt);
     }
+
+    timer_mod(cursor_timer,
+        qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + CONSOLE_CURSOR_PERIOD / 2);
 }
 
 static void
 cursor_timer_cb(void *opaque)
 {
-    qemu_text_console_update_cursor();
+    vt100_update_cursor();
 }
 
 static void text_console_invalidate(void *opaque)
@@ -1071,6 +1085,9 @@ static void text_console_invalidate(void *opaque)
 static void
 qemu_text_console_finalize(Object *obj)
 {
+    QemuTextConsole *s = QEMU_TEXT_CONSOLE(obj);
+
+    QTAILQ_REMOVE(&vt100s, &s->vt, list);
 }
 
 static void
@@ -1095,6 +1112,7 @@ qemu_text_console_init(Object *obj)
 {
     QemuTextConsole *c = QEMU_TEXT_CONSOLE(obj);
 
+    QTAILQ_INSERT_HEAD(&vt100s, &c->vt, list);
     fifo8_create(&c->out_fifo, 16);
     c->vt.total_height = DEFAULT_BACKSCROLL;
     QEMU_CONSOLE(c)->hw_ops = &text_console_ops;
diff --git a/ui/console.c b/ui/console.c
index beaef4ad8b8..a7bd22515b9 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -752,7 +752,7 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
     } else if (QEMU_IS_TEXT_CONSOLE(dcl->con)) {
         qemu_text_console_update_size(QEMU_TEXT_CONSOLE(dcl->con));
     }
-    qemu_text_console_update_cursor();
+    vt100_update_cursor();
 }
 
 void update_displaychangelistener(DisplayChangeListener *dcl,
@@ -1457,23 +1457,6 @@ int qemu_console_get_height(QemuConsole *con, int fallback)
     }
 }
 
-int qemu_invalidate_text_consoles(void)
-{
-    QemuConsole *s;
-    int count = 0;
-
-    QTAILQ_FOREACH(s, &consoles, next) {
-        if (qemu_console_is_graphic(s) ||
-            !qemu_console_is_visible(s)) {
-            continue;
-        }
-        count++;
-        graphic_hw_invalidate(s);
-    }
-
-    return count;
-}
-
 void qemu_console_resize(QemuConsole *s, int width, int height)
 {
     DisplaySurface *surface = qemu_console_surface(s);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 24/40] ui/console-vc: console_scroll() -> vt100_scroll()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (22 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 23/40] ui/console-vc: move cursor blinking logic into VT100 layer marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 25/40] ui/console-vc: refactor text_console_resize() into vt100_set_image() marcandre.lureau
                   ` (17 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This decouples glyph rendering from the console object, continuing the
QemuVT100 abstraction introduced in the previous commits.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 931693a7b0c..d3e891dab92 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -266,9 +266,8 @@ static void vt100_refresh(QemuVT100 *vt)
     vt100_image_update(vt, 0, 0, w, h);
 }
 
-static void console_scroll(QemuTextConsole *s, int ydelta)
+static void vt100_scroll(QemuVT100 *vt, int ydelta)
 {
-    QemuVT100 *vt = &s->vt;
     int i, y1;
 
     if (ydelta > 0) {
@@ -293,7 +292,7 @@ static void console_scroll(QemuTextConsole *s, int ydelta)
                 vt->y_displayed = vt->total_height - 1;
         }
     }
-    vt100_refresh(&s->vt);
+    vt100_refresh(vt);
 }
 
 static void kbd_send_chars(QemuTextConsole *s)
@@ -323,16 +322,16 @@ void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
 
     switch(keysym) {
     case QEMU_KEY_CTRL_UP:
-        console_scroll(s, -1);
+        vt100_scroll(&s->vt, -1);
         break;
     case QEMU_KEY_CTRL_DOWN:
-        console_scroll(s, 1);
+        vt100_scroll(&s->vt, 1);
         break;
     case QEMU_KEY_CTRL_PAGEUP:
-        console_scroll(s, -10);
+        vt100_scroll(&s->vt, -10);
         break;
     case QEMU_KEY_CTRL_PAGEDOWN:
-        console_scroll(s, 10);
+        vt100_scroll(&s->vt, 10);
         break;
     default:
         /* convert the QEMU keysym to VT100 key string */
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 25/40] ui/console-vc: refactor text_console_resize() into vt100_set_image()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (23 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 24/40] ui/console-vc: console_scroll() -> vt100_scroll() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 26/40] ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf() marcandre.lureau
                   ` (16 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Decouple the resize logic from QemuTextConsole by operating on
QemuVT100 and taking a pixman_image_t directly, instead of reaching
into the console's scanout surface. The callers now pass the image
explicitly, which makes the VT100 layer independent of the console
object hierarchy.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 40 +++++++++++++++++++---------------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index d3e891dab92..00de9291d3d 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -11,6 +11,7 @@
 #include "qemu/queue.h"
 #include "ui/console.h"
 
+#include "pixman.h"
 #include "trace.h"
 #include "console-priv.h"
 
@@ -394,44 +395,41 @@ static void text_console_update(void *opaque, console_ch_t *chardata)
     }
 }
 
-static void text_console_resize(QemuTextConsole *t)
+static void vt100_set_image(QemuVT100 *vt, pixman_image_t *image)
 {
-    QemuConsole *s = QEMU_CONSOLE(t);
     TextCell *cells, *c, *c1;
     int w1, x, y, last_width, w, h;
 
-    assert(s->scanout.kind == SCANOUT_SURFACE);
-
-    t->vt.image = s->surface->image;
-    w = pixman_image_get_width(t->vt.image) / FONT_WIDTH;
-    h = pixman_image_get_height(t->vt.image) / FONT_HEIGHT;
-    if (w == t->vt.width && h == t->vt.height) {
+    vt->image = image;
+    w = pixman_image_get_width(image) / FONT_WIDTH;
+    h = pixman_image_get_height(image) / FONT_HEIGHT;
+    if (w == vt->width && h == vt->height) {
         return;
     }
 
-    last_width = t->vt.width;
-    t->vt.width = w;
-    t->vt.height = h;
+    last_width = vt->width;
+    vt->width = w;
+    vt->height = h;
 
-    w1 = MIN(t->vt.width, last_width);
+    w1 = MIN(vt->width, last_width);
 
-    cells = g_new(TextCell, t->vt.width * t->vt.total_height + 1);
-    for (y = 0; y < t->vt.total_height; y++) {
-        c = &cells[y * t->vt.width];
+    cells = g_new(TextCell, vt->width * vt->total_height + 1);
+    for (y = 0; y < vt->total_height; y++) {
+        c = &cells[y * vt->width];
         if (w1 > 0) {
-            c1 = &t->vt.cells[y * last_width];
+            c1 = &vt->cells[y * last_width];
             for (x = 0; x < w1; x++) {
                 *c++ = *c1++;
             }
         }
-        for (x = w1; x < t->vt.width; x++) {
+        for (x = w1; x < vt->width; x++) {
             c->ch = ' ';
             c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             c++;
         }
     }
-    g_free(t->vt.cells);
-    t->vt.cells = cells;
+    g_free(vt->cells);
+    vt->cells = cells;
 }
 
 static void vc_put_lf(VCChardev *vc)
@@ -1076,7 +1074,7 @@ static void text_console_invalidate(void *opaque)
     QemuTextConsole *s = QEMU_TEXT_CONSOLE(opaque);
 
     if (!QEMU_IS_FIXED_TEXT_CONSOLE(s)) {
-        text_console_resize(QEMU_TEXT_CONSOLE(s));
+        vt100_set_image(&s->vt, QEMU_CONSOLE(s)->surface->image);
     }
     vt100_refresh(&s->vt);
 }
@@ -1196,7 +1194,7 @@ static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)
 
     /* set current text attributes to default */
     drv->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
-    text_console_resize(s);
+    vt100_set_image(&s->vt, QEMU_CONSOLE(s)->surface->image);
 
     if (chr->label) {
         char *msg;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 26/40] ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (24 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 25/40] ui/console-vc: refactor text_console_resize() into vt100_set_image() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 27/40] ui/console-vc: unify the write path marcandre.lureau
                   ` (15 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Decouple the line-feed handling from VCChardev by operating on
QemuVT100 directly. The function no longer needs the chardev or
console pointers — callers pass &s->vt instead. This continues the
effort to make the VT100 terminal emulation self-contained.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 00de9291d3d..2de096db3ac 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -432,10 +432,8 @@ static void vt100_set_image(QemuVT100 *vt, pixman_image_t *image)
     vt->cells = cells;
 }
 
-static void vc_put_lf(VCChardev *vc)
+static void vt100_put_lf(QemuVT100 *vt)
 {
-    QemuTextConsole *s = vc->console;
-    QemuVT100 *vt = &s->vt;
     TextCell *c;
     int x, y1;
 
@@ -626,7 +624,7 @@ static void vc_put_one(VCChardev *vc, int ch)
     if (vt->x >= vt->width) {
         /* line wrap */
         vt->x = 0;
-        vc_put_lf(vc);
+        vt100_put_lf(vt);
     }
     y1 = (vt->y_base + vt->y) % vt->total_height;
     c = &vt->cells[y1 * vt->width + vt->x];
@@ -792,7 +790,7 @@ static void vc_putchar(VCChardev *vc, int ch)
             vt->x = 0;
             break;
         case '\n':  /* newline */
-            vc_put_lf(vc);
+            vt100_put_lf(&s->vt);
             break;
         case '\b':  /* backspace */
             if (vt->x > 0)
@@ -801,7 +799,7 @@ static void vc_putchar(VCChardev *vc, int ch)
         case '\t':  /* tabspace */
             if (vt->x + (8 - (vt->x % 8)) > vt->width) {
                 vt->x = 0;
-                vc_put_lf(vc);
+                vt100_put_lf(vt);
             } else {
                 vt->x = vt->x + (8 - (vt->x % 8));
             }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 27/40] ui/console-vc: unify the write path
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (25 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 26/40] ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 28/40] ui: avoid duplicating vgafont16 in each translation unit marcandre.lureau
                   ` (14 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

VT100 escape responses (DSR) used qemu_chr_be_write() to write directly
to the chardev backend, bypassing the output FIFO, while keyboard input
went through the FIFO and flush path. This inconsistency could lead to
out-of-order delivery when both paths are active.

Introduce qemu_text_console_write() that pushes data into the output
FIFO and flushes it, and use it for both keyboard input and VT100
responses. Remove the now-unnecessary vc_respond_str() helper. Rename
kbd_send_chars() to qemu_text_console_flush() to better reflect its
purpose.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index 2de096db3ac..107294af1cc 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -296,7 +296,7 @@ static void vt100_scroll(QemuVT100 *vt, int ydelta)
     vt100_refresh(vt);
 }
 
-static void kbd_send_chars(QemuTextConsole *s)
+static void qemu_text_console_flush(QemuTextConsole *s)
 {
     uint32_t len, avail;
 
@@ -313,13 +313,21 @@ static void kbd_send_chars(QemuTextConsole *s)
     }
 }
 
+static void qemu_text_console_write(QemuTextConsole *s, const void *buf, size_t len)
+{
+    uint32_t num_free;
+
+    num_free = fifo8_num_free(&s->out_fifo);
+    fifo8_push_all(&s->out_fifo, buf, MIN(num_free, len));
+    qemu_text_console_flush(s);
+}
+
 /* called when an ascii key is pressed */
 void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
 {
     QemuVT100 *vt = &s->vt;
     uint8_t buf[16], *q;
     int c;
-    uint32_t num_free;
 
     switch(keysym) {
     case QEMU_KEY_CTRL_UP:
@@ -358,9 +366,7 @@ void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
         if (vt->echo) {
             qemu_chr_write(s->chr, buf, q - buf, true);
         }
-        num_free = fifo8_num_free(&s->out_fifo);
-        fifo8_push_all(&s->out_fifo, buf, MIN(num_free, q - buf));
-        kbd_send_chars(s);
+        qemu_text_console_write(s, buf, q - buf);
         break;
     }
 }
@@ -634,13 +640,6 @@ static void vc_put_one(VCChardev *vc, int ch)
     vt->x++;
 }
 
-static void vc_respond_str(VCChardev *vc, const char *buf)
-{
-    QemuTextConsole *s = vc->console;
-
-    qemu_chr_be_write(s->chr, (const uint8_t *)buf, strlen(buf));
-}
-
 /* set cursor, checking bounds */
 static void vc_set_cursor(VCChardev *vc, int x, int y)
 {
@@ -967,13 +966,13 @@ static void vc_putchar(VCChardev *vc, int ch)
                 switch (vc->esc_params[0]) {
                 case 5:
                     /* report console status (always succeed)*/
-                    vc_respond_str(vc, "\033[0n");
+                    qemu_text_console_write(s, "\033[0n", 4);
                     break;
                 case 6:
                     /* report cursor position */
                     response = g_strdup_printf("\033[%d;%dR",
                                                vt->y + 1, vt->x + 1);
-                    vc_respond_str(vc, response);
+                    qemu_text_console_write(s, response, strlen(response));
                     break;
                 }
                 break;
@@ -1133,7 +1132,7 @@ static void vc_chr_accept_input(Chardev *chr)
 {
     VCChardev *drv = VC_CHARDEV(chr);
 
-    kbd_send_chars(drv->console);
+    qemu_text_console_flush(drv->console);
 }
 
 static void vc_chr_set_echo(Chardev *chr, bool echo)
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 28/40] ui: avoid duplicating vgafont16 in each translation unit
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (26 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 27/40] ui/console-vc: unify the write path marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 29/40] ui/vgafont: add SPDX license header marcandre.lureau
                   ` (13 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

vgafont.h defined vgafont16 as a static const array, so every .c file
that included it (via console-priv.h) got its own 4 KiB copy, that
the linker may or not deduplicate?

Move the array definition into a new vgafont.c compilation unit and
turn the header into a proper extern declaration with an include guard.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vgafont.h   | 4613 +-----------------------------------------------
 ui/vgafont.c   | 4613 ++++++++++++++++++++++++++++++++++++++++++++++++
 ui/meson.build |    1 +
 3 files changed, 4619 insertions(+), 4608 deletions(-)
 create mode 100644 ui/vgafont.c

diff --git a/ui/vgafont.h b/ui/vgafont.h
index 7e1fc473f75..4498ac4e07b 100644
--- a/ui/vgafont.h
+++ b/ui/vgafont.h
@@ -1,4611 +1,8 @@
-static const uint8_t vgafont16[256 * 16] = {
+#ifndef VGAFONT_H
+#define VGAFONT_H
 
-    /* 0 0x00 '^@' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
+#include <stdint.h>
 
-    /* 1 0x01 '^A' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x81, /* 10000001 */
-    0xa5, /* 10100101 */
-    0x81, /* 10000001 */
-    0x81, /* 10000001 */
-    0xbd, /* 10111101 */
-    0x99, /* 10011001 */
-    0x81, /* 10000001 */
-    0x81, /* 10000001 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
+extern const uint8_t vgafont16[256 * 16];
 
-    /* 2 0x02 '^B' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0xff, /* 11111111 */
-    0xdb, /* 11011011 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xc3, /* 11000011 */
-    0xe7, /* 11100111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 3 0x03 '^C' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x6c, /* 01101100 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0x7c, /* 01111100 */
-    0x38, /* 00111000 */
-    0x10, /* 00010000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 4 0x04 '^D' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x7c, /* 01111100 */
-    0xfe, /* 11111110 */
-    0x7c, /* 01111100 */
-    0x38, /* 00111000 */
-    0x10, /* 00010000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 5 0x05 '^E' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0xe7, /* 11100111 */
-    0xe7, /* 11100111 */
-    0xe7, /* 11100111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 6 0x06 '^F' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x7e, /* 01111110 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 7 0x07 '^G' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 8 0x08 '^H' */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xe7, /* 11100111 */
-    0xc3, /* 11000011 */
-    0xc3, /* 11000011 */
-    0xe7, /* 11100111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-
-    /* 9 0x09 '^I' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x42, /* 01000010 */
-    0x42, /* 01000010 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 10 0x0a '^J' */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xc3, /* 11000011 */
-    0x99, /* 10011001 */
-    0xbd, /* 10111101 */
-    0xbd, /* 10111101 */
-    0x99, /* 10011001 */
-    0xc3, /* 11000011 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-
-    /* 11 0x0b '^K' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1e, /* 00011110 */
-    0x0e, /* 00001110 */
-    0x1a, /* 00011010 */
-    0x32, /* 00110010 */
-    0x78, /* 01111000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 12 0x0c '^L' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 13 0x0d '^M' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3f, /* 00111111 */
-    0x33, /* 00110011 */
-    0x3f, /* 00111111 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x70, /* 01110000 */
-    0xf0, /* 11110000 */
-    0xe0, /* 11100000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 14 0x0e '^N' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7f, /* 01111111 */
-    0x63, /* 01100011 */
-    0x7f, /* 01111111 */
-    0x63, /* 01100011 */
-    0x63, /* 01100011 */
-    0x63, /* 01100011 */
-    0x63, /* 01100011 */
-    0x67, /* 01100111 */
-    0xe7, /* 11100111 */
-    0xe6, /* 11100110 */
-    0xc0, /* 11000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 15 0x0f '^O' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xdb, /* 11011011 */
-    0x3c, /* 00111100 */
-    0xe7, /* 11100111 */
-    0x3c, /* 00111100 */
-    0xdb, /* 11011011 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 16 0x10 '^P' */
-    0x00, /* 00000000 */
-    0x80, /* 10000000 */
-    0xc0, /* 11000000 */
-    0xe0, /* 11100000 */
-    0xf0, /* 11110000 */
-    0xf8, /* 11111000 */
-    0xfe, /* 11111110 */
-    0xf8, /* 11111000 */
-    0xf0, /* 11110000 */
-    0xe0, /* 11100000 */
-    0xc0, /* 11000000 */
-    0x80, /* 10000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 17 0x11 '^Q' */
-    0x00, /* 00000000 */
-    0x02, /* 00000010 */
-    0x06, /* 00000110 */
-    0x0e, /* 00001110 */
-    0x1e, /* 00011110 */
-    0x3e, /* 00111110 */
-    0xfe, /* 11111110 */
-    0x3e, /* 00111110 */
-    0x1e, /* 00011110 */
-    0x0e, /* 00001110 */
-    0x06, /* 00000110 */
-    0x02, /* 00000010 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 18 0x12 '^R' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 19 0x13 '^S' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 20 0x14 '^T' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7f, /* 01111111 */
-    0xdb, /* 11011011 */
-    0xdb, /* 11011011 */
-    0xdb, /* 11011011 */
-    0x7b, /* 01111011 */
-    0x1b, /* 00011011 */
-    0x1b, /* 00011011 */
-    0x1b, /* 00011011 */
-    0x1b, /* 00011011 */
-    0x1b, /* 00011011 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 21 0x15 '^U' */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0x60, /* 01100000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x0c, /* 00001100 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 22 0x16 '^V' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 23 0x17 '^W' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 24 0x18 '^X' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 25 0x19 '^Y' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 26 0x1a '^Z' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0xfe, /* 11111110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 27 0x1b '^[' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xfe, /* 11111110 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 28 0x1c '^\' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 29 0x1d '^]' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x28, /* 00101000 */
-    0x6c, /* 01101100 */
-    0xfe, /* 11111110 */
-    0x6c, /* 01101100 */
-    0x28, /* 00101000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 30 0x1e '^^' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x38, /* 00111000 */
-    0x7c, /* 01111100 */
-    0x7c, /* 01111100 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 31 0x1f '^_' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0x7c, /* 01111100 */
-    0x7c, /* 01111100 */
-    0x38, /* 00111000 */
-    0x38, /* 00111000 */
-    0x10, /* 00010000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 32 0x20 ' ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 33 0x21 '!' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 34 0x22 '"' */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x24, /* 00100100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 35 0x23 '#' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0xfe, /* 11111110 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0xfe, /* 11111110 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 36 0x24 '$' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc2, /* 11000010 */
-    0xc0, /* 11000000 */
-    0x7c, /* 01111100 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x86, /* 10000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 37 0x25 '%' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc2, /* 11000010 */
-    0xc6, /* 11000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc6, /* 11000110 */
-    0x86, /* 10000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 38 0x26 '&' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 39 0x27 ''' */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 40 0x28 '(' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 41 0x29 ')' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 42 0x2a '*' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0xff, /* 11111111 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 43 0x2b '+' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 44 0x2c ',' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 45 0x2d '-' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 46 0x2e '.' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 47 0x2f '/' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x02, /* 00000010 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0x80, /* 10000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 48 0x30 '0' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 49 0x31 '1' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x38, /* 00111000 */
-    0x78, /* 01111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 50 0x32 '2' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 51 0x33 '3' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x3c, /* 00111100 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 52 0x34 '4' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x0c, /* 00001100 */
-    0x1c, /* 00011100 */
-    0x3c, /* 00111100 */
-    0x6c, /* 01101100 */
-    0xcc, /* 11001100 */
-    0xfe, /* 11111110 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x1e, /* 00011110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 53 0x35 '5' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xfc, /* 11111100 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 54 0x36 '6' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xfc, /* 11111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 55 0x37 '7' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 56 0x38 '8' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 57 0x39 '9' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7e, /* 01111110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 58 0x3a ':' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 59 0x3b ';' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 60 0x3c '<' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x06, /* 00000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 61 0x3d '=' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 62 0x3e '>' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 63 0x3f '?' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 64 0x40 '@' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xde, /* 11011110 */
-    0xde, /* 11011110 */
-    0xde, /* 11011110 */
-    0xdc, /* 11011100 */
-    0xc0, /* 11000000 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 65 0x41 'A' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 66 0x42 'B' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfc, /* 11111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0xfc, /* 11111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 67 0x43 'C' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0xc2, /* 11000010 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc2, /* 11000010 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 68 0x44 'D' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xf8, /* 11111000 */
-    0x6c, /* 01101100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x6c, /* 01101100 */
-    0xf8, /* 11111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 69 0x45 'E' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x66, /* 01100110 */
-    0x62, /* 01100010 */
-    0x68, /* 01101000 */
-    0x78, /* 01111000 */
-    0x68, /* 01101000 */
-    0x60, /* 01100000 */
-    0x62, /* 01100010 */
-    0x66, /* 01100110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 70 0x46 'F' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x66, /* 01100110 */
-    0x62, /* 01100010 */
-    0x68, /* 01101000 */
-    0x78, /* 01111000 */
-    0x68, /* 01101000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xf0, /* 11110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 71 0x47 'G' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0xc2, /* 11000010 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xde, /* 11011110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x66, /* 01100110 */
-    0x3a, /* 00111010 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 72 0x48 'H' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 73 0x49 'I' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 74 0x4a 'J' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1e, /* 00011110 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 75 0x4b 'K' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xe6, /* 11100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x6c, /* 01101100 */
-    0x78, /* 01111000 */
-    0x78, /* 01111000 */
-    0x6c, /* 01101100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0xe6, /* 11100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 76 0x4c 'L' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xf0, /* 11110000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x62, /* 01100010 */
-    0x66, /* 01100110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 77 0x4d 'M' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xee, /* 11101110 */
-    0xfe, /* 11111110 */
-    0xfe, /* 11111110 */
-    0xd6, /* 11010110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 78 0x4e 'N' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xe6, /* 11100110 */
-    0xf6, /* 11110110 */
-    0xfe, /* 11111110 */
-    0xde, /* 11011110 */
-    0xce, /* 11001110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 79 0x4f 'O' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 80 0x50 'P' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfc, /* 11111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xf0, /* 11110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 81 0x51 'Q' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xd6, /* 11010110 */
-    0xde, /* 11011110 */
-    0x7c, /* 01111100 */
-    0x0c, /* 00001100 */
-    0x0e, /* 00001110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 82 0x52 'R' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfc, /* 11111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x6c, /* 01101100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0xe6, /* 11100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 83 0x53 'S' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x60, /* 01100000 */
-    0x38, /* 00111000 */
-    0x0c, /* 00001100 */
-    0x06, /* 00000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 84 0x54 'T' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x5a, /* 01011010 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 85 0x55 'U' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 86 0x56 'V' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x10, /* 00010000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 87 0x57 'W' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xfe, /* 11111110 */
-    0xee, /* 11101110 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 88 0x58 'X' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x7c, /* 01111100 */
-    0x38, /* 00111000 */
-    0x38, /* 00111000 */
-    0x7c, /* 01111100 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 89 0x59 'Y' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 90 0x5a 'Z' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0x86, /* 10000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc2, /* 11000010 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 91 0x5b '[' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 92 0x5c '\' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x80, /* 10000000 */
-    0xc0, /* 11000000 */
-    0xe0, /* 11100000 */
-    0x70, /* 01110000 */
-    0x38, /* 00111000 */
-    0x1c, /* 00011100 */
-    0x0e, /* 00001110 */
-    0x06, /* 00000110 */
-    0x02, /* 00000010 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 93 0x5d ']' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 94 0x5e '^' */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 95 0x5f '_' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 96 0x60 '`' */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 97 0x61 'a' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 98 0x62 'b' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xe0, /* 11100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x78, /* 01111000 */
-    0x6c, /* 01101100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 99 0x63 'c' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 100 0x64 'd' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1c, /* 00011100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x3c, /* 00111100 */
-    0x6c, /* 01101100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 101 0x65 'e' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 102 0x66 'f' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1c, /* 00011100 */
-    0x36, /* 00110110 */
-    0x32, /* 00110010 */
-    0x30, /* 00110000 */
-    0x78, /* 01111000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 103 0x67 'g' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x7c, /* 01111100 */
-    0x0c, /* 00001100 */
-    0xcc, /* 11001100 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-
-    /* 104 0x68 'h' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xe0, /* 11100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x6c, /* 01101100 */
-    0x76, /* 01110110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0xe6, /* 11100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 105 0x69 'i' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 106 0x6a 'j' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x00, /* 00000000 */
-    0x0e, /* 00001110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-
-    /* 107 0x6b 'k' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xe0, /* 11100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x66, /* 01100110 */
-    0x6c, /* 01101100 */
-    0x78, /* 01111000 */
-    0x78, /* 01111000 */
-    0x6c, /* 01101100 */
-    0x66, /* 01100110 */
-    0xe6, /* 11100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 108 0x6c 'l' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 109 0x6d 'm' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xec, /* 11101100 */
-    0xfe, /* 11111110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 110 0x6e 'n' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xdc, /* 11011100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 111 0x6f 'o' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 112 0x70 'p' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xdc, /* 11011100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xf0, /* 11110000 */
-    0x00, /* 00000000 */
-
-    /* 113 0x71 'q' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x7c, /* 01111100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x1e, /* 00011110 */
-    0x00, /* 00000000 */
-
-    /* 114 0x72 'r' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xdc, /* 11011100 */
-    0x76, /* 01110110 */
-    0x66, /* 01100110 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xf0, /* 11110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 115 0x73 's' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0x60, /* 01100000 */
-    0x38, /* 00111000 */
-    0x0c, /* 00001100 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 116 0x74 't' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0xfc, /* 11111100 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x36, /* 00110110 */
-    0x1c, /* 00011100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 117 0x75 'u' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 118 0x76 'v' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 119 0x77 'w' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xd6, /* 11010110 */
-    0xfe, /* 11111110 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 120 0x78 'x' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x38, /* 00111000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 121 0x79 'y' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7e, /* 01111110 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0xf8, /* 11111000 */
-    0x00, /* 00000000 */
-
-    /* 122 0x7a 'z' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xcc, /* 11001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 123 0x7b '{' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x0e, /* 00001110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x70, /* 01110000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x0e, /* 00001110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 124 0x7c '|' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 125 0x7d '}' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x70, /* 01110000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x0e, /* 00001110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 126 0x7e '~' */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 127 0x7f '\x7f' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 128 0x80 '€' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0xc2, /* 11000010 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc2, /* 11000010 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 129 0x81 '' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 130 0x82 '‚' */
-    0x00, /* 00000000 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 131 0x83 'ƒ' */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 132 0x84 '„' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 133 0x85 '…' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 134 0x86 '†' */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 135 0x87 '‡' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x18, /* 00011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 136 0x88 'ˆ' */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 137 0x89 '‰' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 138 0x8a 'Š' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 139 0x8b '‹' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 140 0x8c 'Œ' */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 141 0x8d '' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 142 0x8e 'Ž' */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 143 0x8f '' */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 144 0x90 '' */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x66, /* 01100110 */
-    0x62, /* 01100010 */
-    0x68, /* 01101000 */
-    0x78, /* 01111000 */
-    0x68, /* 01101000 */
-    0x62, /* 01100010 */
-    0x66, /* 01100110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 145 0x91 '‘' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xec, /* 11101100 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x7e, /* 01111110 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0x6e, /* 01101110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 146 0x92 '’' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3e, /* 00111110 */
-    0x6c, /* 01101100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xfe, /* 11111110 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xce, /* 11001110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 147 0x93 '“' */
-    0x00, /* 00000000 */
-    0x10, /* 00010000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 148 0x94 '”' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 149 0x95 '•' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 150 0x96 '–' */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x78, /* 01111000 */
-    0xcc, /* 11001100 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 151 0x97 '—' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 152 0x98 '˜' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7e, /* 01111110 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x78, /* 01111000 */
-    0x00, /* 00000000 */
-
-    /* 153 0x99 '™' */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 154 0x9a 'š' */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 155 0x9b '›' */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 156 0x9c 'œ' */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x64, /* 01100100 */
-    0x60, /* 01100000 */
-    0xf0, /* 11110000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xe6, /* 11100110 */
-    0xfc, /* 11111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 157 0x9d '' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 158 0x9e 'ž' */
-    0x00, /* 00000000 */
-    0xf8, /* 11111000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xf8, /* 11111000 */
-    0xc4, /* 11000100 */
-    0xcc, /* 11001100 */
-    0xde, /* 11011110 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 159 0x9f 'Ÿ' */
-    0x00, /* 00000000 */
-    0x0e, /* 00001110 */
-    0x1b, /* 00011011 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xd8, /* 11011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 160 0xa0 ' ' */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0x0c, /* 00001100 */
-    0x7c, /* 01111100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 161 0xa1 '¡' */
-    0x00, /* 00000000 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 162 0xa2 '¢' */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 163 0xa3 '£' */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x00, /* 00000000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 164 0xa4 '¤' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x00, /* 00000000 */
-    0xdc, /* 11011100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 165 0xa5 '¥' */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x00, /* 00000000 */
-    0xc6, /* 11000110 */
-    0xe6, /* 11100110 */
-    0xf6, /* 11110110 */
-    0xfe, /* 11111110 */
-    0xde, /* 11011110 */
-    0xce, /* 11001110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 166 0xa6 '¦' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x3e, /* 00111110 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 167 0xa7 '§' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 168 0xa8 '¨' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x7c, /* 01111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 169 0xa9 '©' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 170 0xaa 'ª' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 171 0xab '«' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0xe0, /* 11100000 */
-    0x62, /* 01100010 */
-    0x66, /* 01100110 */
-    0x6c, /* 01101100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xdc, /* 11011100 */
-    0x86, /* 10000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x3e, /* 00111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 172 0xac '¬' */
-    0x00, /* 00000000 */
-    0x60, /* 01100000 */
-    0xe0, /* 11100000 */
-    0x62, /* 01100010 */
-    0x66, /* 01100110 */
-    0x6c, /* 01101100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x66, /* 01100110 */
-    0xce, /* 11001110 */
-    0x9a, /* 10011010 */
-    0x3f, /* 00111111 */
-    0x06, /* 00000110 */
-    0x06, /* 00000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 173 0xad '­' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 174 0xae '®' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x36, /* 00110110 */
-    0x6c, /* 01101100 */
-    0xd8, /* 11011000 */
-    0x6c, /* 01101100 */
-    0x36, /* 00110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 175 0xaf '¯' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xd8, /* 11011000 */
-    0x6c, /* 01101100 */
-    0x36, /* 00110110 */
-    0x6c, /* 01101100 */
-    0xd8, /* 11011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 176 0xb0 '°' */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-    0x11, /* 00010001 */
-    0x44, /* 01000100 */
-
-    /* 177 0xb1 '±' */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-    0x55, /* 01010101 */
-    0xaa, /* 10101010 */
-
-    /* 178 0xb2 '²' */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-    0xdd, /* 11011101 */
-    0x77, /* 01110111 */
-
-    /* 179 0xb3 '³' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 180 0xb4 '´' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 181 0xb5 'µ' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 182 0xb6 '¶' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xf6, /* 11110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 183 0xb7 '·' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 184 0xb8 '¸' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 185 0xb9 '¹' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xf6, /* 11110110 */
-    0x06, /* 00000110 */
-    0xf6, /* 11110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 186 0xba 'º' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 187 0xbb '»' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x06, /* 00000110 */
-    0xf6, /* 11110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 188 0xbc '¼' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xf6, /* 11110110 */
-    0x06, /* 00000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 189 0xbd '½' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 190 0xbe '¾' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 191 0xbf '¿' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xf8, /* 11111000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 192 0xc0 'À' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 193 0xc1 'Á' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 194 0xc2 'Â' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 195 0xc3 'Ã' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 196 0xc4 'Ä' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 197 0xc5 'Å' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xff, /* 11111111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 198 0xc6 'Æ' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 199 0xc7 'Ç' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x37, /* 00110111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 200 0xc8 'È' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x37, /* 00110111 */
-    0x30, /* 00110000 */
-    0x3f, /* 00111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 201 0xc9 'É' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3f, /* 00111111 */
-    0x30, /* 00110000 */
-    0x37, /* 00110111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 202 0xca 'Ê' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xf7, /* 11110111 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 203 0xcb 'Ë' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0xf7, /* 11110111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 204 0xcc 'Ì' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x37, /* 00110111 */
-    0x30, /* 00110000 */
-    0x37, /* 00110111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 205 0xcd 'Í' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 206 0xce 'Î' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xf7, /* 11110111 */
-    0x00, /* 00000000 */
-    0xf7, /* 11110111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 207 0xcf 'Ï' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 208 0xd0 'Ð' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 209 0xd1 'Ñ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 210 0xd2 'Ò' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 211 0xd3 'Ó' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x3f, /* 00111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 212 0xd4 'Ô' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 213 0xd5 'Õ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 214 0xd6 'Ö' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x3f, /* 00111111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 215 0xd7 '×' */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0xff, /* 11111111 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-
-    /* 216 0xd8 'Ø' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xff, /* 11111111 */
-    0x18, /* 00011000 */
-    0xff, /* 11111111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 217 0xd9 'Ù' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xf8, /* 11111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 218 0xda 'Ú' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1f, /* 00011111 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 219 0xdb 'Û' */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-
-    /* 220 0xdc 'Ü' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-
-    /* 221 0xdd 'Ý' */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-    0xf0, /* 11110000 */
-
-    /* 222 0xde 'Þ' */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-    0x0f, /* 00001111 */
-
-    /* 223 0xdf 'ß' */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0xff, /* 11111111 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 224 0xe0 'à' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xdc, /* 11011100 */
-    0x76, /* 01110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 225 0xe1 'á' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x78, /* 01111000 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xcc, /* 11001100 */
-    0xd8, /* 11011000 */
-    0xcc, /* 11001100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xcc, /* 11001100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 226 0xe2 'â' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0xc0, /* 11000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 227 0xe3 'ã' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 228 0xe4 'ä' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 229 0xe5 'å' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 230 0xe6 'æ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x7c, /* 01111100 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0x00, /* 00000000 */
-
-    /* 231 0xe7 'ç' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 232 0xe8 'è' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 233 0xe9 'é' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xfe, /* 11111110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 234 0xea 'ê' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0xee, /* 11101110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 235 0xeb 'ë' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1e, /* 00011110 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x3e, /* 00111110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x66, /* 01100110 */
-    0x3c, /* 00111100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 236 0xec 'ì' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0xdb, /* 11011011 */
-    0xdb, /* 11011011 */
-    0xdb, /* 11011011 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 237 0xed 'í' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x03, /* 00000011 */
-    0x06, /* 00000110 */
-    0x7e, /* 01111110 */
-    0xdb, /* 11011011 */
-    0xdb, /* 11011011 */
-    0xf3, /* 11110011 */
-    0x7e, /* 01111110 */
-    0x60, /* 01100000 */
-    0xc0, /* 11000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 238 0xee 'î' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x1c, /* 00011100 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x7c, /* 01111100 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x1c, /* 00011100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 239 0xef 'ï' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7c, /* 01111100 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0xc6, /* 11000110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 240 0xf0 'ð' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0xfe, /* 11111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 241 0xf1 'ñ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x7e, /* 01111110 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 242 0xf2 'ò' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x06, /* 00000110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 243 0xf3 'ó' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x30, /* 00110000 */
-    0x60, /* 01100000 */
-    0x30, /* 00110000 */
-    0x18, /* 00011000 */
-    0x0c, /* 00001100 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 244 0xf4 'ô' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x0e, /* 00001110 */
-    0x1b, /* 00011011 */
-    0x1b, /* 00011011 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-
-    /* 245 0xf5 'õ' */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0xd8, /* 11011000 */
-    0x70, /* 01110000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 246 0xf6 'ö' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 247 0xf7 '÷' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x00, /* 00000000 */
-    0x76, /* 01110110 */
-    0xdc, /* 11011100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 248 0xf8 'ø' */
-    0x00, /* 00000000 */
-    0x38, /* 00111000 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x38, /* 00111000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 249 0xf9 'ù' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 250 0xfa 'ú' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x18, /* 00011000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 251 0xfb 'û' */
-    0x00, /* 00000000 */
-    0x0f, /* 00001111 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0x0c, /* 00001100 */
-    0xec, /* 11101100 */
-    0x6c, /* 01101100 */
-    0x6c, /* 01101100 */
-    0x3c, /* 00111100 */
-    0x1c, /* 00011100 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 252 0xfc 'ü' */
-    0x00, /* 00000000 */
-    0x6c, /* 01101100 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x36, /* 00110110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 253 0xfd 'ý' */
-    0x00, /* 00000000 */
-    0x3c, /* 00111100 */
-    0x66, /* 01100110 */
-    0x0c, /* 00001100 */
-    0x18, /* 00011000 */
-    0x32, /* 00110010 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 254 0xfe 'þ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x7e, /* 01111110 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-    /* 255 0xff 'ÿ' */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-    0x00, /* 00000000 */
-
-};
+#endif
diff --git a/ui/vgafont.c b/ui/vgafont.c
new file mode 100644
index 00000000000..708c845a6bf
--- /dev/null
+++ b/ui/vgafont.c
@@ -0,0 +1,4613 @@
+#include "vgafont.h"
+
+const uint8_t vgafont16[256 * 16] = {
+
+    /* 0 0x00 '^@' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 1 0x01 '^A' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x81, /* 10000001 */
+    0xa5, /* 10100101 */
+    0x81, /* 10000001 */
+    0x81, /* 10000001 */
+    0xbd, /* 10111101 */
+    0x99, /* 10011001 */
+    0x81, /* 10000001 */
+    0x81, /* 10000001 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 2 0x02 '^B' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0xff, /* 11111111 */
+    0xdb, /* 11011011 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xc3, /* 11000011 */
+    0xe7, /* 11100111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 3 0x03 '^C' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x6c, /* 01101100 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0x7c, /* 01111100 */
+    0x38, /* 00111000 */
+    0x10, /* 00010000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 4 0x04 '^D' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x7c, /* 01111100 */
+    0xfe, /* 11111110 */
+    0x7c, /* 01111100 */
+    0x38, /* 00111000 */
+    0x10, /* 00010000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 5 0x05 '^E' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0xe7, /* 11100111 */
+    0xe7, /* 11100111 */
+    0xe7, /* 11100111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 6 0x06 '^F' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x7e, /* 01111110 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 7 0x07 '^G' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 8 0x08 '^H' */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xe7, /* 11100111 */
+    0xc3, /* 11000011 */
+    0xc3, /* 11000011 */
+    0xe7, /* 11100111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+
+    /* 9 0x09 '^I' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x42, /* 01000010 */
+    0x42, /* 01000010 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 10 0x0a '^J' */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xc3, /* 11000011 */
+    0x99, /* 10011001 */
+    0xbd, /* 10111101 */
+    0xbd, /* 10111101 */
+    0x99, /* 10011001 */
+    0xc3, /* 11000011 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+
+    /* 11 0x0b '^K' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1e, /* 00011110 */
+    0x0e, /* 00001110 */
+    0x1a, /* 00011010 */
+    0x32, /* 00110010 */
+    0x78, /* 01111000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 12 0x0c '^L' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 13 0x0d '^M' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3f, /* 00111111 */
+    0x33, /* 00110011 */
+    0x3f, /* 00111111 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x70, /* 01110000 */
+    0xf0, /* 11110000 */
+    0xe0, /* 11100000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 14 0x0e '^N' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7f, /* 01111111 */
+    0x63, /* 01100011 */
+    0x7f, /* 01111111 */
+    0x63, /* 01100011 */
+    0x63, /* 01100011 */
+    0x63, /* 01100011 */
+    0x63, /* 01100011 */
+    0x67, /* 01100111 */
+    0xe7, /* 11100111 */
+    0xe6, /* 11100110 */
+    0xc0, /* 11000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 15 0x0f '^O' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xdb, /* 11011011 */
+    0x3c, /* 00111100 */
+    0xe7, /* 11100111 */
+    0x3c, /* 00111100 */
+    0xdb, /* 11011011 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 16 0x10 '^P' */
+    0x00, /* 00000000 */
+    0x80, /* 10000000 */
+    0xc0, /* 11000000 */
+    0xe0, /* 11100000 */
+    0xf0, /* 11110000 */
+    0xf8, /* 11111000 */
+    0xfe, /* 11111110 */
+    0xf8, /* 11111000 */
+    0xf0, /* 11110000 */
+    0xe0, /* 11100000 */
+    0xc0, /* 11000000 */
+    0x80, /* 10000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 17 0x11 '^Q' */
+    0x00, /* 00000000 */
+    0x02, /* 00000010 */
+    0x06, /* 00000110 */
+    0x0e, /* 00001110 */
+    0x1e, /* 00011110 */
+    0x3e, /* 00111110 */
+    0xfe, /* 11111110 */
+    0x3e, /* 00111110 */
+    0x1e, /* 00011110 */
+    0x0e, /* 00001110 */
+    0x06, /* 00000110 */
+    0x02, /* 00000010 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 18 0x12 '^R' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 19 0x13 '^S' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 20 0x14 '^T' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7f, /* 01111111 */
+    0xdb, /* 11011011 */
+    0xdb, /* 11011011 */
+    0xdb, /* 11011011 */
+    0x7b, /* 01111011 */
+    0x1b, /* 00011011 */
+    0x1b, /* 00011011 */
+    0x1b, /* 00011011 */
+    0x1b, /* 00011011 */
+    0x1b, /* 00011011 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 21 0x15 '^U' */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0x60, /* 01100000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x0c, /* 00001100 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 22 0x16 '^V' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 23 0x17 '^W' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 24 0x18 '^X' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 25 0x19 '^Y' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 26 0x1a '^Z' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0xfe, /* 11111110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 27 0x1b '^[' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xfe, /* 11111110 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 28 0x1c '^\' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 29 0x1d '^]' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x28, /* 00101000 */
+    0x6c, /* 01101100 */
+    0xfe, /* 11111110 */
+    0x6c, /* 01101100 */
+    0x28, /* 00101000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 30 0x1e '^^' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x38, /* 00111000 */
+    0x7c, /* 01111100 */
+    0x7c, /* 01111100 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 31 0x1f '^_' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0x7c, /* 01111100 */
+    0x7c, /* 01111100 */
+    0x38, /* 00111000 */
+    0x38, /* 00111000 */
+    0x10, /* 00010000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 32 0x20 ' ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 33 0x21 '!' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 34 0x22 '"' */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x24, /* 00100100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 35 0x23 '#' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0xfe, /* 11111110 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0xfe, /* 11111110 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 36 0x24 '$' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc2, /* 11000010 */
+    0xc0, /* 11000000 */
+    0x7c, /* 01111100 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x86, /* 10000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 37 0x25 '%' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc2, /* 11000010 */
+    0xc6, /* 11000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc6, /* 11000110 */
+    0x86, /* 10000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 38 0x26 '&' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 39 0x27 ''' */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 40 0x28 '(' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 41 0x29 ')' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 42 0x2a '*' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0xff, /* 11111111 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 43 0x2b '+' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 44 0x2c ',' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 45 0x2d '-' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 46 0x2e '.' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 47 0x2f '/' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x02, /* 00000010 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0x80, /* 10000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 48 0x30 '0' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 49 0x31 '1' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x38, /* 00111000 */
+    0x78, /* 01111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 50 0x32 '2' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 51 0x33 '3' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x3c, /* 00111100 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 52 0x34 '4' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x0c, /* 00001100 */
+    0x1c, /* 00011100 */
+    0x3c, /* 00111100 */
+    0x6c, /* 01101100 */
+    0xcc, /* 11001100 */
+    0xfe, /* 11111110 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x1e, /* 00011110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 53 0x35 '5' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xfc, /* 11111100 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 54 0x36 '6' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xfc, /* 11111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 55 0x37 '7' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 56 0x38 '8' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 57 0x39 '9' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7e, /* 01111110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 58 0x3a ':' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 59 0x3b ';' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 60 0x3c '<' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x06, /* 00000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 61 0x3d '=' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 62 0x3e '>' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 63 0x3f '?' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 64 0x40 '@' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xde, /* 11011110 */
+    0xde, /* 11011110 */
+    0xde, /* 11011110 */
+    0xdc, /* 11011100 */
+    0xc0, /* 11000000 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 65 0x41 'A' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 66 0x42 'B' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfc, /* 11111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0xfc, /* 11111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 67 0x43 'C' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0xc2, /* 11000010 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc2, /* 11000010 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 68 0x44 'D' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xf8, /* 11111000 */
+    0x6c, /* 01101100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x6c, /* 01101100 */
+    0xf8, /* 11111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 69 0x45 'E' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x66, /* 01100110 */
+    0x62, /* 01100010 */
+    0x68, /* 01101000 */
+    0x78, /* 01111000 */
+    0x68, /* 01101000 */
+    0x60, /* 01100000 */
+    0x62, /* 01100010 */
+    0x66, /* 01100110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 70 0x46 'F' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x66, /* 01100110 */
+    0x62, /* 01100010 */
+    0x68, /* 01101000 */
+    0x78, /* 01111000 */
+    0x68, /* 01101000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xf0, /* 11110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 71 0x47 'G' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0xc2, /* 11000010 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xde, /* 11011110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x66, /* 01100110 */
+    0x3a, /* 00111010 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 72 0x48 'H' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 73 0x49 'I' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 74 0x4a 'J' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1e, /* 00011110 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 75 0x4b 'K' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xe6, /* 11100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x6c, /* 01101100 */
+    0x78, /* 01111000 */
+    0x78, /* 01111000 */
+    0x6c, /* 01101100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0xe6, /* 11100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 76 0x4c 'L' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xf0, /* 11110000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x62, /* 01100010 */
+    0x66, /* 01100110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 77 0x4d 'M' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xee, /* 11101110 */
+    0xfe, /* 11111110 */
+    0xfe, /* 11111110 */
+    0xd6, /* 11010110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 78 0x4e 'N' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xe6, /* 11100110 */
+    0xf6, /* 11110110 */
+    0xfe, /* 11111110 */
+    0xde, /* 11011110 */
+    0xce, /* 11001110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 79 0x4f 'O' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 80 0x50 'P' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfc, /* 11111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xf0, /* 11110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 81 0x51 'Q' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xd6, /* 11010110 */
+    0xde, /* 11011110 */
+    0x7c, /* 01111100 */
+    0x0c, /* 00001100 */
+    0x0e, /* 00001110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 82 0x52 'R' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfc, /* 11111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x6c, /* 01101100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0xe6, /* 11100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 83 0x53 'S' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x60, /* 01100000 */
+    0x38, /* 00111000 */
+    0x0c, /* 00001100 */
+    0x06, /* 00000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 84 0x54 'T' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x5a, /* 01011010 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 85 0x55 'U' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 86 0x56 'V' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x10, /* 00010000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 87 0x57 'W' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xfe, /* 11111110 */
+    0xee, /* 11101110 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 88 0x58 'X' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x7c, /* 01111100 */
+    0x38, /* 00111000 */
+    0x38, /* 00111000 */
+    0x7c, /* 01111100 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 89 0x59 'Y' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 90 0x5a 'Z' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0x86, /* 10000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc2, /* 11000010 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 91 0x5b '[' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 92 0x5c '\' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x80, /* 10000000 */
+    0xc0, /* 11000000 */
+    0xe0, /* 11100000 */
+    0x70, /* 01110000 */
+    0x38, /* 00111000 */
+    0x1c, /* 00011100 */
+    0x0e, /* 00001110 */
+    0x06, /* 00000110 */
+    0x02, /* 00000010 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 93 0x5d ']' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 94 0x5e '^' */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 95 0x5f '_' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 96 0x60 '`' */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 97 0x61 'a' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 98 0x62 'b' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xe0, /* 11100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x78, /* 01111000 */
+    0x6c, /* 01101100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 99 0x63 'c' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 100 0x64 'd' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1c, /* 00011100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x3c, /* 00111100 */
+    0x6c, /* 01101100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 101 0x65 'e' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 102 0x66 'f' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1c, /* 00011100 */
+    0x36, /* 00110110 */
+    0x32, /* 00110010 */
+    0x30, /* 00110000 */
+    0x78, /* 01111000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 103 0x67 'g' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x7c, /* 01111100 */
+    0x0c, /* 00001100 */
+    0xcc, /* 11001100 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+
+    /* 104 0x68 'h' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xe0, /* 11100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x6c, /* 01101100 */
+    0x76, /* 01110110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0xe6, /* 11100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 105 0x69 'i' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 106 0x6a 'j' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x00, /* 00000000 */
+    0x0e, /* 00001110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+
+    /* 107 0x6b 'k' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xe0, /* 11100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x66, /* 01100110 */
+    0x6c, /* 01101100 */
+    0x78, /* 01111000 */
+    0x78, /* 01111000 */
+    0x6c, /* 01101100 */
+    0x66, /* 01100110 */
+    0xe6, /* 11100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 108 0x6c 'l' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 109 0x6d 'm' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xec, /* 11101100 */
+    0xfe, /* 11111110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 110 0x6e 'n' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xdc, /* 11011100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 111 0x6f 'o' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 112 0x70 'p' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xdc, /* 11011100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xf0, /* 11110000 */
+    0x00, /* 00000000 */
+
+    /* 113 0x71 'q' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x7c, /* 01111100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x1e, /* 00011110 */
+    0x00, /* 00000000 */
+
+    /* 114 0x72 'r' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xdc, /* 11011100 */
+    0x76, /* 01110110 */
+    0x66, /* 01100110 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xf0, /* 11110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 115 0x73 's' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0x60, /* 01100000 */
+    0x38, /* 00111000 */
+    0x0c, /* 00001100 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 116 0x74 't' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0xfc, /* 11111100 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x36, /* 00110110 */
+    0x1c, /* 00011100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 117 0x75 'u' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 118 0x76 'v' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 119 0x77 'w' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xd6, /* 11010110 */
+    0xfe, /* 11111110 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 120 0x78 'x' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x38, /* 00111000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 121 0x79 'y' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7e, /* 01111110 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0xf8, /* 11111000 */
+    0x00, /* 00000000 */
+
+    /* 122 0x7a 'z' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xcc, /* 11001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 123 0x7b '{' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x0e, /* 00001110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x70, /* 01110000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x0e, /* 00001110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 124 0x7c '|' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 125 0x7d '}' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x70, /* 01110000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x0e, /* 00001110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 126 0x7e '~' */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 127 0x7f '\x7f' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 128 0x80 '€' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0xc2, /* 11000010 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc2, /* 11000010 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 129 0x81 '' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 130 0x82 '‚' */
+    0x00, /* 00000000 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 131 0x83 'ƒ' */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 132 0x84 '„' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 133 0x85 '…' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 134 0x86 '†' */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 135 0x87 '‡' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x18, /* 00011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 136 0x88 'ˆ' */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 137 0x89 '‰' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 138 0x8a 'Š' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 139 0x8b '‹' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 140 0x8c 'Œ' */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 141 0x8d '' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 142 0x8e 'Ž' */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 143 0x8f '' */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 144 0x90 '' */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x66, /* 01100110 */
+    0x62, /* 01100010 */
+    0x68, /* 01101000 */
+    0x78, /* 01111000 */
+    0x68, /* 01101000 */
+    0x62, /* 01100010 */
+    0x66, /* 01100110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 145 0x91 '‘' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xec, /* 11101100 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x7e, /* 01111110 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0x6e, /* 01101110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 146 0x92 '’' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3e, /* 00111110 */
+    0x6c, /* 01101100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xfe, /* 11111110 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xce, /* 11001110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 147 0x93 '“' */
+    0x00, /* 00000000 */
+    0x10, /* 00010000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 148 0x94 '”' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 149 0x95 '•' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 150 0x96 '–' */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x78, /* 01111000 */
+    0xcc, /* 11001100 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 151 0x97 '—' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 152 0x98 '˜' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7e, /* 01111110 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x78, /* 01111000 */
+    0x00, /* 00000000 */
+
+    /* 153 0x99 '™' */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 154 0x9a 'š' */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 155 0x9b '›' */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 156 0x9c 'œ' */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x64, /* 01100100 */
+    0x60, /* 01100000 */
+    0xf0, /* 11110000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xe6, /* 11100110 */
+    0xfc, /* 11111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 157 0x9d '' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 158 0x9e 'ž' */
+    0x00, /* 00000000 */
+    0xf8, /* 11111000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xf8, /* 11111000 */
+    0xc4, /* 11000100 */
+    0xcc, /* 11001100 */
+    0xde, /* 11011110 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 159 0x9f 'Ÿ' */
+    0x00, /* 00000000 */
+    0x0e, /* 00001110 */
+    0x1b, /* 00011011 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xd8, /* 11011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 160 0xa0 ' ' */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0x0c, /* 00001100 */
+    0x7c, /* 01111100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 161 0xa1 '¡' */
+    0x00, /* 00000000 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 162 0xa2 '¢' */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 163 0xa3 '£' */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x00, /* 00000000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 164 0xa4 '¤' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x00, /* 00000000 */
+    0xdc, /* 11011100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 165 0xa5 '¥' */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x00, /* 00000000 */
+    0xc6, /* 11000110 */
+    0xe6, /* 11100110 */
+    0xf6, /* 11110110 */
+    0xfe, /* 11111110 */
+    0xde, /* 11011110 */
+    0xce, /* 11001110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 166 0xa6 '¦' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x3e, /* 00111110 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 167 0xa7 '§' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 168 0xa8 '¨' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x7c, /* 01111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 169 0xa9 '©' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 170 0xaa 'ª' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 171 0xab '«' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0xe0, /* 11100000 */
+    0x62, /* 01100010 */
+    0x66, /* 01100110 */
+    0x6c, /* 01101100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xdc, /* 11011100 */
+    0x86, /* 10000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x3e, /* 00111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 172 0xac '¬' */
+    0x00, /* 00000000 */
+    0x60, /* 01100000 */
+    0xe0, /* 11100000 */
+    0x62, /* 01100010 */
+    0x66, /* 01100110 */
+    0x6c, /* 01101100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x66, /* 01100110 */
+    0xce, /* 11001110 */
+    0x9a, /* 10011010 */
+    0x3f, /* 00111111 */
+    0x06, /* 00000110 */
+    0x06, /* 00000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 173 0xad '­' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 174 0xae '®' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x36, /* 00110110 */
+    0x6c, /* 01101100 */
+    0xd8, /* 11011000 */
+    0x6c, /* 01101100 */
+    0x36, /* 00110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 175 0xaf '¯' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xd8, /* 11011000 */
+    0x6c, /* 01101100 */
+    0x36, /* 00110110 */
+    0x6c, /* 01101100 */
+    0xd8, /* 11011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 176 0xb0 '°' */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+    0x11, /* 00010001 */
+    0x44, /* 01000100 */
+
+    /* 177 0xb1 '±' */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+    0x55, /* 01010101 */
+    0xaa, /* 10101010 */
+
+    /* 178 0xb2 '²' */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+    0xdd, /* 11011101 */
+    0x77, /* 01110111 */
+
+    /* 179 0xb3 '³' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 180 0xb4 '´' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 181 0xb5 'µ' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 182 0xb6 '¶' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xf6, /* 11110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 183 0xb7 '·' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 184 0xb8 '¸' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 185 0xb9 '¹' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xf6, /* 11110110 */
+    0x06, /* 00000110 */
+    0xf6, /* 11110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 186 0xba 'º' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 187 0xbb '»' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x06, /* 00000110 */
+    0xf6, /* 11110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 188 0xbc '¼' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xf6, /* 11110110 */
+    0x06, /* 00000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 189 0xbd '½' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 190 0xbe '¾' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 191 0xbf '¿' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xf8, /* 11111000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 192 0xc0 'À' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 193 0xc1 'Á' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 194 0xc2 'Â' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 195 0xc3 'Ã' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 196 0xc4 'Ä' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 197 0xc5 'Å' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xff, /* 11111111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 198 0xc6 'Æ' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 199 0xc7 'Ç' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x37, /* 00110111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 200 0xc8 'È' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x37, /* 00110111 */
+    0x30, /* 00110000 */
+    0x3f, /* 00111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 201 0xc9 'É' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3f, /* 00111111 */
+    0x30, /* 00110000 */
+    0x37, /* 00110111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 202 0xca 'Ê' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xf7, /* 11110111 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 203 0xcb 'Ë' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0xf7, /* 11110111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 204 0xcc 'Ì' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x37, /* 00110111 */
+    0x30, /* 00110000 */
+    0x37, /* 00110111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 205 0xcd 'Í' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 206 0xce 'Î' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xf7, /* 11110111 */
+    0x00, /* 00000000 */
+    0xf7, /* 11110111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 207 0xcf 'Ï' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 208 0xd0 'Ð' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 209 0xd1 'Ñ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 210 0xd2 'Ò' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 211 0xd3 'Ó' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x3f, /* 00111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 212 0xd4 'Ô' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 213 0xd5 'Õ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 214 0xd6 'Ö' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x3f, /* 00111111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 215 0xd7 '×' */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0xff, /* 11111111 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+
+    /* 216 0xd8 'Ø' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xff, /* 11111111 */
+    0x18, /* 00011000 */
+    0xff, /* 11111111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 217 0xd9 'Ù' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xf8, /* 11111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 218 0xda 'Ú' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1f, /* 00011111 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 219 0xdb 'Û' */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+
+    /* 220 0xdc 'Ü' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+
+    /* 221 0xdd 'Ý' */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+    0xf0, /* 11110000 */
+
+    /* 222 0xde 'Þ' */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+    0x0f, /* 00001111 */
+
+    /* 223 0xdf 'ß' */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0xff, /* 11111111 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 224 0xe0 'à' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xdc, /* 11011100 */
+    0x76, /* 01110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 225 0xe1 'á' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x78, /* 01111000 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xcc, /* 11001100 */
+    0xd8, /* 11011000 */
+    0xcc, /* 11001100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xcc, /* 11001100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 226 0xe2 'â' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0xc0, /* 11000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 227 0xe3 'ã' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 228 0xe4 'ä' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 229 0xe5 'å' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 230 0xe6 'æ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x7c, /* 01111100 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0x00, /* 00000000 */
+
+    /* 231 0xe7 'ç' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 232 0xe8 'è' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 233 0xe9 'é' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xfe, /* 11111110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 234 0xea 'ê' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0xee, /* 11101110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 235 0xeb 'ë' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1e, /* 00011110 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x3e, /* 00111110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x66, /* 01100110 */
+    0x3c, /* 00111100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 236 0xec 'ì' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0xdb, /* 11011011 */
+    0xdb, /* 11011011 */
+    0xdb, /* 11011011 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 237 0xed 'í' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x03, /* 00000011 */
+    0x06, /* 00000110 */
+    0x7e, /* 01111110 */
+    0xdb, /* 11011011 */
+    0xdb, /* 11011011 */
+    0xf3, /* 11110011 */
+    0x7e, /* 01111110 */
+    0x60, /* 01100000 */
+    0xc0, /* 11000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 238 0xee 'î' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x1c, /* 00011100 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x7c, /* 01111100 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x1c, /* 00011100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 239 0xef 'ï' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7c, /* 01111100 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0xc6, /* 11000110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 240 0xf0 'ð' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0xfe, /* 11111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 241 0xf1 'ñ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x7e, /* 01111110 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 242 0xf2 'ò' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x06, /* 00000110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 243 0xf3 'ó' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x30, /* 00110000 */
+    0x60, /* 01100000 */
+    0x30, /* 00110000 */
+    0x18, /* 00011000 */
+    0x0c, /* 00001100 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 244 0xf4 'ô' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x0e, /* 00001110 */
+    0x1b, /* 00011011 */
+    0x1b, /* 00011011 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+
+    /* 245 0xf5 'õ' */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0xd8, /* 11011000 */
+    0x70, /* 01110000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 246 0xf6 'ö' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 247 0xf7 '÷' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x00, /* 00000000 */
+    0x76, /* 01110110 */
+    0xdc, /* 11011100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 248 0xf8 'ø' */
+    0x00, /* 00000000 */
+    0x38, /* 00111000 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x38, /* 00111000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 249 0xf9 'ù' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 250 0xfa 'ú' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x18, /* 00011000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 251 0xfb 'û' */
+    0x00, /* 00000000 */
+    0x0f, /* 00001111 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0x0c, /* 00001100 */
+    0xec, /* 11101100 */
+    0x6c, /* 01101100 */
+    0x6c, /* 01101100 */
+    0x3c, /* 00111100 */
+    0x1c, /* 00011100 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 252 0xfc 'ü' */
+    0x00, /* 00000000 */
+    0x6c, /* 01101100 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x36, /* 00110110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 253 0xfd 'ý' */
+    0x00, /* 00000000 */
+    0x3c, /* 00111100 */
+    0x66, /* 01100110 */
+    0x0c, /* 00001100 */
+    0x18, /* 00011000 */
+    0x32, /* 00110010 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 254 0xfe 'þ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x7e, /* 01111110 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+    /* 255 0xff 'ÿ' */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+    0x00, /* 00000000 */
+
+};
diff --git a/ui/meson.build b/ui/meson.build
index 69404bca71a..683818fcbe0 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -15,6 +15,7 @@ system_ss.add(files(
   'ui-hmp-cmds.c',
   'ui-qmp-cmds.c',
   'util.c',
+  'vgafont.c',
 ))
 system_ss.add(when: pixman, if_true: files('console-vc.c'), if_false: files('console-vc-stubs.c'))
 if dbus_display
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 29/40] ui/vgafont: add SPDX license header
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (27 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 28/40] ui: avoid duplicating vgafont16 in each translation unit marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 30/40] util: move datadir.c from system/ marcandre.lureau
                   ` (12 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The vgafont was added without source origin, but it can be traced back
to Linux kernel, which used
GPL-2 (https://github.com/mpe/linux-fullhistory/blob/master/lib/fonts/font_8x16.c).

commit c6f37d0e4feeb264a699eda289d3cc69405100b0
Author: Fabrice Bellard <fabrice@bellard.org>
Date:   Wed Jul 14 17:39:50 2004 +0000

    virtual console

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vgafont.h | 3 +++
 ui/vgafont.c | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/ui/vgafont.h b/ui/vgafont.h
index 4498ac4e07b..54aeeb7d192 100644
--- a/ui/vgafont.h
+++ b/ui/vgafont.h
@@ -1,3 +1,6 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 #ifndef VGAFONT_H
 #define VGAFONT_H
 
diff --git a/ui/vgafont.c b/ui/vgafont.c
index 708c845a6bf..b9b9a7016f0 100644
--- a/ui/vgafont.c
+++ b/ui/vgafont.c
@@ -1,3 +1,6 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 #include "vgafont.h"
 
 const uint8_t vgafont16[256 * 16] = {
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 30/40] util: move datadir.c from system/
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (28 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 29/40] ui/vgafont: add SPDX license header marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 31/40] system: make qemu_del_vm_change_state_handler accept NULL marcandre.lureau
                   ` (11 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The datadir module provides general-purpose data file lookup
utilities that are not specific to system emulation. Move it
to util/ so it can be reused more broadly.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 {system => util}/datadir.c | 0
 system/meson.build         | 1 -
 system/trace-events        | 1 -
 util/meson.build           | 1 +
 util/trace-events          | 3 +++
 5 files changed, 4 insertions(+), 2 deletions(-)
 rename {system => util}/datadir.c (100%)

diff --git a/system/datadir.c b/util/datadir.c
similarity index 100%
rename from system/datadir.c
rename to util/datadir.c
diff --git a/system/meson.build b/system/meson.build
index 579e8353d53..9cdfe1b3e75 100644
--- a/system/meson.build
+++ b/system/meson.build
@@ -8,7 +8,6 @@ system_ss.add(files(
   'bootdevice.c',
   'cpus.c',
   'cpu-timers.c',
-  'datadir.c',
   'dirtylimit.c',
   'dma-helpers.c',
   'exit-with-parent.c',
diff --git a/system/trace-events b/system/trace-events
index 6d29a823f04..e6e1b612798 100644
--- a/system/trace-events
+++ b/system/trace-events
@@ -46,7 +46,6 @@ vm_stop_flush_all(int ret) "ret %d"
 
 # vl.c
 vm_state_notify(int running, int reason, const char *reason_str) "running %d reason %d (%s)"
-load_file(const char *name, const char *path) "name %s location %s"
 runstate_set(int current_state, const char *current_state_str, int new_state, const char *new_state_str) "current_run_state %d (%s) new_state %d (%s)"
 system_wakeup_request(int reason) "reason=%d"
 qemu_system_shutdown_request(int reason) "reason=%d"
diff --git a/util/meson.build b/util/meson.build
index 5d3fff0eea4..8bed0267c07 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -30,6 +30,7 @@ util_ss.add(when: linux_io_uring, if_true: files('fdmon-io_uring.c'))
 if glib_has_gslice
   util_ss.add(files('qtree.c'))
 endif
+util_ss.add(files('datadir.c'))
 util_ss.add(files('defer-call.c'))
 util_ss.add(files('envlist.c', 'path.c', 'module.c'))
 util_ss.add(files('event.c'))
diff --git a/util/trace-events b/util/trace-events
index 540d6625073..df549646d12 100644
--- a/util/trace-events
+++ b/util/trace-events
@@ -114,3 +114,6 @@ uffd_unregister_memory_failed(void *addr, uint64_t length, int err) "addr: %p le
 # module.c
 module_load_module(const char *name) "file %s"
 module_lookup_object_type(const char *name) "name %s"
+
+# datadir.c
+load_file(const char *name, const char *path) "name %s location %s"
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 31/40] system: make qemu_del_vm_change_state_handler accept NULL
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (29 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 30/40] util: move datadir.c from system/ marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 32/40] ui/vnc: assert preconditions instead of silently returning marcandre.lureau
                   ` (10 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau, Paolo Bonzini

From: Marc-André Lureau <marcandre.lureau@redhat.com>

For convenience.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 system/runstate.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/system/runstate.c b/system/runstate.c
index 2d4e95a2166..770253b467b 100644
--- a/system/runstate.c
+++ b/system/runstate.c
@@ -349,6 +349,9 @@ VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
 
 void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
 {
+    if (!e) {
+        return;
+    }
     QTAILQ_REMOVE(&vm_change_state_head, e, entries);
     g_free(e);
 }
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 32/40] ui/vnc: assert preconditions instead of silently returning
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (30 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 31/40] system: make qemu_del_vm_change_state_handler accept NULL marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 33/40] ui/vnc: simplify vnc_init_func error handling marcandre.lureau
                   ` (9 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Replace defensive NULL guards with assert() in vnc_display_close()
and vnc_display_open(). These are internal functions whose callers
guarantee non-NULL arguments, so a NULL value would indicate a
programming error rather than a runtime condition.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/ui/vnc.c b/ui/vnc.c
index 4aa446a48d7..e6860cf4c8b 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3467,9 +3467,7 @@ void vnc_display_init(const char *id, Error **errp)
 
 static void vnc_display_close(VncDisplay *vd)
 {
-    if (!vd) {
-        return;
-    }
+    assert(vd);
 
     if (vd->listener) {
         qio_net_listener_disconnect(vd->listener);
@@ -4070,15 +4068,10 @@ void vnc_display_open(const char *id, Error **errp)
     const char *audiodev;
     const char *passwordSecret;
 
-    if (!vd) {
-        error_setg(errp, "VNC display not active");
-        return;
-    }
-    vnc_display_close(vd);
+    assert(vd);
+    assert(opts);
 
-    if (!opts) {
-        return;
-    }
+    vnc_display_close(vd);
 
     reverse = qemu_opt_get_bool(opts, "reverse", false);
     if (vnc_display_get_addresses(opts, reverse, &saddr_list, &wsaddr_list,
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 33/40] ui/vnc: simplify vnc_init_func error handling
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (31 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 32/40] ui/vnc: assert preconditions instead of silently returning marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 34/40] ui/vnc: VncDisplay.id is not const marcandre.lureau
                   ` (8 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/ui/vnc.c b/ui/vnc.c
index e6860cf4c8b..23af83fd6c8 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -4321,7 +4321,7 @@ void vnc_parse(const char *str)
 
 int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
 {
-    Error *local_err = NULL;
+    ERRP_GUARD();
     char *id = (char *)qemu_opts_id(opts);
 
     if (!id) {
@@ -4329,14 +4329,12 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
         id = vnc_auto_assign_id(opts);
     }
 
-    vnc_display_init(id, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    vnc_display_init(id, errp);
+    if (*errp) {
         return -1;
     }
-    vnc_display_open(id, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    vnc_display_open(id, errp);
+    if (*errp) {
         return -1;
     }
     return 0;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 34/40] ui/vnc: VncDisplay.id is not const
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (32 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 33/40] ui/vnc: simplify vnc_init_func error handling marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 35/40] ui/keymaps: introduce kbd_layout_free() marcandre.lureau
                   ` (7 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

s/strdup/g_strdup to highlight the issue and be consistent with other
allocations.

The next patch is going to introduce vnc_display_free() to take care of
deallocating it.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.h | 2 +-
 ui/vnc.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ui/vnc.h b/ui/vnc.h
index ec8d0c91b57..c5d678ac31e 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -166,7 +166,7 @@ struct VncDisplay
     pixman_image_t *server;    /* vnc server surface */
     int true_width; /* server surface width before rounding up */
 
-    const char *id;
+    char *id;
     QTAILQ_ENTRY(VncDisplay) next;
     char *password;
     time_t expires;
diff --git a/ui/vnc.c b/ui/vnc.c
index 23af83fd6c8..d5d92c0d99b 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3433,7 +3433,7 @@ void vnc_display_init(const char *id, Error **errp)
     }
     vd = g_malloc0(sizeof(*vd));
 
-    vd->id = strdup(id);
+    vd->id = g_strdup(id);
     QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
 
     QTAILQ_INIT(&vd->clients);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 35/40] ui/keymaps: introduce kbd_layout_free()
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (33 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 34/40] ui/vnc: VncDisplay.id is not const marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 36/40] ui/vnc: fix vnc_display_init() leak on failure marcandre.lureau
                   ` (6 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Enable callers to properly tear down keyboard layouts.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/keymaps.h |  1 +
 ui/keymaps.c | 13 ++++++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/ui/keymaps.h b/ui/keymaps.h
index 3d52c0882a1..e8917e56404 100644
--- a/ui/keymaps.h
+++ b/ui/keymaps.h
@@ -54,6 +54,7 @@ typedef struct kbd_layout_t kbd_layout_t;
 
 kbd_layout_t *init_keyboard_layout(const name2keysym_t *table,
                                    const char *language, Error **errp);
+void kbd_layout_free(kbd_layout_t *k);
 int keysym2scancode(kbd_layout_t *k, int keysym,
                     QKbdState *kbd, bool down);
 int keycode_is_keypad(kbd_layout_t *k, int keycode);
diff --git a/ui/keymaps.c b/ui/keymaps.c
index 2359dbfe7e6..d1b3f43dc8a 100644
--- a/ui/keymaps.c
+++ b/ui/keymaps.c
@@ -178,6 +178,14 @@ out:
     return ret;
 }
 
+void kbd_layout_free(kbd_layout_t *k)
+{
+    if (!k) {
+        return;
+    }
+    g_hash_table_unref(k->hash);
+    g_free(k);
+}
 
 kbd_layout_t *init_keyboard_layout(const name2keysym_t *table,
                                    const char *language, Error **errp)
@@ -185,10 +193,9 @@ kbd_layout_t *init_keyboard_layout(const name2keysym_t *table,
     kbd_layout_t *k;
 
     k = g_new0(kbd_layout_t, 1);
-    k->hash = g_hash_table_new(NULL, NULL);
+    k->hash = g_hash_table_new_full(NULL, NULL, NULL, g_free);
     if (parse_keyboard_layout(k, table, language, errp) < 0) {
-        g_hash_table_unref(k->hash);
-        g_free(k);
+        kbd_layout_free(k);
         return NULL;
     }
     return k;
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 36/40] ui/vnc: fix vnc_display_init() leak on failure
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (34 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 35/40] ui/keymaps: introduce kbd_layout_free() marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 37/40] ui/vnc: make vnc_disconnect_finish() private marcandre.lureau
                   ` (5 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Do not add the display state to the vnc list, if the initialization
failed. Add vnc_display_free(), to free the display state and associated
data in such case. The function is meant to be public and reused in the
following changes.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/ui/vnc.c b/ui/vnc.c
index d5d92c0d99b..37ebd1a534a 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3424,6 +3424,8 @@ static void vmstate_change_handler(void *opaque, bool running, RunState state)
     update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
 }
 
+static void vnc_display_free(VncDisplay *vd);
+
 void vnc_display_init(const char *id, Error **errp)
 {
     VncDisplay *vd;
@@ -3433,8 +3435,9 @@ void vnc_display_init(const char *id, Error **errp)
     }
     vd = g_malloc0(sizeof(*vd));
 
+    qemu_mutex_init(&vd->mutex);
     vd->id = g_strdup(id);
-    QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
+    vd->dcl.ops = &dcl_ops;
 
     QTAILQ_INIT(&vd->clients);
     vd->expires = TIME_MAX;
@@ -3448,22 +3451,22 @@ void vnc_display_init(const char *id, Error **errp)
     }
 
     if (!vd->kbd_layout) {
+        vnc_display_free(vd);
         return;
     }
 
     vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
     vd->connections_limit = 32;
 
-    qemu_mutex_init(&vd->mutex);
     vnc_start_worker_thread();
 
-    vd->dcl.ops = &dcl_ops;
     register_displaychangelistener(&vd->dcl);
     vd->kbd = qkbd_state_init(vd->dcl.con);
     vd->vmstate_handler_entry = qemu_add_vm_change_state_handler(
         &vmstate_change_handler, vd);
-}
 
+    QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
+}
 
 static void vnc_display_close(VncDisplay *vd)
 {
@@ -3507,6 +3510,28 @@ static void vnc_display_close(VncDisplay *vd)
 #endif
 }
 
+static void vnc_display_free(VncDisplay *vd)
+{
+    if (!vd) {
+        return;
+    }
+
+    assert(QTAILQ_EMPTY(&vd->clients));
+
+    vnc_display_close(vd);
+    unregister_displaychangelistener(&vd->dcl);
+    qkbd_state_free(vd->kbd);
+    qemu_del_vm_change_state_handler(vd->vmstate_handler_entry);
+    kbd_layout_free(vd->kbd_layout);
+    qemu_mutex_destroy(&vd->mutex);
+    if (QTAILQ_IN_USE(vd, next)) {
+        QTAILQ_REMOVE(&vnc_displays, vd, next);
+    }
+    g_free(vd->id);
+    g_free(vd);
+}
+
+
 int vnc_display_password(const char *id, const char *password, Error **errp)
 {
     VncDisplay *vd = vnc_display_find(id);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 37/40] ui/vnc: make vnc_disconnect_finish() private
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (35 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 36/40] ui/vnc: fix vnc_display_init() leak on failure marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 38/40] ui/vnc: remove left-over dead code marcandre.lureau
                   ` (4 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.h | 1 -
 ui/vnc.c | 3 ++-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ui/vnc.h b/ui/vnc.h
index c5d678ac31e..110c2bd4600 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -570,7 +570,6 @@ void vnc_write_u16(VncState *vs, uint16_t value);
 void vnc_write_u8(VncState *vs, uint8_t value);
 void vnc_flush(VncState *vs);
 void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
-void vnc_disconnect_finish(VncState *vs);
 void vnc_start_protocol(VncState *vs);
 
 
diff --git a/ui/vnc.c b/ui/vnc.c
index 37ebd1a534a..947ebd89471 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -70,6 +70,7 @@ static QTAILQ_HEAD(, VncDisplay) vnc_displays =
 
 static int vnc_cursor_define(VncState *vs);
 static void vnc_update_throttle_offset(VncState *vs);
+static void vnc_disconnect_finish(VncState *vs);
 
 static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
 {
@@ -1306,7 +1307,7 @@ static void vnc_disconnect_start(VncState *vs)
     vs->disconnecting = TRUE;
 }
 
-void vnc_disconnect_finish(VncState *vs)
+static void vnc_disconnect_finish(VncState *vs)
 {
     VncConnection *vc = container_of(vs, VncConnection, vs);
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 38/40] ui/vnc: remove left-over dead code
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (36 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 37/40] ui/vnc: make vnc_disconnect_finish() private marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 39/40] ui/vnc: explicitly link with png marcandre.lureau
                   ` (3 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Since commit 5994dcb8d85 ("ui, monitor: remove deprecated VNC ACL option
and HMP commands"), this field is no longer used.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vnc.h | 1 -
 ui/vnc.c | 4 ----
 2 files changed, 5 deletions(-)

diff --git a/ui/vnc.h b/ui/vnc.h
index 110c2bd4600..472a55f7b5f 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -178,7 +178,6 @@ struct VncDisplay
     bool non_adaptive;
     bool power_control;
     QCryptoTLSCreds *tlscreds;
-    QAuthZ *tlsauthz;
     char *tlsauthzid;
 #ifdef CONFIG_VNC_SASL
     VncDisplaySASL sasl;
diff --git a/ui/vnc.c b/ui/vnc.c
index 947ebd89471..ad8d58a23d7 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3491,10 +3491,6 @@ static void vnc_display_close(VncDisplay *vd)
         object_unref(OBJECT(vd->tlscreds));
         vd->tlscreds = NULL;
     }
-    if (vd->tlsauthz) {
-        object_unparent(OBJECT(vd->tlsauthz));
-        vd->tlsauthz = NULL;
-    }
     g_free(vd->tlsauthzid);
     vd->tlsauthzid = NULL;
     if (vd->lock_key_sync) {
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 39/40] ui/vnc: explicitly link with png
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (37 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 38/40] ui/vnc: remove left-over dead code marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-22 10:40 ` [PULL 40/40] tests: rename the dbus-daemon helper script marcandre.lureau
                   ` (2 subsequent siblings)
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The VNC code uses PNG directly.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/meson.build b/ui/meson.build
index 683818fcbe0..4e533d30460 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -42,7 +42,7 @@ vnc_ss.add(files(
   'vnc-jobs.c',
   'vnc-clipboard.c',
 ))
-vnc_ss.add(zlib, jpeg)
+vnc_ss.add(zlib, jpeg, png)
 vnc_ss.add(when: sasl, if_true: files('vnc-auth-sasl.c'))
 system_ss.add_all(when: [vnc, pixman], if_true: vnc_ss)
 system_ss.add(when: vnc, if_false: files('vnc-stubs.c'))
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PULL 40/40] tests: rename the dbus-daemon helper script
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (38 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 39/40] ui/vnc: explicitly link with png marcandre.lureau
@ 2026-04-22 10:40 ` marcandre.lureau
  2026-04-23  1:03 ` [PULL 00/40] UI patches Stefan Hajnoczi
  2026-04-24 14:50 ` Michael Tokarev
  41 siblings, 0 replies; 43+ messages in thread
From: marcandre.lureau @ 2026-04-22 10:40 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, Marc-André Lureau, Fabiano Rosas,
	Laurent Vivier, Paolo Bonzini

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The following patches are going to use it for qemu-vnc.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tests/{dbus-vmstate-daemon.sh => dbus-daemon.sh} | 0
 tests/qtest/meson.build                          | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename tests/{dbus-vmstate-daemon.sh => dbus-daemon.sh} (100%)

diff --git a/tests/dbus-vmstate-daemon.sh b/tests/dbus-daemon.sh
similarity index 100%
rename from tests/dbus-vmstate-daemon.sh
rename to tests/dbus-daemon.sh
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index be4fa627b5f..b735f55fc40 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -435,7 +435,7 @@ foreach dir : target_dirs
     qtest_env.set('QTEST_QEMU_IMG', './qemu-img')
     test_deps += [qemu_img]
   endif
-  qtest_env.set('G_TEST_DBUS_DAEMON', meson.project_source_root() / 'tests/dbus-vmstate-daemon.sh')
+  qtest_env.set('G_TEST_DBUS_DAEMON', meson.project_source_root() / 'tests/dbus-daemon.sh')
   qtest_env.set('QTEST_QEMU_BINARY', './qemu-system-' + target_base)
   if have_tools and have_vhost_user_blk_server
     qtest_env.set('QTEST_QEMU_STORAGE_DAEMON_BINARY', './storage-daemon/qemu-storage-daemon')
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [PULL 00/40] UI patches
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (39 preceding siblings ...)
  2026-04-22 10:40 ` [PULL 40/40] tests: rename the dbus-daemon helper script marcandre.lureau
@ 2026-04-23  1:03 ` Stefan Hajnoczi
  2026-04-24 14:50 ` Michael Tokarev
  41 siblings, 0 replies; 43+ messages in thread
From: Stefan Hajnoczi @ 2026-04-23  1:03 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, peter.maydell, Marc-André Lureau

[-- Attachment #1: Type: text/plain, Size: 17 bytes --]

Applied, thanks.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 484 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PULL 00/40] UI patches
  2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
                   ` (40 preceding siblings ...)
  2026-04-23  1:03 ` [PULL 00/40] UI patches Stefan Hajnoczi
@ 2026-04-24 14:50 ` Michael Tokarev
  41 siblings, 0 replies; 43+ messages in thread
From: Michael Tokarev @ 2026-04-24 14:50 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel; +Cc: qemu-stable

On 22.04.2026 13:40, marcandre.lureau@redhat.com wrote:
...
> UI-related fixes and cleanups

> GuoHan Zhao (3):
>    ui/input-linux: close evdev fd when qemu_set_blocking fails
>    ui/spice-app: detect runtime directory creation failures
>    ui/clipboard: clear deferred serial reset flag on resume
> 
> Marc-André Lureau (36):
>    ui/vnc-jobs: remove needless buffer_reset() before end
>    ui/vnc: clarify intent using buffer_empty() function
>    ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL
>    ui/vnc-jobs: remove dead VncJobQueue.exit
>    ui/vnc-jobs: remove vnc_queue_clear()
>    ui/vnc-jobs: narrow taking the queue lock
>    ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self()
>    ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)
>    ui/console-vc: ignore string-type escape sequences
>    ui/console-vc: fix comment shift-out/in comments
>    ui/console: dispatch get_label() through QOM virtual method
>    ui/console-vc: introduce QemuVT100
>    ui/console-vc: set vt100 associated pixman image
>    ui/console-vc: vga_putcharxy()->vt100_putcharxy()
>    ui/console-vc: make invalidate_xy() take vt100
>    ui/console-vc: make show_cursor() take vt100
>    ui/console-vc: decouple VT100 display updates via function pointer
>    ui/console-vc: console_refresh() -> vt100_refresh()
>    ui/console-vc: move cursor blinking logic into VT100 layer
>    ui/console-vc: console_scroll() -> vt100_scroll()
>    ui/console-vc: refactor text_console_resize() into vt100_set_image()
>    ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf()
>    ui/console-vc: unify the write path
>    ui: avoid duplicating vgafont16 in each translation unit
>    ui/vgafont: add SPDX license header
>    util: move datadir.c from system/
>    system: make qemu_del_vm_change_state_handler accept NULL
>    ui/vnc: assert preconditions instead of silently returning
>    ui/vnc: simplify vnc_init_func error handling
>    ui/vnc: VncDisplay.id is not const
>    ui/keymaps: introduce kbd_layout_free()
>    ui/vnc: fix vnc_display_init() leak on failure
>    ui/vnc: make vnc_disconnect_finish() private
>    ui/vnc: remove left-over dead code
>    ui/vnc: explicitly link with png
>    tests: rename the dbus-daemon helper script
> 
> Werner de Carne (1):
>    serial COM: windows serial COM PollingFunc don't sleep

 From the above, I'm picking up:

     serial COM: windows serial COM PollingFunc don't sleep
     ui/spice-app: detect runtime directory creation failures
     ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)

for the stable series.

Please let me know if I should pick some other changes from here, or
the ones I already picked up, should not be in stable.

Thanks,

/mjt


^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2026-04-24 14:51 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-22 10:40 [PULL 00/40] UI patches marcandre.lureau
2026-04-22 10:40 ` [PULL 01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails marcandre.lureau
2026-04-22 10:40 ` [PULL 02/40] ui/spice-app: detect runtime directory creation failures marcandre.lureau
2026-04-22 10:40 ` [PULL 03/40] serial COM: windows serial COM PollingFunc don't sleep marcandre.lureau
2026-04-22 10:40 ` [PULL 04/40] ui/clipboard: clear deferred serial reset flag on resume marcandre.lureau
2026-04-22 10:40 ` [PULL 05/40] ui/vnc-jobs: remove needless buffer_reset() before end marcandre.lureau
2026-04-22 10:40 ` [PULL 06/40] ui/vnc: clarify intent using buffer_empty() function marcandre.lureau
2026-04-22 10:40 ` [PULL 07/40] ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL marcandre.lureau
2026-04-22 10:40 ` [PULL 08/40] ui/vnc-jobs: remove dead VncJobQueue.exit marcandre.lureau
2026-04-22 10:40 ` [PULL 09/40] ui/vnc-jobs: remove vnc_queue_clear() marcandre.lureau
2026-04-22 10:40 ` [PULL 10/40] ui/vnc-jobs: narrow taking the queue lock marcandre.lureau
2026-04-22 10:40 ` [PULL 11/40] ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self() marcandre.lureau
2026-04-22 10:40 ` [PULL 12/40] ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen) marcandre.lureau
2026-04-22 10:40 ` [PULL 13/40] ui/console-vc: ignore string-type escape sequences marcandre.lureau
2026-04-22 10:40 ` [PULL 14/40] ui/console-vc: fix comment shift-out/in comments marcandre.lureau
2026-04-22 10:40 ` [PULL 15/40] ui/console: dispatch get_label() through QOM virtual method marcandre.lureau
2026-04-22 10:40 ` [PULL 16/40] ui/console-vc: introduce QemuVT100 marcandre.lureau
2026-04-22 10:40 ` [PULL 17/40] ui/console-vc: set vt100 associated pixman image marcandre.lureau
2026-04-22 10:40 ` [PULL 18/40] ui/console-vc: vga_putcharxy()->vt100_putcharxy() marcandre.lureau
2026-04-22 10:40 ` [PULL 19/40] ui/console-vc: make invalidate_xy() take vt100 marcandre.lureau
2026-04-22 10:40 ` [PULL 20/40] ui/console-vc: make show_cursor() " marcandre.lureau
2026-04-22 10:40 ` [PULL 21/40] ui/console-vc: decouple VT100 display updates via function pointer marcandre.lureau
2026-04-22 10:40 ` [PULL 22/40] ui/console-vc: console_refresh() -> vt100_refresh() marcandre.lureau
2026-04-22 10:40 ` [PULL 23/40] ui/console-vc: move cursor blinking logic into VT100 layer marcandre.lureau
2026-04-22 10:40 ` [PULL 24/40] ui/console-vc: console_scroll() -> vt100_scroll() marcandre.lureau
2026-04-22 10:40 ` [PULL 25/40] ui/console-vc: refactor text_console_resize() into vt100_set_image() marcandre.lureau
2026-04-22 10:40 ` [PULL 26/40] ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf() marcandre.lureau
2026-04-22 10:40 ` [PULL 27/40] ui/console-vc: unify the write path marcandre.lureau
2026-04-22 10:40 ` [PULL 28/40] ui: avoid duplicating vgafont16 in each translation unit marcandre.lureau
2026-04-22 10:40 ` [PULL 29/40] ui/vgafont: add SPDX license header marcandre.lureau
2026-04-22 10:40 ` [PULL 30/40] util: move datadir.c from system/ marcandre.lureau
2026-04-22 10:40 ` [PULL 31/40] system: make qemu_del_vm_change_state_handler accept NULL marcandre.lureau
2026-04-22 10:40 ` [PULL 32/40] ui/vnc: assert preconditions instead of silently returning marcandre.lureau
2026-04-22 10:40 ` [PULL 33/40] ui/vnc: simplify vnc_init_func error handling marcandre.lureau
2026-04-22 10:40 ` [PULL 34/40] ui/vnc: VncDisplay.id is not const marcandre.lureau
2026-04-22 10:40 ` [PULL 35/40] ui/keymaps: introduce kbd_layout_free() marcandre.lureau
2026-04-22 10:40 ` [PULL 36/40] ui/vnc: fix vnc_display_init() leak on failure marcandre.lureau
2026-04-22 10:40 ` [PULL 37/40] ui/vnc: make vnc_disconnect_finish() private marcandre.lureau
2026-04-22 10:40 ` [PULL 38/40] ui/vnc: remove left-over dead code marcandre.lureau
2026-04-22 10:40 ` [PULL 39/40] ui/vnc: explicitly link with png marcandre.lureau
2026-04-22 10:40 ` [PULL 40/40] tests: rename the dbus-daemon helper script marcandre.lureau
2026-04-23  1:03 ` [PULL 00/40] UI patches Stefan Hajnoczi
2026-04-24 14:50 ` Michael Tokarev

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.