Hello, (Cc-ing the grub-devel mailing list for the record)
Just a few short points: - brltty GPL2+ and has a _lot_ of drivers for braille devices, it would be sad to not reuse them :) - speakup is also GPL2+ and has drivers for hardware speech syntheses. - qemu can emulate a Baum braille device through the -usbserial braille or -serial braille options. The output needs to be done through brltty, thanks to its virtual braille device for instance. I had written some howto on http://brl.thefreecat.org/text-apps-a11y-test.html - I had already developed something to make grub accessible through braille devices, in GRUB1, as a prototype, I've attached it. I've never had the time to develop it more. How I see things working concerning braille: you can have a look at my prototype to see how I had done it, and probably more importantly, what the interface with device drivers would look like: braille.h only has braille_init() to initialize the serial port and braille_write() to output text. One missing thing is a function that tells how large the braille device is (usually it's 40 cells). A simple way to proceed easily from the core grub part would be to write a prototype that just outputs text on the serial port as is, so that you just need to use -serial stdio for instance. Glueing brltty drivers to it could then be done independently, I can handle that as I know them quite well. Concerning screen reading, the way that is usually used is that normal PC keyboard actions work as usual, the regular screen output works as usual, and the braille device and speech output the text corresponding to the current action (e.g. the currently selected menu entry). That should already be a good thing. One thing to remember is that it's important to keep the regular output so that blind users can be easily helped by sighted people. Then there can be a more complete screen reader, by using keypresses from the braille device or PC keyboard shortcuts, that permits to browse around the screen. Samuel
diff -urN grub-debian-patched/configure.ac grub-0.95+cvs20040624/configure.ac --- grub-debian-patched/configure.ac 2005-09-05 03:57:02.000000000 +0200 +++ grub-0.95+cvs20040624/configure.ac 2005-09-05 03:56:54.000000000 +0200 @@ -610,6 +610,16 @@ [ --disable-serial disable serial terminal support]) AM_CONDITIONAL(SERIAL_SUPPORT, test "x$enable_serial" != xno) +dnl Braille terminal +AC_ARG_ENABLE(braille, + [ --disable-braille disable braille terminal support]) +AM_CONDITIONAL(BRAILLE_SUPPORT, test "x$enable_braille" != xno) + +dnl VisioBraille terminal +AC_ARG_ENABLE(visiobraille, + [ --disable-visiobraille disable visiobraille terminal support]) +AM_CONDITIONAL(VISIOBRAILLE_SUPPORT, test "x$enable_visiobraille" != xno) + dnl Simulation of the slowness of a serial device. AC_ARG_ENABLE(serial-speed-simulation, [ --enable-serial-speed-simulation diff -urN grub-debian-patched/stage2/Makefile.am grub-0.95+cvs20040624/stage2/Makefile.am --- grub-debian-patched/stage2/Makefile.am 2005-09-05 03:57:03.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/Makefile.am 2005-09-05 03:56:57.000000000 +0200 @@ -7,7 +7,7 @@ fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \ imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \ nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \ - terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h + terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h braille.h visiobraille.h EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS) # For <stage1.h>. @@ -19,12 +19,13 @@ disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \ fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \ fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \ - terminfo.c tparm.c graphics.c + terminfo.c tparm.c graphics.c braille.c visiobraille.c libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \ -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \ -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \ -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \ -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \ + -DSUPPORT_BRAILLE=1 -DSUPPORT_VISIOBRAILLE=1 \ -fwritable-strings # Stage 2 and Stage 1.5's. @@ -86,8 +87,20 @@ GRAPHICS_FLAGS = endif +if BRAILLE_SUPPORT +BRAILLE_FLAGS = -DSUPPORT_BRAILLE=1 +else +BRAILLE_FLAGS = +endif + +if VISIOBRAILLE_SUPPORT +VISIOBRAILLE_FLAGS = -DSUPPORT_VISIOBRAILLE=1 +else +VISIOBRAILLE_FLAGS = +endif + STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ - $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS) + $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS) $(BRAILLE_FLAGS) $(VISIOBRAILLE_FLAGS) STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 @@ -98,7 +111,7 @@ fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \ fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \ hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \ - graphics.c + graphics.c braille.c visiobraille.c pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK) diff -urN grub-debian-patched/stage2/boot.c grub-0.95+cvs20040624/stage2/boot.c --- grub-debian-patched/stage2/boot.c 2005-09-05 03:57:03.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/boot.c 2005-09-05 03:56:57.000000000 +0200 @@ -25,6 +25,8 @@ #include "imgact_aout.h" #include "i386-elf.h" +#include "braille.h" + static int cur_addr; entry_func entry_addr; static struct mod_list mll[99]; @@ -274,6 +276,7 @@ if (! big_linux && text_len > linux_data_real_addr - (char *) LINUX_ZIMAGE_ADDR) { + braille_write("linux 'zImage' kernel too big, try 'make bzImage'", -1); grub_printf (" linux 'zImage' kernel too big, try 'make bzImage'\n"); errnum = ERR_WONT_FIT; } diff -urN grub-debian-patched/stage2/braille.c grub-0.95+cvs20040624/stage2/braille.c --- grub-debian-patched/stage2/braille.c 1970-01-01 01:00:00.000000000 +0100 +++ grub-0.95+cvs20040624/stage2/braille.c 2005-09-07 03:11:57.000000000 +0200 @@ -0,0 +1,78 @@ +#include <shared.h> +#ifdef SUPPORT_BRAILLE +#include <braille.h> +#ifdef SUPPORT_VISIOBRAILLE +#include <visiobraille.h> +#endif +static int x = 40, y = 1; +static int inited; + +int braille_init (int unit, int hp) +{ +#ifdef SUPPORT_VISIOBRAILLE + return (inited = vs_init (unit, &x, &y, hp)); +#endif + return 1; +} + +static unsigned char latin1_2_dots_vs[256] = { +0X00, 0X81, 0X83, 0X89, 0X99, 0X91, 0X8B, 0X9B, +0X93, 0X8A, 0X9A, 0X85, 0X87, 0X8D, 0X9D, 0X95, +0X8F, 0X9F, 0X97, 0X8E, 0X9E, 0XA5, 0XA7, 0XBA, +0XAD, 0XBD, 0XB5, 0XFC, 0XA1, 0XA3, 0XA9, 0XB9, +0X00, 0X16, 0X08, 0X28, 0X38, 0X18, 0X1C, 0X04, +0X20, 0X14, 0X0C, 0X30, 0X02, 0X24, 0X32, 0X3F, +0X3C, 0X21, 0X23, 0X29, 0X39, 0X31, 0X2B, 0X3B, +0X33, 0X2A, 0X12, 0X06, 0X26, 0X36, 0X34, 0X22, +0X2F, 0X41, 0X43, 0X49, 0X59, 0X51, 0X4B, 0X5B, +0X53, 0X4A, 0X5A, 0X45, 0X47, 0X4D, 0X5D, 0X55, +0X4F, 0X5F, 0X57, 0X4E, 0X5E, 0X65, 0X67, 0X7A, +0X6D, 0X7D, 0X75, 0X37, 0X2E, 0X3E, 0X2C, 0X84, +0X44, 0X01, 0X03, 0X09, 0X19, 0X11, 0X0B, 0X1B, +0X13, 0X0A, 0X1A, 0X05, 0X07, 0X0D, 0X1D, 0X15, +0X0F, 0X1F, 0X17, 0X0E, 0X1E, 0X25, 0X27, 0X3A, +0X2D, 0X3D, 0X35, 0X60, 0X96, 0X94, 0XD0, 0X00, +0XEF, 0XB3, 0X00, 0XA1, 0X9C, 0XB7, 0X00, 0XAF, +0XA3, 0XAB, 0XAE, 0XBB, 0XA9, 0X00, 0XDC, 0X00, +0XFF, 0X00, 0X00, 0XB9, 0XAA, 0X00, 0XB1, 0XBE, +0XBB, 0XEA, 0XF3, 0X00, 0X00, 0X00, 0X00, 0X00, +0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +0XF7, 0X00, 0XC1, 0X00, 0XD4, 0X00, 0X00, 0XEF, +0X00, 0XFF, 0XE3, 0XEB, 0X00, 0X00, 0XE9, 0XFB, +0X00, 0X00, 0X00, 0X00, 0XF5, 0X00, 0XEA, 0X00, +0X00, 0XFE, 0X00, 0XF1, 0XF3, 0X00, 0X00, 0X00, +0XB7, 0X00, 0XA1, 0X00, 0X9C, 0X00, 0X00, 0XAF, +0XAE, 0XBF, 0XA3, 0XAB, 0X00, 0X00, 0XA9, 0XBB, +0X00, 0X00, 0X00, 0X00, 0XB9, 0X00, 0XAA, 0X00, +0X00, 0XBE, 0X00, 0XB1, 0XB3, 0X00, 0X00, 0X00 +}; +void braille_write (unsigned char *message, int cursor) +{ + int offset; + int i; + int size = strlen(message); + char buf[x]; + if (!inited) + return; + if (cursor >= 0 && cursor <= size) + { + offset = (cursor / x) * x; + message += offset; + size -= offset; + cursor = cursor % x; + } + else + cursor = -1; + if (size > x) + size = x; + for (i=0; i<size; i++) + buf[i] = latin1_2_dots_vs[message[i]]; + memset(&buf[i], 0, x-size); + if (cursor != -1) + buf[cursor] |= BRL_DOT7|BRL_DOT8; + vs_write(buf, size); +} +#endif diff -urN grub-debian-patched/stage2/braille.h grub-0.95+cvs20040624/stage2/braille.h --- grub-debian-patched/stage2/braille.h 1970-01-01 01:00:00.000000000 +0100 +++ grub-0.95+cvs20040624/stage2/braille.h 2005-09-07 03:26:34.000000000 +0200 @@ -0,0 +1,14 @@ +#ifdef SUPPORT_BRAILLE +#define BRL_DOT1 (1<<(1-1)) +#define BRL_DOT2 (1<<(2-1)) +#define BRL_DOT3 (1<<(3-1)) +#define BRL_DOT4 (1<<(4-1)) +#define BRL_DOT5 (1<<(5-1)) +#define BRL_DOT6 (1<<(6-1)) +#define BRL_DOT7 (1<<(7-1)) +#define BRL_DOT8 (1<<(8-1)) +int braille_init(int unit, int hp); +void braille_write(unsigned char *message, int cursor); +#else +#define braille_write(m, c) ((void)0) +#endif diff -urN grub-debian-patched/stage2/builtins.c grub-0.95+cvs20040624/stage2/builtins.c --- grub-debian-patched/stage2/builtins.c 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/builtins.c 2005-09-07 03:08:25.000000000 +0200 @@ -28,6 +28,8 @@ #include <filesys.h> #include <term.h> +#include <braille.h> + #ifdef SUPPORT_NETBOOT # define GRUB 1 # include <etherboot.h> @@ -378,6 +380,28 @@ #endif /* SUPPORT_NETBOOT */ +#ifdef SUPPORT_BRAILLE +/* braille */ +static int +braille_func (char *arg, int flags) +{ + int hp = 0; + if (substring ("--hp", arg) <= 0) + hp = 1; + return braille_init(0, hp); +} + +static struct builtin builtin_braille = +{ + "braille", + braille_func, + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, + "braille", + "Initialize a braille device." +}; +#endif /* SUPPORT_BRAILLE */ + + /* cat */ static int cat_func (char *arg, int flags) @@ -3086,6 +3110,7 @@ static int pause_func (char *arg, int flags) { + braille_write(arg, -1); printf("%s\n", arg); /* If ESC is returned, then abort this entry. */ @@ -4372,6 +4397,7 @@ if (term_bitmap & (1 << i)) { current_term = term_table + i; + braille_write("Press any key to continue.", -1); grub_printf ("\rPress any key to continue.\n"); } @@ -4952,6 +4978,9 @@ #ifdef SUPPORT_NETBOOT &builtin_bootp, #endif /* SUPPORT_NETBOOT */ +#ifdef SUPPORT_BRAILLE + &builtin_braille, +#endif /* SUPPORT_BRAILLE */ &builtin_cat, &builtin_chainloader, &builtin_clear, diff -urN grub-debian-patched/stage2/char_io.c grub-0.95+cvs20040624/stage2/char_io.c --- grub-debian-patched/stage2/char_io.c 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/char_io.c 2005-09-07 03:31:44.000000000 +0200 @@ -29,6 +29,8 @@ # include <serial.h> #endif +#include <braille.h> + #ifndef STAGE1_5 struct term_entry term_table[] = { @@ -361,6 +363,7 @@ void cl_backward (int count) { lpos -= count; + braille_write(buf, lpos); /* If the cursor is in the first section, display the first section instead of the second. */ @@ -388,6 +391,7 @@ void cl_forward (int count) { lpos += count; + braille_write(buf, lpos); /* If the cursor goes outside, scroll the screen to the right. */ if (xpos + count >= CMDLINE_WIDTH) @@ -478,6 +482,7 @@ } /* Print BUF. If ECHO_CHAR is not zero, put it instead. */ + braille_write(buf, lpos); for (i = start; i < start + len && i < llen; i++) { if (! echo_char) @@ -830,6 +835,7 @@ /* Print only the prompt. The contents of CMDLINE is simply discarded, even if it is not empty. */ + braille_write(prompt, -1); grub_printf ("%s", prompt); /* Gather characters until a newline is gotten. */ @@ -845,6 +851,7 @@ /* Printable characters are added into CMDLINE. */ if (c >= ' ' && c <= '~') { + // TODO: put in some editing buffer for braille output. if (! (current_term->flags & TERM_NO_ECHO)) grub_putchar (c); @@ -1076,6 +1083,7 @@ if (current_term->setcolorstate) current_term->setcolorstate (COLOR_STATE_HIGHLIGHT); + braille_write ("[Hit return to continue]", -1); grub_printf ("[Hit return to continue]"); if (current_term->setcolorstate) diff -urN grub-debian-patched/stage2/cmdline.c grub-0.95+cvs20040624/stage2/cmdline.c --- grub-debian-patched/stage2/cmdline.c 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/cmdline.c 2005-09-05 03:56:57.000000000 +0200 @@ -25,6 +25,8 @@ # include <etherboot.h> #endif +#include <braille.h> + grub_jmp_buf restart_cmdline_env; /* Find the next word from CMDLINE and return the pointer. If @@ -203,6 +205,7 @@ intervention. */ if (fallback_entry < 0) { + braille_write("Press any key to continue...", -1); grub_printf ("\nPress any key to continue..."); (void) getkey (); } @@ -232,12 +235,15 @@ builtin = find_command (heap); if (! builtin) { + braille_write(old_entry, -1); grub_printf ("%s\n", old_entry); continue; } - if (! (builtin->flags & BUILTIN_NO_ECHO)) + if (! (builtin->flags & BUILTIN_NO_ECHO)) { + braille_write(old_entry, -1); grub_printf ("%s\n", old_entry); + } /* If BUILTIN cannot be run in the command-line, skip it. */ if (! (builtin->flags & BUILTIN_CMDLINE)) diff -urN grub-debian-patched/stage2/serial.c grub-0.95+cvs20040624/stage2/serial.c --- grub-debian-patched/stage2/serial.c 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/serial.c 2005-09-07 00:11:07.000000000 +0200 @@ -103,6 +103,16 @@ /* There is something wrong. But what can I do? */ return; } + /* Wait until CTS is up. */ + timeout=1000; + while ((inb (serial_hw_port + UART_MSR) & UART_CLEAR_TO_SEND) == 0) + { + if (--timeout == 0) + /* There is something wrong. But what can I do? */ + //return; + /* Send anyway, just in case the device does actually not support RTS/CTS */ + break; + } outb (serial_hw_port + UART_TX, c); } diff -urN grub-debian-patched/stage2/serial.h grub-0.95+cvs20040624/stage2/serial.h --- grub-debian-patched/stage2/serial.h 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/serial.h 2005-09-04 21:29:49.000000000 +0200 @@ -41,6 +41,9 @@ #define UART_DATA_READY 0x01 #define UART_EMPTY_TRANSMITTER 0x20 +/* For MSR bits. */ +#define UART_CLEAR_TO_SEND 0x10 + /* The type of parity. */ #define UART_NO_PARITY 0x00 #define UART_ODD_PARITY 0x08 diff -urN grub-debian-patched/stage2/stage2.c grub-0.95+cvs20040624/stage2/stage2.c --- grub-debian-patched/stage2/stage2.c 2005-09-05 03:57:04.000000000 +0200 +++ grub-0.95+cvs20040624/stage2/stage2.c 2005-09-06 02:37:14.000000000 +0200 @@ -19,6 +19,7 @@ #include <shared.h> #include <term.h> +#include <braille.h> grub_jmp_buf restart_env; @@ -107,6 +108,8 @@ gotoxy (2, y); grub_putchar (' '); + if (highlight) + braille_write(entry, -1); for (x = 3; x < 75; x++) { if (*entry && x <= 72) @@ -288,6 +291,7 @@ grub_timeout--; /* Print a message. */ + braille_write("Press `ESC' to enter the menu...", -1); grub_printf ("\rPress `ESC' to enter the menu... %d ", grub_timeout); } @@ -378,8 +382,10 @@ /* Key was pressed, show which entry is selected before GETKEY, since we're comming in here also on GRUB_TIMEOUT == -1 and hang in GETKEY */ - if (current_term->flags & TERM_DUMB) + if (current_term->flags & TERM_DUMB) { + braille_write(get_entry (menu_entries, first_entry + entryno, 0), -1); grub_printf ("\r Highlighted entry is %d: ", entryno); + } c = ASCII_CHAR (getkey ()); @@ -611,6 +617,7 @@ } else { + braille_write("Failed! Press any key to continue...", -1); grub_printf ("Failed!\n Press any key to continue..."); getkey (); goto restart; @@ -727,11 +734,14 @@ while (1) { - if (config_entries) + if (config_entries) { + braille_write(" Booting", -1); printf (" Booting \'%s\'\n\n", get_entry (menu_entries, first_entry + entryno, 0)); - else + } else { + braille_write(" Booting", -1); printf (" Booting command-list\n\n"); + } if (! cur_entry) cur_entry = get_entry (config_entries, first_entry + entryno, 1); diff -urN grub-debian-patched/stage2/visiobraille.c grub-0.95+cvs20040624/stage2/visiobraille.c --- grub-debian-patched/stage2/visiobraille.c 1970-01-01 01:00:00.000000000 +0100 +++ grub-0.95+cvs20040624/stage2/visiobraille.c 2005-09-07 03:15:43.000000000 +0200 @@ -0,0 +1,334 @@ +#ifdef SUPPORT_VISIOBRAILLE +#include <braille.h> +#include <visiobraille.h> +#include <serial.h> +#include <shared.h> +#define WIDTH 40 +#define SOH 1 +#define STX 2 +#define ETX 3 +#define EOT 4 +#define ENQ 5 + + +int vs_init(int unit, int *x, int *y, int hp) { + if (hp) { + if (!(serial_hw_init(serial_hw_get_port(unit), 9600, UART_8BITS_WORD, UART_NO_PARITY, UART_1_STOP_BIT))) { + grub_printf ("groumpf"); + getkey (); + } + } else { + if (!(serial_hw_init(serial_hw_get_port(unit), 57600, UART_8BITS_WORD, UART_ODD_PARITY, UART_1_STOP_BIT))) { + grub_printf ("groumpf"); + getkey (); + } + } + *x = WIDTH; + *y = 1; + return 1; +} +#define BRL_DOT_1 (1<<(1-1)) +#define BRL_DOT_2 (1<<(2-1)) +#define BRL_DOT_3 (1<<(3-1)) +#define BRL_DOT_4 (1<<(4-1)) +#define BRL_DOT_5 (1<<(5-1)) +#define BRL_DOT_6 (1<<(6-1)) +#define BRL_DOT_7 (1<<(7-1)) +#define BRL_DOT_8 (1<<(8-1)) + + static unsigned char outputTable[256] = { + [0] = 0X20, + [BRL_DOT1] = 0X41, + [BRL_DOT1 | BRL_DOT2] = 0X42, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3] = 0X4C, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4] = 0X50, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X51, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X2F, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEF, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6F, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAF, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X11, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X91, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XD1, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X40, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X00, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X80, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XC0, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X10, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X90, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XD0, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5] = 0X52, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X5b, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1B, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9B, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDB, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0X12, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X92, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XD2, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6] = 0X56, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0X16, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X96, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XD6, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT7] = 0X0C, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X8C, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT8] = 0XCC, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4] = 0X46, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5] = 0X47, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X37, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF7, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X77, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB7, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X07, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X87, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XC7, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6] = 0X36, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF6, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X76, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB6, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT7] = 0X06, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X86, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT8] = 0XC6, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5] = 0X48, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6] = 0X38, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF8, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X78, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB8, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT7] = 0X08, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X88, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT8] = 0XC8, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT6] = 0X32, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT7] = 0XF2, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X72, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT8] = 0XB2, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT7] = 0X02, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT7 | BRL_DOT8] = 0X82, + [BRL_DOT1 | BRL_DOT2 | BRL_DOT8] = 0XC2, + [BRL_DOT1 | BRL_DOT3] = 0X4B, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4] = 0X4D, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X4E, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X59, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X19, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X99, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XD9, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X0E, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8E, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XCE, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X58, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X18, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X98, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XD8, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X0D, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X8D, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XCD, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5] = 0X4F, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X5A, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1A, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9A, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDA, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0X0F, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8F, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XCF, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT6] = 0X55, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0X15, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X95, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XD5, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT7] = 0X0B, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X8B, + [BRL_DOT1 | BRL_DOT3 | BRL_DOT8] = 0XCB, + [BRL_DOT1 | BRL_DOT4] = 0X43, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5] = 0X44, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X34, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF4, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X74, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB4, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X04, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X84, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XC4, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT6] = 0X33, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF3, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X73, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB3, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT7] = 0X03, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X83, + [BRL_DOT1 | BRL_DOT4 | BRL_DOT8] = 0XC3, + [BRL_DOT1 | BRL_DOT5] = 0X45, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT6] = 0X35, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF5, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X75, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB5, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT7] = 0X05, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X85, + [BRL_DOT1 | BRL_DOT5 | BRL_DOT8] = 0XC5, + [BRL_DOT1 | BRL_DOT6] = 0X31, + [BRL_DOT1 | BRL_DOT6 | BRL_DOT7] = 0XF1, + [BRL_DOT1 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X71, + [BRL_DOT1 | BRL_DOT6 | BRL_DOT8] = 0XB1, + [BRL_DOT1 | BRL_DOT7] = 0X01, + [BRL_DOT1 | BRL_DOT7 | BRL_DOT8] = 0X81, + [BRL_DOT1 | BRL_DOT8] = 0XC1, + [BRL_DOT2] = 0X2C, + [BRL_DOT2 | BRL_DOT3] = 0X3B, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4] = 0X53, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X54, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X5D, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1D, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9D, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDD, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X14, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X94, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XD4, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X5C, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X1C, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9C, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XDC, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X13, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X93, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XD3, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5] = 0X21, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X3D, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0Xfd, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7D, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XBD, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0XE1, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X61, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XA1, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT6] = 0X3C, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0XFC, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7C, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XBC, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT7] = 0XFB, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X7B, + [BRL_DOT2 | BRL_DOT3 | BRL_DOT8] = 0XBB, + [BRL_DOT2 | BRL_DOT4] = 0X49, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5] = 0X4A, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X57, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X17, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X97, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XD7, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X0A, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8A, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XCA, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT6] = 0X39, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF9, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X79, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB9, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT7] = 0X09, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X89, + [BRL_DOT2 | BRL_DOT4 | BRL_DOT8] = 0XC9, + [BRL_DOT2 | BRL_DOT5] = 0X3A, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT6] = 0X2E, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEE, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6E, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAE, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT7] = 0XFA, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X7A, + [BRL_DOT2 | BRL_DOT5 | BRL_DOT8] = 0XBA, + [BRL_DOT2 | BRL_DOT6] = 0X3F, + [BRL_DOT2 | BRL_DOT6 | BRL_DOT7] = 0XFF, + [BRL_DOT2 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7F, + [BRL_DOT2 | BRL_DOT6 | BRL_DOT8] = 0XBF, + [BRL_DOT2 | BRL_DOT7] = 0XEC, + [BRL_DOT2 | BRL_DOT7 | BRL_DOT8] = 0X6C, + [BRL_DOT2 | BRL_DOT8] = 0XAC, + [BRL_DOT3] = 0X27, + [BRL_DOT3 | BRL_DOT4] = 0X2A, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X26, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X30, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF0, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X70, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB0, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0XE6, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X66, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XA6, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X5E, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X1E, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9E, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XDE, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0XEA, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X6A, + [BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XAA, + [BRL_DOT3 | BRL_DOT5] = 0X29, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X3E, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XFE, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7E, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XBE, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0XE9, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X69, + [BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XA9, + [BRL_DOT3 | BRL_DOT6] = 0X2D, + [BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0XED, + [BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6D, + [BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XAD, + [BRL_DOT3 | BRL_DOT7] = 0XE7, + [BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X67, + [BRL_DOT3 | BRL_DOT8] = 0XA7, + [BRL_DOT4] = 0X22, + [BRL_DOT4 | BRL_DOT5] = 0X25, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X24, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XE4, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X64, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XA4, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0XE5, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X65, + [BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XA5, + [BRL_DOT4 | BRL_DOT6] = 0X23, + [BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XE3, + [BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X63, + [BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XA3, + [BRL_DOT4 | BRL_DOT7] = 0XE2, + [BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X62, + [BRL_DOT4 | BRL_DOT8] = 0XA2, + [BRL_DOT5] = 0X5F, + [BRL_DOT5 | BRL_DOT6] = 0X2B, + [BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEB, + [BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6B, + [BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAB, + [BRL_DOT5 | BRL_DOT7] = 0X1F, + [BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X9F, + [BRL_DOT5 | BRL_DOT8] = 0XDF, + [BRL_DOT6] = 0X28, + [BRL_DOT6 | BRL_DOT7] = 0XE8, + [BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X68, + [BRL_DOT6 | BRL_DOT8] = 0XA8, + [BRL_DOT7] = 0XE0, + [BRL_DOT7 | BRL_DOT8] = 0X60, + [BRL_DOT8] = 0XA0 + }; +static void serialWrite(unsigned char *buf, int num) { + int i; + for (i=0;i<num;i++) + serial_hw_put(buf[i]); +} + +void vs_write(unsigned char *dots, int num) { + unsigned char csum = '>'; + static unsigned char outbuf[1+1+2*WIDTH+2+1] = { STX, '>' }; + int i; + unsigned char *s, c; + int tries=3; + int timeout; + int res; + for (i=0, s = outbuf+1+1; i<num; i++) { + c = dots[i]; + c = outputTable[c]; + csum ^= c; + if (c <= 5) { + *s++ = SOH; + *s++ = c|0x40; + } else *s++ = c; + } + if (csum <=5) { + *s++ = SOH; + *s++ = csum|0x40; + } else *s++ = csum; + *s++ = ETX; + while(--tries) { + serialWrite(outbuf, s-outbuf); + for (timeout = 100000; timeout; timeout--) { + res = serial_hw_fetch(); + if (res == EOT) return; + if (res == ENQ) break; + } + } +} +#endif diff -urN grub-debian-patched/stage2/visiobraille.h grub-0.95+cvs20040624/stage2/visiobraille.h --- grub-debian-patched/stage2/visiobraille.h 1970-01-01 01:00:00.000000000 +0100 +++ grub-0.95+cvs20040624/stage2/visiobraille.h 2005-09-07 03:15:26.000000000 +0200 @@ -0,0 +1,2 @@ +int vs_init(int unit, int *x, int *y, int hp); +void vs_write(unsigned char *dots, int num);
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel