diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/openbios/libopenbios | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/openbios/libopenbios')
25 files changed, 11769 insertions, 0 deletions
diff --git a/roms/openbios/libopenbios/Kconfig b/roms/openbios/libopenbios/Kconfig new file mode 100644 index 00000000..1b36f192 --- /dev/null +++ b/roms/openbios/libopenbios/Kconfig @@ -0,0 +1,97 @@ + + +menu "Module Configuration" + + +config CMDLINE +	bool "Command Line Editing" +	default y +	help +	  Improved openfirmware prompt + +config DEBLOCKER +	bool "Deblocker" +	default y +	help +	  Deblocker implementation + +endmenu + +menu "Filesystem Configuration" + +config DISK_LABEL +	bool "Disk-Label" +	default y +	help +	  Disk-label package implementation + +config PART_SUPPORT +	depends on DISK_LABEL +	bool "Partition support" +	default y +	help +	  Support for partition tables + +config MAC_PARTS +	depends on PART_SUPPORT && BIG_ENDIAN +	bool "Mac partition support" +	default y +	help +	  Support for Macintosh partition tables + +config PC_PARTS +	depends on PART_SUPPORT +	bool "PC style partition support" +	default y +	help +	  Support for PC style partition tables + +config FS +	depends on DISK_LABEL +	bool "Filesystem Support" +	default y +	help +	  Include filesystem support + +config HFS +	depends on FS && BIG_ENDIAN +	bool "HFS support" +	default y +	help +	  Include HFS support + +config HFSP +	depends on FS && BIG_ENDIAN +	bool "HFS+ support" +	default y +	help +	  Include HFS+ support + +config GRUBFS +	depends on FS +	bool "Additional Filesystems (from GRUB)" +	default y +	help +	  Grub provides a lot of filesystem drivers.  + +source "fs/grubfs/Kconfig" + +config DEBUG_FS +	depends on FS +	bool "Debugging output for Filesystem code" +	default y +	help +	  Say Y here if you want to debug the filesystem layer + +endmenu +	   +menu "Miscellaneous" + +config LINUXBIOS +	bool "Support reading LinuxBIOS table" +	default y +	help +	  If you want to boot OpenBIOS as a LinuxBIOS payload, +	  you should say Y here. + +endmenu diff --git a/roms/openbios/libopenbios/aout_load.c b/roms/openbios/libopenbios/aout_load.c new file mode 100644 index 00000000..e9d20025 --- /dev/null +++ b/roms/openbios/libopenbios/aout_load.c @@ -0,0 +1,176 @@ +/* a.out boot loader + * As we have seek, this implementation can be straightforward. + * 2003-07 by SONE Takeshi + */ + +#include "config.h" +#include "kernel/kernel.h" + +#ifdef CONFIG_SPARC64 +#define CONFIG_SPARC64_PAGE_SIZE_8KB +#endif + +/* NextStep bootloader on SPARC32 expects the a.out header directly +   below load-base (0x4000) */ +#ifdef CONFIG_SPARC32 +#define AOUT_HEADER_COPY +#endif  + +#include "libopenbios/sys_info.h" +#include "libopenbios/bindings.h" +#include "libopenbios/aout_load.h" +#include "libc/diskio.h" +#define printf printk +#define debug printk + +#define addr_fixup(addr) ((addr) & 0x00ffffff) + +static char *image_name, *image_version; +static int fd; + +static int  +check_mem_ranges(struct sys_info *info, +                            unsigned long start, +                            unsigned long size) +{ +    int j; +    unsigned long end; +    unsigned long prog_start, prog_end; +    struct memrange *mem; + +    prog_start = virt_to_phys(&_start); +    prog_end = virt_to_phys(&_end); + +    end = start + size; + +    if (start < prog_start && end > prog_start) +        goto conflict; +    if (start < prog_end && end > prog_end) +        goto conflict; +    mem = info->memrange; +    for (j = 0; j < info->n_memranges; j++) { +        if (mem[j].base <= start && mem[j].base + mem[j].size >= end) +            break; +    } +    if (j >= info->n_memranges) +        goto badseg; +    return 1; + + conflict: +    printf("%s occupies [%#lx-%#lx]\n", program_name, prog_start, prog_end); + + badseg: +    printf("A.out file [%#lx-%#lx] doesn't fit into memory\n", start, end - 1); +    return 0; +} + +int  +is_aout(struct exec *ehdr) +{ +	return ((ehdr->a_info & 0xffff) == OMAGIC +		|| (ehdr->a_info & 0xffff) == NMAGIC +		|| (ehdr->a_info & 0xffff) == ZMAGIC +		|| (ehdr->a_info & 0xffff) == QMAGIC); +} + +int  +aout_load(struct sys_info *info, ihandle_t dev) +{ +    int retval = -1; +    struct exec ehdr; +    unsigned long start, size; +    unsigned int offset; + +    image_name = image_version = NULL; + +    /* Mark the saved-program-state as invalid */ +    feval("0 state-valid !"); + +    fd = open_ih(dev); +    if (fd == -1) { +	goto out; +    } + +    for (offset = 0; offset < 16 * 512; offset += 512) { +        seek_io(fd, offset); +        if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) { +            debug("Can't read a.out header\n"); +            retval = LOADER_NOT_SUPPORT; +            goto out; +        } +        if (is_aout(&ehdr)) +            break; +    } + +    if (!is_aout(&ehdr)) { +	debug("Not a bootable a.out image\n"); +	retval = LOADER_NOT_SUPPORT; +	goto out; +    } + +    if (ehdr.a_text == 0x30800007) +	ehdr.a_text=64*1024; + +    if (N_MAGIC(ehdr) == NMAGIC) { +        size = addr_fixup(N_DATADDR(ehdr)) + addr_fixup(ehdr.a_data); +    } else { +        size = addr_fixup(ehdr.a_text) + addr_fixup(ehdr.a_data); +    } + +    if (size < 7680) +        size = 7680; + +    fword("load-base"); +    start = POP(); // N_TXTADDR(ehdr); + +    if (!check_mem_ranges(info, start, size)) +	goto out; + +    printf("Loading a.out %s...\n", image_name ? image_name : "image"); + +    seek_io(fd, offset + N_TXTOFF(ehdr)); + +    if (N_MAGIC(ehdr) == NMAGIC) { +        if ((size_t)read_io(fd, (void *)start, ehdr.a_text) != ehdr.a_text) { +            printf("Can't read program text segment (size 0x" FMT_aout_ehdr ")\n", ehdr.a_text); +            goto out; +        } +        if ((size_t)read_io(fd, (void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) { +            printf("Can't read program data segment (size 0x" FMT_aout_ehdr ")\n", ehdr.a_data); +            goto out; +        } +    } else { +        if ((size_t)read_io(fd, (void *)start, size) != size) { +            printf("Can't read program (size 0x" FMT_sizet ")\n", size); +            goto out; +        } +    } + +    debug("Loaded %lu bytes\n", size); +    debug("entry point is %#lx\n", start); + +#ifdef AOUT_HEADER_COPY +    // Copy the a.out header just before start +    memcpy((char *)(start - 0x20), &ehdr, 0x20); +#endif + +    // Initialise saved-program-state +    PUSH(addr_fixup(start)); +    feval("saved-program-state >sps.entry !"); +    PUSH(size); +    feval("saved-program-state >sps.file-size !"); +    feval("aout saved-program-state >sps.file-type !"); + +    feval("-1 state-valid !"); + +out: +    close_io(fd); +    return retval; +} + +void  +aout_init_program(void) +{ +	// Currently not implemented +	feval("0 state-valid !"); +} diff --git a/roms/openbios/libopenbios/bindings.c b/roms/openbios/libopenbios/bindings.c new file mode 100644 index 00000000..5323421f --- /dev/null +++ b/roms/openbios/libopenbios/bindings.c @@ -0,0 +1,524 @@ +/* + *   Creation Date: <2003/11/24 12:30:18 samuel> + *   Time-stamp: <2004/01/07 19:37:38 samuel> + * + *	<bindings.c> + * + *	Forth bindings + * + *   Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libc/string.h" +#include "libc/stdlib.h" +#include "libc/byteorder.h" + + +/************************************************************************/ +/*	forth interface glue						*/ +/************************************************************************/ + +void +push_str( const char *str ) +{ +	PUSH( pointer2cell(str) ); +	PUSH( str ? strlen(str) : 0 ); +} + +/* WARNING: sloooow - AVOID */ +cell +feval( const char *str ) +{ +	push_str( str ); +	return eword("evaluate", 2); +} + +cell +_eword( const char *word, xt_t *cache_xt, int nargs ) +{ +	static xt_t catch_xt = 0; +	cell ret = -1; + +	if( !catch_xt ) +		catch_xt = findword("catch"); +	if( !*cache_xt ) +		*cache_xt = findword( (char*)word ); + +	if( *cache_xt ) { +		PUSH_xt( *cache_xt ); +		enterforth( catch_xt ); +		if( (ret=POP()) ) +			dstackcnt -= nargs; +	} +	return ret; +} + +/* note: only the built-in dictionary is searched */ +int +_fword( const char *word, xt_t *cache_xt ) +{ +	if( !*cache_xt ) +		*cache_xt = findword( (char*)word ); + +	if( *cache_xt ) { +		enterforth( *cache_xt ); +		return 0; +	} +	return -1; +} + +int +_selfword( const char *method, xt_t *cache_xt ) +{ +	if( !*cache_xt ) +		*cache_xt = find_ih_method( method, my_self() ); +	if( *cache_xt ) { +		enterforth( *cache_xt ); +		return 0; +	} +	return -1; +} + +int +_parword( const char *method, xt_t *cache_xt ) +{ +	if( !*cache_xt ) +		*cache_xt = find_ih_method( method, my_parent() ); +	if( *cache_xt ) { +		enterforth( *cache_xt ); +		return 0; +	} +	return -1; +} + +void +bind_func( const char *name, void (*func)(void) ) +{ +	PUSH( pointer2cell(func) ); +	push_str( name ); +	fword("is-cfunc"); +} + +void +bind_xtfunc( const char *name, xt_t xt, ucell arg, void (*func)(void) ) +{ +	PUSH_xt( xt ); +	PUSH( arg ); +	PUSH( pointer2cell(func) ); +	push_str( name ); +	fword("is-xt-cfunc"); +} + +xt_t +bind_noname_func( void (*func)(void) ) +{ +	PUSH( pointer2cell(func) ); +	fword("is-noname-cfunc"); +	return POP_xt(); +} + +void +throw( int error ) +{ +	PUSH( error ); +	fword("throw"); +} + + +/************************************************************************/ +/*	ihandle related							*/ +/************************************************************************/ + +phandle_t +ih_to_phandle( ihandle_t ih ) +{ +	PUSH_ih( ih ); +	fword("ihandle>phandle"); +	return POP_ph(); +} + +ihandle_t +my_parent( void ) +{ +	fword("my-parent"); +	return POP_ih(); +} + +ihandle_t +my_self( void ) +{ +	fword("my-self"); +	return POP_ih(); +} + +xt_t +find_package_method( const char *method, phandle_t ph ) +{ +	push_str( method ); +	PUSH_ph( ph ); +	fword("find-method"); +	if( POP() ) +		return POP_xt(); +	return 0; +} + +xt_t +find_ih_method( const char *method, ihandle_t ih ) +{ +	return find_package_method( method, ih_to_phandle(ih) ); +} + + +xt_t +find_parent_method( const char *method ) +{ +	return find_ih_method( method, my_parent() ); +} + +void +call_package( xt_t xt, ihandle_t ihandle ) +{ +	PUSH_xt( xt ); +	PUSH_ih( ihandle ); +	fword("call-package"); +} + +void +call_parent( xt_t xt ) +{ +	PUSH_xt( xt ); +	fword("call-parent"); +} + +void +call_parent_method( const char *method ) +{ +	push_str( method ); +	fword("$call-parent"); +} + + +/************************************************************************/ +/*	open/close package/dev						*/ +/************************************************************************/ + +ihandle_t +open_dev( const char *spec ) +{ +	push_str( spec ); +	fword("open-dev"); +	return POP_ih(); +} + +void +close_dev( ihandle_t ih ) +{ +	PUSH_ih( ih ); +	fword("close-dev"); +} + +ihandle_t +open_package( const char *argstr, phandle_t ph ) +{ +	push_str( argstr ); +	PUSH_ph( ph ); +	fword("open-package"); +	return POP_ih(); +} + +void +close_package( ihandle_t ih ) +{ +	PUSH_ih( ih ); +	fword("close-package"); +} + + +/************************************************************************/ +/*	ihandle arguments						*/ +/************************************************************************/ + +char * +pop_fstr_copy( void ) +{ +	int len = POP(); +	char *str, *p = (char*)cell2pointer(POP()); +	if( !len ) +		return NULL; +	str = malloc( len + 1 ); +        if( !str ) +                return NULL; +	memcpy( str, p, len ); +	str[len] = 0; +	return str; +} + +char * +my_args_copy( void ) +{ +	fword("my-args"); +	return pop_fstr_copy(); +} + + +/************************************************************************/ +/*	properties							*/ +/************************************************************************/ + +void +set_property( phandle_t ph, const char *name, const char *buf, int len ) +{ +	if( !ph ) { +		printk("set_property: NULL phandle\n"); +		return; +	} +	PUSH(pointer2cell(buf)); +	PUSH(len); +	push_str( name ); +	PUSH_ph(ph); +	fword("set-property"); +} + +void +set_int_property( phandle_t ph, const char *name, u32 val ) +{ +	u32 swapped=__cpu_to_be32(val); +	set_property( ph, name, (char*)&swapped, sizeof(swapped) ); +} + +char * +get_property( phandle_t ph, const char *name, int *retlen ) +{ +	int len; + +	if( retlen ) +		*retlen = -1; + +	push_str( name ); +	PUSH_ph( ph ); +	fword("get-package-property"); +	if( POP() ) +		return NULL; +	len = POP(); +	if( retlen ) +		*retlen = len; +	return (char*)cell2pointer(POP()); +} + +u32 +get_int_property( phandle_t ph, const char *name, int *retlen ) +{ +	u32 *p; + +	if( !(p=(u32 *)get_property(ph, name, retlen)) ) +		return 0; +	return __be32_to_cpu(*p); +} + + +/************************************************************************/ +/*	device selection / iteration					*/ +/************************************************************************/ + +void +activate_dev( phandle_t ph ) +{ +	PUSH_ph( ph ); +	fword("active-package!"); +} + +phandle_t +activate_device( const char *str ) +{ +	phandle_t ph = find_dev( str ); +	activate_dev( ph ); +	return ph; +} + +void +device_end( void ) +{ +	fword("device-end"); +} + +phandle_t +get_cur_dev( void ) +{ +	fword("active-package"); +	return POP_ph(); +} + +phandle_t +find_dev( const char *path ) +{ +	phandle_t ret = 0; +	push_str( path ); +	fword("(find-dev)"); +	if( POP() ) +		return POP_ph(); +	return ret; +} + +phandle_t +dt_iter_begin( void ) +{ +	fword("iterate-tree-begin"); +	return POP_ph(); +} + +phandle_t +dt_iterate( phandle_t last_tree ) +{ +        if( !last_tree ) +		return dt_iter_begin(); + +        PUSH_ph( last_tree ); +	fword("iterate-tree"); +	return POP_ph(); +} + +phandle_t +dt_iterate_type( phandle_t last_tree, const char *type ) +{ +        if( !last_tree ) +                last_tree = dt_iter_begin(); + +	/* root node is never matched but we don't care about that */ +        while( (last_tree = dt_iterate(last_tree)) ) { +                char *s = get_property( last_tree, "device_type", NULL ); +		if( s && !strcmp(type, s) ) +			break; +	} +        return last_tree; +} + + +/************************************************************************/ +/*	node methods							*/ +/************************************************************************/ + +void +make_openable( int only_parents ) +{ +	phandle_t ph, save_ph = get_cur_dev(); +	PUSH_ph( save_ph ); + +	for( ;; ) { +		if( only_parents++ ) +			fword("parent"); +		if( !(ph=POP_ph()) ) +			break; +		activate_dev( ph ); +		PUSH_ph( ph ); +		fword("is-open"); +	} +	activate_dev( save_ph ); +} + +static void +call1_func( void ) +{ +	void (*func)(cell v); +	func = (void*)cell2pointer(POP()); + +	(*func)( POP() ); +} + + +static void +add_methods( int flags, int size, const method_t *methods, int nmet ) +{ +	xt_t xt=0; +	int i; + +	/* nodes might be matched multiple times */ +	if( find_package_method(methods[0].name, get_cur_dev()) ) +		return; + +	if( size ) { +		PUSH( size ); +		fword("is-ibuf"); +		xt = POP_xt(); +	} + +	for( i=0; i<nmet; i++ ) { +		/* null-name methods specify static initializers */ +		if( !methods[i].name ) { +			typedef void (*initfunc)( void *p ); +			char *buf = NULL; +			if( xt ) { +				enterforth( xt ); +				buf = (char*)cell2pointer(POP()); +			} +			(*(initfunc)methods[i].func)( buf ); +			continue; +		} +		if( !size ) +			bind_func( methods[i].name, methods[i].func ); +		else +			bind_xtfunc( methods[i].name, xt, pointer2cell(methods[i].func), +				     &call1_func ); +	} + +	if( flags & INSTALL_OPEN ) +		make_openable(0); +} + +void +bind_node( int flags, int size, const char * const *paths, int npaths, +	   const method_t *methods, int nmet ) +{ +	phandle_t save_ph = get_cur_dev(); +	int i; + +	for( i=0; i<npaths; i++ ) { +		const char *name = paths[i]; + +		/* type matching? */ +		if( *name == 'T' ) { +			phandle_t ph = 0; +			name++; +			while( (ph=dt_iterate_type(ph, name)) ) { +				activate_dev( ph ); +				add_methods( flags, size, methods, nmet ); +			} +			continue; +		} + +		/* path patching */ +		if( activate_device(name) ) +			add_methods( flags, size, methods, nmet ); +		else if( *name == '+' ) { +			/* create node (and missing parents) */ +			if( !activate_device(++name) ) { +				push_str( name ); +				fword("create-node"); +			} +			add_methods( flags, size, methods, nmet ); +		} +	} +	activate_dev( save_ph ); +} + +phandle_t +bind_new_node( int flags, int size, const char *name, +	   const method_t *methods, int nmet ) +{ +	phandle_t save_ph = get_cur_dev(); +	phandle_t new_ph; +	/* create node */ +	push_str( name ); +	fword("create-node"); +	add_methods( flags, size, methods, nmet ); +    new_ph = get_cur_dev(); + +	activate_dev( save_ph ); +	return new_ph; +} diff --git a/roms/openbios/libopenbios/bootcode_load.c b/roms/openbios/libopenbios/bootcode_load.c new file mode 100644 index 00000000..0fabf55c --- /dev/null +++ b/roms/openbios/libopenbios/bootcode_load.c @@ -0,0 +1,99 @@ +/*  + * Raw bootcode loader (CHRP/Apple %BOOT) + * Written by Mark Cave-Ayland 2013 + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libopenbios/bindings.h" +#include "libopenbios/bootcode_load.h" +#include "libc/diskio.h" +#include "drivers/drivers.h" +#define printf printk +#define debug printk + + +int  +bootcode_load(ihandle_t dev) +{ +    int retval = -1, count = 0, fd; +    unsigned long bootcode, loadbase, entry, size, offset; +    ihandle_t bootcode_info; + +    /* Mark the saved-program-state as invalid */ +    feval("0 state-valid !"); + +    fd = open_ih(dev); +    if (fd == -1) { +        goto out; +    } + +    /* If we don't have the get-bootcode-info word then we don't support +       loading bootcode via %BOOT */ +    bootcode_info = find_ih_method("get-bootcode-info", dev); +    if (!bootcode_info) { +        goto out; +    } +     +    /* Default to loading at load-base */ +    fword("load-base"); +    loadbase = POP(); +    entry = loadbase; +    size = 0; +     +#ifdef CONFIG_PPC +    /* +     * Apple OF does not honor load-base and instead uses pmBootLoad +     * value from the boot partition descriptor. +     * +     * Tested with: +     *   a debian image with QUIK installed +     *   a debian image with iQUIK installed (https://github.com/andreiw/quik) +     *   an IQUIK boot floppy +     *   a NetBSD boot floppy (boots stage 2) +     */ +    if (is_apple()) { +        PUSH(bootcode_info); +        fword("execute"); + +        loadbase = POP(); +        entry = POP(); +        size = POP(); +    } +#endif +     +    bootcode = loadbase; +    offset = 0; +     +    while(1) { +        if (seek_io(fd, offset) == -1) +            break; +        count = read_io(fd, (void *)bootcode, 512); +        offset += count; +        bootcode += count; +    } + +    /* If we didn't read anything then exit */ +    if (!count) { +        goto out; +    } + +    /* Use proper file size if we got it from bootcode info */ +    if (size == 0) { +        size = offset; +    } +     +    /* Initialise saved-program-state */ +    PUSH(entry); +    feval("saved-program-state >sps.entry !"); +    PUSH(size); +    feval("saved-program-state >sps.file-size !"); +    feval("bootcode saved-program-state >sps.file-type !"); + +    feval("-1 state-valid !"); + +out: +    close_io(fd); +    return retval; +} + diff --git a/roms/openbios/libopenbios/bootinfo_load.c b/roms/openbios/libopenbios/bootinfo_load.c new file mode 100644 index 00000000..fa9e36bd --- /dev/null +++ b/roms/openbios/libopenbios/bootinfo_load.c @@ -0,0 +1,263 @@ +/* + * + *       <bootinfo_load.c> + * + *       bootinfo file loader + * + *   Copyright (C) 2009 Laurent Vivier (Laurent@vivier.eu) + * + *   Original XML parser by Blue Swirl <blauwirbel@gmail.com> + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libopenbios/bootinfo_load.h" +#include "libopenbios/ofmem.h" +#include "libc/vsprintf.h" + +//#define DEBUG_BOOTINFO + +#ifdef DEBUG_BOOTINFO +#define DPRINTF(fmt, args...) \ +    do { printk("%s: " fmt, __func__ , ##args); } while (0) +#else +#define DPRINTF(fmt, args...) \ +    do { } while (0) +#endif + +static char * +get_device( const char *path ) +{ +	int i; +	static char buf[1024]; + +	for (i = 0; i < sizeof(buf) && path[i] && path[i] != ':'; i++) +		buf[i] = path[i]; +	buf[i] = 0; + +	return buf; +} + +static char * +get_partition( const char *path ) +{ +	static char buf[2]; + +	buf[0] = '\0'; +	buf[1] = '\0'; + +	while ( *path && *path != ':' ) +		path++; + +	if (!*path) +		return buf; +	path++; + +	if (path[0] == ',' || !strchr(path, ',')) /* if there is not a ',' or no partition id then return */ +		return buf; + +	/* Must be a partition id */ +	buf[0] = path[0]; + +	return buf; +} + +static char * +get_filename( const char * path , char **dirname) +{ +        static char buf[1024]; +        char *filename; + +        while ( *path && *path != ':' ) +                path++; + +        if (!*path) { +                *dirname = NULL; +                return NULL; +        } +        path++; + +        while ( *path && isdigit(*path) ) +                path++; + +        if (*path == ',') +                path++; + +        strncpy(buf, path, sizeof(buf)); +        buf[sizeof(buf) - 1] = 0; + +        filename = strrchr(buf, '\\'); +        if (filename) { +                *dirname = buf; +                (*filename++) = 0; +        } else { +                *dirname = NULL; +                filename = buf; +        } + +        return filename; +} + +int +is_bootinfo(char *bootinfo) +{ +	return (strncasecmp(bootinfo, "<chrp-boot", 10) ? 0 : -1); +} + +int  +bootinfo_load(struct sys_info *info, const char *filename) +{ +	// Currently not implemented +	return LOADER_NOT_SUPPORT; +} + +/* +  Parse SGML structure like: +  <chrp-boot> +  <description>Debian/GNU Linux Installation on IBM CHRP hardware</description> +  <os-name>Debian/GNU Linux for PowerPC</os-name> +  <boot-script>boot &device;:\install\yaboot</boot-script> +  <icon size=64,64 color-space=3,3,2> + +  CHRP system bindings are described at: +  http://playground.sun.com/1275/bindings/chrp/chrp1_7a.ps +*/ + +void +bootinfo_init_program(void) +{ +	char *base; +	int proplen; +	phandle_t chosen; +	int tag, taglen, script, scriptlen, scriptvalid, entity, chrp; +	char tagbuf[128], c; +	char *device, *filename, *directory, *partition; +	int current, size; +	char *bootscript; +        char *tmp; +	char bootpath[1024]; + +	/* Parse the boot script */ + +	chosen = find_dev("/chosen"); +	tmp = get_property(chosen, "bootpath", &proplen); +	memcpy(bootpath, tmp, proplen); +	bootpath[proplen] = 0; + +	DPRINTF("bootpath %s\n", bootpath); + +	device = get_device(bootpath); +	partition = get_partition(bootpath); +	filename = get_filename(bootpath, &directory); + +	feval("load-base"); +	base = (char*)cell2pointer(POP()); + +	feval("load-size"); +	size = POP(); + +	bootscript = malloc(size); +	if (bootscript == NULL) { +		DPRINTF("Can't malloc %d bytes\n", size); +		return; +	} + +	if (!is_bootinfo(base)) { +		DPRINTF("Not a valid bootinfo memory image\n"); +                free(bootscript); +		return; +	} + +	chrp = 0; +	tag = 0; +	taglen = 0; +	script = 0; +	scriptvalid = 0; +	scriptlen = 0; +	entity = 0; +	current = 0; +	while (current < size) { + +		c = base[current++]; + +		if (c == '<') { +			script = 0; +			tag = 1; +			taglen = 0; +		} else if (c == '>') { +			tag = 0; +			tagbuf[taglen] = '\0'; +			if (strncasecmp(tagbuf, "chrp-boot", 9) == 0) { +				chrp = 1; +			} else if (chrp == 1) { +				if (strncasecmp(tagbuf, "boot-script", 11) == 0) { +					script = 1; +					scriptlen = 0; +				} else if (strncasecmp(tagbuf, "/boot-script", 12) == 0) { + +					script = 0; +					bootscript[scriptlen] = '\0'; + +					DPRINTF("got bootscript %s\n", +						bootscript); + +					scriptvalid = -1; + +					break; +				} else if (strncasecmp(tagbuf, "/chrp-boot", 10) == 0) +					break; +			} +		} else if (tag && taglen < sizeof(tagbuf)) { +			tagbuf[taglen++] = c; +		} else if (script && c == '&') { +			entity = 1; +			taglen = 0; +		} else if (entity && c ==';') { +			entity = 0; +			tagbuf[taglen] = '\0'; +			if (strncasecmp(tagbuf, "lt", 2) == 0) { +				bootscript[scriptlen++] = '<'; +			} else if (strncasecmp(tagbuf, "gt", 2) == 0) { +				bootscript[scriptlen++] = '>'; +			} else if (strncasecmp(tagbuf, "device", 6) == 0) { +				strcpy(bootscript + scriptlen, device); +				scriptlen += strlen(device); +			} else if (strncasecmp(tagbuf, "partition", 9) == 0) { +				strcpy(bootscript + scriptlen, partition); +				scriptlen += strlen(partition); +			} else if (strncasecmp(tagbuf, "directory", 9) == 0) { +				strcpy(bootscript + scriptlen, directory); +				scriptlen += strlen(directory); +			} else if (strncasecmp(tagbuf, "filename", 8) == 0) { +				strcpy(bootscript + scriptlen, filename); +				scriptlen += strlen(filename); +			} else if (strncasecmp(tagbuf, "full-path", 9) == 0) { +				strcpy(bootscript + scriptlen, bootpath); +				scriptlen += strlen(bootpath); +			} else { /* unknown, keep it */ +				bootscript[scriptlen] = '&'; +				strcpy(bootscript + scriptlen + 1, tagbuf); +				scriptlen += taglen + 1; +				bootscript[scriptlen] = ';'; +				scriptlen++; +			} +		} else if (entity && taglen < sizeof(tagbuf)) { +			tagbuf[taglen++] = c; +		} else if (script && scriptlen < size) { +			bootscript[scriptlen++] = c; +		} +	} + +	/* If the payload is bootinfo then we execute it immediately */ +	if (scriptvalid) { +		DPRINTF("bootscript: %s\n", bootscript); +		feval(bootscript); +	} +	else +		DPRINTF("Unable to parse bootinfo bootscript\n"); +} diff --git a/roms/openbios/libopenbios/build.xml b/roms/openbios/libopenbios/build.xml new file mode 100644 index 00000000..feb8f6c7 --- /dev/null +++ b/roms/openbios/libopenbios/build.xml @@ -0,0 +1,31 @@ +<build> + + <library name="openbios" type="static" target="target"> +  <object source="aout_load.c" condition="LOADER_AOUT"/> +  <object source="bindings.c"/> +  <object source="bootcode_load.c" condition="LOADER_BOOTCODE"/> +  <object source="bootinfo_load.c" condition="LOADER_BOOTINFO"/> +  <object source="client.c"/> +  <object source="console.c"/> +  <object source="elf_info.c" /> +  <object source="elf_load.c" condition="LOADER_ELF"/> +  <object source="font_8x8.c" condition="FONT_8X8"/> +  <object source="font_8x16.c" condition="FONT_8X16"/> +  <object source="fcode_load.c" condition="LOADER_FCODE"/>   +  <object source="forth_load.c" condition="LOADER_FORTH"/> +  <object source="init.c"/> +  <object source="initprogram.c"/> +  <object source="ipchecksum.c"/> +  <object source="load.c"/> +  <object source="linuxbios_info.c" condition="LINUXBIOS"/> +  <object source="ofmem_common.c" condition="OFMEM"/> +  <object source="xcoff_load.c" condition="LOADER_XCOFF"/> +  <object source="video_common.c"/> + </library> + + <dictionary name="openbios" target="forth"> +  <object source="clib.fs"/> +  <object source="helpers.fs"/> + </dictionary> + +</build> diff --git a/roms/openbios/libopenbios/clib.fs b/roms/openbios/libopenbios/clib.fs new file mode 100644 index 00000000..04dd0aa4 --- /dev/null +++ b/roms/openbios/libopenbios/clib.fs @@ -0,0 +1,36 @@ +\ tag: C helpers +\  +\ Misc C helpers +\  +\ Copyright (C) 2003, 2004 Samuel Rydh +\  +\ See the file "COPYING" for further information about +\ the copyright and warranty status of this work. +\  + +\ should perhaps be moved somewhere else +: set-property ( buf len propname propname-len phandle -- ) +	>r 2swap encode-bytes 2swap r> encode-property +; + +\ install C function +: is-cfunc ( funcaddr word word-len -- ) +  $create , does> @ call +; + +\ install a nameless C function +: is-noname-cfunc ( funcaddr -- xt ) +  0 0 is-cfunc last-xt +; + +\ is-xt-cfunc installs a function which does the following: +\   - xt is executes +\   - funcarg is pushed +\   - funcaddr is called + +: is-xt-cfunc ( xt|0 funcarg funcaddr word word-len -- ) +	is-func-begin +  rot ?dup if , then +  swap ['] (lit) , , ['] (lit) , , ['] call , +	is-func-end +; diff --git a/roms/openbios/libopenbios/client.c b/roms/openbios/libopenbios/client.c new file mode 100644 index 00000000..8b3d582b --- /dev/null +++ b/roms/openbios/libopenbios/client.c @@ -0,0 +1,367 @@ +/* + *   Creation Date: <2003/11/25 14:29:08 samuel> + *   Time-stamp: <2004/03/27 01:13:53 samuel> + * + *	<client.c> + * + *	OpenFirmware client interface + * + *   Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libopenbios/of.h" + +/* Uncomment to enable debug printout of client interface calls */ +//#define DEBUG_CIF +//#define DUMP_IO + +/* OF client interface. r3 points to the argument array. On return, + * r3 should contain 0==true or -1==false. r4-r12,cr0,cr1 may + * be modified freely. + * + * -1 should only be returned if the control transfer to OF fails + * (it doesn't) or if the function is unimplemented. + */ + +#define PROM_MAX_ARGS	10 +typedef struct prom_args { +    prom_uarg_t service; +    prom_arg_t  nargs; +    prom_arg_t  nret; +    prom_uarg_t args[PROM_MAX_ARGS]; +} __attribute__((packed)) prom_args_t; + +static inline const char * +arg2pointer(prom_uarg_t value) +{ +    return (char*)(uintptr_t)value; +} + +static inline const char * +get_service(prom_args_t *pb) +{ +    return arg2pointer(pb->service); +} + +#ifdef DEBUG_CIF +static void memdump(const char *mem, unsigned long size) +{ +	int i; +	 +	if (size == (unsigned long) -1) +		return; + +	for (i = 0; i < size; i += 16) { +		int j; + +		printk("0x%08lx ", (unsigned long)mem + i); + +		for (j = 0; j < 16 && i + j < size; j++) +			printk(" %02x", *(unsigned char*)(mem + i + j)); + +		for ( ; j < 16; j++) +			printk(" __"); + +		printk("  "); + +		for (j = 0; j < 16 && i + j < size; j++) { +			unsigned char c = *(mem + i + j); +			if (isprint(c)) +				printk("%c", c); +			else +				printk("."); +		} +		printk("\n"); +	} +} + +static void dump_service(prom_args_t *pb) +{ +	int i; +	const char *service = get_service(pb); +	if (strcmp(service, "test") == 0) { +		printk("test(\"%s\") = ", arg2pointer(pb->args[0])); +	} else if (strcmp(service, "peer") == 0) { +		printk("peer(0x" FMT_prom_uargx ") = ", pb->args[0]); +	} else if (strcmp(service, "child") == 0) { +		printk("child(0x" FMT_prom_uargx ") = ", pb->args[0]); +	} else if (strcmp(service, "parent") == 0) { +		printk("parent(0x" FMT_prom_uargx ") = ", pb->args[0]); +	} else if (strcmp(service, "instance-to-package") == 0) { +		printk("instance-to-package(0x" FMT_prom_uargx ") = ", pb->args[0]); +	} else if (strcmp(service, "getproplen") == 0) { +		printk("getproplen(0x" FMT_prom_uargx ", \"%s\") = ", +			pb->args[0], arg2pointer(pb->args[1])); +	} else if (strcmp(service, "getprop") == 0) { +		printk("getprop(0x" FMT_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ", " FMT_prom_arg ") = ", +			pb->args[0], arg2pointer(pb->args[1]), +			pb->args[2], pb->args[3]); +	} else if (strcmp(service, "nextprop") == 0) { +		printk("nextprop(0x" FMT_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ") = ", +			pb->args[0], arg2pointer(pb->args[1]), pb->args[2]); +	} else if (strcmp(service, "setprop") == 0) { +		printk("setprop(0x" FMT_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ", " FMT_prom_arg ")\n", +			pb->args[0], arg2pointer(pb->args[1]), +			pb->args[2], pb->args[3]); +		memdump(arg2pointer(pb->args[2]), pb->args[3]); +		printk(" = "); +	} else if (strcmp(service, "canon") == 0) { +		printk("canon(\"%s\", 0x" FMT_prom_uargx ", " FMT_prom_arg ")\n", +			arg2pointer(pb->args[0]), pb->args[1], pb->args[2]); +	} else if (strcmp(service, "finddevice") == 0) { +		printk("finddevice(\"%s\") = ", arg2pointer(pb->args[0])); +	} else if (strcmp(service, "instance-to-path") == 0) { +		printk("instance-to-path(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_arg ") = ", +			pb->args[0], pb->args[1], pb->args[2]); +	} else if (strcmp(service, "package-to-path") == 0) { +		printk("package-to-path(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_arg ") = ", +			pb->args[0], pb->args[1], pb->args[2]); +	} else if (strcmp(service, "open") == 0) { +		printk("open(\"%s\") = ", arg2pointer(pb->args[0])); +	} else if (strcmp(service, "close") == 0) { +		printk("close(0x" FMT_prom_uargx ")\n", pb->args[0]); +	} else if (strcmp(service, "read") == 0) { +#ifdef DUMP_IO +		printk("read(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_arg ") = ", +			pb->args[0], pb->args[1], pb->args[2]); +#endif +	} else if (strcmp(service, "write") == 0) { +#ifdef DUMP_IO +		printk("write(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_arg ")\n", +			pb->args[0], pb->args[1], pb->args[2]); +		memdump(arg2pointer(pb->args[1]), pb->args[2]); +		printk(" = "); +#endif +	} else if (strcmp(service, "seek") == 0) { +#ifdef DUMP_IO +		printk("seek(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ") = ", +			pb->args[0], pb->args[1], pb->args[2]); +#endif +	} else if (strcmp(service, "claim") == 0) { +		printk("claim(0x" FMT_prom_uargx ", " FMT_prom_arg ", " FMT_prom_arg ") = ", +			pb->args[0], pb->args[1], pb->args[2]); +	} else if (strcmp(service, "release") == 0) { +		printk("release(0x" FMT_prom_uargx ", " FMT_prom_arg ")\n", +			pb->args[0], pb->args[1]); +	} else if (strcmp(service, "boot") == 0) { +		printk("boot \"%s\"\n", arg2pointer(pb->args[0])); +	} else if (strcmp(service, "enter") == 0) { +		printk("enter()\n"); +	} else if (strcmp(service, "exit") == 0) { +		printk("exit()\n"); +	} else if (strcmp(service, "test-method") == 0) { +		printk("test-method(0x" FMT_prom_uargx ", \"%s\") = ", +			pb->args[0], arg2pointer(pb->args[1])); +	} else { +		printk("of_client_interface: %s", service); +		for( i = 0; i < pb->nargs; i++ ) +			printk(" " FMT_prom_uargx, pb->args[i]); +		printk("\n"); +	} +} + +static void dump_return(prom_args_t *pb) +{ +	int i; +	const char *service = get_service(pb); +	if (strcmp(service, "test") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "peer") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "child") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "parent") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "instance-to-package") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "getproplen") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "getprop") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		if ((prom_arg_t)pb->args[pb->nargs] != -1) +			memdump(arg2pointer(pb->args[2]), MIN(pb->args[3], pb->args[pb->nargs])); +	} else if (strcmp(service, "nextprop") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		memdump(arg2pointer(pb->args[2]), 32); +	} else if (strcmp(service, "setprop") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "canon") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]); +	} else if (strcmp(service, "finddevice") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "instance-to-path") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]); +	} else if (strcmp(service, "package-to-path") == 0) { +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]); +	} else if (strcmp(service, "open") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "close") == 0) { +		/* do nothing */ +	} else if (strcmp(service, "read") == 0) { +#ifdef DUMP_IO +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +		memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]); +#endif +	} else if (strcmp(service, "write") == 0) { +#ifdef DUMP_IO +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +#endif +	} else if (strcmp(service, "seek") == 0) { +#ifdef DUMP_IO +		printk(FMT_prom_arg "\n", pb->args[pb->nargs]); +#endif +	} else if (strcmp(service, "claim") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else if (strcmp(service, "release") == 0) { +		/* do nothing */ +	} else if (strcmp(service, "boot") == 0) { +		/* do nothing */ +	} else if (strcmp(service, "enter") == 0) { +		/* do nothing */ +	} else if (strcmp(service, "exit") == 0) { +		/* do nothing */ +	} else if (strcmp(service, "test-method") == 0) { +		printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]); +	} else { +		printk("of_client_interface return:"); +		for (i = 0; i < pb->nret; i++) { +			printk(" " FMT_prom_uargx, pb->args[pb->nargs + i]); +		} +		printk("\n"); +	} +} +#endif + +/* call-method, interpret */ +static int +handle_calls(prom_args_t *pb) +{ +	int i, j, dstacksave; +	ucell val; + +#ifdef DEBUG_CIF +	printk("%s %s ([" FMT_prom_arg "] -- [" FMT_prom_arg "])\n", +		get_service(pb), arg2pointer(pb->args[0]), pb->nargs, pb->nret); +#endif + +	dstacksave = dstackcnt; +	for (i = pb->nargs - 1; i >= 0; i--) +		PUSH(pb->args[i]); + +	push_str(get_service(pb)); +	fword("client-call-iface"); + +	/* Ignore client-call-iface return */ +	POP(); + +	/* If the catch result is non-zero, restore stack and exit */ +	val = POP(); +	if (val) { +		printk("%s %s failed with error " FMT_ucellx "\n", get_service(pb), arg2pointer(pb->args[0]), val); +		dstackcnt = dstacksave; +		return 0; +	} + +	/* Store catch result */ +	pb->args[pb->nargs] = val; +	 +	j = dstackcnt; +	for (i = 1; i < pb->nret; i++, j--) { +                if (dstackcnt > dstacksave) { +			pb->args[pb->nargs + i] = POP(); +		} +	} + +#ifdef DEBUG_CIF +	/* useful for debug but not necessarily an error */ +	if (j != dstacksave) { +		printk("%s '%s': possible argument error (" FMT_prom_arg "--" FMT_prom_arg ") got %d\n", +			get_service(pb), arg2pointer(pb->args[0]), +			pb->nargs - 2, pb->nret, j - dstacksave); +	} + +	printk("handle_calls return:"); +	for (i = 0; i < pb->nret; i++) { +		printk(" " FMT_prom_uargx, pb->args[pb->nargs + i]); +	} +	printk("\n"); +#endif + +	dstackcnt = dstacksave; +	return 0; +} + +int +of_client_interface(int *params) +{ +	prom_args_t *pb = (prom_args_t*)params; +	ucell val; +	int i, j, dstacksave; + +	if (pb->nargs < 0 || pb->nret < 0 || +            pb->nargs + pb->nret > PROM_MAX_ARGS) +		return -1; + +#ifdef DEBUG_CIF +	dump_service(pb); +#endif + +	/* call-method exceptions are special */ +	if (!strcmp("call-method", get_service(pb)) || !strcmp("interpret", get_service(pb))) +		return handle_calls(pb); + +	dstacksave = dstackcnt; +	for (i = pb->nargs - 1; i >= 0; i--) +		PUSH(pb->args[i]); + +	push_str(get_service(pb)); +	fword("client-iface"); + +	val = POP(); +	if (val) { +		if (val == -1) { +			printk("Unimplemented service %s ([" FMT_prom_arg "] -- [" FMT_prom_arg "])\n", +				get_service(pb), pb->nargs, pb->nret); +		} else { +#ifdef DEBUG_CIF +			printk("Error calling client interface: " FMT_ucellx "\n", val); +#endif +		} + +		dstackcnt = dstacksave; +		return -1; +	} + +	j = dstackcnt; +	for (i = 0; i < pb->nret; i++, j--) { +		if (dstackcnt > dstacksave) { +			pb->args[pb->nargs + i] = POP(); +		} +	} + +#ifdef DEBUG_CIF +	if (j != dstacksave) { +		printk("service %s: possible argument error (%d %d)\n", +		       get_service(pb), i, j - dstacksave); + +		/* Some clients request less parameters than the CIF method +		returns, e.g. getprop with OpenSolaris. Hence we drop any +		stack parameters on exit after issuing a warning above */ +	} + +	dump_return(pb); +#endif + +	dstackcnt = dstacksave; +	return 0; +} diff --git a/roms/openbios/libopenbios/console.c b/roms/openbios/libopenbios/console.c new file mode 100644 index 00000000..7f3aad8e --- /dev/null +++ b/roms/openbios/libopenbios/console.c @@ -0,0 +1,68 @@ +/* + *      <console.c> + * + *      Simple text console + * + *   Copyright (C) 2005 Stefan Reinauer <stepan@openbios.org> + *   Copyright (C) 2013 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   as published by the Free Software Foundation + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libopenbios/console.h" +#include "drivers/drivers.h" + +/* ****************************************************************** + *      common functions, implementing simple concurrent console + * ****************************************************************** */ + +/* Dummy routines for when console is unassigned */ + +static int dummy_putchar(int c) +{ +    return c; +} + +static int dummy_availchar(void) +{ +    return 0; +} + +static int dummy_getchar(void) +{ +    return 0; +} + +struct _console_ops console_ops = { +    .putchar = dummy_putchar, +    .availchar = dummy_availchar, +    .getchar = dummy_getchar +}; + +#ifdef CONFIG_DEBUG_CONSOLE + +void init_console(struct _console_ops ops) +{ +    console_ops = ops; +} + +int putchar(int c) +{ +    return (*console_ops.putchar)(c); +} + +int availchar(void) +{ +    return (*console_ops.availchar)(); +} + +int getchar(void) +{ +    return (*console_ops.getchar)(); +} +#endif    // CONFIG_DEBUG_CONSOLE diff --git a/roms/openbios/libopenbios/elf_info.c b/roms/openbios/libopenbios/elf_info.c new file mode 100644 index 00000000..f7febef9 --- /dev/null +++ b/roms/openbios/libopenbios/elf_info.c @@ -0,0 +1,151 @@ +/* Support for ELF Boot Proposal as a boot image */ +#include "config.h" +#include "arch/common/elf_boot.h" +#include "libopenbios/sys_info.h" +#include "asm/io.h" +#include "libopenbios/ipchecksum.h" +#include "openbios-version.h" +#define printf printk +#define debug  printk + +/* ELF image notes provide information to the loader who boots us */ + +/* This compiles and generates correct PT_NOTE segment for me. + * If it doesn't, use assembly version below. */ + +struct elf_image_note { +    Elf_Nhdr hdr0; +    char name0[sizeof(ELF_NOTE_BOOT)]; +    char prog_name[sizeof(PROGRAM_NAME)]; + +    Elf_Nhdr hdr1; +    char name1[sizeof(ELF_NOTE_BOOT)]; +    char version[sizeof(OPENBIOS_VERSION_STR)]; + +    Elf_Nhdr hdr2; +    char name2[sizeof(ELF_NOTE_BOOT)]; +    unsigned short checksum; +}; + +const struct elf_image_note elf_image_notes +	__attribute__ ((section (".note.ELFBoot"))) = +{ +    .hdr0 = { +	.n_namesz = sizeof(ELF_NOTE_BOOT), +	.n_descsz = sizeof(PROGRAM_NAME), +	.n_type = EIN_PROGRAM_NAME, +    }, +    .name0 = ELF_NOTE_BOOT, +    .prog_name = PROGRAM_NAME, + +    .hdr1 = { +	.n_namesz = sizeof(ELF_NOTE_BOOT), +        .n_descsz = sizeof(OPENBIOS_VERSION_STR), +	.n_type = EIN_PROGRAM_VERSION, +    }, +    .name1 = ELF_NOTE_BOOT, +    .version = OPENBIOS_VERSION_STR, + +    .hdr2 = { +	.n_namesz = sizeof(ELF_NOTE_BOOT), +	.n_descsz = sizeof(unsigned short), +	.n_type = EIN_PROGRAM_CHECKSUM, +    }, +    .name2 = ELF_NOTE_BOOT, +    .checksum = 0, /* to be computed by external tool */ +}; + +/* This is refered by other files */ +const char *program_name = elf_image_notes.prog_name; +const char *program_version = elf_image_notes.version; + +#if 0 + +	/* This tells the linker to make a PT_NOTE segment. +	 * If the section is named just ".note", it will be +	 * mixed up with useless .version notes generated by GCC. +	 */ +	.section ".note.ELFBoot", "a" + +	.align 4 +	.int 2f - 1f +	.int 4f - 3f +	.int EIN_PROGRAM_NAME +1:	.asciz "ELFBoot" +2:	.align 4 +3:	.asciz PROGRAM_NAME +4: + +	.align 4 +	.int 2f - 1f +	.int 4f - 3f +	.int EIN_PROGRAM_VERSION +1:	.asciz "ELFBoot" +2:	.align 4 +3:      .asciz OPENBIOS_VERSION_STR +4: + +	.align 4 +	.int 2f - 1f +	.int 4f - 3f +	.int EIN_PROGRAM_CHECKSUM +1:	.asciz "ELFBoot" +2:	.align 4 +3:	.short 0 +4: +#endif + +/* Collect information from the ELF bootloader + * Note that we have to copy them to our own memory, + * otherwise they might be overwritten afterward. */ +void collect_elfboot_info(struct sys_info *info) +{ +    Elf_Bhdr *hdr = NULL; +    char *addr, *end; +    Elf_Nhdr *nhdr; +    char *desc; + +    if (info->boot_type == ELF_BHDR_MAGIC) +	hdr = phys_to_virt(info->boot_data); +    else +	hdr = phys_to_virt(info->boot_arg); + +    if (hdr->b_signature != ELF_BHDR_MAGIC) +	return; + +    if (ipchksum(hdr, hdr->b_size) != 0) { +	printf("Broken ELF boot notes\n"); +	return; +    } + +    addr = (char *) (hdr + 1); +    end = addr + hdr->b_size; +    while (addr <  end) { +	nhdr = (Elf_Nhdr *) addr; +	addr += sizeof(Elf_Nhdr); +	addr += (nhdr->n_namesz + 3) & ~3; +	desc = addr; +	addr += (nhdr->n_descsz + 3) & ~3; + +	if (nhdr->n_namesz == 0) { +	    /* Standard notes */ +	    switch (nhdr->n_type) { +	    case EBN_FIRMWARE_TYPE: +		info->firmware = strdup(desc); +		break; +	    case EBN_BOOTLOADER_NAME: +		debug("Bootloader: %s\n", desc); +		break; +	    case EBN_BOOTLOADER_VERSION: +		debug("Version: %s\n", desc); +		break; +	    case EBN_COMMAND_LINE: +		info->command_line = strdup(desc); +		break; +	    case EBN_LOADED_IMAGE: +		debug("Image name: %s\n", desc); +		break; +	    } +	} +    } +} diff --git a/roms/openbios/libopenbios/elf_load.c b/roms/openbios/libopenbios/elf_load.c new file mode 100644 index 00000000..9c7850e1 --- /dev/null +++ b/roms/openbios/libopenbios/elf_load.c @@ -0,0 +1,537 @@ +/* ELF Boot loader + * As we have seek, this implementation can be straightforward. + * 2003-07 by SONE Takeshi + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libc/diskio.h" +#include "arch/common/elf_boot.h" +#include "libopenbios/elf_load.h" +#include "libopenbios/sys_info.h" +#include "libopenbios/ipchecksum.h" +#include "libopenbios/bindings.h" +#include "libopenbios/ofmem.h" +#define printf printk +#define debug printk + +#define DEBUG		0 + +#define MAX_HEADERS	0x20 +#define BS		0x100	/* smallest step used when looking for the ELF header */ + +#ifdef CONFIG_PPC +extern void             flush_icache_range( char *start, char *stop ); +#endif + +/* FreeBSD and possibly others mask the high 8 bits */ +#define addr_fixup(addr) ((addr) & 0x00ffffff) + +static char *image_name, *image_version; +static int fd; + +/* Note: avoid name collision with platforms which have their own version of calloc() */ +static void *ob_calloc(size_t nmemb, size_t size) +{ +    size_t alloc_size = nmemb * size; +    void *mem; + +    if (alloc_size < nmemb || alloc_size < size) { +        printf("calloc overflow: %u, %u\n", nmemb, size); +        return NULL; +    } + +    mem = malloc(alloc_size); +    memset(mem, 0, alloc_size); + +    return mem; +} + +static int check_mem_ranges(struct sys_info *info, +	Elf_phdr *phdr, int phnum) +{ +    int i, j; +    unsigned long start, end; +    unsigned long prog_start, prog_end; +    struct memrange *mem; + +    prog_start = virt_to_phys(&_start); +    prog_end = virt_to_phys(&_end); + +    for (i = 0; i < phnum; i++) { +	if (phdr[i].p_type != PT_LOAD) +	    continue; +	start = addr_fixup(phdr[i].p_paddr); +	end = start + phdr[i].p_memsz; +	if (start < prog_start && end > prog_start) +	    goto conflict; +	if (start < prog_end && end > prog_end) +	    goto conflict; +	mem=info->memrange; +	for (j = 0; j < info->n_memranges; j++) { +	    if (mem[j].base <= start && mem[j].base + mem[j].size >= end) +		break; +	} +	if (j >= info->n_memranges) +	    goto badseg; +    } +    return 1; + +conflict: +    printf("%s occupies [%#lx-%#lx]\n", program_name, prog_start, prog_end); + +badseg: +    printf("Segment %d [%#lx-%#lx] doesn't fit into memory\n", i, start, end-1); +    return 0; +} + +static unsigned long process_image_notes(Elf_phdr *phdr, int phnum, +                                         unsigned short *sum_ptr, +                                         unsigned int offset) +{ +    int i; +    char *buf = NULL; +    int retval = 0; +    unsigned long addr, end; +    Elf_Nhdr *nhdr; +    const char *name; +    void *desc; + +    for (i = 0; i < phnum; i++) { +	if (phdr[i].p_type != PT_NOTE) +	    continue; +	buf = malloc(phdr[i].p_filesz); +	seek_io(fd, offset + phdr[i].p_offset); +	if ((size_t)read_io(fd, buf, phdr[i].p_filesz) != phdr[i].p_filesz) { +	    printf("Can't read note segment\n"); +	    goto out; +	} +	addr = (unsigned long) buf; +	end = addr + phdr[i].p_filesz; +	while (addr < end) { +	    nhdr = (Elf_Nhdr *) addr; +	    addr += sizeof(Elf_Nhdr); +	    name = (const char *) addr; +	    addr += (nhdr->n_namesz+3) & ~3; +	    desc = (void *) addr; +	    addr += (nhdr->n_descsz+3) & ~3; + +	    if (nhdr->n_namesz==sizeof(ELF_NOTE_BOOT) +		    && memcmp(name, ELF_NOTE_BOOT, sizeof(ELF_NOTE_BOOT))==0) { +		if (nhdr->n_type == EIN_PROGRAM_NAME) { +		    image_name = ob_calloc(1, nhdr->n_descsz + 1); +		    memcpy(image_name, desc, nhdr->n_descsz); +		} +		if (nhdr->n_type == EIN_PROGRAM_VERSION) { +		    image_version = ob_calloc(1, nhdr->n_descsz + 1); +		    memcpy(image_version, desc, nhdr->n_descsz); +		} +		if (nhdr->n_type == EIN_PROGRAM_CHECKSUM) { +		    *sum_ptr = *(unsigned short *) desc; +		    debug("Image checksum: %#04x\n", *sum_ptr); +		    /* Where in the file */ +		    retval = phdr[i].p_offset +			+ (unsigned long) desc - (unsigned long) buf; +		} +	    } +	} +    } +out: +    close_io(fd); +    if (buf) +	free(buf); +    return retval; +} + +static int load_segments(Elf_phdr *phdr, int phnum, +                         unsigned long checksum_offset, +                         unsigned int offset, unsigned long *bytes) +{ +    //unsigned int start_time, time; +    int i; + +    *bytes = 0; +    // start_time = currticks(); +    for (i = 0; i < phnum; i++) { +	if (phdr[i].p_type != PT_LOAD) +	    continue; +	debug("segment %d addr:" FMT_elf " file:" FMT_elf " mem:" FMT_elf " ", +              i, addr_fixup(phdr[i].p_paddr), phdr[i].p_filesz, phdr[i].p_memsz); +	seek_io(fd, offset + phdr[i].p_offset); +	debug("loading... "); +	if ((size_t)read_io(fd, phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz) +		!= phdr[i].p_filesz) { +	    printf("Can't read program segment %d\n", i); +	    return 0; +	} +	bytes += phdr[i].p_filesz; +	debug("clearing... "); +	memset(phys_to_virt(addr_fixup(phdr[i].p_paddr) + phdr[i].p_filesz), 0, +		phdr[i].p_memsz - phdr[i].p_filesz); +	if (phdr[i].p_offset <= checksum_offset +		&& phdr[i].p_offset + phdr[i].p_filesz >= checksum_offset+2) { +	    debug("clearing checksum... "); +	    memset(phys_to_virt(addr_fixup(phdr[i].p_paddr) + checksum_offset +			- phdr[i].p_offset), 0, 2); +	} +	debug("ok\n"); + +    } +    // time = currticks() - start_time; +    //debug("Loaded %lu bytes in %ums (%luKB/s)\n", bytes, time, +    //	    time? bytes/time : 0); +    debug("Loaded %lu bytes \n", *bytes); + +    return 1; +} + +static int verify_image(Elf_ehdr *ehdr, Elf_phdr *phdr, int phnum, +	unsigned short image_sum) +{ +    unsigned short sum, part_sum; +    unsigned long offset; +    int i; + +    sum = 0; +    offset = 0; + +    part_sum = ipchksum(ehdr, sizeof *ehdr); +    sum = add_ipchksums(offset, sum, part_sum); +    offset += sizeof *ehdr; + +    part_sum = ipchksum(phdr, phnum * sizeof(*phdr)); +    sum = add_ipchksums(offset, sum, part_sum); +    offset += phnum * sizeof(*phdr); + +    for (i = 0; i < phnum; i++) { +	if (phdr[i].p_type != PT_LOAD) +	    continue; +	part_sum = ipchksum(phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_memsz); +	sum = add_ipchksums(offset, sum, part_sum); +	offset += phdr[i].p_memsz; +    } + +    if (sum != image_sum) { +	printf("Verify FAILED (image:%#04x vs computed:%#04x)\n", +		image_sum, sum); +	return 0; +    } +    return 1; +} + +static inline unsigned padded(unsigned s) +{ +    return (s + 3) & ~3; +} + +static Elf_Bhdr *add_boot_note(Elf_Bhdr *bhdr, const char *name, +	unsigned type, const char *desc, unsigned descsz) +{ +    Elf_Nhdr nhdr; +    unsigned ent_size, new_size, pad; +    char *addr; + +    if (!bhdr) +	return NULL; + +    nhdr.n_namesz = name? strlen(name)+1 : 0; +    nhdr.n_descsz = descsz; +    nhdr.n_type = type; +    ent_size = sizeof(nhdr) + padded(nhdr.n_namesz) + padded(nhdr.n_descsz); +    if (bhdr->b_size + ent_size > 0xffff) { +	printf("Boot notes too big\n"); +	free(bhdr); +	return NULL; +    } +    if (bhdr->b_size + ent_size > bhdr->b_checksum) { +	do { +	    new_size = bhdr->b_checksum * 2; +	} while (new_size < bhdr->b_size + ent_size); +	if (new_size > 0xffff) +	    new_size = 0xffff; +	debug("expanding boot note size to %u\n", new_size); +#ifdef HAVE_REALLOC +	bhdr = realloc(bhdr, new_size); +	bhdr->b_checksum = new_size; +#else +	printf("Boot notes too big\n"); +	free(bhdr); +	return NULL; +#endif +    } + +    addr = (char *) bhdr; +    addr += bhdr->b_size; +    memcpy(addr, &nhdr, sizeof(nhdr)); +    addr += sizeof(nhdr); + +    if (name && nhdr.n_namesz) { +        memcpy(addr, name, nhdr.n_namesz); +        addr += nhdr.n_namesz; +        pad = padded(nhdr.n_namesz) - nhdr.n_namesz; +        memset(addr, 0, pad); +        addr += pad; +    } + +    memcpy(addr, desc, nhdr.n_descsz); +    addr += nhdr.n_descsz; +    pad = padded(nhdr.n_descsz) - nhdr.n_descsz; +    memset(addr, 0, pad); + +    bhdr->b_size += ent_size; +    bhdr->b_records++; +    return bhdr; +} + +static inline Elf_Bhdr *add_note_string(Elf_Bhdr *bhdr, const char *name, +	unsigned type, const char *desc) +{ +    return add_boot_note(bhdr, name, type, desc, strlen(desc) + 1); +} + +static Elf_Bhdr *build_boot_notes(struct sys_info *info, const char *cmdline) +{ +    Elf_Bhdr *bhdr; + +    bhdr = malloc(256); +    bhdr->b_signature = ELF_BHDR_MAGIC; +    bhdr->b_size = sizeof *bhdr; +    bhdr->b_checksum = 256; /* XXX cache the current buffer size here */ +    bhdr->b_records = 0; + +    if (info->firmware) +	bhdr = add_note_string(bhdr, NULL, EBN_FIRMWARE_TYPE, info->firmware); +    bhdr = add_note_string(bhdr, NULL, EBN_BOOTLOADER_NAME, program_name); +    bhdr = add_note_string(bhdr, NULL, EBN_BOOTLOADER_VERSION, program_version); +    if (cmdline) +	bhdr = add_note_string(bhdr, NULL, EBN_COMMAND_LINE, cmdline); +    if (!bhdr) +	return bhdr; +    bhdr->b_checksum = 0; +    bhdr->b_checksum = ipchksum(bhdr, bhdr->b_size); +    return bhdr; +} + +int +is_elf(Elf_ehdr *ehdr) +{ +    return (ehdr->e_ident[EI_MAG0] == ELFMAG0 +        && ehdr->e_ident[EI_MAG1] == ELFMAG1 +        && ehdr->e_ident[EI_MAG2] == ELFMAG2 +        && ehdr->e_ident[EI_MAG3] == ELFMAG3 +        && ehdr->e_ident[EI_CLASS] == ARCH_ELF_CLASS +        && ehdr->e_ident[EI_DATA] == ARCH_ELF_DATA +        && ehdr->e_ident[EI_VERSION] == EV_CURRENT +        && ehdr->e_type == ET_EXEC +        && ARCH_ELF_MACHINE_OK(ehdr->e_machine) +        && ehdr->e_version == EV_CURRENT +        && ehdr->e_phentsize == sizeof(Elf_phdr)); +} + +int +find_elf(Elf_ehdr *ehdr) +{ +   int offset; + +   for (offset = 0; offset < MAX_HEADERS * BS; offset += BS) { +        if ((size_t)read_io(fd, ehdr, sizeof ehdr) != sizeof ehdr) { +            debug("Can't read ELF header\n"); +            return 0; +        } + +        if (is_elf(ehdr)) { +            debug("Found ELF header at offset %d\n", offset); +	    return offset; +        } + +        seek_io(fd, offset); +    } + +    debug("Not a bootable ELF image\n"); +    return 0; +} + +Elf_phdr * +elf_readhdrs(int offset, Elf_ehdr *ehdr) +{ +    unsigned long phdr_size; +    Elf_phdr *phdr; + +    phdr_size = ehdr->e_phnum * sizeof(Elf_phdr); +    phdr = malloc(phdr_size); +    seek_io(fd, offset + ehdr->e_phoff); +    if ((size_t)read_io(fd, phdr, phdr_size) != phdr_size) { +	printf("Can't read program header\n"); +	return NULL; +    } + +    return phdr; +} + +int  +elf_load(struct sys_info *info, ihandle_t dev, const char *cmdline, void **boot_notes) +{ +    Elf_ehdr ehdr; +    Elf_phdr *phdr = NULL; +    unsigned long checksum_offset, file_size; +    unsigned short checksum = 0; +    int retval = -1; +    unsigned int offset; + +    image_name = image_version = NULL; + +    /* Mark the saved-program-state as invalid */ +    feval("0 state-valid !"); + +    fd = open_ih(dev); +    if (fd == -1) { +	goto out; +    } + +    offset = find_elf(&ehdr); +    if (!offset) { +	retval = LOADER_NOT_SUPPORT; +        goto out; +    } + +#if DEBUG +	printk("ELF header:\n"); +	printk(" ehdr.e_type    = %d\n", (int)ehdr.e_type); +	printk(" ehdr.e_machine = %d\n", (int)ehdr.e_machine); +	printk(" ehdr.e_version = %d\n", (int)ehdr.e_version); +	printk(" ehdr.e_entry   = 0x%08x\n", (int)ehdr.e_entry); +	printk(" ehdr.e_phoff   = 0x%08x\n", (int)ehdr.e_phoff); +	printk(" ehdr.e_shoff   = 0x%08x\n", (int)ehdr.e_shoff); +	printk(" ehdr.e_flags   = %d\n", (int)ehdr.e_flags); +	printk(" ehdr.e_ehsize  = 0x%08x\n", (int)ehdr.e_ehsize); +	printk(" ehdr.e_phentsize = 0x%08x\n", (int)ehdr.e_phentsize); +	printk(" ehdr.e_phnum   = %d\n", (int)ehdr.e_phnum); +#endif + +    if (ehdr.e_phnum > MAX_HEADERS) { +        printk ("elfload: too many program headers (MAX_HEADERS)\n"); +        retval = 0; +	goto out; +    } + +    phdr = elf_readhdrs(offset, &ehdr); +    if (!phdr) +        goto out; + +    if (!check_mem_ranges(info, phdr, ehdr.e_phnum)) +	goto out; + +    checksum_offset = process_image_notes(phdr, ehdr.e_phnum, &checksum, offset); + +    printf("Loading %s", image_name ? image_name : "image"); +    if (image_version) +	printf(" version %s", image_version); +    printf("...\n"); + +    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset, &file_size)) +	goto out; + +    if (checksum_offset) { +	if (!verify_image(&ehdr, phdr, ehdr.e_phnum, checksum)) +	    goto out; +    } + +    /* If we are attempting an ELF boot image, we pass a non-NULL pointer +       into boot_notes and mark the image as elf-boot rather than standard +       ELF */ +    if (boot_notes) { +        *boot_notes = (void *)virt_to_phys(build_boot_notes(info, cmdline)); +        feval("elf-boot saved-program-state >sps.file-type !"); +    } else { +        feval("elf saved-program-state >sps.file-type !"); +    } + +    //debug("current time: %lu\n", currticks()); + +    debug("entry point is " FMT_elf "\n", addr_fixup(ehdr.e_entry)); + +    // Initialise saved-program-state +    PUSH(addr_fixup(ehdr.e_entry)); +    feval("saved-program-state >sps.entry !"); +    PUSH(file_size); +    feval("saved-program-state >sps.file-size !"); + +    feval("-1 state-valid !"); + +out: +    close_io(fd); +    if (phdr) +	free(phdr); +    if (image_name) +	free(image_name); +    if (image_version) +	free(image_version); +    return retval; +} + +void  +elf_init_program(void) +{ +	char *base; +	int i; +	Elf_ehdr *ehdr; +	Elf_phdr *phdr; +	size_t size, total_size = 0; +	char *addr; +	uintptr_t tmp; + +	/* TODO: manage ELF notes section */ +	feval("0 state-valid !"); +	feval("load-base"); +	base = (char*)cell2pointer(POP()); + +	ehdr = (Elf_ehdr *)base; + +	if (!is_elf(ehdr)) { +		debug("Not a valid ELF memory image\n"); +		return; +	} + +	phdr = (Elf_phdr *)(base + ehdr->e_phoff); + +	for (i = 0; i < ehdr->e_phnum; i++) { + +#if DEBUG +		debug("filesz: %08lX memsz: %08lX p_offset: %08lX " +                        "p_vaddr %08lX\n", +			(unsigned long)phdr[i].p_filesz, (unsigned long)phdr[i].p_memsz, +			(unsigned long)phdr[i].p_offset, (unsigned long)phdr[i].p_vaddr ); +#endif + +		size = MIN(phdr[i].p_filesz, phdr[i].p_memsz); +		if (!size) +			continue; +#if !defined(CONFIG_SPARC32) && !defined(CONFIG_X86) +		if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) { +                        printk("Ignoring failed claim for va %lx memsz %lx!\n", +                               (unsigned long)phdr[i].p_vaddr, +                               (unsigned long)phdr[i].p_memsz); +		} +#endif +		/* Workaround for archs where sizeof(int) != pointer size */ +		tmp = phdr[i].p_vaddr; +		addr = (char *)tmp; + +		memcpy(addr, base + phdr[i].p_offset, size); + +		total_size += size; + +#ifdef CONFIG_PPC +		flush_icache_range( addr, addr + size ); +#endif +	} + +	// Initialise saved-program-state +	PUSH(ehdr->e_entry); +	feval("saved-program-state >sps.entry !"); +	PUSH(total_size); +	feval("saved-program-state >sps.file-size !"); +	feval("elf saved-program-state >sps.file-type !"); + +	feval("-1 state-valid !"); +} diff --git a/roms/openbios/libopenbios/fcode_load.c b/roms/openbios/libopenbios/fcode_load.c new file mode 100644 index 00000000..f4eb7bf3 --- /dev/null +++ b/roms/openbios/libopenbios/fcode_load.c @@ -0,0 +1,109 @@ +/* + * FCode boot loader + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libopenbios/bindings.h" +#include "libopenbios/fcode_load.h" +#include "libopenbios/sys_info.h" +#include "libc/diskio.h" +#define printf printk +#define debug printk + +static int fd; + +int  +is_fcode(unsigned char *fcode) +{ +	return (fcode[0] == 0xf0	// start0 +		|| fcode[0] == 0xf1	// start1  +		|| fcode[0] == 0xf2	// start2 +		|| fcode[0] == 0xf3	// start4 +		|| fcode[0] == 0xfd);	// version1 +} + +int  +fcode_load(ihandle_t dev) +{ +    int retval = -1; +    uint8_t fcode_header[8]; +    unsigned long start, size; +    unsigned int offset; + +    /* Mark the saved-program-state as invalid */ +    feval("0 state-valid !"); + +    fd = open_ih(dev); +    if (fd == -1) { +        goto out; +    } + +    for (offset = 0; offset < 16 * 512; offset += 512) { +        seek_io(fd, offset); +        if (read_io(fd, &fcode_header, sizeof(fcode_header)) +            != sizeof(fcode_header)) { +            debug("Can't read FCode header from ihandle " FMT_ucellx "\n", dev); +            retval = LOADER_NOT_SUPPORT; +            goto out; +        } + +	if (is_fcode(fcode_header)) +            goto found; +    } + +    debug("Not a bootable FCode image\n"); +    retval = LOADER_NOT_SUPPORT; +    goto out; + + found: +    size = (fcode_header[4] << 24) | (fcode_header[5] << 16) | +        (fcode_header[6] << 8) | fcode_header[7]; + +    fword("load-base"); +    start = POP(); + +    printf("\nLoading FCode image...\n"); + +    seek_io(fd, offset); + +    if ((size_t)read_io(fd, (void *)start, size) != size) { +        printf("Can't read file (size 0x%lx)\n", size); +        goto out; +    } + +    debug("Loaded %lu bytes\n", size); +    debug("entry point is %#lx\n", start); +     +    // Initialise saved-program-state +    PUSH(start); +    feval("saved-program-state >sps.entry !"); +    PUSH(size); +    feval("saved-program-state >sps.file-size !"); +    feval("fcode saved-program-state >sps.file-type !"); + +    feval("-1 state-valid !"); + +out: +    close_io(fd); +    return retval; +} + +void  +fcode_init_program(void) +{ +	/* If the payload is Fcode then we execute it immediately */ +	ucell address; + +	fword("load-base"); +	address = POP(); + +	if (!is_fcode((unsigned char *)address)) { +		debug("Not a valid Fcode memory image\n"); +		return; +	} + +	PUSH(address); +	PUSH(1); +	fword("byte-load"); +} diff --git a/roms/openbios/libopenbios/font_8x16.c b/roms/openbios/libopenbios/font_8x16.c new file mode 100644 index 00000000..26c4e449 --- /dev/null +++ b/roms/openbios/libopenbios/font_8x16.c @@ -0,0 +1,4622 @@ +/**********************************************/ +/*                                            */ +/*       Font file generated by cpi2fnt       */ +/*                                            * + *                                            * + * originally from the Linux distribution     * + *                                            * + **********************************************/ + +#include "libopenbios/fontdata.h" + +const unsigned char fontdata_8x16[FONTDATAMAX_8X16] = { + +	/* 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 '' */ +	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/roms/openbios/libopenbios/font_8x8.c b/roms/openbios/libopenbios/font_8x8.c new file mode 100644 index 00000000..861929ea --- /dev/null +++ b/roms/openbios/libopenbios/font_8x8.c @@ -0,0 +1,2571 @@ +/**********************************************/ +/*                                            */ +/*       Font file generated by cpi2fnt       */ +/*                                            */ +/**********************************************/ + +#include "libopenbios/fontdata.h" + +const unsigned char fontdata_8x8[FONTDATAMAX_8X8] = { + +	/* 0 0x00 '^@' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 1 0x01 '^A' */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ + +	/* 2 0x02 '^B' */ +	0x6c, /* 01101100 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 3 0x03 '^C' */ +	0x6c, /* 01101100 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0x7c, /* 01111100 */ +	0x38, /* 00111000 */ +	0x10, /* 00010000 */ +	0x00, /* 00000000 */ + +	/* 4 0x04 '^D' */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ +	0x7c, /* 01111100 */ +	0xfe, /* 11111110 */ +	0x7c, /* 01111100 */ +	0x38, /* 00111000 */ +	0x10, /* 00010000 */ +	0x00, /* 00000000 */ + +	/* 5 0x05 '^E' */ +	0x38, /* 00111000 */ +	0x7c, /* 01111100 */ +	0x38, /* 00111000 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xd6, /* 11010110 */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ + +	/* 6 0x06 '^F' */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ +	0x7c, /* 01111100 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0x7c, /* 01111100 */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ + +	/* 7 0x07 '^G' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 8 0x08 '^H' */ +	0xff, /* 11111111 */ +	0xff, /* 11111111 */ +	0xe7, /* 11100111 */ +	0xc3, /* 11000011 */ +	0xc3, /* 11000011 */ +	0xe7, /* 11100111 */ +	0xff, /* 11111111 */ +	0xff, /* 11111111 */ + +	/* 9 0x09 '^I' */ +	0x00, /* 00000000 */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x42, /* 01000010 */ +	0x42, /* 01000010 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 10 0x0a '^J' */ +	0xff, /* 11111111 */ +	0xc3, /* 11000011 */ +	0x99, /* 10011001 */ +	0xbd, /* 10111101 */ +	0xbd, /* 10111101 */ +	0x99, /* 10011001 */ +	0xc3, /* 11000011 */ +	0xff, /* 11111111 */ + +	/* 11 0x0b '^K' */ +	0x0f, /* 00001111 */ +	0x07, /* 00000111 */ +	0x0f, /* 00001111 */ +	0x7d, /* 01111101 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x78, /* 01111000 */ + +	/* 12 0x0c '^L' */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ + +	/* 13 0x0d '^M' */ +	0x3f, /* 00111111 */ +	0x33, /* 00110011 */ +	0x3f, /* 00111111 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x70, /* 01110000 */ +	0xf0, /* 11110000 */ +	0xe0, /* 11100000 */ + +	/* 14 0x0e '^N' */ +	0x7f, /* 01111111 */ +	0x63, /* 01100011 */ +	0x7f, /* 01111111 */ +	0x63, /* 01100011 */ +	0x63, /* 01100011 */ +	0x67, /* 01100111 */ +	0xe6, /* 11100110 */ +	0xc0, /* 11000000 */ + +	/* 15 0x0f '^O' */ +	0x18, /* 00011000 */ +	0xdb, /* 11011011 */ +	0x3c, /* 00111100 */ +	0xe7, /* 11100111 */ +	0xe7, /* 11100111 */ +	0x3c, /* 00111100 */ +	0xdb, /* 11011011 */ +	0x18, /* 00011000 */ + +	/* 16 0x10 '^P' */ +	0x80, /* 10000000 */ +	0xe0, /* 11100000 */ +	0xf8, /* 11111000 */ +	0xfe, /* 11111110 */ +	0xf8, /* 11111000 */ +	0xe0, /* 11100000 */ +	0x80, /* 10000000 */ +	0x00, /* 00000000 */ + +	/* 17 0x11 '^Q' */ +	0x02, /* 00000010 */ +	0x0e, /* 00001110 */ +	0x3e, /* 00111110 */ +	0xfe, /* 11111110 */ +	0x3e, /* 00111110 */ +	0x0e, /* 00001110 */ +	0x02, /* 00000010 */ +	0x00, /* 00000000 */ + +	/* 18 0x12 '^R' */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ + +	/* 19 0x13 '^S' */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ + +	/* 20 0x14 '^T' */ +	0x7f, /* 01111111 */ +	0xdb, /* 11011011 */ +	0xdb, /* 11011011 */ +	0x7b, /* 01111011 */ +	0x1b, /* 00011011 */ +	0x1b, /* 00011011 */ +	0x1b, /* 00011011 */ +	0x00, /* 00000000 */ + +	/* 21 0x15 '^U' */ +	0x3e, /* 00111110 */ +	0x61, /* 01100001 */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x86, /* 10000110 */ +	0x7c, /* 01111100 */ + +	/* 22 0x16 '^V' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x7e, /* 01111110 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 23 0x17 '^W' */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ + +	/* 24 0x18 '^X' */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 25 0x19 '^Y' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 26 0x1a '^Z' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0xfe, /* 11111110 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 27 0x1b '^[' */ +	0x00, /* 00000000 */ +	0x30, /* 00110000 */ +	0x60, /* 01100000 */ +	0xfe, /* 11111110 */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 28 0x1c '^\' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 29 0x1d '^]' */ +	0x00, /* 00000000 */ +	0x24, /* 00100100 */ +	0x66, /* 01100110 */ +	0xff, /* 11111111 */ +	0x66, /* 01100110 */ +	0x24, /* 00100100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 30 0x1e '^^' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x7e, /* 01111110 */ +	0xff, /* 11111111 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 31 0x1f '^_' */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0xff, /* 11111111 */ +	0x7e, /* 01111110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 32 0x20 ' ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 33 0x21 '!' */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 34 0x22 '"' */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x24, /* 00100100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 35 0x23 '#' */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0xfe, /* 11111110 */ +	0x6c, /* 01101100 */ +	0xfe, /* 11111110 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x00, /* 00000000 */ + +	/* 36 0x24 '$' */ +	0x18, /* 00011000 */ +	0x3e, /* 00111110 */ +	0x60, /* 01100000 */ +	0x3c, /* 00111100 */ +	0x06, /* 00000110 */ +	0x7c, /* 01111100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 37 0x25 '%' */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xcc, /* 11001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x66, /* 01100110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 38 0x26 '&' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 39 0x27 ''' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 40 0x28 '(' */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x00, /* 00000000 */ + +	/* 41 0x29 ')' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x00, /* 00000000 */ + +	/* 42 0x2a '*' */ +	0x00, /* 00000000 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0xff, /* 11111111 */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 43 0x2b '+' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 44 0x2c ',' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ + +	/* 45 0x2d '-' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 46 0x2e '.' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 47 0x2f '/' */ +	0x06, /* 00000110 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x60, /* 01100000 */ +	0xc0, /* 11000000 */ +	0x80, /* 10000000 */ +	0x00, /* 00000000 */ + +	/* 48 0x30 '0' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xd6, /* 11010110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ + +	/* 49 0x31 '1' */ +	0x18, /* 00011000 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 50 0x32 '2' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0x06, /* 00000110 */ +	0x1c, /* 00011100 */ +	0x30, /* 00110000 */ +	0x66, /* 01100110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 51 0x33 '3' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0x06, /* 00000110 */ +	0x3c, /* 00111100 */ +	0x06, /* 00000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 52 0x34 '4' */ +	0x1c, /* 00011100 */ +	0x3c, /* 00111100 */ +	0x6c, /* 01101100 */ +	0xcc, /* 11001100 */ +	0xfe, /* 11111110 */ +	0x0c, /* 00001100 */ +	0x1e, /* 00011110 */ +	0x00, /* 00000000 */ + +	/* 53 0x35 '5' */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xfc, /* 11111100 */ +	0x06, /* 00000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 54 0x36 '6' */ +	0x38, /* 00111000 */ +	0x60, /* 01100000 */ +	0xc0, /* 11000000 */ +	0xfc, /* 11111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 55 0x37 '7' */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x00, /* 00000000 */ + +	/* 56 0x38 '8' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 57 0x39 '9' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7e, /* 01111110 */ +	0x06, /* 00000110 */ +	0x0c, /* 00001100 */ +	0x78, /* 01111000 */ +	0x00, /* 00000000 */ + +	/* 58 0x3a ':' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 59 0x3b ';' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ + +	/* 60 0x3c '<' */ +	0x06, /* 00000110 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x06, /* 00000110 */ +	0x00, /* 00000000 */ + +	/* 61 0x3d '=' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 62 0x3e '>' */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x60, /* 01100000 */ +	0x00, /* 00000000 */ + +	/* 63 0x3f '?' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 64 0x40 '@' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xde, /* 11011110 */ +	0xde, /* 11011110 */ +	0xde, /* 11011110 */ +	0xc0, /* 11000000 */ +	0x78, /* 01111000 */ +	0x00, /* 00000000 */ + +	/* 65 0x41 'A' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 66 0x42 'B' */ +	0xfc, /* 11111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x7c, /* 01111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0xfc, /* 11111100 */ +	0x00, /* 00000000 */ + +	/* 67 0x43 'C' */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 68 0x44 'D' */ +	0xf8, /* 11111000 */ +	0x6c, /* 01101100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x6c, /* 01101100 */ +	0xf8, /* 11111000 */ +	0x00, /* 00000000 */ + +	/* 69 0x45 'E' */ +	0xfe, /* 11111110 */ +	0x62, /* 01100010 */ +	0x68, /* 01101000 */ +	0x78, /* 01111000 */ +	0x68, /* 01101000 */ +	0x62, /* 01100010 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 70 0x46 'F' */ +	0xfe, /* 11111110 */ +	0x62, /* 01100010 */ +	0x68, /* 01101000 */ +	0x78, /* 01111000 */ +	0x68, /* 01101000 */ +	0x60, /* 01100000 */ +	0xf0, /* 11110000 */ +	0x00, /* 00000000 */ + +	/* 71 0x47 'G' */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xce, /* 11001110 */ +	0x66, /* 01100110 */ +	0x3a, /* 00111010 */ +	0x00, /* 00000000 */ + +	/* 72 0x48 'H' */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 73 0x49 'I' */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 74 0x4a 'J' */ +	0x1e, /* 00011110 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x78, /* 01111000 */ +	0x00, /* 00000000 */ + +	/* 75 0x4b 'K' */ +	0xe6, /* 11100110 */ +	0x66, /* 01100110 */ +	0x6c, /* 01101100 */ +	0x78, /* 01111000 */ +	0x6c, /* 01101100 */ +	0x66, /* 01100110 */ +	0xe6, /* 11100110 */ +	0x00, /* 00000000 */ + +	/* 76 0x4c 'L' */ +	0xf0, /* 11110000 */ +	0x60, /* 01100000 */ +	0x60, /* 01100000 */ +	0x60, /* 01100000 */ +	0x62, /* 01100010 */ +	0x66, /* 01100110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 77 0x4d 'M' */ +	0xc6, /* 11000110 */ +	0xee, /* 11101110 */ +	0xfe, /* 11111110 */ +	0xfe, /* 11111110 */ +	0xd6, /* 11010110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 78 0x4e 'N' */ +	0xc6, /* 11000110 */ +	0xe6, /* 11100110 */ +	0xf6, /* 11110110 */ +	0xde, /* 11011110 */ +	0xce, /* 11001110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 79 0x4f 'O' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 80 0x50 'P' */ +	0xfc, /* 11111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x7c, /* 01111100 */ +	0x60, /* 01100000 */ +	0x60, /* 01100000 */ +	0xf0, /* 11110000 */ +	0x00, /* 00000000 */ + +	/* 81 0x51 'Q' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xce, /* 11001110 */ +	0x7c, /* 01111100 */ +	0x0e, /* 00001110 */ + +	/* 82 0x52 'R' */ +	0xfc, /* 11111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x7c, /* 01111100 */ +	0x6c, /* 01101100 */ +	0x66, /* 01100110 */ +	0xe6, /* 11100110 */ +	0x00, /* 00000000 */ + +	/* 83 0x53 'S' */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 84 0x54 'T' */ +	0x7e, /* 01111110 */ +	0x7e, /* 01111110 */ +	0x5a, /* 01011010 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 85 0x55 'U' */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 86 0x56 'V' */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ + +	/* 87 0x57 'W' */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xd6, /* 11010110 */ +	0xd6, /* 11010110 */ +	0xfe, /* 11111110 */ +	0x6c, /* 01101100 */ +	0x00, /* 00000000 */ + +	/* 88 0x58 'X' */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 89 0x59 'Y' */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 90 0x5a 'Z' */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0x8c, /* 10001100 */ +	0x18, /* 00011000 */ +	0x32, /* 00110010 */ +	0x66, /* 01100110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 91 0x5b '[' */ +	0x3c, /* 00111100 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 92 0x5c '\' */ +	0xc0, /* 11000000 */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x06, /* 00000110 */ +	0x02, /* 00000010 */ +	0x00, /* 00000000 */ + +	/* 93 0x5d ']' */ +	0x3c, /* 00111100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 94 0x5e '^' */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 95 0x5f '_' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ + +	/* 96 0x60 '`' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 97 0x61 'a' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 98 0x62 'b' */ +	0xe0, /* 11100000 */ +	0x60, /* 01100000 */ +	0x7c, /* 01111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ + +	/* 99 0x63 'c' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc0, /* 11000000 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 100 0x64 'd' */ +	0x1c, /* 00011100 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 101 0x65 'e' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 102 0x66 'f' */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x60, /* 01100000 */ +	0xf8, /* 11111000 */ +	0x60, /* 01100000 */ +	0x60, /* 01100000 */ +	0xf0, /* 11110000 */ +	0x00, /* 00000000 */ + +	/* 103 0x67 'g' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x7c, /* 01111100 */ +	0x0c, /* 00001100 */ +	0xf8, /* 11111000 */ + +	/* 104 0x68 'h' */ +	0xe0, /* 11100000 */ +	0x60, /* 01100000 */ +	0x6c, /* 01101100 */ +	0x76, /* 01110110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0xe6, /* 11100110 */ +	0x00, /* 00000000 */ + +	/* 105 0x69 'i' */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 106 0x6a 'j' */ +	0x06, /* 00000110 */ +	0x00, /* 00000000 */ +	0x06, /* 00000110 */ +	0x06, /* 00000110 */ +	0x06, /* 00000110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ + +	/* 107 0x6b 'k' */ +	0xe0, /* 11100000 */ +	0x60, /* 01100000 */ +	0x66, /* 01100110 */ +	0x6c, /* 01101100 */ +	0x78, /* 01111000 */ +	0x6c, /* 01101100 */ +	0xe6, /* 11100110 */ +	0x00, /* 00000000 */ + +	/* 108 0x6c 'l' */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 109 0x6d 'm' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xec, /* 11101100 */ +	0xfe, /* 11111110 */ +	0xd6, /* 11010110 */ +	0xd6, /* 11010110 */ +	0xd6, /* 11010110 */ +	0x00, /* 00000000 */ + +	/* 110 0x6e 'n' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xdc, /* 11011100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ + +	/* 111 0x6f 'o' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 112 0x70 'p' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xdc, /* 11011100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x7c, /* 01111100 */ +	0x60, /* 01100000 */ +	0xf0, /* 11110000 */ + +	/* 113 0x71 'q' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x7c, /* 01111100 */ +	0x0c, /* 00001100 */ +	0x1e, /* 00011110 */ + +	/* 114 0x72 'r' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xdc, /* 11011100 */ +	0x76, /* 01110110 */ +	0x60, /* 01100000 */ +	0x60, /* 01100000 */ +	0xf0, /* 11110000 */ +	0x00, /* 00000000 */ + +	/* 115 0x73 's' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x06, /* 00000110 */ +	0xfc, /* 11111100 */ +	0x00, /* 00000000 */ + +	/* 116 0x74 't' */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0xfc, /* 11111100 */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x36, /* 00110110 */ +	0x1c, /* 00011100 */ +	0x00, /* 00000000 */ + +	/* 117 0x75 'u' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 118 0x76 'v' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ + +	/* 119 0x77 'w' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xd6, /* 11010110 */ +	0xd6, /* 11010110 */ +	0xfe, /* 11111110 */ +	0x6c, /* 01101100 */ +	0x00, /* 00000000 */ + +	/* 120 0x78 'x' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 121 0x79 'y' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7e, /* 01111110 */ +	0x06, /* 00000110 */ +	0xfc, /* 11111100 */ + +	/* 122 0x7a 'z' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x4c, /* 01001100 */ +	0x18, /* 00011000 */ +	0x32, /* 00110010 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 123 0x7b '{' */ +	0x0e, /* 00001110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x70, /* 01110000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x0e, /* 00001110 */ +	0x00, /* 00000000 */ + +	/* 124 0x7c '|' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 125 0x7d '}' */ +	0x70, /* 01110000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x0e, /* 00001110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x70, /* 01110000 */ +	0x00, /* 00000000 */ + +	/* 126 0x7e '~' */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 127 0x7f '' */ +	0x00, /* 00000000 */ +	0x10, /* 00010000 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 128 0x80 '€' */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x0c, /* 00001100 */ +	0x78, /* 01111000 */ + +	/* 129 0x81 '' */ +	0xcc, /* 11001100 */ +	0x00, /* 00000000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 130 0x82 '‚' */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 131 0x83 'ƒ' */ +	0x7c, /* 01111100 */ +	0x82, /* 10000010 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 132 0x84 '„' */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 133 0x85 '…' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 134 0x86 '†' */ +	0x30, /* 00110000 */ +	0x30, /* 00110000 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 135 0x87 '‡' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0x7e, /* 01111110 */ +	0x0c, /* 00001100 */ +	0x38, /* 00111000 */ + +	/* 136 0x88 'ˆ' */ +	0x7c, /* 01111100 */ +	0x82, /* 10000010 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 137 0x89 '‰' */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 138 0x8a 'Š' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 139 0x8b '‹' */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 140 0x8c 'Œ' */ +	0x7c, /* 01111100 */ +	0x82, /* 10000010 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 141 0x8d '' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 142 0x8e 'Ž' */ +	0xc6, /* 11000110 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 143 0x8f '' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 144 0x90 '' */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0xf8, /* 11111000 */ +	0xc0, /* 11000000 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 145 0x91 '‘' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0xd8, /* 11011000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 146 0x92 '’' */ +	0x3e, /* 00111110 */ +	0x6c, /* 01101100 */ +	0xcc, /* 11001100 */ +	0xfe, /* 11111110 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xce, /* 11001110 */ +	0x00, /* 00000000 */ + +	/* 147 0x93 '“' */ +	0x7c, /* 01111100 */ +	0x82, /* 10000010 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 148 0x94 '”' */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 149 0x95 '•' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 150 0x96 '–' */ +	0x78, /* 01111000 */ +	0x84, /* 10000100 */ +	0x00, /* 00000000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 151 0x97 '—' */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 152 0x98 '˜' */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7e, /* 01111110 */ +	0x06, /* 00000110 */ +	0xfc, /* 11111100 */ + +	/* 153 0x99 '™' */ +	0xc6, /* 11000110 */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ + +	/* 154 0x9a 'š' */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 155 0x9b '›' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 156 0x9c 'œ' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0x64, /* 01100100 */ +	0xf0, /* 11110000 */ +	0x60, /* 01100000 */ +	0x66, /* 01100110 */ +	0xfc, /* 11111100 */ +	0x00, /* 00000000 */ + +	/* 157 0x9d '' */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 158 0x9e 'ž' */ +	0xf8, /* 11111000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xfa, /* 11111010 */ +	0xc6, /* 11000110 */ +	0xcf, /* 11001111 */ +	0xc6, /* 11000110 */ +	0xc7, /* 11000111 */ + +	/* 159 0x9f 'Ÿ' */ +	0x0e, /* 00001110 */ +	0x1b, /* 00011011 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0xd8, /* 11011000 */ +	0x70, /* 01110000 */ +	0x00, /* 00000000 */ + +	/* 160 0xa0 ' ' */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x7c, /* 01111100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 161 0xa1 '¡' */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x38, /* 00111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 162 0xa2 '¢' */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ + +	/* 163 0xa3 '£' */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 164 0xa4 '¤' */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ +	0xdc, /* 11011100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x00, /* 00000000 */ + +	/* 165 0xa5 '¥' */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ +	0xe6, /* 11100110 */ +	0xf6, /* 11110110 */ +	0xde, /* 11011110 */ +	0xce, /* 11001110 */ +	0x00, /* 00000000 */ + +	/* 166 0xa6 '¦' */ +	0x3c, /* 00111100 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x3e, /* 00111110 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 167 0xa7 '§' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 168 0xa8 '¨' */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x63, /* 01100011 */ +	0x3e, /* 00111110 */ +	0x00, /* 00000000 */ + +	/* 169 0xa9 '©' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 170 0xaa 'ª' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x06, /* 00000110 */ +	0x06, /* 00000110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 171 0xab '«' */ +	0x63, /* 01100011 */ +	0xe6, /* 11100110 */ +	0x6c, /* 01101100 */ +	0x7e, /* 01111110 */ +	0x33, /* 00110011 */ +	0x66, /* 01100110 */ +	0xcc, /* 11001100 */ +	0x0f, /* 00001111 */ + +	/* 172 0xac '¬' */ +	0x63, /* 01100011 */ +	0xe6, /* 11100110 */ +	0x6c, /* 01101100 */ +	0x7a, /* 01111010 */ +	0x36, /* 00110110 */ +	0x6a, /* 01101010 */ +	0xdf, /* 11011111 */ +	0x06, /* 00000110 */ + +	/* 173 0xad '' */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 174 0xae '®' */ +	0x00, /* 00000000 */ +	0x33, /* 00110011 */ +	0x66, /* 01100110 */ +	0xcc, /* 11001100 */ +	0x66, /* 01100110 */ +	0x33, /* 00110011 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 175 0xaf '¯' */ +	0x00, /* 00000000 */ +	0xcc, /* 11001100 */ +	0x66, /* 01100110 */ +	0x33, /* 00110011 */ +	0x66, /* 01100110 */ +	0xcc, /* 11001100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 176 0xb0 '°' */ +	0x22, /* 00100010 */ +	0x88, /* 10001000 */ +	0x22, /* 00100010 */ +	0x88, /* 10001000 */ +	0x22, /* 00100010 */ +	0x88, /* 10001000 */ +	0x22, /* 00100010 */ +	0x88, /* 10001000 */ + +	/* 177 0xb1 '±' */ +	0x55, /* 01010101 */ +	0xaa, /* 10101010 */ +	0x55, /* 01010101 */ +	0xaa, /* 10101010 */ +	0x55, /* 01010101 */ +	0xaa, /* 10101010 */ +	0x55, /* 01010101 */ +	0xaa, /* 10101010 */ + +	/* 178 0xb2 '²' */ +	0x77, /* 01110111 */ +	0xdd, /* 11011101 */ +	0x77, /* 01110111 */ +	0xdd, /* 11011101 */ +	0x77, /* 01110111 */ +	0xdd, /* 11011101 */ +	0x77, /* 01110111 */ +	0xdd, /* 11011101 */ + +	/* 179 0xb3 '³' */ +	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 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 181 0xb5 'µ' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 182 0xb6 '¶' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xf6, /* 11110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 183 0xb7 '·' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 184 0xb8 '¸' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 185 0xb9 '¹' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xf6, /* 11110110 */ +	0x06, /* 00000110 */ +	0xf6, /* 11110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 186 0xba 'º' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 187 0xbb '»' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x06, /* 00000110 */ +	0xf6, /* 11110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 188 0xbc '¼' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xf6, /* 11110110 */ +	0x06, /* 00000110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 189 0xbd '½' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 190 0xbe '¾' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 191 0xbf '¿' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xf8, /* 11111000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 192 0xc0 'À' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 193 0xc1 'Á' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 194 0xc2 'Â' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 195 0xc3 'Ã' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 196 0xc4 'Ä' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 197 0xc5 'Å' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 198 0xc6 'Æ' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 199 0xc7 'Ç' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x37, /* 00110111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 200 0xc8 'È' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x37, /* 00110111 */ +	0x30, /* 00110000 */ +	0x3f, /* 00111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 201 0xc9 'É' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x3f, /* 00111111 */ +	0x30, /* 00110000 */ +	0x37, /* 00110111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 202 0xca 'Ê' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xf7, /* 11110111 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 203 0xcb 'Ë' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0xf7, /* 11110111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 204 0xcc 'Ì' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x37, /* 00110111 */ +	0x30, /* 00110000 */ +	0x37, /* 00110111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 205 0xcd 'Í' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 206 0xce 'Î' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xf7, /* 11110111 */ +	0x00, /* 00000000 */ +	0xf7, /* 11110111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 207 0xcf 'Ï' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 208 0xd0 'Ð' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 209 0xd1 'Ñ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 210 0xd2 'Ò' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xff, /* 11111111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 211 0xd3 'Ó' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x3f, /* 00111111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 212 0xd4 'Ô' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 213 0xd5 'Õ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 214 0xd6 'Ö' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x3f, /* 00111111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 215 0xd7 '×' */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0xff, /* 11111111 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ + +	/* 216 0xd8 'Ø' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ +	0x18, /* 00011000 */ +	0xff, /* 11111111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 217 0xd9 'Ù' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xf8, /* 11111000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 218 0xda 'Ú' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x1f, /* 00011111 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 219 0xdb 'Û' */ +	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 */ +	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 */ + +	/* 222 0xde 'Þ' */ +	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 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 224 0xe0 'à' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0xc8, /* 11001000 */ +	0xdc, /* 11011100 */ +	0x76, /* 01110110 */ +	0x00, /* 00000000 */ + +	/* 225 0xe1 'á' */ +	0x78, /* 01111000 */ +	0xcc, /* 11001100 */ +	0xcc, /* 11001100 */ +	0xd8, /* 11011000 */ +	0xcc, /* 11001100 */ +	0xc6, /* 11000110 */ +	0xcc, /* 11001100 */ +	0x00, /* 00000000 */ + +	/* 226 0xe2 'â' */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0xc0, /* 11000000 */ +	0x00, /* 00000000 */ + +	/* 227 0xe3 'ã' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x00, /* 00000000 */ + +	/* 228 0xe4 'ä' */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0x60, /* 01100000 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ + +	/* 229 0xe5 'å' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0xd8, /* 11011000 */ +	0xd8, /* 11011000 */ +	0xd8, /* 11011000 */ +	0x70, /* 01110000 */ +	0x00, /* 00000000 */ + +	/* 230 0xe6 'æ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x7c, /* 01111100 */ +	0xc0, /* 11000000 */ + +	/* 231 0xe7 'ç' */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ + +	/* 232 0xe8 'è' */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x3c, /* 00111100 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ + +	/* 233 0xe9 'é' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xfe, /* 11111110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ + +	/* 234 0xea 'ê' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0xee, /* 11101110 */ +	0x00, /* 00000000 */ + +	/* 235 0xeb 'ë' */ +	0x0e, /* 00001110 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x3e, /* 00111110 */ +	0x66, /* 01100110 */ +	0x66, /* 01100110 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ + +	/* 236 0xec 'ì' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0xdb, /* 11011011 */ +	0xdb, /* 11011011 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 237 0xed 'í' */ +	0x06, /* 00000110 */ +	0x0c, /* 00001100 */ +	0x7e, /* 01111110 */ +	0xdb, /* 11011011 */ +	0xdb, /* 11011011 */ +	0x7e, /* 01111110 */ +	0x60, /* 01100000 */ +	0xc0, /* 11000000 */ + +	/* 238 0xee 'î' */ +	0x1e, /* 00011110 */ +	0x30, /* 00110000 */ +	0x60, /* 01100000 */ +	0x7e, /* 01111110 */ +	0x60, /* 01100000 */ +	0x30, /* 00110000 */ +	0x1e, /* 00011110 */ +	0x00, /* 00000000 */ + +	/* 239 0xef 'ï' */ +	0x00, /* 00000000 */ +	0x7c, /* 01111100 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0xc6, /* 11000110 */ +	0x00, /* 00000000 */ + +	/* 240 0xf0 'ð' */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0xfe, /* 11111110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 241 0xf1 'ñ' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x7e, /* 01111110 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 242 0xf2 'ò' */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 243 0xf3 'ó' */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x18, /* 00011000 */ +	0x0c, /* 00001100 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ + +	/* 244 0xf4 'ô' */ +	0x0e, /* 00001110 */ +	0x1b, /* 00011011 */ +	0x1b, /* 00011011 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ + +	/* 245 0xf5 'õ' */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0xd8, /* 11011000 */ +	0xd8, /* 11011000 */ +	0x70, /* 01110000 */ + +	/* 246 0xf6 'ö' */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x7e, /* 01111110 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 247 0xf7 '÷' */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ +	0x76, /* 01110110 */ +	0xdc, /* 11011100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 248 0xf8 'ø' */ +	0x38, /* 00111000 */ +	0x6c, /* 01101100 */ +	0x6c, /* 01101100 */ +	0x38, /* 00111000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 249 0xf9 'ù' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 250 0xfa 'ú' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x18, /* 00011000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 251 0xfb 'û' */ +	0x0f, /* 00001111 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0x0c, /* 00001100 */ +	0xec, /* 11101100 */ +	0x6c, /* 01101100 */ +	0x3c, /* 00111100 */ +	0x1c, /* 00011100 */ + +	/* 252 0xfc 'ü' */ +	0x6c, /* 01101100 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x36, /* 00110110 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 253 0xfd 'ý' */ +	0x78, /* 01111000 */ +	0x0c, /* 00001100 */ +	0x18, /* 00011000 */ +	0x30, /* 00110000 */ +	0x7c, /* 01111100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 254 0xfe 'þ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x3c, /* 00111100 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +	/* 255 0xff 'ÿ' */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ +	0x00, /* 00000000 */ + +}; diff --git a/roms/openbios/libopenbios/forth_load.c b/roms/openbios/libopenbios/forth_load.c new file mode 100644 index 00000000..c3a1929f --- /dev/null +++ b/roms/openbios/libopenbios/forth_load.c @@ -0,0 +1,88 @@ +/* tag: forth source loader + * + * Copyright (C) 2004 Stefan Reinauer + * + * See the file "COPYING" for further information about + * the copyright and warranty status of this work. + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libopenbios/bindings.h" +#include "libopenbios/sys_info.h" +#include "libc/diskio.h" +#include "libopenbios/forth_load.h" +#define printk printk +#define debug printk + +static int fd; +static char *forthtext=NULL; + +int is_forth(char *forth) +{ +	return (forth[0] == '\\' && forth[1] == ' '); +} + +int forth_load(ihandle_t dev) +{ +    char magic[2]; +    unsigned long forthsize; +    int retval = -1; + +    /* Mark the saved-program-state as invalid */ +    feval("0 state-valid !"); + +    fd = open_ih(dev); +    if (fd == -1) { +	goto out; +    } + +    if (read_io(fd, magic, 2) != 2) { +	debug("Can't read magic header\n"); +	retval = LOADER_NOT_SUPPORT; +	goto out; +    } + +    if (!is_forth(magic)) { +	debug("No forth source image\n"); +	retval = LOADER_NOT_SUPPORT; +	goto out; +    } + +    /* Calculate the file size by seeking to the end of the file */ +    seek_io(fd, -1); +    forthsize = tell(fd); +    forthtext = malloc(forthsize+1); +    seek_io(fd, 0); + +    printk("Loading forth source ..."); +    if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) { +	printk("Can't read forth text\n"); +	goto out; +    } +    forthtext[forthsize]=0; +    printk("ok\n"); + +    // Initialise saved-program-state +    PUSH((ucell)forthtext); +    feval("saved-program-state >sps.entry !"); +    PUSH((ucell)forthsize); +    feval("saved-program-state >sps.file-size !"); +    feval("forth saved-program-state >sps.file-type !"); + +    feval("-1 state-valid !"); + +    retval=0; + +out: +    //if (forthtext) +    //	free(forthtext); +    return retval; +} + +void  +forth_init_program(void) +{ +	// Currently not implemented +	feval("0 state-valid !"); +} diff --git a/roms/openbios/libopenbios/helpers.fs b/roms/openbios/libopenbios/helpers.fs new file mode 100644 index 00000000..8f5db9ff --- /dev/null +++ b/roms/openbios/libopenbios/helpers.fs @@ -0,0 +1,35 @@ +\ tag: helper functions +\  +\ deblocker / filesystem support +\  +\ Copyright (C) 2003 Samuel Rydh +\  +\ See the file "COPYING" for further information about +\ the copyright and warranty status of this work. +\  + + +\ create device node and any missing parents. +\ The new node becomes the active package + +: create-node ( nodepath -- ) +  recursive +  ascii / right-split +  2dup find-dev if +    active-package! +    2drop +  else +    ( nodename path ) +    dup if +      create-node +    else +      device-tree @ active-package! +      2drop +    then +  then +  new-device +  device-name +  active-package +  finish-device +  active-package! +; diff --git a/roms/openbios/libopenbios/init.c b/roms/openbios/libopenbios/init.c new file mode 100644 index 00000000..10fb55cd --- /dev/null +++ b/roms/openbios/libopenbios/init.c @@ -0,0 +1,27 @@ +/* + *   Creation Date: <2010/04/02 12:00:00 mcayland> + *   Time-stamp: <2010/04/02 12:00:00 mcayland> + * + *	<init.c> + * + *	OpenBIOS intialization + * + *   Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "libopenbios/openbios.h" +#include "libopenbios/bindings.h" +#include "libopenbios/initprogram.h" + +void +openbios_init( void ) +{ +	// Bind the C implementation of (init-program) into Forth +	bind_func("(init-program)", init_program); +} diff --git a/roms/openbios/libopenbios/initprogram.c b/roms/openbios/libopenbios/initprogram.c new file mode 100644 index 00000000..1fa33ba6 --- /dev/null +++ b/roms/openbios/libopenbios/initprogram.c @@ -0,0 +1,85 @@ +/* + *   Creation Date: <2010/04/02 13:00:00 mcayland> + *   Time-stamp: <2010/04/02 13:00:00 mcayland> + * + *	<initprogram.c> + * + *	C implementation of (init-program) word + * + *   Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libopenbios/bindings.h" +#include "libopenbios/initprogram.h" + +/* Because the a.out loader requires platform-specific headers */ +#ifdef CONFIG_LOADER_AOUT +#include "libopenbios/aout_load.h" +#endif + +#include "libopenbios/bootinfo_load.h" +#include "libopenbios/elf_load.h" +#include "libopenbios/fcode_load.h" +#include "libopenbios/forth_load.h" +#include "libopenbios/xcoff_load.h" + + +void init_program(void) +{ +	/* Get the value of load-base and use it to determine the correct loader +           to use */ +	ucell addr; + +	feval("load-base"); +	addr = POP(); + +#ifdef CONFIG_LOADER_AOUT +	if (is_aout((struct exec *)cell2pointer(addr))) { +		aout_init_program(); +		return; +	} +#endif + +#ifdef CONFIG_LOADER_BOOTINFO +	if (is_bootinfo((char *)cell2pointer(addr))) { +		bootinfo_init_program(); +		return; +	} +#endif + +#ifdef CONFIG_LOADER_ELF +	if (is_elf((Elf_ehdr *)cell2pointer(addr))) { +		elf_init_program(); +		return; +	} +#endif + +#ifdef CONFIG_LOADER_FCODE +	if (is_fcode((unsigned char *)cell2pointer(addr))) { +		fcode_init_program(); +		return; +	} +#endif + +#ifdef CONFIG_LOADER_FORTH +	if (is_forth((char *)cell2pointer(addr))) { +		forth_init_program(); +		return; +	} +#endif + +#ifdef CONFIG_LOADER_XCOFF +	if (is_xcoff((COFF_filehdr_t *)cell2pointer(addr))) { +		xcoff_init_program(); +		return; +	} +#endif + +} diff --git a/roms/openbios/libopenbios/ipchecksum.c b/roms/openbios/libopenbios/ipchecksum.c new file mode 100644 index 00000000..83f39bce --- /dev/null +++ b/roms/openbios/libopenbios/ipchecksum.c @@ -0,0 +1,55 @@ +/* Taken from Etherboot */ + +#include "libopenbios/ipchecksum.h" + +unsigned short ipchksum(const void *data, unsigned long length) +{ +	unsigned long sum; +	unsigned long i; +	const unsigned char *ptr; +	union { +	    unsigned char byte[2]; +	    unsigned short word; +	} u; + +	/* In the most straight forward way possible, +	 * compute an ip style checksum. +	 */ +	sum = 0; +	ptr = data; +	for(i = 0; i < length; i++) { +		unsigned long value; +		value = ptr[i]; +		if (i & 1) { +			value <<= 8; +		} +		/* Add the new value */ +		sum += value; +		/* Wrap around the carry */ +		if (sum > 0xFFFF) { +			sum = (sum + (sum >> 16)) & 0xFFFF; +		} +	} +	u.byte[0] = (unsigned char) sum; +	u.byte[1] = (unsigned char) (sum >> 8); +	return (unsigned short) ~u.word; +} + +unsigned short add_ipchksums(unsigned long offset, unsigned short sum, unsigned short new) +{ +	unsigned long checksum; +	sum = ~sum & 0xFFFF; +	new = ~new & 0xFFFF; +	if (offset & 1) { +		/* byte swap the sum if it came from an odd offset +		 * since the computation is endian independant this +		 * works. +		 */ +		new = (new << 8) | (new >> 8); +	} +	checksum = sum + new; +	if (checksum > 0xFFFF) { +		checksum -= 0xFFFF; +	} +	return (~checksum) & 0xFFFF; +} diff --git a/roms/openbios/libopenbios/linuxbios.h b/roms/openbios/libopenbios/linuxbios.h new file mode 100644 index 00000000..0f7cba96 --- /dev/null +++ b/roms/openbios/libopenbios/linuxbios.h @@ -0,0 +1,181 @@ +#ifndef LINUXBIOS_TABLES_H +#define LINUXBIOS_TABLES_H + +/* The linuxbios table information is for conveying information + * from the firmware to the loaded OS image.  Primarily this + * is expected to be information that cannot be discovered by + * other means, such as quering the hardware directly. + * + * All of the information should be Position Independent Data. + * That is it should be safe to relocated any of the information + * without it's meaning/correctnes changing.   For table that + * can reasonably be used on multiple architectures the data + * size should be fixed.  This should ease the transition between + * 32 bit and 64 bit architectures etc. + * + * The completeness test for the information in this table is: + * - Can all of the hardware be detected? + * - Are the per motherboard constants available? + * - Is there enough to allow a kernel to run that was written before + *   a particular motherboard is constructed? (Assuming the kernel + *   has drivers for all of the hardware but it does not have + *   assumptions on how the hardware is connected together). + * + * With this test it should be straight forward to determine if a + * table entry is required or not.  This should remove much of the + * long term compatibility burden as table entries which are + * irrelevant or have been replaced by better alternatives may be + * dropped.  Of course it is polite and expidite to include extra + * table entries and be backwards compatible, but it is not required. + */ + + +struct lb_header +{ +	uint8_t  signature[4]; /* LBIO */ +	uint32_t header_bytes; +	uint32_t header_checksum; +	uint32_t table_bytes; +	uint32_t table_checksum; +	uint32_t table_entries; +}; + +/* Every entry in the boot enviroment list will correspond to a boot + * info record.  Encoding both type and size.  The type is obviously + * so you can tell what it is.  The size allows you to skip that + * boot enviroment record if you don't know what it easy.  This allows + * forward compatibility with records not yet defined. + */ +struct lb_record { +	uint32_t tag;		/* tag ID */ +	uint32_t size;		/* size of record (in bytes) */ +}; + +#define LB_TAG_UNUSED	0x0000 + +#define LB_TAG_MEMORY	0x0001 + +struct lb_memory_range { +	uint64_t start; +	uint64_t size; +	uint32_t type; +#define LB_MEM_RAM       1	/* Memory anyone can use */ +#define LB_MEM_RESERVED  2	/* Don't use this memory region */ +#define LB_MEM_TABLE     16	/* Ram configuration tables are kept in */ + +}; + +struct lb_memory { +	uint32_t tag; +	uint32_t size; +	struct lb_memory_range map[0]; +}; + +#define LB_TAG_HWRPB	0x0002 +struct lb_hwrpb { +	uint32_t tag; +	uint32_t size; +	uint64_t hwrpb; +}; + +#define LB_TAG_MAINBOARD	0x0003 +struct lb_mainboard { +	uint32_t tag; +	uint32_t size; +	uint8_t  vendor_idx; +	uint8_t  part_number_idx; +	uint8_t  strings[0]; +}; + +#define LB_TAG_VERSION		0x0004 +#define LB_TAG_EXTRA_VERSION	0x0005 +#define LB_TAG_BUILD		0x0006 +#define LB_TAG_COMPILE_TIME	0x0007 +#define LB_TAG_COMPILE_BY	0x0008 +#define LB_TAG_COMPILE_HOST	0x0009 +#define LB_TAG_COMPILE_DOMAIN	0x000a +#define LB_TAG_COMPILER		0x000b +#define LB_TAG_LINKER		0x000c +#define LB_TAG_ASSEMBLER	0x000d +struct lb_string { +	uint32_t tag; +	uint32_t size; +	uint8_t  string[0]; +}; + +/* The following structures are for the cmos definitions table */ +#define LB_TAG_CMOS_OPTION_TABLE 200 +/* cmos header record */ +struct cmos_option_table { +	uint32_t tag;               /* CMOS definitions table type */ +	uint32_t size;               /* size of the entire table */ +	uint32_t header_length;      /* length of header */ +}; + +/* cmos entry record +        This record is variable length.  The name field may be +        shorter than CMOS_MAX_NAME_LENGTH. The entry may start +        anywhere in the byte, but can not span bytes unless it +        starts at the beginning of the byte and the length is +        fills complete bytes. +*/ +#define LB_TAG_OPTION 201 +struct cmos_entries { +	uint32_t tag;                /* entry type */ +	uint32_t size;               /* length of this record */ +	uint32_t bit;                /* starting bit from start of image */ +	uint32_t length;             /* length of field in bits */ +	uint32_t config;             /* e=enumeration, h=hex, r=reserved */ +	uint32_t config_id;          /* a number linking to an enumeration record */ +#define CMOS_MAX_NAME_LENGTH 32 +	uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name of entry in ascii, +					       variable length int aligned */ +}; + + +/* cmos enumerations record +        This record is variable length.  The text field may be +        shorter than CMOS_MAX_TEXT_LENGTH. +*/ +#define LB_TAG_OPTION_ENUM 202 +struct cmos_enums { +	uint32_t tag;		     /* enumeration type */ +	uint32_t size; 		     /* length of this record */ +	uint32_t config_id;          /* a number identifying the config id */ +	uint32_t value;              /* the value associated with the text */ +#define CMOS_MAX_TEXT_LENGTH 32 +	uint8_t text[CMOS_MAX_TEXT_LENGTH]; /* enum description in ascii, +						variable length int aligned */ +}; + +/* cmos defaults record +        This record contains default settings for the cmos ram. +*/ +#define LB_TAG_OPTION_DEFAULTS 203 +struct cmos_defaults { +	uint32_t tag;                /* default type */ +	uint32_t size;               /* length of this record */ +	uint32_t name_length;        /* length of the following name field */ +	uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name identifying the default */ +#define CMOS_IMAGE_BUFFER_SIZE 128 +	uint8_t default_set[CMOS_IMAGE_BUFFER_SIZE]; /* default settings */ +}; + +#define LB_TAG_OPTION_CHECKSUM 204 +struct	cmos_checksum { +	uint32_t tag; +	uint32_t size; +	/* In practice everything is byte aligned, but things are measured +	 * in bits to be consistent. +	 */ +	uint32_t range_start;	/* First bit that is checksummed (byte aligned) */ +	uint32_t range_end;	/* Last bit that is checksummed (byte aligned) */ +	uint32_t location;	/* First bit of the checksum (byte aligned) */ +	uint32_t type;		/* Checksum algorithm that is used */ +#define CHECKSUM_NONE	0 +#define CHECKSUM_PCBIOS	1 +}; + + + +#endif /* LINUXBIOS_TABLES_H */ diff --git a/roms/openbios/libopenbios/linuxbios_info.c b/roms/openbios/libopenbios/linuxbios_info.c new file mode 100644 index 00000000..bef996cf --- /dev/null +++ b/roms/openbios/libopenbios/linuxbios_info.c @@ -0,0 +1,130 @@ +/* Adapted from Etherboot 5.1.8 */ + +#include "config.h" +#include "sysinclude.h" +#include "asm/types.h" +#include "asm/io.h" +#include "linuxbios.h" +#include "libopenbios/ipchecksum.h" +#include "libopenbios/sys_info.h" + +#ifdef CONFIG_DEBUG_BOOT +#define debug printk +#else +#define debug(x...) +#endif + +#define for_each_lbrec(head, rec) \ +	for(rec = (struct lb_record *)(((char *)head) + sizeof(*head)); \ +		(((char *)rec) < (((char *)head) + sizeof(*head) + head->table_bytes))  && \ +		(rec->size >= 1) && \ +		((((char *)rec) + rec->size) <= (((char *)head) + sizeof(*head) + head->table_bytes)); \ +		rec = (struct lb_record *)(((char *)rec) + rec->size)) + +static void convert_memmap(struct lb_memory *lbmem, struct sys_info *info) +{ +    int lbcount; +    int i; + +    lbcount = lbmem->size / sizeof(struct lb_memory_range); +    info->memrange = malloc(lbcount * sizeof(struct memrange)); +    info->n_memranges = 0; +    for (i = 0; i < lbcount; i++) { +	debug("%#016llx %#016llx %d\n", +              (long long)lbmem->map[i].start, (long long)lbmem->map[i].size, +              (int) lbmem->map[i].type); +	if (lbmem->map[i].type != LB_MEM_RAM) +	    continue; +	info->memrange[info->n_memranges].base = lbmem->map[i].start; +	info->memrange[info->n_memranges].size = lbmem->map[i].size; +	info->n_memranges++; +    } +} + +static int read_lbtable(struct lb_header *head, struct sys_info *info) +{ +	int retval = 0; + +	/* Read linuxbios tables... */ +	struct lb_record *rec; + +	for_each_lbrec(head, rec) { +		switch(rec->tag) { +		case LB_TAG_MEMORY: +			convert_memmap((struct lb_memory *) rec, info); +			retval = 1; +			break; +		}; +	} +	return retval; +} + +static unsigned long count_lb_records(void *start, unsigned long length) +{ +	struct lb_record *rec; +	void *end; +	unsigned long count; +	count = 0; +	end = ((char *)start) + length; +	for(rec = start; ((void *)rec < end) && +		((signed long)rec->size <= +                 ((signed long)end - (signed long)rec)); +		rec = (void *)(((char *)rec) + rec->size)) { +		count++; +	} +	return count; +} + +static int find_lb_table(void *start, void *end, struct lb_header **result) +{ +	unsigned char *ptr; +	/* For now be stupid.... */ +	for(ptr = start; (void *)ptr < end; ptr += 16) { +		struct lb_header *head = (struct lb_header *)ptr; +		if (	(head->signature[0] != 'L') || +			(head->signature[1] != 'B') || +			(head->signature[2] != 'I') || +			(head->signature[3] != 'O')) { +			continue; +		} +		if (head->header_bytes != sizeof(*head)) +			continue; +		debug("Found canidate at: %p\n", head); +		if (ipchksum((uint16_t *)head, sizeof(*head)) != 0) +			continue; +		debug("header checksum o.k.\n"); +		if (ipchksum((uint16_t *)(ptr + sizeof(*head)), head->table_bytes) != +			head->table_checksum) { +			continue; +		} +		debug("table checksum o.k.\n"); +		if (count_lb_records(ptr + sizeof(*head), head->table_bytes) != +			head->table_entries) { +			continue; +		} +		debug("record count o.k.\n"); +		*result = head; +		return 1; +	}; +	return 0; +} + +void collect_linuxbios_info(struct sys_info *info) +{ +	struct lb_header *lb_table; +	int found; +	debug("Searching for LinuxBIOS tables...\n"); +	found = 0; +	if (!found) { +		found = find_lb_table(phys_to_virt(0x00000), phys_to_virt(0x01000), &lb_table); +	} +	if (!found) { +		found = find_lb_table(phys_to_virt(0xf0000), phys_to_virt(0x100000), &lb_table); +	} +	if (!found) +		return; + +	debug("Found LinuxBIOS table at: %p\n", lb_table); +	info->firmware = "LinuxBIOS"; +	read_lbtable(lb_table, info); +} diff --git a/roms/openbios/libopenbios/load.c b/roms/openbios/libopenbios/load.c new file mode 100644 index 00000000..4bc12ea3 --- /dev/null +++ b/roms/openbios/libopenbios/load.c @@ -0,0 +1,122 @@ +/* + *   Creation Date: <2010/06/25 20:00:00 mcayland> + *   Time-stamp: <2010/06/25 20:00:00 mcayland> + * + *	<load.c> + * + *	C implementation of load + * + *   Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "kernel/kernel.h" +#include "libopenbios/bindings.h" +#include "libopenbios/sys_info.h" +#include "libopenbios/load.h" + +#ifdef CONFIG_LOADER_ELF +#include "libopenbios/elf_load.h" +#endif + +#ifdef CONFIG_LOADER_AOUT +#include "libopenbios/aout_load.h" +#endif + +#ifdef CONFIG_LOADER_FCODE +#include "libopenbios/fcode_load.h" +#endif + +#ifdef CONFIG_LOADER_FORTH +#include "libopenbios/forth_load.h" +#endif + +#ifdef CONFIG_LOADER_BOOTCODE +#include "libopenbios/bootcode_load.h" +#endif + + +struct sys_info sys_info; +void *elf_boot_notes = NULL; + +/* ( addr -- size ) */ + +void load(ihandle_t dev) +{ +	/* Invoke the loaders on the specified device */ +	char *param; +	ucell valid; + +	/* TODO: Currently the internal loader APIs use load-base directly, so +	   drop the address */ +	POP(); + +#ifdef CONFIG_LOADER_ELF + +	/* Grab the boot arguments */ +	push_str("bootargs"); +	push_str("/chosen"); +	fword("(find-dev)"); +	POP(); +	fword("get-package-property"); +	POP(); +	param = pop_fstr_copy(); + +	elf_load(&sys_info, dev, param, &elf_boot_notes); +        feval("state-valid @"); +        valid = POP(); +        if (valid) { +                feval("saved-program-state >sps.file-size @"); +                return; +        } +#endif + +#ifdef CONFIG_LOADER_AOUT +	aout_load(&sys_info, dev); +        feval("state-valid @"); +        valid = POP(); +        if (valid) { +                feval("saved-program-state >sps.file-size @"); +                return; +        } +#endif + +#ifdef CONFIG_LOADER_FCODE +	fcode_load(dev); +        feval("state-valid @"); +        valid = POP(); +        if (valid) { +                feval("saved-program-state >sps.file-size @"); +                return; +        } +#endif + +#ifdef CONFIG_LOADER_FORTH +	forth_load(dev); +        feval("state-valid @"); +        valid = POP(); +        if (valid) { +                feval("saved-program-state >sps.file-size @"); +                return; +        } +#endif + +#ifdef CONFIG_LOADER_BOOTCODE +	/* Check for a "raw" %BOOT bootcode payload */ +	bootcode_load(dev); +        feval("state-valid @"); +        valid = POP(); +        if (valid) { +                feval("saved-program-state >sps.file-size @"); +                return; +        } +#endif + +        /* Didn't load anything, so return zero size */ +        PUSH(0); +} diff --git a/roms/openbios/libopenbios/ofmem_common.c b/roms/openbios/libopenbios/ofmem_common.c new file mode 100644 index 00000000..052aa2f4 --- /dev/null +++ b/roms/openbios/libopenbios/ofmem_common.c @@ -0,0 +1,990 @@ +/* + *	<ofmem_common.c> + * + *	OF Memory manager + * + *   Copyright (C) 1999-2004 Samuel Rydh (samuel@ibrium.se) + *   Copyright (C) 2004 Stefan Reinauer + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   as published by the Free Software Foundation + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libopenbios/ofmem.h" + +/* Default size of memory allocated for each of the MMU properties (in bytes) */ +#define OFMEM_DEFAULT_PROP_SIZE 2048 + +/* + * define OFMEM_FILL_RANGE to claim any unclaimed virtual and + * physical memory in the range for ofmem_map + * + * TODO: remove this macro and wrapped code if not needed by implementations + */ +//#define OFMEM_FILL_RANGE + + +static inline size_t align_size(size_t x, size_t a) +{ +    return (x + a - 1) & ~(a - 1); +} + +static inline phys_addr_t align_ptr(uintptr_t x, size_t a) +{ +    return (x + a - 1) & ~(a - 1); +} + +static ucell get_ram_size( void ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	return ofmem->ramsize; +} + +/************************************************************************/ +/* debug                                                                */ +/************************************************************************/ + +#if 0 +static void +print_range( range_t *r, const char *str ) +{ +	printk("--- Range %s ---\n", str ); +	for( ; r; r=r->next ) +		printk("%p : " FMT_plx " - " FMT_plx "\n", r, r->start, r->start + r->size - 1); +	printk("\n"); +} + +static void +print_phys_range(void) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	print_range( ofmem->phys_range, "phys" ); +} + +static void +print_virt_range(void) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	print_range( ofmem->virt_range, "virt" ); +} + +static void +print_trans( void ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t *t = ofmem->trans; + +	printk("--- Translations ---\n"); +	for( ; t; t=t->next ) +		printk("%p : " FMT_ucellx " -> " FMT_plx " [size " FMT_ucellx "]\n", t, t->virt, t->phys, t->size); +	printk("\n"); +} +#endif + +/************************************************************************/ +/* OF private allocations                                               */ +/************************************************************************/ + +int ofmem_posix_memalign( void **memptr, size_t alignment, size_t size ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	alloc_desc_t *d, **pp; +	void *ret; +	ucell top; +	phys_addr_t pa; + +	if( !size ) +		return ENOMEM; + +	if( !ofmem->next_malloc ) +		ofmem->next_malloc = (char*)ofmem_arch_get_malloc_base(); + +	size = align_size(size + sizeof(alloc_desc_t), alignment); + +	/* look in the freelist */ +	for( pp=&ofmem->mfree; *pp && (**pp).size < size; pp = &(**pp).next ) { +	} + +	/* waste at most 4K by taking an entry from the freelist */ +	if( *pp && (**pp).size > size + 0x1000 ) { +		/* Alignment should be on physical not virtual address */ +		pa = va2pa((uintptr_t)*pp + sizeof(alloc_desc_t)); +		pa = align_ptr(pa, alignment); +		ret = (void *)pa2va(pa); + +		memset( ret, 0, (**pp).size - sizeof(alloc_desc_t) ); +		*pp = (**pp).next; + +		*memptr = ret; +		return 0; +	} + +	top = ofmem_arch_get_heap_top(); + +	/* Alignment should be on physical not virtual address */ +	pa = va2pa((uintptr_t)ofmem->next_malloc + sizeof(alloc_desc_t)); +	pa = align_ptr(pa, alignment); +	ret = (void *)pa2va(pa); + +	if( pointer2cell(ret) + size > top ) { +		printk("out of malloc memory (%x)!\n", size ); +		return ENOMEM; +	} + +	d = (alloc_desc_t*)((uintptr_t)ret - sizeof(alloc_desc_t)); +	ofmem->next_malloc += size; + +	d->next = NULL; +	d->size = size; + +	memset( ret, 0, size - sizeof(alloc_desc_t) ); + +	*memptr = ret; +	return 0; +} + +void* ofmem_malloc( size_t size ) +{ +	void *memptr; +	int res; +	 +	res = ofmem_posix_memalign( &memptr, CONFIG_OFMEM_MALLOC_ALIGN, size ); +	if (!res) { +		/* Success */ +		return memptr; +	} else { +		/* Failure */ +		return NULL; +	} +} + +void ofmem_free( void *ptr ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	alloc_desc_t **pp, *d; + +	/* it is legal to free NULL pointers (size zero allocations) */ +	if( !ptr ) +		return; + +	d = (alloc_desc_t*)((char *)ptr - sizeof(alloc_desc_t)); +	d->next = ofmem->mfree; + +	/* insert in the (sorted) freelist */ +	for( pp=&ofmem->mfree; *pp && (**pp).size < d->size ; pp = &(**pp).next ) { +	} + +	d->next = *pp; +	*pp = d; +} + +void* ofmem_realloc( void *ptr, size_t size ) +{ +	alloc_desc_t *d = (alloc_desc_t*)((char *)ptr - sizeof(alloc_desc_t)); +	char *p; + +	if( !ptr ) +		return malloc( size ); +	if( !size ) { +		free( ptr ); +		return NULL; +	} +	p = malloc( size ); +	memcpy( p, ptr, MIN(d->size - sizeof(alloc_desc_t),size) ); +	free( ptr ); +	return p; +} + + +/************************************************************************/ +/* "translations" and "available" property tracking                     */ +/************************************************************************/ + +static int trans_prop_size = 0, phys_range_prop_size = 0, virt_range_prop_size = 0; +static int trans_prop_used = 0, phys_range_prop_used = 0, virt_range_prop_used = 0; +static ucell *trans_prop, *phys_range_prop, *virt_range_prop; + +static void +ofmem_set_property( phandle_t ph, const char *name, const char *buf, int len ) +{ +	/* This is very similar to set_property() in libopenbios/bindings.c but allows +	   us to set the property pointer directly, rather than having to copy it +	   into the Forth dictonary every time we update the memory properties */ +	if( !ph ) { +		printk("ofmem_set_property: NULL phandle\n"); +		return; +	} +	PUSH(pointer2cell(buf)); +	PUSH(len); +	push_str(name); +	PUSH_ph(ph); +	fword("encode-property"); +} + +phandle_t s_phandle_memory = 0; +phandle_t s_phandle_mmu = 0; + +static void ofmem_update_mmu_translations( void ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t *t; +	int ncells, prop_used, prop_size; + +	if (s_phandle_mmu == 0) +		return; + +	for( t = ofmem->trans, ncells = 0; t ; t=t->next, ncells++ ) { +	} + +	/* Get the current number of bytes required for the MMU translation property */ +	prop_used = ncells * sizeof(ucell) * ofmem_arch_get_translation_entry_size(); + +	if (prop_used > trans_prop_size) { + +		/* The property doesn't fit within the existing space, so keep doubling it +		   until it does */ +		prop_size = trans_prop_size; +		while (prop_size < prop_used) { +			prop_size *= 2; +		}  + +		/* Allocate the new memory and copy all of the existing information across */ +		trans_prop = realloc(trans_prop, prop_size); +		trans_prop_size = prop_size; +		trans_prop_used = prop_used; +	} + +	if (trans_prop == NULL) { +		/* out of memory! */ +		printk("Unable to allocate memory for translations property!\n"); +		return; +	} + +	/* Call architecture-specific routines to generate translation entries */ +	for( t = ofmem->trans, ncells = 0 ; t ; t=t->next ) { +		ofmem_arch_create_translation_entry(&trans_prop[ncells], t); +		ncells += ofmem_arch_get_translation_entry_size(); +	} + +	ofmem_set_property(s_phandle_mmu, "translations", +			(char*)trans_prop, ncells * sizeof(trans_prop[0])); + +} + + +static void ofmem_update_memory_available( phandle_t ph, range_t *range, +		ucell **mem_prop, int *mem_prop_size, int *mem_prop_used, u64 top_address ) +{ +	range_t *r; +	int ncells, prop_used, prop_size; +	phys_addr_t start; +	ucell size, *prop; + +	if (s_phandle_memory == 0) +		return; + +	/* count phys_range list entries */ +	for( r = range, ncells = 0; r ; r=r->next, ncells++ ) { +	} + +	/* inverse of phys_range list could take 2 or more additional cells for the tail +	   For /memory, physical addresses may be wider than one ucell. */ +	prop_used = (ncells + 1) * sizeof(ucell) * ofmem_arch_get_available_entry_size(ph) + 1; + +	if (prop_used > *mem_prop_size) { + +		/* The property doesn't fit within the existing space, so keep doubling it +		   until it does */ +		prop_size = *mem_prop_size; +		while (prop_size < prop_used) { +			prop_size *= 2; +		} + +		/* Allocate the new memory and copy all of the existing information across */ +		*mem_prop = realloc(*mem_prop, prop_size); +		*mem_prop_size = prop_size; +		*mem_prop_used = prop_used; +	} + +	if (*mem_prop == NULL) { +		/* out of memory! */ +		printk("Unable to allocate memory for memory range property!\n"); +		return; +	} + +	start = 0; +	ncells = 0; +	prop = *mem_prop; + +	for (r = range; r; r=r->next) { +		if (r->start >= top_address) { +			break; +		} + +		size = r->start - start; +		if (size) { +			ofmem_arch_create_available_entry(ph, &prop[ncells], start, size); +			ncells += ofmem_arch_get_available_entry_size(ph); +		} +		start = r->start + r->size; +	} + +	/* tail */ +	if ((start - 1) < top_address) { +		ofmem_arch_create_available_entry(ph, &prop[ncells], start, top_address - start + 1); +		ncells += ofmem_arch_get_available_entry_size(ph); +	} + +	ofmem_set_property(ph, "available", +			(char*)prop, ncells * sizeof(prop[0])); +} + +static void ofmem_update_translations( void ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); + +	ofmem_update_memory_available(s_phandle_memory, ofmem->phys_range,  +			&phys_range_prop, &phys_range_prop_size, &phys_range_prop_used, get_ram_size() - 1); +	ofmem_update_memory_available(s_phandle_mmu, ofmem->virt_range,  +			&virt_range_prop, &virt_range_prop_size, &virt_range_prop_used, (ucell)-1); +	ofmem_update_mmu_translations(); +} + + +/************************************************************************/ +/* client interface                                                     */ +/************************************************************************/ + +static int is_free( phys_addr_t ea, ucell size, range_t *r ) +{ +	if( size == 0 ) +		return 1; +	for( ; r ; r=r->next ) { +		if( r->start + r->size - 1 >= ea && r->start <= ea ) +			return 0; +		if( r->start >= ea && r->start <= ea + size - 1 ) +			return 0; +	} +	return 1; +} + +static void add_entry_( phys_addr_t ea, ucell size, range_t **r ) +{ +	range_t *nr; + +	for( ; *r && (**r).start < ea; r=&(**r).next ) { +	} + +	nr = (range_t*)malloc( sizeof(range_t) ); +	nr->next = *r; +	nr->start = ea; +	nr->size = size; +	*r = nr; +} + +static int add_entry( phys_addr_t ea, ucell size, range_t **r ) +{ +	if( !is_free( ea, size, *r ) ) { +		OFMEM_TRACE("add_entry: range not free!\n"); +		return -1; +	} +	add_entry_( ea, size, r ); +	return 0; +} + +#if defined(OFMEM_FILL_RANGE) +static void join_ranges( range_t **rr ) +{ +	range_t *n, *r = *rr; +	while( r ) { +		if( !(n=r->next) ) +			break; + +		if( r->start + r->size - 1 >= n->start -1 ) { +			int s = n->size + (n->start - r->start - r->size); +			if( s > 0 ) +				r->size += s; +			r->next = n->next; +			free( n ); +			continue; +		} +		r=r->next; +	} +} + +static void fill_range( phys_addr_t ea, ucell size, range_t **rr ) +{ +	add_entry_( ea, size, rr ); +	join_ranges( rr ); +} +#endif + +static ucell find_area( ucell align, ucell size, range_t *r, +		phys_addr_t min, phys_addr_t max, int reverse ) +{ +	phys_addr_t base = min; +	range_t *r2; +	ucell old_align = align; +	int i; + +	if( (align < PAGE_SIZE) ) { +		 +		/* Minimum alignment is page size */ +		align = PAGE_SIZE; +		 +		OFMEM_TRACE("warning: bad alignment " FMT_ucellx " rounded up to " FMT_ucellx "\n", old_align, align); +	} + +	if( (align & (align-1)) ) { +	 +		/* As per IEEE1275 specification, round up to the nearest power of 2 */ +		align--; +		for (i = 1; i < sizeof(ucell) * 8; i<<=1) { +			align |= align >> i; +		} +		align++; +		 +		OFMEM_TRACE("warning: bad alignment " FMT_ucellx " rounded up to " FMT_ucellx "\n", old_align, align); +	} + +	base = reverse ? max - size : min; +	r2 = reverse ? NULL : r; + +	for( ;; ) { +		if( !reverse ) { +			base = (base + align - 1) & ~(align-1); +			if( base < min ) +				base = min; +			if( base + size - 1 >= max -1 ) +				break; +		} else { +			if( base > max - size ) +				base = max - size; +			base -= base & (align-1); +		} +		if( is_free( base, size, r ) ) +			return base; + +		if( !reverse ) { +			if( !r2 ) +				break; +			base = r2->start + r2->size; +			r2 = r2->next; +		} else { +			range_t *rp; + +			for( rp=r; rp && rp->next != r2 ; rp=rp->next ) { +			} + +			r2 = rp; +			if( !r2 ) +				break; +			base = r2->start - size; +		} +	} +	return -1; +} + +static phys_addr_t ofmem_claim_phys_( phys_addr_t phys, ucell size, ucell align, +		phys_addr_t min, phys_addr_t max, int reverse ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	if( !align ) { +		if( !is_free( phys, size, ofmem->phys_range ) ) { +			OFMEM_TRACE("Non-free physical memory claimed!\n"); +			return -1; +		} +		add_entry( phys, size, &ofmem->phys_range ); +		ofmem_update_translations(); +		return phys; +	} +	phys = find_area( align, size, ofmem->phys_range, min, max, reverse ); +	if( phys == -1 ) { +		printk("ofmem_claim_phys - out of space (failed request for " FMT_ucellx " bytes)\n", size); +		return -1; +	} +	add_entry( phys, size, &ofmem->phys_range ); + +	ofmem_update_translations(); + +	return phys; +} + +/* if align != 0, phys is ignored. Returns -1 on error */ +phys_addr_t ofmem_claim_phys( phys_addr_t phys, ucell size, ucell align ) +{ +    OFMEM_TRACE("ofmem_claim_phys phys=" FMT_plx " size=" FMT_ucellx +                " align=" FMT_ucellx "\n", +                phys, size, align); + +	return ofmem_claim_phys_( phys, size, align, 0, get_ram_size(), 1 ); +} + +static ucell ofmem_claim_virt_( ucell virt, ucell size, ucell align, +		ucell min, ucell max, int reverse ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	if( !align ) { +		if( !is_free( virt, size, ofmem->virt_range ) ) { +			OFMEM_TRACE("Non-free virtual memory claimed!\n"); +			return -1; +		} +		add_entry( virt, size, &ofmem->virt_range ); +		ofmem_update_translations(); +		return virt; +	} + +	virt = find_area( align, size, ofmem->virt_range, min, max, reverse ); +	if( virt == -1 ) { +		printk("ofmem_claim_virt - out of space (failed request for " FMT_ucellx " bytes)\n", size); +		return -1; +	} +	add_entry( virt, size, &ofmem->virt_range ); +	 +	ofmem_update_translations(); +	 +	return virt; +} + +ucell ofmem_claim_virt( ucell virt, ucell size, ucell align ) +{ +    OFMEM_TRACE("ofmem_claim_virt virt=" FMT_ucellx " size=" FMT_ucellx +                " align=" FMT_ucellx "\n", +                virt, size, align); + +	/* printk("+ ofmem_claim virt %08lx %lx %ld\n", virt, size, align ); */ +	return ofmem_claim_virt_( virt, size, align, +			get_ram_size(), ofmem_arch_get_virt_top(), 1 ); +} + +static ucell ofmem_claim_io_( ucell virt, ucell size, ucell align, +		ucell min, ucell max, int reverse ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	if( !align ) { +		if( !is_free( virt, size, ofmem->io_range ) ) { +			OFMEM_TRACE("Non-free I/O memory claimed!\n"); +			return -1; +		} +		add_entry( virt, size, &ofmem->io_range ); +		return virt; +	} + +	virt = find_area( align, size, ofmem->io_range, min, max, reverse ); +	if( virt == -1 ) { +		printk("ofmem_claim_io - out of space (failed request for " FMT_ucellx " bytes)\n", size); +		return -1; +	} +	add_entry( virt, size, &ofmem->io_range ); +	return virt; +} + +ucell ofmem_claim_io( ucell virt, ucell size, ucell align ) +{ +	/* Claim a section of memory from the I/O range */ +	return ofmem_claim_io_( virt, size, align, +			ofmem_arch_get_iomem_base(), ofmem_arch_get_iomem_top(), 0 ); +} + +/* if align != 0, phys is ignored. Returns -1 on error */ +phys_addr_t ofmem_retain( phys_addr_t phys, ucell size, ucell align ) +{ +    retain_t *retained = ofmem_arch_get_retained(); +    phys_addr_t retain_phys; + +    OFMEM_TRACE("ofmem_retain phys=" FMT_plx " size=" FMT_ucellx +                " align=" FMT_ucellx "\n", +                phys, size, align); + +	retain_phys = ofmem_claim_phys_( phys, size, align, 0, get_ram_size(), 1 /* reverse */ ); + +	/* Add to the retain_phys_range list */ +	retained->retain_phys_range[retained->numentries].next = NULL; +	retained->retain_phys_range[retained->numentries].start = retain_phys; +	retained->retain_phys_range[retained->numentries].size = size; +	retained->numentries++; + +	return retain_phys; +} + +/* allocate both physical and virtual space and add a translation */ +ucell ofmem_claim( ucell addr, ucell size, ucell align ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	ucell virt; +	phys_addr_t phys; +	ucell offs = addr & (PAGE_SIZE - 1); + +	OFMEM_TRACE("ofmem_claim " FMT_ucellx " " FMT_ucellx " " FMT_ucellx "\n", addr, size, align ); +	virt = phys = 0; +	if( !align ) { +		if( is_free(addr, size, ofmem->virt_range) && +		    is_free(addr, size, ofmem->phys_range) ) { +			ofmem_claim_phys_( addr, size, 0, 0, 0, 0 ); +			ofmem_claim_virt_( addr, size, 0, 0, 0, 0 ); +			virt = phys = addr; +		} else { +			OFMEM_TRACE("**** ofmem_claim failure ***!\n"); +			return -1; +		} +	} else { +		if( align < PAGE_SIZE ) +			align = PAGE_SIZE; +		phys = ofmem_claim_phys_( -1, size, align, 0, get_ram_size(), 1 /* reverse */ ); +		virt = ofmem_claim_virt_( phys, size, 0, 0, 0, 0 ); +		if( phys == -1 || virt == -1 ) { +			OFMEM_TRACE("ofmem_claim failed\n"); +			return -1; +		} +		/* printk("...phys = %08lX, virt = %08lX, size = %08lX\n", phys, virt, size ); */ +	} + +	/* align */ +	if( phys & (PAGE_SIZE - 1) ) { +		size += (phys & (PAGE_SIZE - 1)); +		virt -= (phys & (PAGE_SIZE - 1)); +		phys &= PAGE_MASK; +	} +	if( size & (PAGE_SIZE - 1) ) +		size = (size + (PAGE_SIZE - 1)) & PAGE_MASK; + +	/* printk("...free memory found... phys: %08lX, virt: %08lX, size %lX\n", phys, virt, size ); */ +	ofmem_map( phys, virt, size, -1 ); +	return virt + offs; +} + + +/************************************************************************/ +/* keep track of ea -> phys translations                                */ +/************************************************************************/ + +static void split_trans( ucell virt ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t *t, *t2; + +	for( t=ofmem->trans; t; t=t->next ) { +		if( virt > t->virt && virt < t->virt + t->size-1 ) { +			t2 = (translation_t*)malloc( sizeof(translation_t) ); +			t2->virt = virt; +			t2->size = t->size - (virt - t->virt); +			t->size = virt - t->virt; +			t2->phys = t->phys + t->size; +			t2->mode = t->mode; +			t2->next = t->next; +			t->next = t2; +		} +	} +} + +int ofmem_map_page_range( phys_addr_t phys, ucell virt, ucell size, ucell mode ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t *t, **tt; + +	OFMEM_TRACE("ofmem_map_page_range " FMT_ucellx +			" -> " FMT_plx " " FMT_ucellx " mode " FMT_ucellx "\n", +			virt, phys, size, mode ); + +	split_trans( virt ); +	split_trans( virt + size ); + +	/* detect remappings */ +	for( t=ofmem->trans; t; ) { +		if( virt == t->virt || (virt < t->virt && virt + size > t->virt )) { +			if( t->phys + virt - t->virt != phys ) { +				OFMEM_TRACE("mapping altered virt=" FMT_ucellx ")\n", t->virt ); +			} else if( t->mode != mode ){ +				OFMEM_TRACE("mapping mode altered virt=" FMT_ucellx +						" old mode=" FMT_ucellx " new mode=" FMT_ucellx "\n", +						t->virt, t->mode, mode); +			} + +			for( tt=&ofmem->trans; *tt != t ; tt=&(**tt).next ) { +			} + +			*tt = t->next; + +			/* really unmap these pages */ +			ofmem_arch_unmap_pages(t->virt, t->size); + +			free((char*)t); + +			t=ofmem->trans; +			continue; +		} +		t=t->next; +	} + +	/* add mapping */ +	for( tt=&ofmem->trans; *tt && (**tt).virt < virt ; tt=&(**tt).next ) { +	} + +	t = (translation_t*)malloc( sizeof(translation_t) ); +	t->virt = virt; +	t->phys = phys; +	t->size = size; +	t->mode = mode; +	t->next = *tt; +	*tt = t; + +	ofmem_update_translations(); + +	return 0; +} + +static int unmap_page_range( ucell virt, ucell size ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t **plink; + +	/* make sure there is exactly one matching translation entry */ + +	split_trans( virt ); +	split_trans( virt + size ); + +	/* find and unlink entries in range */ +	plink = &ofmem->trans; + +	while (*plink && (*plink)->virt < virt+size) { +		translation_t **plinkentry = plink; +		translation_t *t = *plink; + +		/* move ahead */ +		plink = &t->next; + +		if (t->virt >= virt && t->virt + t->size <= virt+size) { + +			/* unlink entry */ +			*plinkentry = t->next; + +			OFMEM_TRACE("unmap_page_range found " +					FMT_ucellx " -> " FMT_plx " " FMT_ucellx +					" mode " FMT_ucellx "\n", +					t->virt, t->phys, t->size, t->mode ); + +			// really map these pages +			ofmem_arch_unmap_pages(t->virt, t->size); + +			free((char*)t); +		} +	} + +	ofmem_update_translations(); + +	return 0; +} + +int ofmem_map( phys_addr_t phys, ucell virt, ucell size, ucell mode ) +{ +	/* printk("+ofmem_map: %08lX --> %08lX (size %08lX, mode 0x%02X)\n", +	   virt, phys, size, mode ); */ + +	if( (phys & (PAGE_SIZE - 1)) || (virt & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1)) ) { + +		OFMEM_TRACE("ofmem_map: Bad parameters (" +				FMT_plx " " FMT_ucellx " " FMT_ucellx ")\n", +				phys, virt, size ); + +		phys &= PAGE_MASK; +		virt &= PAGE_MASK; +		size = (size + (PAGE_SIZE - 1)) & PAGE_MASK; +	} + +#if defined(OFMEM_FILL_RANGE) +	{ +		ofmem_t *ofmem = ofmem_arch_get_private(); +		/* claim any unclaimed virtual memory in the range */ +		fill_range( virt, size, &ofmem->virt_range ); +		/* hmm... we better claim the physical range too */ +		fill_range( phys, size, &ofmem->phys_range ); +	} +#endif + +	if (mode==-1) { +		mode = ofmem_arch_default_translation_mode(phys); +	} + +	/* install translations */ +	ofmem_map_page_range(phys, virt, size, mode); + +	/* allow arch to map the pages */ +	ofmem_arch_map_pages(phys, virt, size, mode); + +	return 0; +} + +int ofmem_unmap( ucell virt, ucell size ) +{ +	OFMEM_TRACE("ofmem_unmap " FMT_ucellx " " FMT_ucellx "\n", +			virt, size ); + +	if( (virt & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1)) ) { +		/* printk("ofmem_unmap: Bad parameters (%08lX %08lX)\n", +				virt, size ); */ +		virt &= PAGE_MASK; +		size = (size + (PAGE_SIZE - 1)) & PAGE_MASK; +	} + +	/* remove translations and unmap pages */ +	unmap_page_range(virt, size); + +	return 0; +} + +ucell ofmem_map_io( phys_addr_t phys, ucell size ) +{ +	/* Claim virtual memory from the I/O range and map the page-aligned +	   physical address phys to it, returning the newly allocated +	   virtual address */ +	ucell virt, mode; +	phys_addr_t off; +	int npages; + +	off = phys & (PAGE_SIZE - 1); +	npages = (off + size - 1) / PAGE_SIZE + 1; +	phys &= ~(PAGE_SIZE - 1); + +	virt = ofmem_claim_io(-1, npages * PAGE_SIZE, PAGE_SIZE); + +	mode = ofmem_arch_io_translation_mode(off); + +	ofmem_map_page_range(phys, virt, npages * PAGE_SIZE, mode); +	ofmem_arch_map_pages(phys, virt, npages * PAGE_SIZE, mode); + +	return (virt + off); +} + +/* virtual -> physical. */ +phys_addr_t ofmem_translate( ucell virt, ucell *mode ) +{ +	ofmem_t *ofmem = ofmem_arch_get_private(); +	translation_t *t; + +	for( t=ofmem->trans; t && t->virt <= virt ; t=t->next ) { +		ucell offs; +		if( t->virt + t->size - 1 < virt ) +			continue; +		offs = virt - t->virt; +		*mode = t->mode; +		return t->phys + offs; +	} + +	/*printk("ofmem_translate: no translation defined (%08lx)\n", virt);*/ +	/*print_trans();*/ +	return -1; +} + +static void remove_range_( phys_addr_t ea, ucell size, range_t **r ) +{ +	range_t **t, *u; + +	/* If not an exact match then split the range */ +	for (t = r; *t; t = &(**t).next) { +		if (ea > (**t).start && ea < (**t).start + (**t).size - 1) { +			u = (range_t*)malloc(sizeof(range_t)); +			u->start = ea; +			u->size = size; +			u->next = (**t).next; + +			OFMEM_TRACE("remove_range_ splitting range with addr=" FMT_plx +					" size=" FMT_ucellx " -> addr=" FMT_plx " size=" FMT_ucellx ", " +					"addr=" FMT_plx " size=" FMT_ucellx "\n", +					(**t).start, (**t).size, (**t).start, (**t).size - size, +					u->start, u->size); + +			(**t).size = (**t).size - size; +			(**t).next = u; +		} +	} + +	for (t = r; *t; t = &(**t).next) { +		if (ea >= (**t).start && ea + size <= (**t).start + (**t).size) { +			OFMEM_TRACE("remove_range_ freeing range with addr=" FMT_plx +					" size=" FMT_ucellx "\n", (**t).start, (**t).size); +			u = *t; +			*t = (**t).next; +			free(u); +			break; +		} +	} +} + +static int remove_range( phys_addr_t ea, ucell size, range_t **r ) +{ +	if( is_free( ea, size, *r ) ) { +		OFMEM_TRACE("remove_range: range isn't occupied\n"); +		return -1; +	} +	remove_range_( ea, size, r ); +	return 0; +} + +/* release memory allocated by ofmem_claim_phys */ +void ofmem_release_phys( phys_addr_t phys, ucell size ) +{ +    OFMEM_TRACE("ofmem_release_phys addr=" FMT_plx " size=" FMT_ucellx "\n", +                phys, size); + +    ofmem_t *ofmem = ofmem_arch_get_private(); +    remove_range(phys, size, &ofmem->phys_range); +} + +/* release memory allocated by ofmem_claim_virt */ +void ofmem_release_virt( ucell virt, ucell size ) +{ +    OFMEM_TRACE("ofmem_release_virt addr=" FMT_ucellx " size=" FMT_ucellx "\n", +                virt, size); + +    ofmem_t *ofmem = ofmem_arch_get_private(); +    remove_range(virt, size, &ofmem->virt_range); +} + +/* release memory allocated by ofmem_claim_io */ +void ofmem_release_io( ucell virt, ucell size ) +{ +    OFMEM_TRACE("ofmem_release_io addr=" FMT_ucellx " size=" FMT_ucellx "\n", +                virt, size); + +    ofmem_t *ofmem = ofmem_arch_get_private(); +    remove_range(virt, size, &ofmem->io_range); +} + +/* release memory allocated by ofmem_claim - 6.3.2.4 */ +void ofmem_release( ucell virt, ucell size ) +{ +    OFMEM_TRACE("%s addr=" FMT_ucellx " size=" FMT_ucellx "\n", +                __func__, virt, size); + +    ucell mode; +    phys_addr_t phys = ofmem_translate(virt, &mode); +    if (phys == (phys_addr_t)-1) { +        OFMEM_TRACE("%s: no mapping\n", __func__); +        return; +    } +    ofmem_unmap(virt, size); +    ofmem_release_virt(virt, size); +    ofmem_release_phys(phys, size); +} + +/************************************************************************/ +/* init / cleanup                                                       */ +/************************************************************************/ + +void ofmem_register( phandle_t ph_memory, phandle_t ph_mmu ) +{ +	s_phandle_memory = ph_memory; +	s_phandle_mmu = ph_mmu; + +	/* Initialise some default property sizes  */ +	trans_prop_size = phys_range_prop_size = virt_range_prop_size = OFMEM_DEFAULT_PROP_SIZE; +	trans_prop = malloc(trans_prop_size); +	phys_range_prop = malloc(phys_range_prop_size); +	virt_range_prop = malloc(virt_range_prop_size); + +	ofmem_update_translations(); +} diff --git a/roms/openbios/libopenbios/video_common.c b/roms/openbios/libopenbios/video_common.c new file mode 100644 index 00000000..9bbc18c3 --- /dev/null +++ b/roms/openbios/libopenbios/video_common.c @@ -0,0 +1,258 @@ +/* + *   Creation Date: <2002/10/23 20:26:40 samuel> + *   Time-stamp: <2004/01/07 19:39:15 samuel> + * + *     <video_common.c> + * + *     Shared video routines + * + *   Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se) + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   as published by the Free Software Foundation + * + */ + +#include "config.h" +#include "libc/vsprintf.h" +#include "libopenbios/bindings.h" +#include "libopenbios/fontdata.h" +#include "libopenbios/ofmem.h" +#include "libopenbios/video.h" +#include "packages/video.h" +#include "drivers/vga.h" +#define NO_QEMU_PROTOS +#include "arch/common/fw_cfg.h" + +struct video_info video; + +unsigned long +video_get_color( int col_ind ) +{ +	unsigned long col; +	if( !VIDEO_DICT_VALUE(video.ih) || col_ind < 0 || col_ind > 255 ) +		return 0; +	if( VIDEO_DICT_VALUE(video.depth) == 8 ) +		return col_ind; +	col = video.pal[col_ind]; +	if( VIDEO_DICT_VALUE(video.depth) == 24 || VIDEO_DICT_VALUE(video.depth) == 32 ) +		return col; +	if( VIDEO_DICT_VALUE(video.depth) == 15 ) +		return ((col>>9) & 0x7c00) | ((col>>6) & 0x03e0) | ((col>>3) & 0x1f); +	return 0; +} + +/* ( fbaddr maskaddr width height fgcolor bgcolor -- ) */ + +void +video_mask_blit(void) +{ +	ucell bgcolor = POP(); +	ucell fgcolor = POP(); +	ucell height = POP(); +	ucell width = POP(); +	unsigned char *mask = (unsigned char *)POP(); +	unsigned char *fbaddr = (unsigned char *)POP(); + +	ucell color; +	unsigned char *dst, *rowdst; +	int x, y, m, b, d, depthbytes; + +	fgcolor = video_get_color(fgcolor); +	bgcolor = video_get_color(bgcolor); +	d = VIDEO_DICT_VALUE(video.depth); +	depthbytes = (d + 1) >> 3; + +	dst = fbaddr; +	for( y = 0; y < height; y++) { +		rowdst = dst; +		for( x = 0; x < (width + 1) >> 3; x++ ) { +			for (b = 0; b < 8; b++) { +				m = (1 << (7 - b)); + +				if (*mask & m) { +					color = fgcolor; +				} else { +					color = bgcolor; +				} + +				if( d >= 24 ) +					*((uint32_t*)dst) = color; +				else if( d >= 15 ) +					*((uint16_t*)dst) = color; +				else +					*dst = color; + +				dst += depthbytes; +			} +			mask++; +		} +		dst = rowdst; +		dst += VIDEO_DICT_VALUE(video.rb); +	} +} + +/* ( x y w h fgcolor bgcolor -- ) */ + +void +video_invert_rect( void ) +{ +	ucell bgcolor = POP(); +	ucell fgcolor = POP(); +	int h = POP(); +	int w = POP(); +	int y = POP(); +	int x = POP(); +	char *pp; + +	bgcolor = video_get_color(bgcolor); +	fgcolor = video_get_color(fgcolor); + +	if (!VIDEO_DICT_VALUE(video.ih) || x < 0 || y < 0 || w <= 0 || h <= 0 || +		x + w > VIDEO_DICT_VALUE(video.w) || y + h > VIDEO_DICT_VALUE(video.h)) +		return; + +	pp = (char*)VIDEO_DICT_VALUE(video.mvirt) + VIDEO_DICT_VALUE(video.rb) * y; +	for( ; h--; pp += *(video.rb) ) { +		int ww = w; +		if( VIDEO_DICT_VALUE(video.depth) == 24 || VIDEO_DICT_VALUE(video.depth) == 32 ) { +			uint32_t *p = (uint32_t*)pp + x; +			while( ww-- ) { +				if (*p == fgcolor) { +					*p++ = bgcolor; +				} else if (*p == bgcolor) { +					*p++ = fgcolor; +				} +			} +		} else if( VIDEO_DICT_VALUE(video.depth) == 16 || VIDEO_DICT_VALUE(video.depth) == 15 ) { +			uint16_t *p = (uint16_t*)pp + x; +			while( ww-- ) { +				if (*p == (uint16_t)fgcolor) { +					*p++ = bgcolor; +				} else if (*p == (uint16_t)bgcolor) { +					*p++ = fgcolor; +				} +			} +		} else { +			char *p = (char *)(pp + x); + +			while( ww-- ) { +				if (*p == (char)fgcolor) { +					*p++ = bgcolor; +				} else if (*p == (char)bgcolor) { +					*p++ = fgcolor; +				} +			} +		} +	} +} + +/* ( color_ind x y width height -- ) (?) */ +void +video_fill_rect(void) +{ +	int h = POP(); +	int w = POP(); +	int y = POP(); +	int x = POP(); +	int col_ind = POP(); + +	char *pp; +	unsigned long col = video_get_color(col_ind); + +        if (!VIDEO_DICT_VALUE(video.ih) || x < 0 || y < 0 || w <= 0 || h <= 0 || +            x + w > VIDEO_DICT_VALUE(video.w) || y + h > VIDEO_DICT_VALUE(video.h)) +		return; + +	pp = (char*)VIDEO_DICT_VALUE(video.mvirt) + VIDEO_DICT_VALUE(video.rb) * y; +	for( ; h--; pp += VIDEO_DICT_VALUE(video.rb) ) { +		int ww = w; +		if( VIDEO_DICT_VALUE(video.depth) == 24 || VIDEO_DICT_VALUE(video.depth) == 32 ) { +			uint32_t *p = (uint32_t*)pp + x; +			while( ww-- ) +				*p++ = col; +		} else if( VIDEO_DICT_VALUE(video.depth) == 16 || VIDEO_DICT_VALUE(video.depth) == 15 ) { +			uint16_t *p = (uint16_t*)pp + x; +			while( ww-- ) +				*p++ = col; +		} else { +                        char *p = (char *)(pp + x); + +			while( ww-- ) +				*p++ = col; +		} +	} +} + +void setup_video() +{ +	/* Make everything inside the video_info structure point to the +	   values in the Forth dictionary. Hence everything is always in +	   sync. */ +	phandle_t options; +	char buf[6]; + +	feval("['] display-ih cell+"); +	video.ih = cell2pointer(POP()); + +	feval("['] frame-buffer-adr cell+"); +	video.mvirt = cell2pointer(POP()); +	feval("['] openbios-video-width cell+"); +	video.w = cell2pointer(POP()); +	feval("['] openbios-video-height cell+"); +	video.h = cell2pointer(POP()); +	feval("['] depth-bits cell+"); +	video.depth = cell2pointer(POP()); +	feval("['] line-bytes cell+"); +	video.rb = cell2pointer(POP()); +	feval("['] color-palette cell+"); +	video.pal = cell2pointer(POP()); + +	/* Set global variables ready for fb8-install */ +	PUSH( pointer2cell(video_mask_blit) ); +	fword("is-noname-cfunc"); +	feval("to fb8-blitmask"); +	PUSH( pointer2cell(video_fill_rect) ); +	fword("is-noname-cfunc"); +	feval("to fb8-fillrect"); +	PUSH( pointer2cell(video_invert_rect) ); +	fword("is-noname-cfunc"); +	feval("to fb8-invertrect"); + +	/* Static information */ +	PUSH((ucell)fontdata); +	feval("to (romfont)"); +	PUSH(FONT_HEIGHT); +	feval("to (romfont-height)"); +	PUSH(FONT_WIDTH); +	feval("to (romfont-width)"); + +	/* Initialise the structure */ +	VIDEO_DICT_VALUE(video.w) = VGA_DEFAULT_WIDTH; +	VIDEO_DICT_VALUE(video.h) = VGA_DEFAULT_HEIGHT; +	VIDEO_DICT_VALUE(video.depth) = VGA_DEFAULT_DEPTH; +	VIDEO_DICT_VALUE(video.rb) = VGA_DEFAULT_LINEBYTES; + +#if defined(CONFIG_QEMU) && (defined(CONFIG_PPC) || defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)) +	/* If running from QEMU, grab the parameters from the firmware interface */ +	int w, h, d; + +	w = fw_cfg_read_i16(FW_CFG_ARCH_WIDTH); +        h = fw_cfg_read_i16(FW_CFG_ARCH_HEIGHT); +        d = fw_cfg_read_i16(FW_CFG_ARCH_DEPTH); +	if (w && h && d) { +		VIDEO_DICT_VALUE(video.w) = w; +		VIDEO_DICT_VALUE(video.h) = h; +		VIDEO_DICT_VALUE(video.depth) = d; +		VIDEO_DICT_VALUE(video.rb) = (w * ((d + 7) / 8)); +	} +#endif + +	/* Setup screen-#rows/screen-#columns */ +	options = find_dev("/options"); +	snprintf(buf, sizeof(buf), FMT_ucell, VIDEO_DICT_VALUE(video.w) / FONT_WIDTH); +	set_property(options, "screen-#columns", buf, strlen(buf) + 1); +	snprintf(buf, sizeof(buf), FMT_ucell, VIDEO_DICT_VALUE(video.h) / FONT_HEIGHT); +	set_property(options, "screen-#rows", buf, strlen(buf) + 1); +} diff --git a/roms/openbios/libopenbios/xcoff_load.c b/roms/openbios/libopenbios/xcoff_load.c new file mode 100644 index 00000000..0dcb28ca --- /dev/null +++ b/roms/openbios/libopenbios/xcoff_load.c @@ -0,0 +1,147 @@ +/* + * + *       <xcoff_load.c> + * + *       XCOFF file loader + * + *   Copyright (C) 2009 Laurent Vivier (Laurent@vivier.eu) + * + *   from original XCOFF loader by Steven Noonan <steven@uplinklabs.net> + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   version 2 + * + */ + +#include "config.h" +#include "libopenbios/bindings.h" +#include "libopenbios/xcoff_load.h" + +#include "arch/common/xcoff.h" + +#ifdef CONFIG_PPC +extern void             flush_icache_range( char *start, char *stop ); +#endif + +//#define DEBUG_XCOFF + +#ifdef DEBUG_XCOFF +#define DPRINTF(fmt, args...) \ +    do { printk("%s: " fmt, __func__ , ##args); } while (0) +#else +#define DPRINTF(fmt, args...) \ +    do { } while (0) +#endif + +int  +is_xcoff(COFF_filehdr_t *fhdr) +{ +	return (fhdr->f_magic == U802WRMAGIC +            || fhdr->f_magic == U802ROMAGIC +	    || fhdr->f_magic == U802TOCMAGIC +	    || fhdr->f_magic == U802TOMAGIC); +} + +int  +xcoff_load(struct sys_info *info, const char *filename) +{ +	// Currently not implemented +	return LOADER_NOT_SUPPORT; +} + +void +xcoff_init_program(void) +{ +	char *base; +	COFF_filehdr_t *fhdr; +	COFF_aouthdr_t *ahdr; +	COFF_scnhdr_t *shdr; +	uint32_t offset; +	size_t total_size = 0; +	int i; + +	feval("0 state-valid !"); + +	feval("load-base"); +	base = (char*)cell2pointer(POP()); + +	fhdr = (COFF_filehdr_t*)base; + +	/* Is it an XCOFF file ? */ +	if (!is_xcoff(fhdr)) { +		DPRINTF("Not a XCOFF file %02x\n", fhdr->f_magic); +		return; +	} + +	/* Is it executable ? */ +	if (fhdr->f_magic != 0x01DF && +	    (fhdr->f_flags & COFF_F_EXEC) == 0) { +		DPRINTF("Not an executable XCOFF file %02x\n", fhdr->f_flags); +		return; +	} + +	/* Optional header is a.out ? */ +	if (fhdr->f_opthdr != sizeof(COFF_aouthdr_t)) { +		DPRINTF("AOUT optional error size mismatch in XCOFF file\n"); +		return; +	} + +        ahdr = (COFF_aouthdr_t*)(base + sizeof(COFF_filehdr_t)); + +	/* check a.out magic number */ +	if (ahdr->magic != AOUT_MAGIC) { +		DPRINTF("Invalid AOUT optional header\n"); +		return; +	} + +	offset = sizeof(COFF_filehdr_t) + sizeof(COFF_aouthdr_t); + +	DPRINTF("XCOFF file with %d sections\n", fhdr->f_nscns); + +	for (i = 0; i < fhdr->f_nscns; i++) { + +		DPRINTF("Read header at offset %0x\n", offset); + +		shdr = (COFF_scnhdr_t*)(base + offset); + +		DPRINTF("Initializing '%s' section from %0x %0x to %0x (%0x)\n", +			shdr->s_name, offset, shdr->s_scnptr, +			shdr->s_vaddr, shdr->s_size); + +		if (strcmp(shdr->s_name, ".text") == 0) { + +			memcpy((char*)(uintptr_t)shdr->s_vaddr, base + shdr->s_scnptr, +			       shdr->s_size); +			total_size += shdr->s_size; +#ifdef CONFIG_PPC +			flush_icache_range((char*)(uintptr_t)shdr->s_vaddr, +					 (char*)(uintptr_t)(shdr->s_vaddr + shdr->s_size)); +#endif +		} else if (strcmp(shdr->s_name, ".data") == 0) { + +			memcpy((char*)(uintptr_t)shdr->s_vaddr, base + shdr->s_scnptr, +			       shdr->s_size); +			total_size += shdr->s_size; + +		} else if (strcmp(shdr->s_name, ".bss") == 0) { + +			memset((void *)(uintptr_t)shdr->s_vaddr, 0, shdr->s_size); +			total_size += shdr->s_size; +		} else { +			DPRINTF("    Skip '%s' section\n", shdr->s_name); +		} +		offset += sizeof(COFF_scnhdr_t); +	} + +	DPRINTF("XCOFF entry point: %x\n", *(uint32_t*)ahdr->entry); + +	// Initialise saved-program-state +	PUSH(*(uint32_t*)(uintptr_t)ahdr->entry); +	feval("saved-program-state >sps.entry !"); +	PUSH(total_size); +	feval("saved-program-state >sps.file-size !"); +	feval("xcoff saved-program-state >sps.file-type !"); + +	feval("-1 state-valid !"); +}  | 
