Merge remote-tracking branch 'original/main' into merge-211113

This commit is contained in:
Vincent Barrilliot 2021-11-13 18:40:21 +01:00
commit 185a7a686f
125 changed files with 15090 additions and 32894 deletions

10
.gitignore vendored
View file

@ -52,3 +52,13 @@ samples/HelloPGX/hello.pgx
samples/HelloPGX/hello.lst samples/HelloPGX/hello.lst
src/mapfile src/mapfile
src/mapfile src/mapfile
src/foenixmcp_20211026_1.bin
src/foenixmcp_20211026_1.bin
src/foenixmcp_20211027_1.bin
src/foenixmcp_setsof.bin
src/foenixmcp_u_20201020.bin
src/foenixmcp.bin
src/foenixmcp_ram.bin
src/foenixmcp_flash.bin
src/bin/archive/foenixmcp_u_flash_20211111_03.bin
src/bin/archive/foenixmcp_u_flash_20211112_06.bin

View file

@ -63,31 +63,31 @@ def program_flash(port, filename, hex_address):
address = base_address address = base_address
print("About to upload image to address 0x{:X}".format(address), flush=True) print("About to upload image to address 0x{:X}".format(address), flush=True)
if os.path.getsize(filename) == FLASH_SIZE: #if os.path.getsize(filename) == FLASH_SIZE:
if confirm("Are you sure you want to reprogram the flash memory? (y/n): "): if confirm("Are you sure you want to reprogram the flash memory? (y/n): "):
with open(filename, "rb") as f: with open(filename, "rb") as f:
c256 = foenix.FoenixDebugPort() c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
c256.enter_debug()
try: try:
c256.open(port) block = f.read(CHUNK_SIZE)
c256.enter_debug() while block:
try: c256.write_block(address, block)
address += len(block)
block = f.read(CHUNK_SIZE) block = f.read(CHUNK_SIZE)
while block:
c256.write_block(address, block)
address += len(block)
block = f.read(CHUNK_SIZE)
print("Binary file uploaded...", flush=True) print("Binary file uploaded...", flush=True)
c256.erase_flash() c256.erase_flash()
print("Flash memory erased...", flush=True) print("Flash memory erased...", flush=True)
c256.program_flash(base_address) c256.program_flash(base_address)
print("Flash memory programmed...") print("Flash memory programmed...")
finally:
c256.exit_debug()
finally: finally:
c256.close() c256.exit_debug()
else: finally:
print("The provided flash file is not the right size.") c256.close()
# else:
# print("The provided flash file is not the right size.")
def dereference(port, file, label): def dereference(port, file, label):
"""Get the address contained in the pointer with the label in the label file.""" """Get the address contained in the pointer with the label in the label file."""
@ -321,4 +321,3 @@ try:
parser.print_help() parser.print_help()
finally: finally:
print print

View file

@ -37,6 +37,7 @@ Building this project requires the [VBCC](http://www.compilers.de/vbcc.html) com
```MAKE``` utility. Using your command line, go into the ```src``` directory and type: ```MAKE``` utility. Using your command line, go into the ```src``` directory and type:
``` ```
export VBCC = <use-your-projects-dir>/FoenixMCP/vbcc
make all make all
``` ```
to build the kernel. to build the kernel.

View file

@ -1,4 +1,4 @@
[DEFAULT] [DEFAULT]
port=COM9 port=COM6
labels=sample.lbl labels=sample.lbl
flash_address=380000 flash_address=380000

BIN
docs/FoenixMCP Manual.epub Normal file

Binary file not shown.

BIN
docs/FoenixMCP Manual.odt Normal file

Binary file not shown.

BIN
docs/FoenixMCP Manual.pdf Normal file

Binary file not shown.

BIN
docs/OS Layout.odg Normal file

Binary file not shown.

Binary file not shown.

View file

@ -1,185 +0,0 @@
\documentclass{report}
\usepackage[T1]{fontenc}
\usepackage{ccfonts}
\begin{document}
\newcommand{\MCP}{{\sc Foenix/MCP}}
\newcommand{\param}[1]{{\tt #1}}
\newcommand{\name}[1]{{\tt #1}}
\title{{\MCP} a Simple, Portable Operating System for the Foenix Line of Computers}
\author{Peter J. Weingartner}
\date{19 September, 2021}
\maketitle
\chapter{Overview}
\section{Copyrights}
\chapter{Command Line Utility}
\section{Paths}
\section{External Commands}
\section{Internal Commands}
\subsection{Numbers}
Several internal commands use numbers as arguments.
These numbers can be specified in one of three ways: decimal, binary, or hexadecimal.
A decimal number is written just the usual numerals between \param{0} and \param{9}.
A binary number must be prefixed with either \param{\%} or \param{0b}.
A hexadecimal number must be prefixed with either \param{\$} or \param{0x}.
\subsection{File System Commands}
\subsection{Memory Commands}
\subsection{Graphics Commands}
\chapter{Devices}
There are two main ways of supporting devices in {\MCP}: channel devices, and block devices.
Bytes may be written to or read from a channel, but the bytes are always in order.
Every channel has a ``cursor'', which marks where the next byte to read or write is.
Some channels may support the ability to move the cursor, but some will not have that ability.
Examples of channels include the text screens, the keyboard, the serial port, and files open for
reading or writing.
Block devices, on the other hand support reading or writing an entire block of bytes at a time.
Every block has an ``address'' on the device, and blocks may be read or written in any order
and location by specifying the address desired. Examples of block devices include a hard drive,
SD card, or floppy drive.
\section{Channels and Channel Devices}
{\MCP} supports several channel devices, including: main console screen, secondary console screen
(Channel B or the EVID card), the COM ports on the computer, MIDI ports (if available), and
parallel printer port (if available):
\begin{table}
\begin{center}
\begin{tabular}{|l|l|l| } \hline
Number & Device & Name \\ \hline
0 & Console (Channel A) & \param{@CONA:} \\ \hline
1 & Channel B or EVID & \param{@CONB:} \\ \hline
2 & Serial Port \#1 & \param{@COM1:} \\ \hline
3 & Serial Port \#2 & \param{@COM2:} \\ \hline
4 & Parallel Port & \param{@LPT1:} \\ \hline
5 & MIDI Port & \param{@MIDI:} \\ \hline
\end{tabular}
\end{center}
\caption{Built in channel devices}
\label{cdev:list}
\end{table}
Channel devices support several operations. User programs will not generally access channel devices
directly, but will instead access them through an open channel. Each channel will be referenced by
its number. By default, the operating system will have already created a channel for each channel
device present on the system, and the channel number will match that of its device. Another source
of channels is to open a file (see below).
\begin{itemize}
\item Read---Read a number of bytes from the channel.
\item Read Byte---Read a single byte from the channel.
\item Read Line---Read a line of text from the channel (delimited by a newline character).
\item Write---Write a number of bytes to the channel device.
\item Write Byte---Write a single byte to the channel.
\item Flush---Ensure that any pending writes are completed on the device.
\item Seek---Move the channel cursor to a different position in the channel. This may not be supported by all types of channels.
\item Status---Return the status of the block device.
\item IOCTRL---Set options for the block device. Some options will be common, but others will be device-dependent.
\end{itemize}
\section{Block Devices}
{\MCP} supports three block devices: SD cards, hard drives on the IDE (PATA) interface, and floppy drives.
\begin{table}
\begin{center}
\begin{tabular}{|l|l|l| } \hline
Number & Device & Name \\ \hline
0 & SD Card & \param{@S:} \\ \hline
1 & Floppy Drive & \param{@F:} \\ \hline
2 & Hard Drive & \param{@H:} \\ \hline
\end{tabular}
\end{center}
\caption{Built in block devices}
\label{bdev:list}
\end{table}
Block devices support several operations:
\begin{itemize}
\item Read---Read a block of data from the block device.
\item Write---Write a block of data to the block device.
\item Flush---Ensure that any pending writes are completed on the device.
\item Status---Return the status of the block device.
\item IOCTRL---Set options for the block device. Some options will be common, but others will be device-dependent.
\end{itemize}
\section{Files}
{\MCP} provides for file access on block devices. The operations supported for files include:
\begin{itemize}
\item Open---Create a channel (with a unique channel number) which can be used to read, write, or append a file.
\item Close---Shut down access to a previously open file, given its channel number. Files open for writing or appending will commit any pending write operations.
\item Delete---Remove a file from its block device.
\item Rename---Change the name of a file.
\item Copy---Make a copy of a file.
\end{itemize}
In addition to files, {\MCP} supports directory access:
\begin{itemize}
\item OpenDir---Open a directory to list out the files present.
\item CloseDir---Close a previously open directory.
\item ReadDir---Read an entry out of an open directory.
\item FindFirst---Find the first entry in a directory that matches a search pattern.
\item FindNext---Find the next entry in a directory that matches a search pattern.
\end{itemize}
\chapter{System Calls}
\section{Channel Calls}
\section{Block Calls}
\section{File System Calls}
\section{Miscellaneous Calls}
\chapter{Keyboard Operations}
\section{Scancodes}
\section{Translation Tables}
\chapter{Implementing Device Drivers}
\section{Channel Device Drivers}
\section{Block Device Drivers}
\end{document}

View file

@ -0,0 +1,87 @@
// MC68SEC000 Memory Map Model
//1Mx16 (2x 1Mx8) <- $0000_0000 - $001F_FFFF - RAM (U Model)
//2Mx16 (2x 2Mx8) <- $0000_0000 - $003F_FFFF - RAM (U + Model)
// $0040_0000 - $00AF_FFFF - FREE SPACE (Future SDRAM Expansion Card?)
// $00B0_0000 - $00B1_FFFF - GABE Registers (SuperIO/Math Block/SDCard/IDE/Ethernet/SDMA)
// $00B2_0000 - $00B3_FFFF - BEATRIX Registers (CODEC/ADC/DAC0/DAC1/PSG/SID)
// $00B4_0000 - $00B5_FFFF - VICKY Registers
// $00B6_0000 - $00B6_3FFF - TEXT Memory
// $00B6_4000 - $00B6_7FFF - Color Memory
// $00BF_0000 - $00BF_FFFF - EXPANSION Chip Select
// 512Kx32 (2Mx8) <- $00C0_0000 - $00DF_FFFF - VRAM MEMORY
// 1Mx16 (2Mx8) <- $00E0_0000 - $00FF_FFFF - FLASH0
so the Keyboard is $B02800 - $B0280F
The Serial is @ $B028F8 - $B028FF
#ifndef KeyboardH /* Include guard */
#define KeyboardH
// Status
#define OUT_BUF_FULL 0x01
#define INPT_BUF_FULL 0x02
#define SYS_FLAG 0x04
#define CMD_DATA 0x08
#define KEYBD_INH 0x10
#define TRANS_TMOUT 0x20
#define RCV_TMOUT 0x40
#define PARITY_EVEN 0x80
#define INH_KEYBOARD 0x10
#define KBD_ENA 0xAE
#define KBD_DIS 0xAD
// Keyboard
unsigned char * STATUS_PORT = (void *)0x00B02804;
unsigned char * KBD_OUT_BUF = (void *)0x00B02800;
unsigned char * KBD_INPT_BUF = (void *)0x00B02800;
unsigned char * KBD_CMD_BUF = (void *)0x00B02804;
unsigned char * KBD_DATA_BUF = (void *)0x00B02800;
unsigned char * PORT_A = (void *)0x00B02808;
unsigned char * PORT_B = (void *)0x00B02809;
assign CS0 = ( ADDY_In[23:22] == 2'b00 ) & ( UserData | UserProgram | SuperData | SuperProgram ); //$000000 - $3FFFFF
assign BERR = ( ADDY_In[23:22] == 2'b01 ) & ( UserData | UserProgram | SuperData | SuperProgram ); //$400000 - $7FFFFF
assign CS_GABE = ( ADDY_In[23:17] == 7'b1011_000 ) & ( UserData | SuperData ); //$B0
assign CS_BEATRIX = ( ADDY_In[23:17] == 7'b1011_001 ) & ( UserData | SuperData ); //$B2
// Vicky II
assign CS_VICKY = ( ADDY_In[23:17] == 7'b1011_010 ) & ( UserData | SuperData ); //$B4
assign CS_VICKY_MEM = ( ADDY_In[23:17] == 7'b1011_011 ) & ( UserData | SuperData ); //$B6
assign CS_EXP = ( ADDY_In[23:16] == 8'b1011_1111 ) & ( UserData | SuperData ); //$BF
// Video RAM
assign CS_VRAM = ( ADDY_In[23:21] == 3'b110 ) & ( UserData | SuperData ); //$C0_0000 - DFFFFF (2M)
assign FLASH0 = ( ADDY_In[23:21] == 3'b111 ) & ( SuperData | SuperProgram ); //$E0_0000 - FFFFFF (2M)
assign CS0 = ( ADDY_In[23:22] == 2'b00 ) & ( UserData | UserProgram | SuperData | SuperProgram ); //$000000 - $3FFFFF
assign BERR = ( ADDY_In[23:22] == 2'b01 ) & ( UserData | UserProgram | SuperData | SuperProgram ); //$400000 - $7FFFFF
assign CS_GABE = ( ADDY_In[23:17] == 7'b1011_000 ) & ( UserData | SuperData ); //$B0
assign CS_BEATRIX = ( ADDY_In[23:17] == 7'b1011_001 ) & ( UserData | SuperData ); //$B2
// Vicky II
assign CS_VICKY = ( ADDY_In[23:17] == 7'b1011_010 ) & ( UserData | SuperData ); //$B4
assign CS_VICKY_MEM = ( ADDY_In[23:17] == 7'b1011_011 ) & ( UserData | SuperData ); //$B6
assign CS_EXP = ( ADDY_In[23:16] == 8'b1011_1111 ) & ( UserData | SuperData ); //$BF
// Video RAM
assign CS_VRAM = ( ADDY_In[23:21] == 3'b110 ) & ( UserData | SuperData ); //$C0_0000 - DFFFFF (2M)
assign FLASH0 = ( ADDY_In[23:21] == 3'b111 ) & ( SuperData | SuperProgram ); //$E0_0000 - FFFFFF (2M)
***
assign CS_VICKY_REG_o = ( iBUS_A_i[16:7] == 10'b0_0000_0000_0) & iBUS_CS_VICKY_i; // $B40000..$B4007F - Control Registers
assign CS_Bitmap_Registers_o = ( iBUS_A_i[16:8] == 9'b0_0000_0001) & iBUS_CS_VICKY_i; // $B40100..$B401FF - Bitmap Control Registers
assign CS_Tile0_Registers_o = ( iBUS_A_i[16:7] == 10'b0_0000_0010_0) & iBUS_CS_VICKY_i; // $B40200..$B4027F - TileMap Control Registers
assign CS_Tile1_Registers_o = ( iBUS_A_i[16:7] == 10'b0_0000_0010_1) & iBUS_CS_VICKY_i; // $B40280..$B402FF - TileSet Control Registers
assign CS_Collisions_Registers_o = ( iBUS_A_i[16:8] == 9'b0_0000_0011) & iBUS_CS_VICKY_i; // $B40300..$B403FF - Collision Control Registers
assign CS_Mouse_Ptr_Graphics_o = ( iBUS_A_i[16:10] == 7'b0_0000_01) & iBUS_CS_VICKY_i; // $B40400..$B40BFF - Mouser Pointer graphics 16x16 ARGB x2
assign CS_Mouse_Ptr_Registers_o = ( iBUS_A_i[16:8] == 9'b0_0000_1100) & iBUS_CS_VICKY_i; // $B40C00..$B40CFF - Mouser Pointer Registers
assign CS_Sprites_Registers_o = ( iBUS_A_i[16:12] == 5'b0_0001) & iBUS_CS_VICKY_i; // $B41000..$B41FFF - Sprites Registers
assign CS_LUT0_o = ( iBUS_A_i[16:13] == 4'b0_001) & iBUS_CS_VICKY_i; // $B42000..$B43FFF - LUT
assign CS_GAMMA_B_o = ( iBUS_A_i[16:8] == 9'b0_0100_0000) & iBUS_CS_VICKY_i; // $B44000..$B440FF - GAMMA Blue
assign CS_GAMMA_G_o = ( iBUS_A_i[16:8] == 9'b0_0100_0001) & iBUS_CS_VICKY_i; // $B44100..$B441FF - GAMMA Green
assign CS_GAMMA_R_o = ( iBUS_A_i[16:8] == 9'b0_0100_0010) & iBUS_CS_VICKY_i; // $B44200..$B442FF - GAMMA Red
// $B6_0000 - $BE_FFFF - VICKY TEXT MODE Internal Memory and CLUT
assign CS_TextMemory_o = (iBUS_A_i[16:14] == 3'b000) & iBUS_CS_VICKY_MEM_i; // $B60000..$B63FFF - Text Memory
assign CS_ColorMemory_o = (iBUS_A_i[16:14] == 3'b010) & iBUS_CS_VICKY_MEM_i; // $B68000..$B6BFFF - Color Memory
assign CS_BF_CLUT_o = (iBUS_A_i[16:06] == 11'b0_1100_0100_00) & iBUS_CS_VICKY_MEM_i; // $B6C400..$B6C43F - Foreground Character LUT
assign CS_BG_CLUT_o = (iBUS_A_i[16:06] == 11'b0_1100_0100_01) & iBUS_CS_VICKY_MEM_i; // $B6C440..$B6C47F - Background Character LUT
// $BF:0000 - $BF:FFFF for Expension ChipSelect

View file

@ -16,18 +16,24 @@ export CPU=32
# MODEL_FOENIX_A2560X 8 # MODEL_FOENIX_A2560X 8
# MODEL_FOENIX_A2560U 9 # MODEL_FOENIX_A2560U 9
# MODEL_FOENIX_A2560K 13 # MODEL_FOENIX_A2560K 13
export MODEL=13 export MODEL=9
export VER_MAJOR = 0 export VER_MAJOR = 0
export VER_MINOR = 0 export VER_MINOR = 1
export VER_BUILD = 1 export VER_BUILD = 11
export AS = vasmm68k_mot export AS = vasmm68k_mot
export ASFLAGS = -quiet -Fvobj -nowarn=62 export ASFLAGS = -quiet -Fvobj -nowarn=62
export CC = vc export CC = vc
export DEFINES = -DCPU=$(CPU) -DMODEL=$(MODEL) -DVER_MAJOR=$(VER_MAJOR) -DVER_MINOR=$(VER_MINOR) -DVER_BUILD=$(VER_BUILD) # -DKBD_POLLED export DEFINES = -DCPU=$(CPU) -DMODEL=$(MODEL) -DVER_MAJOR=$(VER_MAJOR) -DVER_MINOR=$(VER_MINOR) -DVER_BUILD=$(VER_BUILD) # -DKBD_POLLED
export CFLAGS = +../vbcc/config/m68k-foenix -I. -Iinclude
export RM = cmd /C del /Q /F ifeq ($(OS),Windows_NT)
# export CFLAGS = +$(VBCC)\config\m68k-foenix -I. -I$(CURDIR)\include -I$(CURDIR)
export CFLAGS = +$(VBCC)\config\a2560u_flash -I. -I$(CURDIR)\include -I$(CURDIR)
export RM = cmd /C del /Q /F
else
export CFLAGS = +$(VBCC)/config/m68k-foenix-linux -I. -I$(CURDIR)/include -I$(CURDIR)
export RM = rm -f
endif
cpu = m68k cpu = m68k
cpu_assembly_src := $(wildcard $(cpu)/*.s) cpu_assembly_src := $(wildcard $(cpu)/*.s)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,4 +1,4 @@
[DEFAULT] [DEFAULT]
port=COM9 port=COM6
labels=sample.lbl labels=sample.lbl
flash_address=380000 flash_address=380000

View file

@ -1,5 +1,3 @@
override CFLAGS = +../../vbcc/config/m68k-foenix -I. -I.. -I../include
csources = $(wildcard *.c) csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources)) cobjects = $(subst .c,.o,$(csources))

View file

@ -10,10 +10,19 @@
#include "simpleio.h" #include "simpleio.h"
#include "syscalls.h" #include "syscalls.h"
#include "sys_general.h" #include "sys_general.h"
#include "timers.h"
#include "cli/cli.h" #include "cli/cli.h"
#include "cli/dos_cmds.h" #include "cli/dos_cmds.h"
#include "cli/mem_cmds.h" #include "cli/mem_cmds.h"
#include "cli/settings.h"
#include "cli/sound_cmds.h"
#include "cli/test_cmds.h"
#include "dev/ps2.h"
#include "dev/rtc.h" #include "dev/rtc.h"
#include "dev/uart.h"
#include "uart_reg.h"
#include "rtc_reg.h"
#include "vicky_general.h"
#define MAX_COMMAND_SIZE 128 #define MAX_COMMAND_SIZE 128
#define MAX_ARGC 32 #define MAX_ARGC 32
@ -30,11 +39,11 @@ typedef struct s_cli_command {
cli_cmd_handler handler; cli_cmd_handler handler;
} t_cli_command, *p_cli_command; } t_cli_command, *p_cli_command;
extern short cmd_gettime(short channel, int argc, char * argv[]);
extern short cmd_settime(short channel, int argc, char * argv[]);
extern short cmd_sysinfo(short channel, int argc, char * argv[]); extern short cmd_sysinfo(short channel, int argc, char * argv[]);
extern short cmd_cls(short channel, int argc, char * argv[]); extern short cmd_cls(short channel, int argc, char * argv[]);
extern short cmd_showint(short channel, int argc, char * argv[]); extern short cmd_showint(short channel, int argc, char * argv[]);
extern short cmd_getjiffies(short channel, int argc, char * argv[]);
extern short cmd_get_ticks(short channel, int argc, char * argv[]);
/* /*
* Variables * Variables
@ -52,6 +61,8 @@ const t_cli_command g_cli_commands[] = {
{ "DISKFILL", "DISKFILL <drive #> <sector #> <byte value>", cmd_diskfill }, { "DISKFILL", "DISKFILL <drive #> <sector #> <byte value>", cmd_diskfill },
{ "DISKREAD", "DISKREAD <drive #> <sector #>", cmd_diskread }, { "DISKREAD", "DISKREAD <drive #> <sector #>", cmd_diskread },
{ "DUMP", "DUMP <addr> [<count>] : print a memory dump", mem_cmd_dump}, { "DUMP", "DUMP <addr> [<count>] : print a memory dump", mem_cmd_dump},
{ "GETJIFFIES", "GETJIFFIES : print the number of jiffies since bootup", cmd_getjiffies },
{ "GETTICKS", "GETTICKS : print number of ticks since reset", cmd_get_ticks },
{ "LABEL", "LABEL <drive#> <label> : set the label of a drive", cmd_label }, { "LABEL", "LABEL <drive#> <label> : set the label of a drive", cmd_label },
{ "LOAD", "LOAD <path> : load a file into memory", cmd_load }, { "LOAD", "LOAD <path> : load a file into memory", cmd_load },
{ "MKDIR", "MKDIR <path> : create a directory", cmd_mkdir }, { "MKDIR", "MKDIR <path> : create a directory", cmd_mkdir },
@ -62,14 +73,13 @@ const t_cli_command g_cli_commands[] = {
{ "POKE16", "POKE16 <addr> <value> : write the 16-bit value to the address in memory", mem_cmd_poke16 }, { "POKE16", "POKE16 <addr> <value> : write the 16-bit value to the address in memory", mem_cmd_poke16 },
{ "POKE32", "POKE32 <addr> <value> : write the 32-bit value to the address in memory", mem_cmd_poke32 }, { "POKE32", "POKE32 <addr> <value> : write the 32-bit value to the address in memory", mem_cmd_poke32 },
{ "PWD", "PWD : prints the current directory", cmd_pwd }, { "PWD", "PWD : prints the current directory", cmd_pwd },
// { "REN", "REN <old path> <new path> : rename a file or directory", cmd_rename }, { "REN", "REN <old path> <new path> : rename a file or directory", cmd_rename },
{ "RUN", "RUN <path> : execute a binary file", cmd_run }, { "RUN", "RUN <path> : execute a binary file", cmd_run },
{ "GETTIME", "GETTIME : prints the current time", cmd_gettime }, { "SET", "SET <name> <value> : set the value of a setting", cli_cmd_set },
{ "SETTIME", "SETTIME yyyy-mm-dd HH:MM:SS : sets the current time", cmd_settime }, { "GET", "GET <name> : get the value of a setting", cli_cmd_get },
{ "SHOWINT", "SHOWINT : Show information about the interrupt registers", cmd_showint }, { "SHOWINT", "SHOWINT : Show information about the interrupt registers", cmd_showint },
{ "SYSINFO", "SYSINFO : prints information about the system", cmd_sysinfo }, { "SYSINFO", "SYSINFO : prints information about the system", cmd_sysinfo },
{ "TESTIDE", "TESTIDE : fetches and prints the IDE MBR repeatedly", cmd_testide }, { "TEST", "TEST <feature> : run a test about a feature", cmd_test },
{ "TESTCREATE", "TESTCREATE <path> : tries to create a file", cmd_testcreate },
{ "TYPE", "TYPE <path> : print the contents of a text file", cmd_type }, { "TYPE", "TYPE <path> : print the contents of a text file", cmd_type },
{ 0, 0 } { 0, 0 }
}; };
@ -87,6 +97,25 @@ int cmd_help(short channel, int argc, char * argv[]) {
return 0; return 0;
} }
short cmd_getjiffies(short channel, int argc, char * argv[]) {
char buffer[80];
sprintf(buffer, "%d\n", timers_jiffies());
sys_chan_write(channel, buffer, strlen(buffer));;
return 0;
}
/*
* Print the number of ticks since last restart
*/
short cmd_get_ticks(short channel, int argc, char * argv[]) {
char buffer[80];
sprintf(buffer, "%d\n", rtc_get_jiffies());
sys_chan_write(channel, buffer, strlen(buffer));
return 0;
}
/* /*
* Clear the screen * Clear the screen
*/ */
@ -102,124 +131,33 @@ short cmd_cls(short channel, int argc, char * argv[]) {
*/ */
short cmd_sysinfo(short channel, int argc, char * argv[]) { short cmd_sysinfo(short channel, int argc, char * argv[]) {
t_sys_info info; t_sys_info info;
char buffer[80];
sys_get_info(&info); sys_get_info(&info);
print(channel, "System information:\nModel: ");
print(channel, info.model_name);
print(channel, "\nCPU: "); sprintf(buffer, "System information:\nModel: %s", info.model_name);
print(channel, info.cpu_name); sys_chan_write(channel, buffer, strlen(buffer));
print(channel, "\nGABE version: "); sprintf(buffer, "\nCPU: %s", info.cpu_name);
print_hex_16(channel, info.gabe_number); sys_chan_write(channel, buffer, strlen(buffer));
print(channel, ".");
print_hex_16(channel, info.gabe_version);
print(channel, ".");
print_hex_16(channel, info.gabe_subrev);
print(channel, "\nVICKY version: "); sprintf(buffer, "\nSystem Memory: 0x%X", info.system_ram_size);
print_hex_16(channel, info.vicky_rev); sys_chan_write(channel, buffer, strlen(buffer));
print(channel, "\n"); sprintf(buffer, "\nPCB version: %s", &info.pcb_version);
sys_chan_write(channel, buffer, strlen(buffer));
return 0; sprintf(buffer, "\nFPGA Date: %08X", info.fpga_date);
} sys_chan_write(channel, buffer, strlen(buffer));
short cmd_gettime(short channel, int argc, char * argv[]) { sprintf(buffer, "\nFPGA Model: %08X", info.fpga_model);
char time_string[128]; sys_chan_write(channel, buffer, strlen(buffer));
t_time time;
rtc_get_time(&time); sprintf(buffer, "\nFPGA Version: %04X.%04X", info.fpga_version, info.fpga_subver);
sprintf(time_string, "%04d-%02d-%02d %02d:%02d:%02d\n", time.year, time.month, time.day, time.hour, time.minute, time.second); sys_chan_write(channel, buffer, strlen(buffer));
print(channel, time_string);
return 0; sprintf(buffer, "\nMCP version: v%02d.%02d.%04d\n", info.mcp_version, info.mcp_rev, info.mcp_build);
} sys_chan_write(channel, buffer, strlen(buffer));
short atoi_n(char * text, short n) {
short result = 0;
short i;
for (i = 0; i < n; i++) {
result = result * 10;
result = result + (text[i] - '0');
}
return result;
}
/*
* Set the date and time in the RTC
*
* SETTIME yyyy-mm-dd HH:MM:SS
*/
short cmd_settime(short screen, int argc, char * argv[]) {
char * date;
char * time
t_time date_time;
short i;
date_time.year = 2021;
date_time.month = 10;
date_time.day = 4;
date_time.hour = 9;
date_time.minute = 15;
date_time.second = 0;
date_time.is_24hours = 1;
date_time.is_pm = 0;
if (argc != 3) {
print(screen, "USAGE: SETTIME yyyy-mm-dd HH:MM:SS\n");
return -1;
}
date = argv[1];
time = argv[2];
/* Validate date is correct format */
for (i = 0; i < 10; i++) {
if ((i == 4) || (i == 7)) {
if (date[i] != '-') {
print(screen, "USAGE: SETTIME yyyy-mm-dd HH:MM:SS\n");
print(screen, " ^");
return -1;
}
} else {
if ((date[i] < '0') || (date[i] > '9')) {
print(screen, "USAGE: SETTIME yyyy-mm-dd HH:MM:SS\n");
print(screen, " ^");
return -1;
}
}
}
/* Validate time is correct format */
for (i = 0; i < 8; i++) {
if ((i == 2) || (i == 5)) {
if (time[i] != ':') {
print(screen, "USAGE: SETTIME yyyy-mm-dd HH:MM:SS\n");
print(screen, " ^");
return -1;
}
} else {
if ((time[i] < '0') || (date[i] > '9')) {
print(screen, "USAGE: SETTIME yyyy-mm-dd HH:MM:SS\n");
print(screen, " ^");
return -1;
}
}
}
date_time.year = atoi_n(&date[0], 4);
date_time.month = atoi_n(&date[5], 2);
date_time.day = atoi_n(&date[8], 2);
date_time.hour = atoi_n(&time[0], 2);
date_time.minute = atoi_n(&time[3], 2);
date_time.second = atoi_n(&time[6], 2);
rtc_set_time(&date_time);
return 0; return 0;
} }
@ -275,10 +213,8 @@ short cli_exec(short channel, char * command, int argc, char * argv[]) {
} }
} }
// Built in command not found.. /* No built-in command that matched... try to run a binary file */
// TODO: search the current drive for an executable file return cmd_run(channel, argc, argv);
sys_chan_write(channel, cmd_not_found, strlen(cmd_not_found));
return -1;
} }
char * strtok_r(char * source, const char * delimiter, char ** saveptr) { char * strtok_r(char * source, const char * delimiter, char ** saveptr) {
@ -466,5 +402,6 @@ long cli_eval_number(const char * arg) {
// 0 on success, negative number on error // 0 on success, negative number on error
// //
short cli_init() { short cli_init() {
cli_set_init();
return 0; return 0;
} }

View file

@ -1,4 +1,5 @@
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include "syscalls.h" #include "syscalls.h"
@ -37,13 +38,11 @@ short cmd_diskread(short screen, int argc, char * argv[]) {
result = bdev_read(bdev_number, lba, buffer, 512); result = bdev_read(bdev_number, lba, buffer, 512);
if (result < 512) { if (result < 512) {
print(screen, "Unable to read sector: "); err_print(screen, "Unable to read sector", result);
print_hex_32(screen, result);
print(screen, "\n");
return -2; return -2;
} }
dump_buffer(screen, buffer, 512); dump_buffer(screen, buffer, 512, 1);
return 0; return 0;
} }
@ -79,9 +78,7 @@ short cmd_diskfill(short screen, int argc, char * argv[]) {
result = bdev_write(bdev_number, lba, buffer, 512); result = bdev_write(bdev_number, lba, buffer, 512);
if (result < 512) { if (result < 512) {
print(screen, "Unable to write sector: "); err_print(screen, "Unable to write sector", result);
print_hex_32(screen, result);
print(screen, "\n");
return -2; return -2;
} }
@ -89,80 +86,22 @@ short cmd_diskfill(short screen, int argc, char * argv[]) {
return cmd_diskread(screen, argc, argv); return cmd_diskread(screen, argc, argv);
} }
/*
* Test the IDE interface by reading the MBR
*/
short cmd_testide(short screen, int argc, char * argv[]) {
unsigned char buffer[512];
short i;
short scancode;
short n = 0;
while (1) {
n = bdev_read(BDEV_HDC, 0, buffer, 512);
if (n <= 0) {
log_num(LOG_ERROR, "Unable to read MBR: ", n);
return n;
}
for (i = 0; i < n; i++) {
if ((i % 16) == 0) {
print(screen, "\n");
}
print_hex_8(screen, buffer[i]);
print(screen, " ");
}
print(screen, "\n\n");
if (kbdmo_getc_poll()) break;
}
}
/* /*
* Test file creation * Try to run a command from storage.
*
* Command name is in argv[0].
*/ */
short cmd_testcreate(short screen, int argc, char * argv[]) {
short n;
if (argc > 1) {
short channel = fsys_open(argv[1], FA_CREATE_NEW | FA_WRITE);
if (channel >= 0) {
char * message = "Hello, world!\n";
n = chan_write(channel, message, strlen(message));
if (n <= 0) {
print(screen, "Unable to write to file: ");
print_hex_16(screen, n);
print(screen, "\n");
}
fsys_close(channel);
return 0;
} else {
print(screen, "Unable to open file: ");
print_hex_16(screen, channel);
print(screen, "\n");
return -1;
}
} else {
print(screen, "USAGE: TESTCREATE <path>\n");
return -1;
}
}
short cmd_run(short screen, int argc, char * argv[]) { short cmd_run(short screen, int argc, char * argv[]) {
TRACE("cmd_run"); TRACE("cmd_run");
if (argc > 1) { short result = proc_run(argv[0], argc, argv);
short result = proc_run(argv[1]); if (result < 0) {
if (result < 0) { err_print(screen, "Unable to execute file", result);
log_num(LOG_ERROR, "Unable to run: ", result); return -1;
return result;
}
} }
return result;
} }
/* /*
@ -175,7 +114,7 @@ short cmd_mkdir(short screen, int argc, char * argv[]) {
if (argc > 1) { if (argc > 1) {
short result = fsys_mkdir(argv[1]); short result = fsys_mkdir(argv[1]);
if (result < 0) { if (result < 0) {
log_num(LOG_ERROR, "Unable to create directory: ", result); err_print(screen, "Unable to create directory", result);
return result; return result;
} }
} else { } else {
@ -194,7 +133,7 @@ short cmd_del(short screen, int argc, char * argv[]) {
if (argc > 1) { if (argc > 1) {
short result = fsys_delete(argv[1]); short result = fsys_delete(argv[1]);
if (result < 0) { if (result < 0) {
log_num(LOG_ERROR, "Unable to delete: ", result); err_print(screen, "Unable to delete file", result);
return result; return result;
} }
} else { } else {
@ -211,9 +150,9 @@ short cmd_cd(short screen, int argc, char * argv[]) {
TRACE("cmd_cd"); TRACE("cmd_cd");
if (argc > 1) { if (argc > 1) {
short result = fsys_setcwd(argv[1]); short result = fsys_set_cwd(argv[1]);
if (result < 0) { if (result < 0) {
log_num(LOG_ERROR, "Unable to change directory: ", result); err_print(screen, "Unable to change directory", result);
return result; return result;
} else { } else {
print(screen, "Changed to: "); print(screen, "Changed to: ");
@ -236,9 +175,9 @@ short cmd_pwd(short screen, int argc, char * argv[]) {
TRACE("cmd_pwd"); TRACE("cmd_pwd");
short result = fsys_getcwd(buffer, 128); short result = fsys_get_cwd(buffer, 128);
if (result < 0) { if (result < 0) {
log_num(LOG_ERROR, "Unable to get directory: ", result); err_print(screen, "Unable to get current directory", result);
return result; return result;
} else { } else {
print(screen, buffer); print(screen, buffer);
@ -249,14 +188,14 @@ short cmd_pwd(short screen, int argc, char * argv[]) {
/* /*
* Rename a file or directory * Rename a file or directory
*/ */
extern short cmd_rename(short screen, int argc, char * argv[]) { short cmd_rename(short screen, int argc, char * argv[]) {
TRACE("cmd_rename"); TRACE("cmd_rename");
if (argc > 2) { if (argc > 2) {
short result = fsys_rename(argv[1], argv[2]); short result = fsys_rename(argv[1], argv[2]);
if (result < 0) { if (result < 0) {
log_num(LOG_ERROR, "Unable to rename: ", result); err_print(screen, "Unable to rename file", result);
return result; return result;
} }
} }
@ -271,13 +210,10 @@ short cmd_dir(short screen, int argc, char * argv[]) {
char * path = ""; char * path = "";
char label[40]; char label[40];
log_num(LOG_INFO, "cmd_dir: ", argc);
if (argc > 1) { if (argc > 1) {
path = argv[1]; path = argv[1];
} }
log3(LOG_INFO, "Attempting to read directory for [", path, "]\n");
short dir = fsys_opendir(path); short dir = fsys_opendir(path);
if (dir >= 0) { if (dir >= 0) {
result = fsys_getlabel(path, label); result = fsys_getlabel(path, label);
@ -313,7 +249,7 @@ short cmd_dir(short screen, int argc, char * argv[]) {
fsys_closedir(dir); fsys_closedir(dir);
} else { } else {
log_num(LOG_ERROR, "Could not open directory: ", dir); err_print(screen, "Unable to open directory", dir);
return dir; return dir;
} }
@ -347,7 +283,7 @@ short cmd_type(short screen, int argc, char * argv[]) {
return 0; return 0;
} else { } else {
log_num(LOG_ERROR, "Could not open file for reading: ", fd); err_print(screen, "Unable to open file", fd);
return fd; return fd;
} }
} else { } else {
@ -377,7 +313,7 @@ short cmd_load(short screen, int argc, char * argv[]) {
log(LOG_INFO, "File loaded."); log(LOG_INFO, "File loaded.");
} }
} else { } else {
log_num(LOG_ERROR, "Unable to open file: ", result); err_print(screen, "Unable to open file", result);
return -1; return -1;
} }
@ -399,8 +335,7 @@ short cmd_label(short screen, int argc, char * argv[]) {
short drive = cli_eval_number(argv[1]); short drive = cli_eval_number(argv[1]);
short result = fsys_setlabel(drive, argv[2]); short result = fsys_setlabel(drive, argv[2]);
if (result != 0) { if (result != 0) {
print(screen, "Unable to set the label: "); err_print(screen, "Unable to set volume label", result);
print_hex_16(screen, result);
return -1; return -1;
} }
@ -420,8 +355,7 @@ short cmd_format(short screen, int argc, char * argv[]) {
short drive = cli_eval_number(argv[1]); short drive = cli_eval_number(argv[1]);
short result = fsys_mkfs(drive, ""); short result = fsys_mkfs(drive, "");
if (result != 0) { if (result != 0) {
print(screen, "Unable to format the drive: "); err_print(screen, "Unable to format volume", result);
print_hex_16(screen, result);
return -1; return -1;
} }

View file

@ -5,16 +5,6 @@
#ifndef __DOS_CMDS_H #ifndef __DOS_CMDS_H
#define __DOS_CMDS_H #define __DOS_CMDS_H
/*
* Test the IDE interface by reading the MBR
*/
extern short cmd_testide(short screen, int argc, char * argv[]);
/*
* Test file creation
*/
extern short cmd_testcreate(short screen, int argc, char * argv[]);
/* /*
* Execute a binary file * Execute a binary file
*/ */

View file

@ -5,6 +5,8 @@
#include "log.h" #include "log.h"
#include "cli.h" #include "cli.h"
#include "simpleio.h" #include "simpleio.h"
#include "sys_general.h"
#include "syscalls.h"
#include "mem_cmds.h" #include "mem_cmds.h"
/* /*
@ -27,20 +29,7 @@ short mem_cmd_dump(short channel, int argc, char * argv[]) {
count = cli_eval_number(argv[2]); count = cli_eval_number(argv[2]);
} }
TRACE("foo"); dump_buffer(channel, address, count, 2);
for (i = 0; i < count; i++) {
if ((i % 16) == 0) {
print(channel, "\n");
print_hex_32(channel, ((long)address + i));
print(channel, ": ");
}
print_hex_8(channel, address[i]);
print(channel, " ");
}
print(channel, "\n");
return 0; return 0;
} else { } else {

515
src/cli/settings.c Normal file
View file

@ -0,0 +1,515 @@
/*
* Mechanism for handling the SET command
*
* SET <setting name> <setting value>
*/
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"
#include "errors.h"
#include "settings.h"
#include "simpleio.h"
#include "syscalls.h"
#include "interrupt.h"
#include "rtc_reg.h"
#include "dev/rtc.h"
#include "dev/text_screen_iii.h"
#include "snd/codec.h"
#include "vicky_general.h"
#define MAX_SETTING_NAME 64
#define MAX_SETTING_HELP 80
/*
* Structure to hold a setting
*/
typedef struct s_setting {
char name[MAX_SETTING_NAME]; /* Name of the setting (in upper case) */
char help[MAX_SETTING_HELP]; /* Help line for this setting */
cli_setter setter; /* The function to set the value of the setting */
cli_getter getter; /* The function to get the value of the setting */
struct s_setting * next; /* Pointer to the next registered setting */
} t_setting, *p_setting;
static p_setting cli_first_setting; /* Pointer to the first registered setting */
static p_setting cli_last_setting; /* Pointer to the last registered setting */
/*
* Copy the name to a buffer as an upper case setting name
*
* Inputs:
* name_upper = pointer to the buffer of at least MAX_SETTING_NAME bytes to receive the copy
* name = the name to copy
*/
void cli_name_upper(char * name_upper, const char *name) {
short i;
for (i = 0; (i < MAX_SETTING_NAME) && (name[i] != 0); i++) {
name_upper[i] = toupper(name[i]);
}
name_upper[i] = 0;
}
/*
* Add a setting
*
* Inputs:
* name = the name of the setting
* setter = the function to change the value of the setting
* getter = the function to get the value of a setting
*
* Returns:
* 0 on success, any other number is an error
*/
short cli_set_register(const char * name, const char * help, cli_setter setter, cli_getter getter) {
p_setting setting = (p_setting)malloc(sizeof(t_setting));
if (setting == 0) {
/* Could not allocate the setting record... return an error */
return -1;
} else {
/* Set the fields for the setting */
cli_name_upper(setting->name, name);
strncpy(setting->help, help);
setting->setter = setter;
setting->getter = getter;
setting->next = 0;
if (cli_first_setting == 0) {
/* This is the first and last setting so far */
cli_first_setting = setting;
cli_last_setting = setting;
} else {
/* This is the new last setting */
cli_last_setting->next = setting;
cli_last_setting = setting;
}
/* Return success */
return 0;
}
}
/*
* Find the setting that matches the name (case insensitive search)
*
* Inputs:
* name = the setting name to find
*
* Returns:
* pointer to the matching setting (0 if none found)
*/
p_setting cli_find_setting(const char * name) {
char name_upper[MAX_SETTING_NAME];
p_setting setting;
/* Convert the name to upper case */
cli_name_upper(name_upper, name);
/* Walk through the list of settings to find a name that matches */
for (setting = cli_first_setting; setting != 0; setting = setting->next) {
if (strcmp(setting->name, name_upper) == 0) {
/* Found the setting... */
return setting;
}
}
/* Didn't find the setting... */
return 0;
}
/*
* Set the value of a setting
*
* Inputs:
* name = the name of the setting to update (case insensitive)
* value = the value to store in the setting (may be interpreted by the setting)
*
* Returns:
* 0 on success, any other number is an error
*/
short cli_set_value(short channel, const char * name, const char * value) {
p_setting setting = cli_find_setting(name);
if (setting == 0) {
/* Setting not found... */
return ERR_NOT_FOUND;
} else {
/* Attempt to set the value, and return the results */
return setting->setter(channel, value);
}
}
/*
* Get the value of a setting
*
* Inputs:
* name = the name of the setting to update (case insensitive)
* buffer = the place to copy a string representing the value of the setting
* size = the number of characters that can be stored in the buffer
*
* Returns:
* 0 on success, any other number is an error
*/
short cli_get_value(short channel, const char * name, char * buffer, short size) {
p_setting setting = cli_find_setting(name);
if (setting == 0) {
/* Setting not found... */
return ERR_NOT_FOUND;
} else {
/* Attempt to set the value, and return the results */
return setting->getter(channel, buffer, size);
}
}
/*
* Print help information about the SET command
*/
void cli_set_help(short channel) {
char message[80];
p_setting setting;
sprintf(message, "SET/GET command supported settings:\n");
sys_chan_write(channel, message, strlen(message));
for (setting = cli_first_setting; setting != 0; setting = setting->next) {
sys_chan_write(channel, setting->help, strlen(setting->help));
sys_chan_write(channel, "\n", 1);
}
return 0;
}
/*
* Command to set the value of a setting
*/
short cli_cmd_set(short channel, int argc, char * argv[]) {
char message[80];
short result;
if (argc == 3) {
result = cli_set_value(channel, argv[1], argv[2]);
if (result != 0) {
sprintf(message, "Unable to change setting: %s", sys_err_message(result));
sys_chan_write(channel, message, strlen(message));
return 0;
}
return result;
} else if ((argc == 2) && ((strcmp(argv[1], "HELP") == 0) || (strcmp(argv[1], "help") == 0) || (strcmp(argv[1], "?") == 0)) {
cli_set_help(channel);
} else {
print(channel, "USAGE: SET <name> <value>\n");
return -1;
}
}
/*
* Command to set the value of a setting
*/
short cli_cmd_get(short channel, int argc, char * argv[]) {
char buffer[128];
short result;
if (argc == 2) {
if ((strcmp(argv[1], "HELP") == 0) || (strcmp(argv[1], "help") == 0) || (strcmp(argv[1], "?") == 0)) {
cli_set_help(channel);
} else {
result = cli_get_value(channel, argv[1], buffer, 128);
if (result == 0) {
print(channel, buffer);
print(channel, "\n");
return 0;
} else {
sprintf(buffer, "Unable to get setting: %s", sys_err_message(result));
sys_chan_write(channel, buffer, strlen(buffer));
return result;
}
}
} else {
print(channel, "USAGE: GET <name>\n");
return -1;
}
}
/*
* SOF setter
*/
short cli_sof_set(short channel, const char * value) {
char message[80];
if (strcmp(value, "1") == 0) {
int_enable(INT_SOF_A);
sprintf(message, "Start Of Frame interrupt enabled.\n");
} else if (strcmp(value, "0") == 0) {
int_disable(INT_SOF_A);
sprintf(message, "Start Of Frame interrupt disabled.\n");
} else {
sprintf(message, "USAGE: SET SOF 0|1\n");
}
sys_chan_write(channel, message, strlen(message));
return 0;
}
/*
* SOF getter
*/
short cli_sof_get(short channel, char * buffer, short size) {
return 0;
}
/*
* RTC setter
*/
short cli_rtc_set(short channel, const char * value) {
char message[80];
if (strcmp(value, "1") == 0) {
rtc_enable_ticks();
sprintf(message, "RTC interrupt enabled.\n");
} else if (strcmp(value, "0") == 0) {
int_disable(INT_RTC);
sprintf(message, "RTC interrupt disabled.\n");
} else {
sprintf(message, "USAGE: SET RTC 0|1\n");
}
sys_chan_write(channel, message, strlen(message));
return 0;
}
/*
* RTC getter
*/
short cli_rtc_get(short channel, char * buffer, short size) {
return 0;
}
short atoi_n(char * text, short n) {
short result = 0;
short i;
for (i = 0; i < n; i++) {
result = result * 10;
result = result + (text[i] - '0');
}
return result;
}
/*
* DATE setter
*/
short cli_date_set(short channel, const char * date) {
t_time date_time;
short i;
const char * usage = "USAGE: SET DATE yyyy-mm-dd\n";
rtc_get_time(&date_time);
date_time.is_24hours = 1;
date_time.is_pm = 0;
/* Validate date is correct format */
for (i = 0; i < 10; i++) {
if ((i == 4) || (i == 7)) {
if (date[i] != '-') {
sys_chan_write(channel, usage, strlen(usage));
return -1;
}
} else {
if ((date[i] < '0') || (date[i] > '9')) {
sys_chan_write(channel, usage, strlen(usage));
return -1;
}
}
}
date_time.year = atoi_n(&date[0], 4);
date_time.month = atoi_n(&date[5], 2);
date_time.day = atoi_n(&date[8], 2);
rtc_set_time(&date_time);
return 0;
}
/*
* DATE getter
*/
short cli_date_get(short channel, char * value) {
t_time time;
rtc_get_time(&time);
sprintf(value, "%04d-%02d-%02d\n", time.year, time.month, time.day);
return 0;
}
/*
* TIME setter
*/
short cli_time_set(short channel, const char * time) {
t_time date_time;
short i;
const char * usage = "USAGE: SET TIME HH:MM:SS\n";
rtc_get_time(&date_time);
date_time.is_24hours = 1;
date_time.is_pm = 0;
/* Validate time is correct format */
for (i = 0; i < 8; i++) {
if ((i == 2) || (i == 5)) {
if (time[i] != ':') {
sys_chan_write(channel, usage, strlen(usage));
return -1;
}
} else {
if ((time[i] < '0') || (time[i] > '9')) {
sys_chan_write(channel, usage, strlen(usage));
return -1;
}
}
}
date_time.hour = atoi_n(&time[0], 2);
date_time.minute = atoi_n(&time[3], 2);
date_time.second = atoi_n(&time[6], 2);
rtc_set_time(&date_time);
return 0;
}
/*
* TIME getter
*/
short cli_time_get(short channel, char * value) {
t_time time;
rtc_get_time(&time);
sprintf(value, "%02d:%02d:%02d\n", time.hour, time.minute, time.second);
return 0;
}
/*
* Font setter -- SET FONT <path>
*/
short cli_font_set(short screen, const char * value) {
/* Open the file */
short chan = fsys_open(value, 0x01);
if (chan > 0) {
int i;
for (i = 0; i < 8 * 256; i++) {
short b = sys_chan_read_b(chan);
if (b >= 0) {
VICKY_TXT_FONT_A[i] = (unsigned char)b;
} else {
char message[80];
/* Reset the text screen */
text_init();
fsys_close(chan);
sprintf(message, "Unable to read font file: %d\n", b);
sys_chan_write(screen, message, strlen(message));
return -1;
}
}
fsys_close(chan);
} else {
print(screen, "Could not load font file.\n");
return -1;
}
}
/*
* Font setter -- GET FONT <path>
*/
short cli_font_get(short channel, char * value) {
/* We don't keep the font path */
*value = 0;
return 0;
}
/*
* Volume setter -- SET VOLUME <value>
*/
short cli_volume_set(short channel, char * value) {
unsigned char volume = (unsigned char)cli_eval_number(value);
codec_set_volume(volume);
return 0;
}
/*
* Volume getter -- GET VOLUME
*/
short cli_volume_get(short channel, char * value) {
sprintf(value, "%d", codec_get_volume());
return 0;
}
/*
* Set the keyboard layout given a keyboard layout file -- SET LAYOUT <path>
*/
short cli_layout_set(short channel, const char * value) {
short result, fd;
char buffer[1024]; /* Temporary storage for the translation tables */
/* Try to open the file */
fd = sys_fsys_open(value, 1);
if (fd >= 0) {
/* Try to read the data */
result = sys_chan_read(fd, buffer, 1024);
if (result > 0) {
/* If we got something, set the layout */
result = sys_kbd_layout(buffer);
}
sys_fsys_close(fd);
return result;
} else {
return fd;
}
}
/*
* Get the keyboard layout given a keyboard layout file -- GET LAYOUT
*/
short cli_layout_get(short channel, char * value) {
return 0;
}
/*
* Initialize the settings tables
*/
void cli_set_init() {
cli_first_setting = 0;
cli_last_setting = 0;
cli_set_register("DATE", "DATE yyyy-mm-dd -- set the date in the realtime clock", cli_date_set, cli_date_get);
// cli_set_register("RTC", "RTC 1|0 -- Enable or disable the realtime clock interrupt", cli_rtc_set, cli_rtc_get);
// cli_set_register("SOF", "SOF 1|0 -- Enable or disable the Start of Frame interrupt", cli_sof_set, cli_sof_get);
cli_set_register("FONT", "FONT <path> -- set a font for the display", cli_font_set, cli_font_get);
cli_set_register("KEYBOARD", "KEYBOARD <path> -- set the keyboard layout", cli_layout_set, cli_layout_get);
cli_set_register("TIME", "TIME HH:MM:SS -- set the time in the realtime clock", cli_time_set, cli_time_get);
cli_set_register("VOLUME", "VOLUME <0 - 255> -- set the master volume", cli_volume_set, cli_volume_get);
}

69
src/cli/settings.h Normal file
View file

@ -0,0 +1,69 @@
/*
* Mechanism for handling the SET command
*
* SET <setting name> <setting value>
*/
#ifndef __SETTINGS_H
#define __SETTINGS_H
/* Pointer to a function to set a value */
typedef short (*cli_setter)(short, const char *);
/* Pointer to a function to get a value */
typedef short (*cli_getter)(short, char * buffer, short size);
/*
* Initialize the settings tables
*/
extern void cli_set_init();
/*
* Add a setting
*
* Inputs:
* name = the name of the setting
* setter = the function to change the value of the setting
* getter = the function to get the value of a setting
*
* Returns:
* 0 on success, any other number is an error
*/
extern short cli_set_register(const char * name, cli_setter setter, cli_getter getter);
/*
* Set the value of a setting
*
* Inputs:
* name = the name of the setting to update (case insensitive)
* value = the value to store in the setting (may be interpreted by the setting)
*
* Returns:
* 0 on success, any other number is an error
*/
extern short cli_set_value(const char * name, const char * value);
/*
* Get the value of a setting
*
* Inputs:
* name = the name of the setting to update (case insensitive)
* buffer = the place to copy a string representing the value of the setting
* size = the number of characters that can be stored in the buffer
*
* Returns:
* 0 on success, any other number is an error
*/
extern short cli_get_value(const char * name, char * buffer, short size);
/*
* Command to set the value of a setting
*/
extern short cli_cmd_set(short screen, int argc, char * argv[]);
/*
* Command to set the value of a setting
*/
extern short cli_cmd_get(short screen, int argc, char * argv[]);
#endif

503
src/cli/sound_cmds.c Normal file
View file

@ -0,0 +1,503 @@
/*
* Commands to work with the sound devices
*/
#include "timers.h"
#include "sound_cmds.h"
#include "sound_reg.h"
#include "snd/psg.h"
#include "snd/opl2.h"
#include "dev/midi.h"
/*
* Play a sound on the PSG
*/
short psg_test(short channel, int argc, char * argv[]) {
int i;
long target_time;
psg_tone(0, 34923);
psg_attenuation(0, 0);
target_time = sys_time_jiffies() + 6;
while (target_time > sys_time_jiffies()) ;
psg_tone(1, 44000);
psg_attenuation(1, 0);
target_time = sys_time_jiffies() + 6;
while (target_time > sys_time_jiffies()) ;
psg_tone(2, 52325);
psg_attenuation(2, 0);
target_time = sys_time_jiffies() + 60;
while (target_time > sys_time_jiffies()) ;
psg_attenuation(0, 15);
psg_tone(0, 0);
psg_attenuation(1, 15);
psg_tone(1, 0);
psg_attenuation(2, 15);
psg_tone(2, 0);
return 0;
}
const unsigned char opl3_tone_on[] = {
0x01,0x00, /* initialise */
0x05,0x01, /* OPL3 mode, necessary for stereo */
0xc0,0x31, /* both channel, parallel connection */
/* Carrier settings
* no amplitude modulation (D7=0), no vibrato (D6=0)
* sustained envelope type (D5=1), KSR=0 (D4=0)
* frequency multiplier=1 (D4-D0=1) */
0x23,0x21,
/* no volume decrease with pitch (D7-D6=0)
* no attenuation (D5-D0=0) */
0x43,0x00,
/* fast attack (D7-D4=0xF) and decay (D3-D0=0xF) */
0x63,0xff,
/* high sustain level (D7-D4=0), slow release rate (D3-D0=5) */
0x83,0x05,
/* Modulator settings
* sustained envelope type, frequency multiplier=0 */
0x20,0x20,
/* maximum attenuation, no volume decrease with pitch */
0x40,0x3f,
/* Since the modulator signal is attenuated as much as possible, these
* next two values shouldn't have any effect. */
0x60,0x44,
0x80,0x05,
/* 440Hz */
0xa0,0x41,
/* block 0, key on */
0xb0,0x32,
/* end of sequence marker */
0xff
};
const unsigned char opl3_tone_off[] = {
/* block 0, key off */
0xb0,0x00,
/* end of sequence marker */
0xff
};
/*
* Play a sound on the OPL3
*/
short opl3_test(short channel, int argc, char * argv[]) {
short i;
unsigned char reg;
unsigned char data;
long target_time;
i = 0;
while (1) {
reg = opl3_tone_on[i++];
if (reg == 0xff) {
break;
} else {
data = opl3_tone_on[i++];
OPL3_PORT[reg] = data;
}
}
target_time = sys_time_jiffies() + 60;
while (target_time > sys_time_jiffies()) ;
i = 0;
while (1) {
reg = opl3_tone_off[i++];
if (reg == 0xff) {
break;
} else {
data = opl3_tone_off[i++];
OPL3_PORT[reg] = data;
}
}
return 0;
}
/*
* Perform a transmit test on the MIDI ports
*/
short midi_tx_test(short channel, int argc, char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
const char note_on[] = { 0x90, 0x3c, 0xff };
const char note_off[] = { 0x80, 0x3c, 0x00 };
char message[80];
unsigned short scancode = 0;
int i;
midi_init();
for (i = 0; i < 3; i++) {
midi_put(note_on[i]);
}
for (i = 0; i < 65535 * 20; i++) ;
for (i = 0; i < 3; i++) {
midi_put(note_off[i]);
}
#endif
return 0;
}
/*
* Perform a receive test on the MIDI ports
*/
short midi_rx_test(short channel, int argc, char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
char message[80];
unsigned short scancode = 0;
int i;
midi_init();
sprintf(message, "Press '1' to start, and 'ESC' to exit test.\n");
sys_chan_write(channel, message, strlen(message));
while (sys_kbd_scancode() != 0x02) ;
i = 0;
while (scancode != 0x01) {
unsigned char input = midi_get_poll();
if ((input != 0xf8) && (input != 0xfe)) {
if ((i % 16) == 0) {
sprintf(message, "\n%02X", input);
sys_chan_write(channel, message, strlen(message));
} else {
sprintf(message, " %02X", input);
sys_chan_write(channel, message, strlen(message));
}
i++;
}
scancode = sys_kbd_scancode();
}
sys_chan_write(channel, "\n", 1);
#endif
return 0;
}
/*
* Perform a loopback test on the MIDI ports
*/
short midi_loop_test(short channel, int argc, char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
char message[80];
unsigned short scancode = 0;
unsigned char output;
midi_init();
sprintf(message, "Plug a MIDI loopback cable between MIDI IN and MIDI OUT.\nThen press '1' to start.\n");
sys_chan_write(channel, message, strlen(message));
sprintf(message, "Press ESC to exit test.\n");
sys_chan_write(channel, message, strlen(message));
while (sys_kbd_scancode() != 0x02) ;
output = 1;
while (scancode != 0x01) {
sprintf(message, "Sending: ");
sys_chan_write(channel, message, strlen(message));
midi_put(output);
sprintf(message, "%02X --> ", output);
sys_chan_write(channel, message, strlen(message));
unsigned char input = midi_get_poll();
sprintf(message, "%02X\n", input);
sys_chan_write(channel, message, strlen(message));
scancode = sys_kbd_scancode();
output++;
if (output > 0xfe) {
output = 1;
}
}
sys_chan_write(channel, "\n", 1);
#endif
return 0;
}
/*
* Test the OPL2
*/
short opl2_test(short channel, int argc, char * argv[]) {
unsigned char i;
OPN2_INT_BASE[OPN2_22_LFO] = 0; /* LFO off */
OPN2_INT_BASE[OPN2_27_CHANEL_3_MODE] = 0; /* chanel 3 in normal mode */
/* switch off all chanal */
for (i = 0; i < 7; i++) {
OPN2_INT_BASE[OPN2_28_KEY_ON_OFF] = i;
}
/* ADC off */
OPN2_INT_BASE[OPN2_2B_ADC_EN] = 0;
/* DT1/MUL */
OPN2_INT_BASE[OPN2_30_ADSR__DT1_MUL__CH1_OP1] = 0x71;
OPN2_INT_BASE[OPN2_31_ADSR__DT1_MUL__CH2_OP1] = 0x71;
OPN2_INT_BASE[OPN2_32_ADSR__DT1_MUL__CH3_OP1] = 0x71;
OPN2_INT_BASE[OPN2_30_ADSR__DT1_MUL__CH1_OP5] = 0x71;
OPN2_INT_BASE[OPN2_31_ADSR__DT1_MUL__CH2_OP5] = 0x71;
OPN2_INT_BASE[OPN2_32_ADSR__DT1_MUL__CH3_OP5] = 0x71;
OPN2_INT_BASE[OPN2_34_ADSR__DT1_MUL__CH1_OP2] = 0x0D;
OPN2_INT_BASE[OPN2_35_ADSR__DT1_MUL__CH2_OP2] = 0x0D;
OPN2_INT_BASE[OPN2_36_ADSR__DT1_MUL__CH3_OP2] = 0x0D;
OPN2_INT_BASE[OPN2_34_ADSR__DT1_MUL__CH1_OP6] = 0x0D;
OPN2_INT_BASE[OPN2_35_ADSR__DT1_MUL__CH2_OP6] = 0x0D;
OPN2_INT_BASE[OPN2_36_ADSR__DT1_MUL__CH3_OP6] = 0x0D;
OPN2_INT_BASE[OPN2_38_ADSR__DT1_MUL__CH1_OP3] = 0x33;
OPN2_INT_BASE[OPN2_39_ADSR__DT1_MUL__CH2_OP3] = 0x33;
OPN2_INT_BASE[OPN2_3A_ADSR__DT1_MUL__CH3_OP3] = 0x33;
OPN2_INT_BASE[OPN2_38_ADSR__DT1_MUL__CH1_OP7] = 0x33;
OPN2_INT_BASE[OPN2_39_ADSR__DT1_MUL__CH2_OP7] = 0x33;
OPN2_INT_BASE[OPN2_3A_ADSR__DT1_MUL__CH3_OP7] = 0x33;
OPN2_INT_BASE[OPN2_3C_ADSR__DT1_MUL__CH1_OP4] = 0x01;
OPN2_INT_BASE[OPN2_3D_ADSR__DT1_MUL__CH2_OP4] = 0x01;
OPN2_INT_BASE[OPN2_3E_ADSR__DT1_MUL__CH3_OP4] = 0x01;
OPN2_INT_BASE[OPN2_3C_ADSR__DT1_MUL__CH1_OP8] = 0x01;
OPN2_INT_BASE[OPN2_3D_ADSR__DT1_MUL__CH2_OP8] = 0x01;
OPN2_INT_BASE[OPN2_3E_ADSR__DT1_MUL__CH3_OP8] = 0x01;
/* Total Level */
OPN2_INT_BASE[OPN2_40_ADSR__LT__CH1_OP1] = 0x23;
OPN2_INT_BASE[OPN2_41_ADSR__LT__CH2_OP1] = 0x23;
OPN2_INT_BASE[OPN2_42_ADSR__LT__CH3_OP1] = 0x23;
OPN2_INT_BASE[OPN2_40_ADSR__LT__CH1_OP5] = 0x23;
OPN2_INT_BASE[OPN2_41_ADSR__LT__CH2_OP5] = 0x23;
OPN2_INT_BASE[OPN2_42_ADSR__LT__CH3_OP5] = 0x23;
OPN2_INT_BASE[OPN2_44_ADSR__LT__CH1_OP2] = 0x2D;
OPN2_INT_BASE[OPN2_45_ADSR__LT__CH2_OP2] = 0x2D;
OPN2_INT_BASE[OPN2_46_ADSR__LT__CH3_OP2] = 0x2D;
OPN2_INT_BASE[OPN2_44_ADSR__LT__CH1_OP6] = 0x2D;
OPN2_INT_BASE[OPN2_45_ADSR__LT__CH2_OP6] = 0x2D;
OPN2_INT_BASE[OPN2_46_ADSR__LT__CH3_OP6] = 0x2D;
OPN2_INT_BASE[OPN2_48_ADSR__LT__CH1_OP3] = 0x26;
OPN2_INT_BASE[OPN2_49_ADSR__LT__CH2_OP3] = 0x26;
OPN2_INT_BASE[OPN2_4A_ADSR__LT__CH3_OP3] = 0x26;
OPN2_INT_BASE[OPN2_48_ADSR__LT__CH1_OP7] = 0x26;
OPN2_INT_BASE[OPN2_49_ADSR__LT__CH2_OP7] = 0x26;
OPN2_INT_BASE[OPN2_4A_ADSR__LT__CH3_OP7] = 0x26;
OPN2_INT_BASE[OPN2_4C_ADSR__LT__CH1_OP4] = 0x00;
OPN2_INT_BASE[OPN2_4D_ADSR__LT__CH2_OP4] = 0x00;
OPN2_INT_BASE[OPN2_4E_ADSR__LT__CH3_OP4] = 0x00;
OPN2_INT_BASE[OPN2_4C_ADSR__LT__CH1_OP8] = 0x00;
OPN2_INT_BASE[OPN2_4D_ADSR__LT__CH2_OP8] = 0x00;
OPN2_INT_BASE[OPN2_4E_ADSR__LT__CH3_OP8] = 0x00;
/* RS/AR */
OPN2_INT_BASE[OPN2_50_ADSR__SR_AR__CH1_OP1] = 0x5F;
OPN2_INT_BASE[OPN2_51_ADSR__SR_AR__CH2_OP1] = 0x5F;
OPN2_INT_BASE[OPN2_52_ADSR__SR_AR__CH3_OP1] = 0x5F;
OPN2_INT_BASE[OPN2_50_ADSR__SR_AR__CH1_OP5] = 0x5F;
OPN2_INT_BASE[OPN2_51_ADSR__SR_AR__CH2_OP5] = 0x5F;
OPN2_INT_BASE[OPN2_52_ADSR__SR_AR__CH3_OP5] = 0x5F;
OPN2_INT_BASE[OPN2_54_ADSR__SR_AR__CH1_OP2] = 0x99;
OPN2_INT_BASE[OPN2_55_ADSR__SR_AR__CH2_OP2] = 0x99;
OPN2_INT_BASE[OPN2_56_ADSR__SR_AR__CH3_OP2] = 0x99;
OPN2_INT_BASE[OPN2_54_ADSR__SR_AR__CH1_OP6] = 0x99;
OPN2_INT_BASE[OPN2_55_ADSR__SR_AR__CH2_OP6] = 0x99;
OPN2_INT_BASE[OPN2_56_ADSR__SR_AR__CH3_OP6] = 0x99;
OPN2_INT_BASE[OPN2_58_ADSR__SR_AR__CH1_OP3] = 0x5F;
OPN2_INT_BASE[OPN2_59_ADSR__SR_AR__CH2_OP3] = 0x5F;
OPN2_INT_BASE[OPN2_5A_ADSR__SR_AR__CH3_OP3] = 0x5F;
OPN2_INT_BASE[OPN2_58_ADSR__SR_AR__CH1_OP7] = 0x5F;
OPN2_INT_BASE[OPN2_59_ADSR__SR_AR__CH2_OP7] = 0x5F;
OPN2_INT_BASE[OPN2_5A_ADSR__SR_AR__CH3_OP7] = 0x5F;
OPN2_INT_BASE[OPN2_5C_ADSR__SR_AR__CH1_OP4] = 0x94;
OPN2_INT_BASE[OPN2_5D_ADSR__SR_AR__CH2_OP4] = 0x94;
OPN2_INT_BASE[OPN2_5E_ADSR__SR_AR__CH3_OP4] = 0x94;
OPN2_INT_BASE[OPN2_5C_ADSR__SR_AR__CH1_OP8] = 0x94;
OPN2_INT_BASE[OPN2_5D_ADSR__SR_AR__CH2_OP8] = 0x94;
OPN2_INT_BASE[OPN2_5E_ADSR__SR_AR__CH3_OP8] = 0x94;
/* AM/D1R */
OPN2_INT_BASE[OPN2_60_ADSR__AM_D1R__CH1_OP1] = 0x07;
OPN2_INT_BASE[OPN2_61_ADSR__AM_D1R__CH2_OP1] = 0x07;
OPN2_INT_BASE[OPN2_62_ADSR__AM_D1R__CH3_OP1] = 0x07;
OPN2_INT_BASE[OPN2_60_ADSR__AM_D1R__CH1_OP5] = 0x07;
OPN2_INT_BASE[OPN2_61_ADSR__AM_D1R__CH2_OP5] = 0x07;
OPN2_INT_BASE[OPN2_62_ADSR__AM_D1R__CH3_OP5] = 0x07;
OPN2_INT_BASE[OPN2_64_ADSR__AM_D1R__CH1_OP2] = 0x07;
OPN2_INT_BASE[OPN2_65_ADSR__AM_D1R__CH2_OP2] = 0x07;
OPN2_INT_BASE[OPN2_66_ADSR__AM_D1R__CH3_OP2] = 0x07;
OPN2_INT_BASE[OPN2_64_ADSR__AM_D1R__CH1_OP6] = 0x07;
OPN2_INT_BASE[OPN2_65_ADSR__AM_D1R__CH2_OP6] = 0x07;
OPN2_INT_BASE[OPN2_66_ADSR__AM_D1R__CH3_OP6] = 0x07;
OPN2_INT_BASE[OPN2_68_ADSR__AM_D1R__CH1_OP3] = 0x05;
OPN2_INT_BASE[OPN2_69_ADSR__AM_D1R__CH2_OP3] = 0x05;
OPN2_INT_BASE[OPN2_6A_ADSR__AM_D1R__CH3_OP3] = 0x05;
OPN2_INT_BASE[OPN2_68_ADSR__AM_D1R__CH1_OP7] = 0x05;
OPN2_INT_BASE[OPN2_69_ADSR__AM_D1R__CH2_OP7] = 0x05;
OPN2_INT_BASE[OPN2_6A_ADSR__AM_D1R__CH3_OP7] = 0x05;
OPN2_INT_BASE[OPN2_6C_ADSR__AM_D1R__CH1_OP4] = 0x07;
OPN2_INT_BASE[OPN2_6D_ADSR__AM_D1R__CH2_OP4] = 0x07;
OPN2_INT_BASE[OPN2_6E_ADSR__AM_D1R__CH3_OP4] = 0x07;
OPN2_INT_BASE[OPN2_6C_ADSR__AM_D1R__CH1_OP8] = 0x07;
OPN2_INT_BASE[OPN2_6D_ADSR__AM_D1R__CH2_OP8] = 0x07;
OPN2_INT_BASE[OPN2_6E_ADSR__AM_D1R__CH3_OP8] = 0x07;
/* D2R */
OPN2_INT_BASE[OPN2_70_ADSR__D2R__CH1_OP1] = 0x02;
OPN2_INT_BASE[OPN2_71_ADSR__D2R__CH2_OP1] = 0x02;
OPN2_INT_BASE[OPN2_72_ADSR__D2R__CH3_OP1] = 0x02;
OPN2_INT_BASE[OPN2_70_ADSR__D2R__CH1_OP5] = 0x02;
OPN2_INT_BASE[OPN2_71_ADSR__D2R__CH2_OP5] = 0x02;
OPN2_INT_BASE[OPN2_72_ADSR__D2R__CH3_OP5] = 0x02;
OPN2_INT_BASE[OPN2_74_ADSR__D2R__CH1_OP2] = 0x02;
OPN2_INT_BASE[OPN2_75_ADSR__D2R__CH2_OP2] = 0x02;
OPN2_INT_BASE[OPN2_76_ADSR__D2R__CH3_OP2] = 0x02;
OPN2_INT_BASE[OPN2_74_ADSR__D2R__CH1_OP6] = 0x02;
OPN2_INT_BASE[OPN2_75_ADSR__D2R__CH2_OP6] = 0x02;
OPN2_INT_BASE[OPN2_76_ADSR__D2R__CH3_OP6] = 0x02;
OPN2_INT_BASE[OPN2_78_ADSR__D2R__CH1_OP3] = 0x02;
OPN2_INT_BASE[OPN2_79_ADSR__D2R__CH2_OP3] = 0x02;
OPN2_INT_BASE[OPN2_7A_ADSR__D2R__CH3_OP3] = 0x02;
OPN2_INT_BASE[OPN2_78_ADSR__D2R__CH1_OP7] = 0x02;
OPN2_INT_BASE[OPN2_79_ADSR__D2R__CH2_OP7] = 0x02;
OPN2_INT_BASE[OPN2_7A_ADSR__D2R__CH3_OP7] = 0x02;
OPN2_INT_BASE[OPN2_7C_ADSR__D2R__CH1_OP4] = 0x02;
OPN2_INT_BASE[OPN2_7D_ADSR__D2R__CH2_OP4] = 0x02;
OPN2_INT_BASE[OPN2_7E_ADSR__D2R__CH3_OP4] = 0x02;
OPN2_INT_BASE[OPN2_7C_ADSR__D2R__CH1_OP8] = 0x02;
OPN2_INT_BASE[OPN2_7D_ADSR__D2R__CH2_OP8] = 0x02;
OPN2_INT_BASE[OPN2_7E_ADSR__D2R__CH3_OP8] = 0x02;
/* D1L/RR */
OPN2_INT_BASE[OPN2_80_ADSR__D1L_RR__CH1_OP1] = 0x11;
OPN2_INT_BASE[OPN2_81_ADSR__D1L_RR__CH2_OP1] = 0x11;
OPN2_INT_BASE[OPN2_82_ADSR__D1L_RR__CH3_OP1] = 0x11;
OPN2_INT_BASE[OPN2_80_ADSR__D1L_RR__CH1_OP5] = 0x11;
OPN2_INT_BASE[OPN2_81_ADSR__D1L_RR__CH2_OP5] = 0x11;
OPN2_INT_BASE[OPN2_82_ADSR__D1L_RR__CH3_OP5] = 0x11;
OPN2_INT_BASE[OPN2_84_ADSR__D1L_RR__CH1_OP2] = 0x11;
OPN2_INT_BASE[OPN2_85_ADSR__D1L_RR__CH2_OP2] = 0x11;
OPN2_INT_BASE[OPN2_86_ADSR__D1L_RR__CH3_OP2] = 0x11;
OPN2_INT_BASE[OPN2_84_ADSR__D1L_RR__CH1_OP6] = 0x11;
OPN2_INT_BASE[OPN2_85_ADSR__D1L_RR__CH2_OP6] = 0x11;
OPN2_INT_BASE[OPN2_86_ADSR__D1L_RR__CH3_OP6] = 0x11;
OPN2_INT_BASE[OPN2_88_ADSR__D1L_RR__CH1_OP3] = 0x11;
OPN2_INT_BASE[OPN2_89_ADSR__D1L_RR__CH2_OP3] = 0x11;
OPN2_INT_BASE[OPN2_8A_ADSR__D1L_RR__CH3_OP3] = 0x11;
OPN2_INT_BASE[OPN2_88_ADSR__D1L_RR__CH1_OP7] = 0x11;
OPN2_INT_BASE[OPN2_89_ADSR__D1L_RR__CH2_OP7] = 0x11;
OPN2_INT_BASE[OPN2_8A_ADSR__D1L_RR__CH3_OP7] = 0x11;
OPN2_INT_BASE[OPN2_8C_ADSR__D1L_RR__CH1_OP4] = 0xA6;
OPN2_INT_BASE[OPN2_8D_ADSR__D1L_RR__CH2_OP4] = 0xA6;
OPN2_INT_BASE[OPN2_8E_ADSR__D1L_RR__CH3_OP4] = 0xA6;
OPN2_INT_BASE[OPN2_8C_ADSR__D1L_RR__CH1_OP8] = 0xA6;
OPN2_INT_BASE[OPN2_8D_ADSR__D1L_RR__CH2_OP8] = 0xA6;
OPN2_INT_BASE[OPN2_8E_ADSR__D1L_RR__CH3_OP8] = 0xA6;
/* Proprietary */
OPN2_INT_BASE[OPN2_90_ADSR__D1L_RR__CH1_OP1] = 0x00;
OPN2_INT_BASE[OPN2_91_ADSR__D1L_RR__CH2_OP1] = 0x00;
OPN2_INT_BASE[OPN2_92_ADSR__D1L_RR__CH3_OP1] = 0x00;
OPN2_INT_BASE[OPN2_90_ADSR__D1L_RR__CH4_OP1] = 0x00;
OPN2_INT_BASE[OPN2_91_ADSR__D1L_RR__CH5_OP1] = 0x00;
OPN2_INT_BASE[OPN2_92_ADSR__D1L_RR__CH6_OP1] = 0x00;
OPN2_INT_BASE[OPN2_94_ADSR__D1L_RR__CH1_OP2] = 0x00;
OPN2_INT_BASE[OPN2_95_ADSR__D1L_RR__CH2_OP2] = 0x00;
OPN2_INT_BASE[OPN2_96_ADSR__D1L_RR__CH3_OP2] = 0x00;
OPN2_INT_BASE[OPN2_94_ADSR__D1L_RR__CH4_OP2] = 0x00;
OPN2_INT_BASE[OPN2_95_ADSR__D1L_RR__CH5_OP2] = 0x00;
OPN2_INT_BASE[OPN2_96_ADSR__D1L_RR__CH6_OP2] = 0x00;
OPN2_INT_BASE[OPN2_98_ADSR__D1L_RR__CH1_OP3] = 0x00;
OPN2_INT_BASE[OPN2_99_ADSR__D1L_RR__CH2_OP3] = 0x00;
OPN2_INT_BASE[OPN2_9A_ADSR__D1L_RR__CH3_OP3] = 0x00;
OPN2_INT_BASE[OPN2_98_ADSR__D1L_RR__CH4_OP3] = 0x00;
OPN2_INT_BASE[OPN2_99_ADSR__D1L_RR__CH5_OP3] = 0x00;
OPN2_INT_BASE[OPN2_9A_ADSR__D1L_RR__CH6_OP3] = 0x00;
OPN2_INT_BASE[OPN2_9C_ADSR__D1L_RR__CH1_OP4] = 0x00;
OPN2_INT_BASE[OPN2_9D_ADSR__D1L_RR__CH2_OP4] = 0x00;
OPN2_INT_BASE[OPN2_9E_ADSR__D1L_RR__CH3_OP4] = 0x00;
OPN2_INT_BASE[OPN2_9C_ADSR__D1L_RR__CH4_OP4] = 0x00;
OPN2_INT_BASE[OPN2_9D_ADSR__D1L_RR__CH5_OP4] = 0x00;
OPN2_INT_BASE[OPN2_9E_ADSR__D1L_RR__CH6_OP4] = 0x00;
/* Feedback/algorithm */
OPN2_INT_BASE[OPN2_B0_CH1_FEEDBACK_ALGO] = 0x32;
OPN2_INT_BASE[OPN2_B1_CH2_FEEDBACK_ALGO] = 0x32;
OPN2_INT_BASE[OPN2_B2_CH3_FEEDBACK_ALGO] = 0x32;
/* Both speakers on */
OPN2_INT_BASE[OPN2_B4_CH1_L_R_AMS_FMS] = 0xC0;
OPN2_INT_BASE[OPN2_B5_CH2_L_R_AMS_FMS] = 0xC0;
OPN2_INT_BASE[OPN2_B6_CH3_L_R_AMS_FMS] = 0xC0;
/* Set frequency */
OPN2_INT_BASE[OPN2_A4_CH1_OCTAVE_FRECANCY_H] = 0x23;
OPN2_INT_BASE[OPN2_A5_CH2_OCTAVE_FRECANCY_H] = 0x22;
OPN2_INT_BASE[OPN2_A6_CH3_OCTAVE_FRECANCY_H] = 0x22;
OPN2_INT_BASE[OPN2_A0_CH1_FRECANCY_L] = 0x96;
OPN2_INT_BASE[OPN2_A1_CH2_FRECANCY_L] = 0x96;
OPN2_INT_BASE[OPN2_A2_CH3_FRECANCY_L] = 0x24;
/* Key off */
OPN2_INT_BASE[OPN2_28_KEY_ON_OFF] = 0x00;
for (i = 0xF0; i < 0xF7; i++) {
OPN2_INT_BASE[OPN2_28_KEY_ON_OFF] = i;
}
long target_ticks = sys_time_jiffies();
while (target_ticks > sys_time_jiffies() + 300) ;
for (i = 0x00; i < 0x07; i++) {
OPN2_INT_BASE[OPN2_28_KEY_ON_OFF] = i;
}
return 0;
}

38
src/cli/sound_cmds.h Normal file
View file

@ -0,0 +1,38 @@
/*
* Commands to work with the sound devices
*/
#ifndef __SOUND_CMDS_H
#define __SOUND_CMDS_H
/*
* Play a sound on the PSG
*/
extern short psg_test(short channel, int argc, char * argv[]);
/*
* Play a sound on the OPL3
*/
extern short opl3_test(short channel, int argc, char * argv[]);
/*
* Test the OPL2
*/
extern short opl2_test(short channel, int argc, char * argv[]);
/*
* Perform a transmit test on the MIDI ports
*/
extern short midi_tx_test(short channel, int argc, char * argv[]);
/*
* Perform a receive test on the MIDI ports
*/
extern short midi_rx_test(short channel, int argc, char * argv[]);
/*
* Perform a loopback test on the MIDI ports
*/
extern short midi_loop_test(short channel, int argc, char * argv[]);
#endif

385
src/cli/test_cmd2.c Normal file
View file

@ -0,0 +1,385 @@
/*
* Test commands
*/
#include <ctype.h>
#include <string.h>
#include "cli.h"
#include "cli/test_cmds.h"
#include "cli/sound_cmds.h"
#include "dev/block.h"
#include "dev/channel.h"
#include "dev/fsys.h"
#include "dev/lpt.h"
#include "dev/rtc.h"
#include "dev/uart.h"
#include "fatfs/ff.h"
#include "interrupt.h"
#include "rtc_reg.h"
#include "simpleio.h"
#include "syscalls.h"
#include "sys_general.h"
#include "uart_reg.h"
#include "vicky_general.h"
#define LPT_DATA_PORT ((volatile unsigned char *)0x00C02378)
#define LPT_STAT_PORT ((volatile unsigned char *)0x00C02379)
#define LPT_STAT_BUSY 0x80
#define LPT_STAT_ACK 0x40
#define LPT_STAT_PO 0x20
#define LPT_STAT_SELECT 0x10
#define LPT_STAT_ERROR 0x08
#define LPT_STAT_IRQ 0x04
#define LPT_CTRL_PORT ((volatile unsigned char *)0x00C0237A)
#define LPT_CTRL_STROBE 0x01
#define LPT_CTRL_AL 0x02
#define LPT_CTRL_INIT 0x04
#define LPT_CTRL_SELECT 0x08
#define LPT_CTRL_IRQE 0x10
#define LPT_CTRL_BI 0x20
#define LPT_INIT_ON 0x08 /* Start the printer initialization process */
#define LPT_INIT_OFF 0x0C /* Stop the printer initialization process */
#define LPT_STROBE_ON 0x0F /* Strobe the printer */
#define LPT_STROBE_OFF 0x0E /* Drop the strobe to the printer */
typedef struct s_cli_test_feature {
const char * name;
const char * help;
cli_cmd_handler handler;
} t_cli_test_feature, * p_cli_test_feature;
/*
* Tests...
*/
short cli_test_bitmap(short channel, int argc, char * argv[]) {
int i,m,p;
unsigned char j;
unsigned short k;
*MasterControlReg_A = VKY3_MCR_BITMAP_EN | VKY3_MCR_GRAPH_EN; // Enable bitmap graphics
*BM0_Control_Reg = 0x00000001; // Enable BM0
*BM0_Addy_Pointer_Reg = 0x00000000; //Pointing to Starting of VRAM Bank A
// *BorderControlReg_L = 0x00000800; // Enable
k = 0;
for (i = 0; i< 256; i++) {
LUT_0[4*i] = i;
LUT_0[4*i+1] = i;
LUT_0[4*i+2] = i;
LUT_0[4*i+3] = 0;
}
for (i = 0; i< 640 * 480; i++) {
VRAM_Bank0[i] = i & 0xff;
}
}
short cli_test_uart(short channel, int argc, char * argv[]) {
char c;
char buffer[80];
uart_init(0);
uart_setbps(0, UART_115200);
uart_setlcr(0, LCR_DATABITS_8 | LCR_STOPBIT_1 | LCR_PARITY_NONE);
sprintf(buffer, "COM1: 115200, no parity, 1 stop bit, 8 data bits\nPress ESC to finish (%d).\n", UART_115200);
sys_chan_write(0, buffer, strlen(buffer));
while (1) {
c = kbd_getc();
if (c != 0) {
if (c == 0x1b) {
return 0;
}
uart_put(0, c);
} else if (uart_has_bytes(0)) {
c = uart_get(0);
sys_chan_write_b(channel, c);
}
}
}
short cli_test_panic(short channel, int argc, char * argv[]) {
volatile int x = 0;
return argc / x;
}
/*
* Try using the RTC periodic interrupt in polled mode
*/
short cli_test_rtc(short channel, int argc, char * argv[]) {
char buffer[80];
char * spinner = "|/-\\";
short count = 0;
long ticks;
*RTC_RATES = 0x0e; /* Periodic interrupt rate: 250 ms */
*RTC_ENABLES = RTC_PIE; /* Turn on the periodic interrupt */
int_enable(INT_RTC);
ticks = sys_time_jiffies();
sprintf(buffer, "Waiting for updated ticks starting from %d\n", ticks);
sys_chan_write(channel, buffer, strlen(buffer));
while (1) {
if (ticks < sys_time_jiffies()) {
/* We got the periodic interrupt */
sprintf(buffer, "Tick! %d\n", ticks);
sys_chan_write(channel, buffer, strlen(buffer));
ticks = sys_time_jiffies();
}
}
}
/*
* Test the memory
*/
short cli_mem_test(short channel, int argc, char * argv[]) {
volatile unsigned char * memory = 0x00000000;
t_sys_info sys_info;
const long mem_start = 0x00050000;
long mem_end;
char message[80];
long i;
sys_get_info(&sys_info);
mem_end = sys_info.system_ram_size;
sprintf(message, "\x1B[H\x1B[2JTesting memory...");
sys_chan_write(channel, message, strlen(message));
for (i = mem_start; i < mem_end; i++) {
memory[i] = 0x55;
if (memory[i] != 0x55) {
sprintf(message, "\x1B[1;2H\x1B[KFailed to write 0x55... read %02X at %08X\n\n", memory[i], i);
sys_chan_write(channel, message, strlen(message));
return -1;
}
memory[i] = 0xAA;
if (memory[i] != 0xAA) {
sprintf(message, "\x1B[1;2H\x1B[KFailed to write 0xAA... read %02X at %08X\n\n", memory[i], i);
sys_chan_write(channel, message, strlen(message));
return -1;
}
memory[i] = 0x00;
if (memory[i] != 0x00) {
sprintf(message, "\x1B[1;2H\x1B[KFailed to write 0x00... read %02X at %08\n\nX", memory[i], i);
sys_chan_write(channel, message, strlen(message));
return -1;
}
if ((i % 1024) == 0) {
sprintf(message, "\x1B[H\x1B[0KMemory tested: %08X", i);
sys_chan_write(channel, message, strlen(message));
}
}
sprintf(message, "\x1B[H\x1B[2JMemory passed basic tests.\n\n");
sys_chan_write(channel, message, strlen(message));
return 0;
}
/*
* Test the IDE interface by reading the MBR
*/
short cli_test_ide(short screen, int argc, char * argv[]) {
unsigned char buffer[512];
short i;
short scancode;
short n = 0;
while (1) {
n = bdev_read(BDEV_HDC, 0, buffer, 512);
if (n <= 0) {
err_print(screen, "Unable to read MBR", n);
return n;
}
dump_buffer(screen, buffer, 512, 1);
print(screen, "\n\n");
scancode = sys_kbd_scancode();
if (scancode == 0x01) {
break;
}
}
}
/*
* Test file creation
*/
short cli_test_create(short screen, int argc, char * argv[]) {
short n;
if (argc > 1) {
short channel = fsys_open(argv[1], FA_CREATE_NEW | FA_WRITE);
if (channel >= 0) {
char * message = "Hello, world!\n";
n = chan_write(channel, message, strlen(message));
if (n <= 0) {
err_print(screen, "Unable to write to file", n);
}
fsys_close(channel);
return 0;
} else {
err_print(screen, "Unable to open to file", channel);
return -1;
}
} else {
print(screen, "USAGE: TEST CREATE <path>\n");
return -1;
}
}
short cli_test_lpt(short screen, int argc, char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
char message[80];
unsigned char scancode;
sprintf(message, "Test parallel port:\nF1: DATA=00 F2: DATA=FF F3: STRB=1 F4: STRB=0\n");
sys_chan_write(screen, message, strlen(message));
sprintf(message, "F5: INIT=1 F6: INIT=0 F7: SEL=1 F8: SEL=0\nESC: Quit");
sys_chan_write(screen, message, strlen(message));
while (1) {
scancode = sys_kbd_scancode();
switch (scancode) {
case 0x3B: /* F1 */
*LPT_DATA_PORT = 0;
break;
case 0x3C: /* F2 */
*LPT_DATA_PORT = 0xff;
break;
case 0x3D: /* F3 */
*LPT_CTRL_PORT = LPT_CTRL_STROBE;
break;
case 0x3E: /* F4 */
*LPT_CTRL_PORT = 0;
break;
case 0x3F: /* F5 */
*LPT_CTRL_PORT = 0;
break;
case 0x40: /* F6 */
*LPT_CTRL_PORT = LPT_CTRL_INIT;
break;
case 0x41: /* F7 */
*LPT_CTRL_PORT = LPT_CTRL_SELECT;
break;
case 0x42: /* F8 */
*LPT_CTRL_PORT = 0;
break;
case 0x1B: /* ESC */
return 0;
default:
break;
}
}
#endif
return 0;
}
short cmd_test_print(short screen, int argc, char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
const char * test_pattern = "0123456789ABCDEFGHIJKLMNOPQRTSUVWZXYZ\r\n";
char message[80];
unsigned short scancode = 0;
sprintf(message, "Initializing printer...\n");
sys_chan_write(screen, message, strlen(message));
lpt_initialize();
sprintf(message, "Sending test patterns to printer (ESC to quit)...\n");
sys_chan_write(screen, message, strlen(message));
while (scancode != 0x01) {
scancode = sys_kbd_scancode();
lpt_write(0, test_pattern, strlen(test_pattern));
}
#endif
return 0;
}
static t_cli_test_feature cli_test_features[] = {
{"BITMAP", "BITMAP: test the bitmap screen", cli_test_bitmap},
{"CREATE", "CREATE <path>: test creating a file", cli_test_create},
{"IDE", "IDE: test reading the MBR of the IDE drive", cli_test_ide},
{"PANIC", "PANIC: test the kernel panic mechanism", cli_test_panic},
{"LPT", "LPT: test the parallel port", cli_test_lpt},
{"MEM", "MEM: test reading and writing memory", cli_mem_test},
{"MIDILOOP", "MIDILOOP: perform a loopback test on the MIDI ports", midi_loop_test},
{"MIDIRX", "MIDIRX: perform a receive test on the MIDI ports", midi_rx_test},
{"MIDITX", "MIDITX: send a note to a MIDI keyboard", midi_tx_test},
{"OPL2", "OPL2: test the OPL2 sound chip", opl2_test},
{"OPL3", "OPL3: test the OPL3 sound chip", opl3_test},
{"PSG", "PSG: test the PSG sound chip", psg_test},
{"PRINT", "PRINT: sent text to the printer", cmd_test_print},
{"UART", "UART: test the serial port", cli_test_uart},
{0, 0}
};
void test_help(short screen) {
p_cli_test_feature f;
print(screen, "USAGE: TEST <feature>\nFeatures supported...\n");
for (f = cli_test_features; f->name != 0; f++) {
print(screen, f->help);
print(screen, "\n");
}
}
/*
* Test command
*/
short cmd_test(short screen, int argc, char * argv[]) {
short i;
p_cli_test_feature f;
if (argc > 1) {
char feature_upcase[80];
/* Make an upper case copy of the feature to test */
strncpy(feature_upcase, argv[1], 80);
for (i = 0; i < strlen(feature_upcase); i++) {
feature_upcase[i] = toupper(feature_upcase[i]);
}
for (f = cli_test_features; f->name != 0; f++) {
if (strcmp(f->name, feature_upcase) == 0) {
f->handler(screen, argc - 1, &argv[1]);
return 0;
}
}
test_help(screen);
return -1;
} else {
test_help(screen);
return -1;
}
}

13
src/cli/test_cmds.h Normal file
View file

@ -0,0 +1,13 @@
/*
* Test commands
*/
#ifndef __TEST_CMDS_H
#define __TEST_CMDS_H
/*
* Test command
*/
extern short cmd_test(short channel, int argc, char * argv[]);
#endif

View file

@ -1,5 +1,3 @@
override CFLAGS = +../../vbcc/config/m68k-foenix -I. -I.. -I../include
csources = $(wildcard *.c) csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources)) cobjects = $(subst .c,.o,$(csources))

View file

@ -21,6 +21,8 @@
#define MAX_ANSI_ARGS 10 #define MAX_ANSI_ARGS 10
#define CON_CTRL_ANSI 0x80 /* Set to enable ANSI escape processing */ #define CON_CTRL_ANSI 0x80 /* Set to enable ANSI escape processing */
#define CON_IOCTRL_ANSI_ON 0x01 /* IOCTRL Command: turn on ANSI terminal codes */
#define CON_IOCTRL_ANSI_OFF 0x02 /* IOCTRL Command: turn off ANSI terminal codes */
typedef void (*ansi_handler)(p_channel, short, short[]); typedef void (*ansi_handler)(p_channel, short, short[]);
@ -39,6 +41,7 @@ typedef struct s_console_data {
unsigned char control; /* Control flags for the console: e.g. process ANSI codes */ unsigned char control; /* Control flags for the console: e.g. process ANSI codes */
unsigned char ansi_buffer_count; /* Number of characters in the ANSI BUFFER */ unsigned char ansi_buffer_count; /* Number of characters in the ANSI BUFFER */
char ansi_buffer[ANSI_BUFFER_SIZE]; /* Used to keep track of characters in the ANSI escape sequences */ char ansi_buffer[ANSI_BUFFER_SIZE]; /* Used to keep track of characters in the ANSI escape sequences */
char key_buffer; /* Used to peek at keyboard input */
} t_console_data, *p_console_data; } t_console_data, *p_console_data;
/* /*
@ -66,9 +69,9 @@ extern void ansi_sgr(p_channel chan, short arg_count, short args[]);
const t_ansi_seq ansi_sequence[] = { const t_ansi_seq ansi_sequence[] = {
{ '@', ansi_ich }, { '@', ansi_ich },
{ 'A', ansi_cuu }, { 'A', ansi_cuu },
{ 'B', ansi_cuf }, { 'B', ansi_cud },
{ 'C', ansi_cub }, { 'C', ansi_cuf },
{ 'D', ansi_cud }, { 'D', ansi_cub },
{ 'J', ansi_ed }, { 'J', ansi_ed },
{ 'K', ansi_el }, { 'K', ansi_el },
{ 'P', ansi_dch }, { 'P', ansi_dch },
@ -425,6 +428,7 @@ short con_open(p_channel chan, uint8_t * path, short mode) {
for (i = 0; i < ANSI_BUFFER_SIZE; i++) { for (i = 0; i < ANSI_BUFFER_SIZE; i++) {
con_data->ansi_buffer[i] = 0; con_data->ansi_buffer[i] = 0;
} }
con_data->key_buffer = 0;
return 0; return 0;
} }
@ -485,20 +489,41 @@ short con_write_b(p_channel chan, uint8_t b) {
* Attempt to read from the keyboard. * Attempt to read from the keyboard.
*/ */
short con_read_b(p_channel chan) { short con_read_b(p_channel chan) {
p_console_data con_data;
/* Check to see if we need to process ANSI codes */
con_data = &(chan->data);
char c; char c;
do { do {
if (con_data->key_buffer != 0) {
c = con_data->key_buffer;
con_data->key_buffer = 0;
} else {
#if MODEL == MODEL_FOENIX_A2560K
#ifdef KBD_POLLED #ifdef KBD_POLLED
ps2_mouse_get_packet(); ps2_mouse_get_packet();
c = kbdmo_getc_poll(); c = kbdmo_getc_poll();
#else #else
c = kbdmo_getc(); c = kbdmo_getc();
#endif #endif
#else
#ifdef KBD_POLLED
c = kbd_getc_poll();
#else
c = kbd_getc();
#endif
#endif
}
} while (c == 0); } while (c == 0);
// Echo the character to the screen // Echo the character to the screen
con_write_b(chan, c); con_write_b(chan, c);
return c; return (short)(c & 0x00ff);
} }
@ -595,13 +620,58 @@ short con_write(p_channel chan, const uint8_t * buffer, short size) {
return i; return i;
} }
short con_has_input(p_channel chan) {
p_console_data con_data;
char c;
/* Check to see if we need to process ANSI codes */
con_data = &(chan->data);
if (con_data->key_buffer != 0) {
/* If we already peeked and have a character... return true */
return 1;
} else {
/* Otherwise, peek at the keyboard to see if there is a valid key */
#if MODEL == MODEL_FOENIX_A2560K
#ifdef KBD_POLLED
ps2_mouse_get_packet();
c = kbdmo_getc_poll();
#else
c = kbdmo_getc();
#endif
#else
#ifdef KBD_POLLED
c = kbd_getc_poll();
#else
c = kbd_getc();
#endif
#endif
if (c == 0) {
/* No: return false */
return 0;
} else {
/* Yes: save the key we got and return true */
con_data->key_buffer = c;
return 1;
}
}
}
// //
// Return the status of the console // Return the status of the console
// //
short con_status(p_channel chan) { short con_status(p_channel chan) {
// TODO: make CDEV_STAT_READABLE conditional short status = CDEV_STAT_WRITABLE; /* The console is always writable */
if (con_has_input(chan)) {
/* If there is data available, flag that it's readable */
status |= CDEV_STAT_READABLE;
}
return CDEV_STAT_READABLE | CDEV_STAT_WRITABLE; return status;
} }
// //
@ -612,6 +682,25 @@ short con_seek(p_channel chan, long position, short base) {
} }
short con_ioctrl(p_channel chan, short command, uint8_t * buffer, short size) { short con_ioctrl(p_channel chan, short command, uint8_t * buffer, short size) {
p_console_data con_data;
/* Check to see if we need to process ANSI codes */
con_data = &(chan->data);
switch (command) {
case CON_IOCTRL_ANSI_ON:
/* Turn on ANSI interpreting */
con_data->control |= CON_CTRL_ANSI;
return 0;
case CON_IOCTRL_ANSI_OFF:
/* Turn on ANSI interpreting */
con_data->control &= ~CON_CTRL_ANSI;
return 0;
default:
break;
}
return 0; return 0;
} }

646
src/dev/fdc.c Normal file
View file

@ -0,0 +1,646 @@
/**
* Definitions support low level FDC device driver
*/
#if MODEL == MODEL_FOENIX_A2560K
#include "log.h"
#include "types.h"
#include "timers.h"
#include "fdc.h"
#include "fdc_reg.h"
/*
* Constants
*/
const long fdc_motor_wait = 18; /* The number of jiffies to wait for the motor to spin up: 300ms */
const long fdc_motor_timeout = 120; /* The number of jiffies to let the motor spin without activity: 2 seconds */
const long fdc_timeout = 10; /* The number of jiffies to allow for basic wait loops */
/*
* Types
*/
enum fdc_command {
FDC_CMD_READ_TRACK = 2,
FDC_CMD_SPECIFY = 3,
FDC_CMD_SENSE_DRIVE_STATUS = 4,
FDC_CMD_WRITE_DATA = 5,
FDC_CMD_READ_DATA = 6,
FDC_CMD_RECALIBRATE = 7,
FDC_CMD_SENSE_INTERRUPT = 8,
FDC_CMD_WRITE_DELETED_DATA = 9,
FDC_CMD_READ_ID = 10,
FDC_CMD_READ_DELETED_TRACK = 12,
FDC_CMD_FORMAT_TRACK = 13,
FDC_CMD_DUMPREG = 14,
FDC_CMD_SEEK = 15,
FDC_CMD_VERSION = 16,
FDC_CMD_SCAN_EQUAL = 17,
FDC_CMD_CONFIGURE = 19
};
/*
* Device variables
*/
static unsigned char fdc_stat = 0;
static long fdc_motor_off_time = 0; /* The time (in jiffies) when the motor should turn off */
/*
* Wait for the FDC to be ready for a transfer from the CPU
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_check_rqm() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char msr;
TRACE("fdc_check_rqm");
do {
msr = *FDC_MSR;
} while (((msr & FDC_MSR_RQM) == 0) && (target_time > timers_jiffies()));
if ((msr & FDC_MSR_RQM) == FDC_MSR_RQM) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait while drive #0 is busy...
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_wait_drv0_busy() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char msr;
TRACE("fdc_wait_drv0_busy");
do {
msr = *FDC_MSR;
} while (((msr & FDC_MSR_DRV0BSY) == FDC_MSR_DRV0BSY) && (target_time > timers_jiffies()));
if ((msr & FDC_MSR_DRV0BSY) == 0) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait until the CPU can read data from the FDC
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_can_read_data() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char msr;
TRACE("fdc_can_read_data");
do {
msr = *FDC_MSR;
} while (((msr & FDC_MSR_DIO) == 0) && (target_time > timers_jiffies()));
if ((msr & FDC_MSR_DIO) == FDC_MSR_DIO) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait until the CPU can write data to the FDC
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_wait_can_write() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char msr;
TRACE("fdc_wait_can_write");
do {
msr = *FDC_MSR;
} while (((msr & FDC_MSR_DIO) == FDC_MSR_DIO) && (target_time > timers_jiffies()));
if ((msr & FDC_MSR_DIO) == 0) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait while the FDC is busy with a command...
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_wait_cmd_busy() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char msr;
TRACE("fdc_wait_cmd_busy");
do {
msr = *FDC_MSR;
} while (((msr & FDC_MSR_CMDBSY) == FDC_MSR_CMDBSY) && (target_time > timers_jiffies()));
if ((msr & FDC_MSR_CMDBSY) == 0) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait until the FDC has a byte ready to ready
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_can_read() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char master_status;
TRACE("fdc_can_read");
do {
master_status = *FDC_MSR & (FDC_MSR_DIO | FDC_MSR_RQM);
} while ((target_time > timers_jiffies()) && (master_status != (FDC_MSR_RQM | FDC_MSR_DIO)));
if ((master_status & FDC_MSR_DIO) != 0) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Wait until the FDC is clear to receive a byte
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_can_write() {
long target_time = timers_jiffies() + fdc_timeout;
unsigned char master_status;
TRACE("fdc_can_write");
do {
master_status = *FDC_MSR & (FDC_MSR_DIO | FDC_MSR_RQM);
} while ((target_time > timers_jiffies()) && (master_status != FDC_MSR_RQM));
if ((master_status & FDC_MSR_DIO) == 0) {
/* Return success */
return 0;
} else {
/* Return that we hit a timeout */
return -1;
}
}
/*
* Spin up the drive's spindle motor
*/
short fdc_motor_on() {
TRACE("fdc_motor_on");
log_num(LOG_TRACE, "FDC_DOR: ", *FDC_DOR);
// if ((*FDC_DOR & FDC_DOR_MOT0) != FDC_DOR_MOT0) {
// /* Motor is not on... turn it on without DMA or RESET */
*FDC_DOR = FDC_DOR_MOT0 | FDC_DOR_NRESET;
log_num(LOG_TRACE, "FDC_DOR 2: ", *FDC_DOR);
if (fdc_check_rqm()) {
/* Got a timeout after trying to turn on the motor */
log(LOG_ERROR, "fdc_motor_on timeout");
return -1;
}
/* Wait a decent time for the motor to spin up */
long wait_time = timers_jiffies() + fdc_motor_wait;
while (wait_time > timers_jiffies()) ;
// }
/* Set a new target time to shut off the motor */
fdc_motor_off_time = timers_jiffies() + fdc_motor_timeout;
/* Flag that the motor is on */
fdc_stat |= FDC_STAT_MOTOR_ON;
return 0;
}
/*
* Spin down the drive's spindle motor
*/
void fdc_motor_off() {
TRACE("fdc_motor_off");
if ((*FDC_DOR & FDC_DOR_MOT0) == FDC_DOR_MOT0) {
/* Motor is not on... turn it on without DMA or RESET */
*FDC_DOR = FDC_DOR_NRESET;
if (fdc_check_rqm()) {
/* Got a timeout after trying to turn on the motor */
return;
}
}
/* Flag that the motor is off */
fdc_stat &= ~FDC_STAT_MOTOR_ON;
}
/*
* Issue the SENSE INTERRUPT command
*
* Inputs:
* st0 = pointer to the ST0 location
* pcn = pointer to the Present Cylinder Number location
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_sense_interrupt_status(unsigned char *st0, unsigned char *pcn) {
TRACE("fdc_sense_interrupt_status");
/* Set up "return" values to something neutral */
*st0 = 0;
*pcn = 0xff;
if (fdc_wait_cmd_busy() < 0) {
/* Timed out waiting for the FDC to be free */
log(LOG_ERROR, "fdc_wait_cmd_busy: timeout");
return -1;
}
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to write a command byte */
log(LOG_ERROR, "fdc_check_rqm 1: timeout");
return -1;
}
/* Send command */
*FDC_DATA = FDC_CMD_SENSE_INTERRUPT;
if (fdc_can_read_data() < 0) {
/* Timed out waiting to receive data */
log(LOG_ERROR, "fdc_can_read_data: timeout");
return -1;
}
/* Read the status byte */
*st0 = *FDC_DATA;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
log(LOG_ERROR, "fdc_check_rqm 2: timeout");
return -1;
}
/* Read the present cylinder number */
*pcn = *FDC_DATA;
return 0;
}
/*
* Issue the SPECIFY command
*
* Inputs:
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_specify() {
TRACE("fdc_specify");
if (fdc_wait_cmd_busy() < 0) {
/* Timed out waiting for the FDC to be free */
return -1;
}
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to write a command byte */
return -1;
}
/* Send command */
*FDC_DATA = FDC_CMD_SPECIFY;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
return -1;
}
/* Send the seek rate time and head load times */
*FDC_DATA = 0xCF;
if (fdc_can_write() < 0) {
/* Timed out waiting for permission to transfer another byte */
return -1;
}
/* Set head unload time to maximum, and no DMA */
*FDC_DATA = 0x01;
return 0;
}
/*
* Issue the CONFIGURE command
*
* Inputs:
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_configure() {
TRACE("fdc_configure");
if (fdc_wait_cmd_busy() < 0) {
/* Timed out waiting for the FDC to be free */
return -1;
}
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to write a command byte */
return -1;
}
/* Send command */
*FDC_DATA = FDC_CMD_CONFIGURE;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
return -1;
}
/* Send a padding byte of 0 */
*FDC_DATA = 0x00;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
return -1;
}
/* Implied seek, enable FIFO, enable POLL, FIFO threshold = 4 bytes */
*FDC_DATA = 0x44;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
return -1;
}
/* Send track precompensation = 0 */
*FDC_DATA = 0x00;
return 0;
}
/*
* Issue the VERSION command
*
* Inputs:
* version = pointer to the byte to hold the version
*
* Returns:
* 0 on success, -1 on timeout
*/
short fdc_version(unsigned char *version) {
TRACE("fdc_version");
if (fdc_wait_cmd_busy() < 0) {
/* Timed out waiting for the FDC to be free */
log(LOG_ERROR, "fdc_version fdc_wait_cmd_busy timed out");
return -1;
}
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to write a command byte */
log(LOG_ERROR, "fdc_version fdc_check_rqm 1 timed out");
return -1;
}
/* Send command */
*FDC_DATA = FDC_CMD_VERSION;
if (fdc_check_rqm() < 0) {
/* Timed out waiting for permission to transfer another byte */
log(LOG_ERROR, "fdc_version fdc_check_rqm 2 timed out");
return -1;
}
/* Get the version */
*version = *FDC_DATA;
return 0;
}
/*
* Reset the FDC
*/
short fdc_reset() {
unsigned char st0;
unsigned char pcn;
short i;
long target_time;
TRACE("fdc_reset");
/* Reset the controller */
target_time = timers_jiffies() + fdc_timeout;
*FDC_DOR = 0;
while (target_time > timers_jiffies()) ;
*FDC_DOR = FDC_DOR_NRESET;
/* Default precompensation, data rate for 1.44MB */
*FDC_DSR = 0;
/* Set data rate for 1.44 MB */
*FDC_CCR = 0;
/* Issue the sense interrupt command 4 times. */
for (i = 0; i < 4; i++) {
st0 = 0;
pcn = 0;
if (fdc_sense_interrupt_status(&st0, &pcn) < 0) {
/* Timeout on sense interrupt */
log(LOG_ERROR, "fdc_sense_interrupt_status timeout");
return -1;
}
log_num(LOG_INFO, "ST0: ", st0);
log_num(LOG_INFO, "PCN: ", pcn);
if (st0 = 0xC0) {
break;
}
}
/* Configure the FDC */
if (fdc_configure() < 0) {
/* Timeout on sense interrupt */
log(LOG_ERROR, "fdc_configure timeout");
return -1;
}
/* Specify seek and head times, and turn off DMA */
if (fdc_specify() < 0) {
/* Timeout on sense interrupt */
log(LOG_ERROR, "fdc_specify timeout");
return -1;
}
fdc_motor_on();
return 0;
}
/*
* Install the FDC driver
*/
short fdc_install() {
fdc_stat = FDC_STAT_NOINIT;
return 0;
}
/*
* Initialize the FDC
*
* Returns:
* 0 on success, any negative number is an error code
*/
short fdc_init() {
unsigned char version;
if (fdc_version(&version) < 0) {
log(LOG_ERROR, "Unable to get FDC version");
return -1;
}
log_num(LOG_INFO, "FDC version: ", version);
if (fdc_reset() < 0) {
log(LOG_ERROR, "Unable to reset the FDC");
return -1;
}
fdc_stat &= ~FDC_STAT_NOINIT;
return 0;
}
/*
* Read a block from the FDC
*
* Inputs:
* lba = the logical block address of the block to read
* buffer = the buffer into which to copy the block data
* size = the size of the buffer.
*
* Returns:
* number of bytes read, any negative number is an error code
*/
short fdc_read(long lba, unsigned char * buffer, short size) {
return 0;
}
/*
* Write a block to the FDC
*
* Inputs:
* lba = the logical block address of the block to write
* buffer = the buffer containing the data to write
* size = the size of the buffer.
*
* Returns:
* number of bytes written, any negative number is an error code
*/
short fdc_write(long lba, const unsigned char * buffer, short size) {
return 0;
}
/*
* Return the status of the FDC
*
* Returns:
* the status of the device
*/
short fdc_status() {
return fdc_stat;
}
/*
* Return any error code of the FDC
*
* Returns:
* the error code of the device
*/
short fdc_error() {
return 0;
}
/*
* Ensure that any pending writes to teh device have been completed
*
* Returns:
* 0 on success, any negative number is an error code
*/
short fdc_flush() {
return 0;
}
/*
* Issue a control command to the device
*
* Inputs:
* command = the number of the command to send
* buffer = pointer to bytes of additional data for the command
* size = the size of the buffer
*
* Returns:
* 0 on success, any negative number is an error code
*/
short fdc_ioctrl(short command, unsigned char * buffer, short size) {
switch (command) {
case FDC_CTRL_MOTOR_ON:
return fdc_motor_on();
case FDC_CTRL_MOTOR_OFF:
fdc_motor_off();
return 0;
default:
return 0;
}
}
#endif

104
src/dev/fdc.h Normal file
View file

@ -0,0 +1,104 @@
/**
* Definitions support low level FDC device driver
*/
#ifndef __FDC_H
#define __FDC_H
#if MODEL == MODEL_FOENIX_A2560K
#include "types.h"
/*
* Definitions for the FDC controller
*/
#define FDC_SECTOR_SIZE 512 /* Size of a block on the FDC */
#define FDC_STAT_NOINIT 0x01 /* FDC has not been initialized */
#define FDC_STAT_PRESENT 0x02 /* FD is present */
#define FDC_STAT_PROTECTED 0x04 /* FD is write-protected */
#define FDC_STAT_MOTOR_ON 0x08 /* FDC spindle motor is on */
#define FDC_CTRL_MOTOR_ON 0x0100 /* IOCTRL command to start spinning the motor */
#define FDC_CTRL_MOTOR_OFF 0x0200 /* IOCTRL command to start spinning the motor */
/*
* Install the FDC driver
*/
extern short fdc_install();
/*
* Initialize the FDC
*
* Returns:
* 0 on success, any negative number is an error code
*/
extern short fdc_init();
/*
* Read a block from the FDC
*
* Inputs:
* lba = the logical block address of the block to read
* buffer = the buffer into which to copy the block data
* size = the size of the buffer.
*
* Returns:
* number of bytes read, any negative number is an error code
*/
extern short fdc_read(long lba, unsigned char * buffer, short size);
/*
* Write a block to the FDC
*
* Inputs:
* lba = the logical block address of the block to write
* buffer = the buffer containing the data to write
* size = the size of the buffer.
*
* Returns:
* number of bytes written, any negative number is an error code
*/
extern short fdc_write(long lba, const unsigned char * buffer, short size);
/*
* Return the status of the FDC
*
* Returns:
* the status of the device
*/
extern short fdc_status();
/*
* Return any error code of the FDC
*
* Returns:
* the error code of the device
*/
extern short fdc_error();
/*
* Ensure that any pending writes to teh device have been completed
*
* Returns:
* 0 on success, any negative number is an error code
*/
extern short fdc_flush();
/*
* Issue a control command to the device
*
* Inputs:
* command = the number of the command to send
* buffer = pointer to bytes of additional data for the command
* size = the size of the buffer
*
* Returns:
* 0 on success, any negative number is an error code
*/
extern short fdc_ioctrl(short command, unsigned char * buffer, short size);
#endif
#endif

View file

@ -58,9 +58,8 @@ short fatfs_to_foenix(FRESULT r) {
if (r == 0) { if (r == 0) {
return 0; return 0;
} else { } else {
/* TODO: flesh this out */ /* Convert FatFS error numbers to Foenix error numbers */
log_num(LOG_DEBUG, "FATFS: ", r); return (FSYS_ERR_DISK_ERR - (short)r + 1);
return -1;
} }
} }
@ -178,7 +177,7 @@ short fsys_opendir(const char * path) {
/* Try to open the directory */ /* Try to open the directory */
if (path[0] == 0) { if (path[0] == 0) {
char cwd[128]; char cwd[128];
fsys_getcwd(cwd, 128); fsys_get_cwd(cwd, 128);
fres = f_opendir(&g_directory[dir], cwd); fres = f_opendir(&g_directory[dir], cwd);
} else { } else {
fres = f_opendir(&g_directory[dir], path); fres = f_opendir(&g_directory[dir], path);
@ -265,7 +264,45 @@ short fsys_readdir(short dir, p_file_info file) {
* the directory handle to use for subsequent calls if >= 0, error if negative * the directory handle to use for subsequent calls if >= 0, error if negative
*/ */
short fsys_findfirst(const char * path, const char * pattern, p_file_info file) { short fsys_findfirst(const char * path, const char * pattern, p_file_info file) {
return -1; FILINFO finfo;
FRESULT fres;
short dir;
short i;
/* Allocate a directory handle */
for (i = 0; i < MAX_DIRECTORIES; i++) {
if (g_dir_state[i] == 0) {
dir = i;
break;
}
}
if (dir < 0) {
return ERR_OUT_OF_HANDLES;
} else {
if (fres != FR_OK) {
return fatfs_to_foenix(fres);
} else {
int i;
/* Copy file information into the kernel table */
file->size = finfo.fsize;
file->date = finfo.fdate;
file->time = finfo.ftime;
file->attributes = finfo.fattrib;
for (i = 0; i < MAX_PATH_LEN; i++) {
file->name[i] = finfo.fname[i];
if (file->name[i] == 0) {
break;
}
}
return dir;
}
}
} }
/** /**
@ -279,7 +316,35 @@ short fsys_findfirst(const char * path, const char * pattern, p_file_info file)
* 0 on success, error if negative * 0 on success, error if negative
*/ */
short fsys_findnext(short dir, p_file_info file) { short fsys_findnext(short dir, p_file_info file) {
return -1; FILINFO finfo;
FRESULT fres;
if (g_dir_state[dir]) {
fres = f_findnext(&g_dir_state[dir], &finfo);
if (fres != FR_OK) {
return fatfs_to_foenix(fres);
} else {
int i;
/* Copy file information into the kernel table */
file->size = finfo.fsize;
file->date = finfo.fdate;
file->time = finfo.ftime;
file->attributes = finfo.fattrib;
for (i = 0; i < MAX_PATH_LEN; i++) {
file->name[i] = finfo.fname[i];
if (file->name[i] == 0) {
break;
}
}
return 0
}
} else {
return ERR_BAD_HANDLE;
}
} }
/** /**
@ -338,7 +403,14 @@ short fsys_delete(const char * path) {
* 0 on success, negative number on failure. * 0 on success, negative number on failure.
*/ */
short fsys_rename(const char * old_path, const char * new_path) { short fsys_rename(const char * old_path, const char * new_path) {
return -1; FRESULT fres;
fres = f_rename(old_path, new_path);
if (fres != 0) {
return fatfs_to_foenix(fres);
} else {
return 0;
}
} }
/** /**
@ -350,14 +422,14 @@ short fsys_rename(const char * old_path, const char * new_path) {
* Returns: * Returns:
* 0 on success, negative number on failure. * 0 on success, negative number on failure.
*/ */
short fsys_setcwd(const char * path) { short fsys_set_cwd(const char * path) {
FRESULT result; FRESULT result;
result = f_chdir(path); result = f_chdir(path);
if (result == FR_OK) { if (result == FR_OK) {
return 0; return 0;
} else { } else {
log_num(LOG_ERROR, "fsys_setcwd error: ", result); log_num(LOG_ERROR, "fsys_set_cwd error: ", result);
return fatfs_to_foenix(result); return fatfs_to_foenix(result);
} }
} }
@ -372,7 +444,7 @@ short fsys_setcwd(const char * path) {
* Returns: * Returns:
* 0 on success, negative number on failure. * 0 on success, negative number on failure.
*/ */
short fsys_getcwd(char * path, short size) { short fsys_get_cwd(char * path, short size) {
FRESULT result; FRESULT result;
f_chdrive(""); f_chdrive("");
@ -380,7 +452,7 @@ short fsys_getcwd(char * path, short size) {
if (result == FR_OK) { if (result == FR_OK) {
return 0; return 0;
} else { } else {
log_num(LOG_ERROR, "fsys_getcwd error: ", result); log_num(LOG_ERROR, "fsys_get_cwd error: ", result);
return fatfs_to_foenix(result); return fatfs_to_foenix(result);
} }
} }
@ -452,6 +524,25 @@ short fchan_readline(t_channel * chan, unsigned char * buffer, short size) {
* read a single byte from the device * read a single byte from the device
*/ */
short fchan_read_b(t_channel * chan) { short fchan_read_b(t_channel * chan) {
FRESULT result;
FIL * file;
short total_read;
char buffer[2];
log(LOG_TRACE, "fchan_read");
file = fchan_to_file(chan);
if (file) {
result = f_read(file, buffer, 1, &total_read);
if (result == FR_OK) {
return (short)(buffer[0] & 0x00ff);
} else {
return fatfs_to_foenix(result);
}
}
return ERR_BADCHANNEL;
return 0; return 0;
} }

View file

@ -195,7 +195,7 @@ extern short fsys_rename(const char * old_path, const char * new_path);
* Returns: * Returns:
* 0 on success, negative number on failure. * 0 on success, negative number on failure.
*/ */
extern short fsys_setcwd(const char * path); extern short fsys_set_cwd(const char * path);
/** /**
* Get the current working drive and directory * Get the current working drive and directory
@ -207,7 +207,7 @@ extern short fsys_setcwd(const char * path);
* Returns: * Returns:
* 0 on success, negative number on failure. * 0 on success, negative number on failure.
*/ */
extern short fsys_getcwd(char * path, short size); extern short fsys_get_cwd(char * path, short size);
/* /*
* Load a file into memory at the designated destination address. * Load a file into memory at the designated destination address.

View file

@ -2,10 +2,15 @@
* Declarations for Mo, the built-in keyboard of the A2560K * Declarations for Mo, the built-in keyboard of the A2560K
*/ */
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "log.h" #include "log.h"
#include "interrupt.h" #include "interrupt.h"
#include "kbd_mo.h" #include "kbd_mo.h"
#include "ring_buffer.h" #include "ring_buffer.h"
#include "gabe_reg.h"
#define KBD_MO_DATA ((volatile unsigned short *)0x00C00040) /* Data register for the keyboard (scan codes will be here) */ #define KBD_MO_DATA ((volatile unsigned short *)0x00C00040) /* Data register for the keyboard (scan codes will be here) */
#define KBD_MO_STAT ((volatile unsigned short *)0x00C00042) /* Status register for the keyboard */ #define KBD_MO_STAT ((volatile unsigned short *)0x00C00042) /* Status register for the keyboard */
@ -50,6 +55,7 @@ struct s_kdbmo_kbd {
*/ */
struct s_kdbmo_kbd g_kbdmo_control; struct s_kdbmo_kbd g_kbdmo_control;
static short kbdmo_leds = 0;
/* /*
* US keyboard layout scancode translation tables * US keyboard layout scancode translation tables
@ -214,6 +220,10 @@ short kbdmo_init() {
/* Make sure everything is read */ /* Make sure everything is read */
kbdmo_flush_out(); kbdmo_flush_out();
/* Turn off the LEDs */
kbdmo_leds = 0;
*GABE_MO_LEDS = kbdmo_leds;
/* Clear out any pending interrupt */ /* Clear out any pending interrupt */
int_clear(INT_KBD_A2560K); int_clear(INT_KBD_A2560K);
@ -233,6 +243,17 @@ short kbdmo_init() {
*/ */
void kbdmo_toggle_modifier(short flag) { void kbdmo_toggle_modifier(short flag) {
g_kbdmo_control.modifiers ^= flag; g_kbdmo_control.modifiers ^= flag;
if (flag == KBD_LOCK_CAPS) {
if (g_kbdmo_control.modifiers & flag) {
/* CAPS is on... set it to purple */
kbdmo_set_caps_led(5);
} else {
/* CAPS is off... turn off the LED */
kbdmo_set_caps_led(0);
}
}
} }
/* /*
@ -428,3 +449,49 @@ unsigned short kbdmo_get_scancode_poll() {
kbdmo_handle_irq(); kbdmo_handle_irq();
return kbdmo_get_scancode(); return kbdmo_get_scancode();
} }
/*
* Set the color of the LED for the capslock
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
void kbdmo_set_caps_led(short colors) {
kbdmo_leds = (kbdmo_leds & 0xF1FF) | ((colors & 0x07) << 9);
*GABE_MO_LEDS = kbdmo_leds;
}
/*
* Set the color of the LED for the floppy drive
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
void kbdmo_set_fdc_led(short colors) {
kbdmo_leds = (kbdmo_leds & 0xFFF8) | (colors & 0x07);
*GABE_MO_LEDS = kbdmo_leds;
}
/*
* Set the color of the LED for the SD card slot
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
void kbdmo_set_sdc_led(short colors) {
kbdmo_leds = (kbdmo_leds & 0xFFC7) | ((colors & 0x07) << 3);
*GABE_MO_LEDS = kbdmo_leds;
}
/*
* Set the color of the LED for the IDE hard drive
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
void kbdmo_set_hdc_led(short colors) {
kbdmo_leds = (kbdmo_leds & 0xFE3F) | ((colors & 0x07) << 6);
*GABE_MO_LEDS = kbdmo_leds;
}
#endif

View file

@ -5,6 +5,10 @@
#ifndef __KBD_MO_H #ifndef __KBD_MO_H
#define __KBD_MO_H #define __KBD_MO_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
/* /*
* Initialize the PS2 controller and any attached devices * Initialize the PS2 controller and any attached devices
* Enable keyboard and mouse interrupts as appropriate. * Enable keyboard and mouse interrupts as appropriate.
@ -42,4 +46,38 @@ extern unsigned short kbdmo_get_scancode_poll();
extern void kbdmo_handle_irq(); extern void kbdmo_handle_irq();
/*
* Set the color of the LED for the capslock
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
extern void kbdmo_set_caps_led(short colors);
/*
* Set the color of the LED for the floppy drive
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
extern void kbdmo_set_fdc_led(short colors);
/*
* Set the color of the LED for the SD card slot
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
extern void kbdmo_set_sdc_led(short colors);
/*
* Set the color of the LED for the IDE hard drive
*
* Inputs:
* colors = color specification, three bits: 0x_____RGB
*/
extern void kbdmo_set_hdc_led(short colors);
#endif
#endif #endif

View file

@ -5,6 +5,9 @@
#include "log.h" #include "log.h"
#include "dev/lpt.h" #include "dev/lpt.h"
#include "dev/text_screen_iii.h" #include "dev/text_screen_iii.h"
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#define LPT_DATA_PORT ((volatile unsigned char *)0x00C02378) #define LPT_DATA_PORT ((volatile unsigned char *)0x00C02378)
@ -32,11 +35,9 @@
short lpt_delay() { short lpt_delay() {
int i; int i;
short x; short x;
for (i = 0, x = 0; i < 65535; i++) { for (i = 0, x = 0; i < 10; i++) {
x++; x++;
} }
DEBUG(".");
return x; return x;
} }
@ -138,3 +139,5 @@ short lpt_write(p_channel chan, unsigned char * buffer, short size) {
return 0; return 0;
} }
#endif

82
src/dev/midi.c Normal file
View file

@ -0,0 +1,82 @@
/*
* Definitions for the MIDI ports
*/
#include "midi_reg.h"
#include "dev/midi.h"
#include "simpleio.h"
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
/*
* Return true if there is data waiting to be read
*/
short midi_input_not_ready() {
return (*MIDI_STAT & MIDI_STAT_RX_EMPTY);
}
/*
* Return true if there is data waiting to be read
*/
short midi_output_busy() {
return (*MIDI_STAT & MIDI_STAT_RX_EMPTY);
}
/*
* Initilialize the MIDI port
*/
short midi_init() {
unsigned char dummy;
while (midi_output_busy()) ;
*MIDI_CMD = 0xFF; /* Reset the MIDI port */
/* Wait for the ACK */
for (dummy = 0; dummy != 0xFE; ) {
while (midi_input_not_ready()) ;
dummy = *MIDI_DATA;
}
while (midi_output_busy()) ;
*MIDI_CMD = 0x3F; /* Switch the MIDI port into UART mode */
/* Wait for the ACK */
for (dummy = 0; dummy != 0xFE; ) {
while (midi_input_not_ready()) ;
dummy = *MIDI_DATA;
}
return 0;
}
/*
* Send a byte to the MIDI port
*
* Inputs:
* b = the byte to send
*/
short midi_put(unsigned char b) {
while (midi_output_busy()) ;
/* Send the byte */
*MIDI_DATA = b;
return 0;
}
/*
* Get a byte from the MIDI port
*
* Returns:
* b = the byte to send
*/
unsigned char midi_get_poll() {
while (midi_input_not_ready()) ;
return *MIDI_DATA;
}
#endif

View file

@ -24,6 +24,6 @@ extern short midi_put(unsigned char b);
* Returns: * Returns:
* b = the byte to send * b = the byte to send
*/ */
extern short midi_get_poll(); extern unsigned char midi_get_poll();
#endif #endif

View file

@ -6,12 +6,20 @@
#include "log.h" #include "log.h"
#include "errors.h" #include "errors.h"
#include "constants.h" #include "constants.h"
// #include "fatfs/ff.h" #include "indicators.h"
#include "dev/block.h" #include "dev/block.h"
#include "dev/pata.h" #include "dev/pata.h"
#include "dev/text_screen_iii.h" #include "dev/text_screen_iii.h"
#include "dev/rtc.h"
#include "pata_reg.h" #include "pata_reg.h"
//
// Constants
//
#define PATA_TIMEOUT_JF 20 /* Timeout in jiffies: 1/60th second */
#define PATA_WAIT_JF 10 /* Delay in jiffies: 1/60th second */
// //
// Variables // Variables
// //
@ -30,16 +38,22 @@ short g_pata_status = PATA_STAT_NOINIT; // Status of the PATA interface
// 0 on success (PATA drive is no longer busy), DEV_TIMEOUT on timeout // 0 on success (PATA drive is no longer busy), DEV_TIMEOUT on timeout
// //
short pata_wait_not_busy() { short pata_wait_not_busy() {
short count = MAX_TRIES_BUSY; long target_ticks;
long ticks;
char status; char status;
TRACE("pata_wait_not_busy"); TRACE("pata_wait_not_busy");
target_ticks = rtc_get_jiffies() + PATA_TIMEOUT_JF;
do { do {
status = *PATA_CMD_STAT; status = *PATA_CMD_STAT;
} while ((status & PATA_STAT_BSY) && (count-- > 0)); ticks = rtc_get_jiffies();
} while ((status & PATA_STAT_BSY) && (target_ticks > ticks));
if (count == 0) { if (target_ticks <= ticks) {
log(LOG_ERROR, "pata_wait_not_busy: timeout");
log_num(LOG_ERROR, "target_ticks: ", (int)target_ticks);
log_num(LOG_ERROR, "ticks: ", (int)ticks);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} else { } else {
return 0; return 0;
@ -53,16 +67,20 @@ short pata_wait_not_busy() {
// 0 on success (PATA drive is ready), DEV_TIMEOUT on timeout // 0 on success (PATA drive is ready), DEV_TIMEOUT on timeout
// //
short pata_wait_ready() { short pata_wait_ready() {
short count = MAX_TRIES_BUSY; long target_ticks;
long ticks;
char status; char status;
TRACE("pata_wait_ready"); TRACE("pata_wait_ready");
target_ticks = rtc_get_jiffies() + PATA_TIMEOUT_JF;
do { do {
status = *PATA_CMD_STAT; status = *PATA_CMD_STAT;
} while (((status & PATA_STAT_DRDY) == 0) && (count-- > 0)); ticks = rtc_get_jiffies();
} while (((status & PATA_STAT_DRDY) == 0) && (target_ticks > ticks));
if (count == 0) { if (target_ticks <= ticks) {
log(LOG_ERROR, "pata_wait_ready: timeout");
return DEV_TIMEOUT; return DEV_TIMEOUT;
} else { } else {
return 0; return 0;
@ -76,7 +94,8 @@ short pata_wait_ready() {
// 0 on success (PATA drive is ready and not busy), DEV_TIMEOUT on timeout // 0 on success (PATA drive is ready and not busy), DEV_TIMEOUT on timeout
// //
short pata_wait_ready_not_busy() { short pata_wait_ready_not_busy() {
short count = MAX_TRIES_BUSY; long target_ticks;
long ticks;
char status; char status;
TRACE("pata_wait_ready_not_busy"); TRACE("pata_wait_ready_not_busy");
@ -85,11 +104,17 @@ short pata_wait_ready_not_busy() {
// status = *PATA_CMD_STAT; // status = *PATA_CMD_STAT;
// } while (((status & (PATA_STAT_DRDY | PATA_STAT_BSY)) != PATA_STAT_DRDY) && (count-- > 0)); // } while (((status & (PATA_STAT_DRDY | PATA_STAT_BSY)) != PATA_STAT_DRDY) && (count-- > 0));
target_ticks = rtc_get_jiffies() + PATA_TIMEOUT_JF;
do { do {
while ((*PATA_CMD_STAT & PATA_STAT_DRDY) != PATA_STAT_DRDY); while (((*PATA_CMD_STAT & PATA_STAT_DRDY) != PATA_STAT_DRDY) && (target_ticks > ticks)) {
} while ((*PATA_CMD_STAT & PATA_STAT_BSY) == PATA_STAT_BSY); ticks = rtc_get_jiffies();
}
} while (((*PATA_CMD_STAT & PATA_STAT_BSY) == PATA_STAT_BSY) && (target_ticks > ticks));
if (count == 0) { if (target_ticks <= ticks) {
log(LOG_ERROR, "pata_wait_ready_not_busy: timeout");
log_num(LOG_ERROR, "target_ticks: ", (int)target_ticks);
log_num(LOG_ERROR, "ticks: ", (int)ticks);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} else { } else {
return 0; return 0;
@ -103,16 +128,20 @@ short pata_wait_ready_not_busy() {
// 0 on success (PATA drive is ready to transfer data), DEV_TIMEOUT on timeout // 0 on success (PATA drive is ready to transfer data), DEV_TIMEOUT on timeout
// //
short pata_wait_data_request() { short pata_wait_data_request() {
short count = MAX_TRIES_BUSY; long target_ticks;
long ticks;
char status; char status;
TRACE("pata_wait_data_request"); TRACE("pata_wait_data_request");
target_ticks = rtc_get_jiffies() + PATA_TIMEOUT_JF;
do { do {
status = *PATA_CMD_STAT; status = *PATA_CMD_STAT;
} while (((status & PATA_STAT_DRQ) != PATA_STAT_DRQ) && (count-- > 0)); ticks = rtc_get_jiffies();
} while (((status & PATA_STAT_DRQ) != PATA_STAT_DRQ) && (target_ticks > ticks));
if (count == 0) { if (target_ticks <= ticks) {
log(LOG_ERROR, "pata_wait_data_request: timeout");
return DEV_TIMEOUT; return DEV_TIMEOUT;
} else { } else {
return 0; return 0;
@ -236,12 +265,21 @@ short pata_read(long lba, unsigned char * buffer, short size) {
TRACE("pata_read"); TRACE("pata_read");
log_num(LOG_VERBOSE, "pata_read lba: ", lba); log_num(LOG_VERBOSE, "pata_read lba: ", lba);
/* Turn on the HDD LED */
// ind_set(IND_HDC, IND_ON);
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
*PATA_HEAD = ((lba >> 24) & 0x07) | 0xe0; // Upper 3 bits of LBA, Drive 0, LBA mode. *PATA_HEAD = ((lba >> 24) & 0x07) | 0xe0; // Upper 3 bits of LBA, Drive 0, LBA mode.
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -255,10 +293,16 @@ short pata_read(long lba, unsigned char * buffer, short size) {
// TODO: Wait ~500ns // TODO: Wait ~500ns
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
if (pata_wait_data_request()) { if (pata_wait_data_request()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -267,10 +311,14 @@ short pata_read(long lba, unsigned char * buffer, short size) {
*wptr++ = *PATA_DATA_16; *wptr++ = *PATA_DATA_16;
} }
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return i; return i;
} }
short pata_flush_cache() { short pata_flush_cache() {
long target_ticks;
short i; short i;
unsigned short *wptr; unsigned short *wptr;
unsigned char status; unsigned char status;
@ -296,8 +344,9 @@ short pata_flush_cache() {
*PATA_CMD_STAT = 0xE7; // PATA_CMD_FLUSH_CACHE; *PATA_CMD_STAT = 0xE7; // PATA_CMD_FLUSH_CACHE;
// Give the controller some time... // Give the controller some time (100ms?)...
for (i = 0; i < 32000; i++) ; target_ticks = rtc_get_jiffies() + PATA_WAIT_JF;
while (target_ticks > rtc_get_jiffies()) ;
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
return DEV_TIMEOUT; return DEV_TIMEOUT;
@ -329,18 +378,28 @@ short pata_flush_cache() {
// number of chars written, any negative number is an error code // number of chars written, any negative number is an error code
// //
short pata_write(long lba, const unsigned char * buffer, short size) { short pata_write(long lba, const unsigned char * buffer, short size) {
long target_ticks;
short i; short i;
unsigned short *wptr; unsigned short *wptr;
unsigned char status; unsigned char status;
TRACE("pata_write"); TRACE("pata_write");
/* Turn on the HDD LED */
// ind_set(IND_HDC, IND_ON);
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
*PATA_HEAD = ((lba >> 24) & 0x07) | 0xe0; // Upper 3 bits of LBA, Drive 0, LBA mode. *PATA_HEAD = ((lba >> 24) & 0x07) | 0xe0; // Upper 3 bits of LBA, Drive 0, LBA mode.
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -351,10 +410,14 @@ short pata_write(long lba, const unsigned char * buffer, short size) {
*PATA_CMD_STAT = PATA_CMD_WRITE_SECTOR; // Issue the WRITE command *PATA_CMD_STAT = PATA_CMD_WRITE_SECTOR; // Issue the WRITE command
// Give the controller some time... // Give the controller some time (100ms?)...
for (i = 0; i < 32000; i++) ; target_ticks = rtc_get_jiffies() + PATA_WAIT_JF;
while (target_ticks > rtc_get_jiffies()) ;
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -367,6 +430,9 @@ short pata_write(long lba, const unsigned char * buffer, short size) {
for (i = 0; i < 32000; i++) ; for (i = 0; i < 32000; i++) ;
if (pata_wait_ready_not_busy()) { if (pata_wait_ready_not_busy()) {
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -376,14 +442,25 @@ short pata_write(long lba, const unsigned char * buffer, short size) {
status = *PATA_CMD_STAT; status = *PATA_CMD_STAT;
if ((status & PATA_STAT_DF) != 0){ if ((status & PATA_STAT_DF) != 0){
log(LOG_ERROR, "pata_write: device fault"); log(LOG_ERROR, "pata_write: device fault");
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return -1; return -1;
} }
if ((status & PATA_STAT_ERR) != 0) { if ((status & PATA_STAT_ERR) != 0) {
log(LOG_ERROR, "pata_write: error"); log(LOG_ERROR, "pata_write: error");
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return -1; return -1;
} }
/* Turn off the HDD LED */
// ind_set(IND_HDC, IND_OFF);
return size; return size;
} }

View file

@ -2,17 +2,22 @@
* Definitions for the PS/2 interface devices... mouse and keyboard * Definitions for the PS/2 interface devices... mouse and keyboard
*/ */
#include <stdio.h>
#include <string.h>
#include "errors.h"
#include "log.h" #include "log.h"
#include "types.h" #include "types.h"
#include "ring_buffer.h" #include "ring_buffer.h"
#include "interrupt.h" #include "interrupt.h"
#include "vicky_general.h" #include "vicky_general.h"
#include "dev/ps2.h" #include "dev/ps2.h"
#include "dev/rtc.h"
#include "dev/text_screen_iii.h" #include "dev/text_screen_iii.h"
#include "rsrc/bitmaps/mouse_pointer.h" #include "rsrc/bitmaps/mouse_pointer.h"
#define PS2_RETRY_MAX 20000 /* For timeout purposes when sending a command */ #define PS2_TIMEOUT_JF 10 /* Timeout in jiffies: 1/60 second units */
#define PS2_RESEND_MAX 50 /* Number of times we'll repeat a command on receiving a 0xFE reply */ #define PS2_RESEND_MAX 50 /* Number of times we'll repeat a command on receiving a 0xFE reply */
#define KBD_XLATE_TABLE_SIZE 128*8 /* Number of characters in the keyboard layout tables */
/* /*
* Modifier bit flags * Modifier bit flags
@ -73,6 +78,10 @@ struct s_ps2_kbd {
char * keys_control_shift; char * keys_control_shift;
char * keys_caps; char * keys_caps;
char * keys_caps_shift; char * keys_caps_shift;
char * keys_r_alt;
char * keys_r_alt_shift;
char * translation_table;
}; };
/* /*
@ -83,8 +92,37 @@ struct s_ps2_kbd g_kbd_control;
short g_mouse_state = 0; /* Mouse packet state machine's state */ short g_mouse_state = 0; /* Mouse packet state machine's state */
/*
* Mapping of "codepoints" 0x80 - 0x95 (function keys, etc)
* to ANSI escape codes
*/
const char * ansi_keys[] = {
"1~", /* HOME */
"2~", /* INS */
"3~", /* DELETE */
"4~", /* END */
"5~", /* PgUp */
"6~", /* PgDn */
"A", /* Up */
"B", /* Left */
"C", /* Right */
"D", /* Down */
"11~", /* F1 */
"12~", /* F2 */
"13~", /* F3 */
"14~", /* F4 */
"15~", /* F5 */
"17~", /* F6 */
"18~", /* F7 */
"19~", /* F8 */
"20~", /* F9 */
"21~", /* F10 */
"23~", /* F11 */
"24~", /* F12 */
};
// Translation table from base set1 make scan codes to Foenix scan codes // Translation table from base set1 make scan codes to Foenix scan codes
unsigned char g_kbd_set1_base[128] = { const unsigned char g_kbd_set1_base[128] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00 - 0x07 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00 - 0x07 */
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 0x08 - 0x0F */ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 0x08 - 0x0F */
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10 - 0x17 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10 - 0x17 */
@ -104,7 +142,7 @@ unsigned char g_kbd_set1_base[128] = {
}; };
// Translation table from E0 prefixed set1 make scan codes to Foenix scan codes // Translation table from E0 prefixed set1 make scan codes to Foenix scan codes
unsigned char g_kbd_set1_e0[128] = { const unsigned char g_kbd_set1_e0[128] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00 - 0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00 - 0x07 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08 - 0x0F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08 - 0x0F */
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10 - 0x17 */ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10 - 0x17 */
@ -127,7 +165,7 @@ unsigned char g_kbd_set1_e0[128] = {
* US keyboard layout scancode translation tables * US keyboard layout scancode translation tables
*/ */
char g_us_sc_unmodified[] = { const char g_us_sc_unmodified[] = {
0x00, 0x1B, '1', '2', '3', '4', '5', '6', /* 0x00 - 0x07 */ 0x00, 0x1B, '1', '2', '3', '4', '5', '6', /* 0x00 - 0x07 */
'7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */ '7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* 0x10 - 0x17 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* 0x10 - 0x17 */
@ -146,7 +184,7 @@ char g_us_sc_unmodified[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
char g_us_sc_shift[] = { const char g_us_sc_shift[] = {
0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */ 0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */
'&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */ '&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* 0x10 - 0x17 */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* 0x10 - 0x17 */
@ -165,7 +203,7 @@ char g_us_sc_shift[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
char g_us_sc_ctrl[] = { const char g_us_sc_ctrl[] = {
0x00, 0x1B, '1', '2', '3', '4', '5', 0x1E, /* 0x00 - 0x07 */ 0x00, 0x1B, '1', '2', '3', '4', '5', 0x1E, /* 0x00 - 0x07 */
'7', '8', '9', '0', 0x1F, '=', 0x08, 0x09, /* 0x08 - 0x0F */ '7', '8', '9', '0', 0x1F, '=', 0x08, 0x09, /* 0x08 - 0x0F */
0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* 0x10 - 0x17 */ 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* 0x10 - 0x17 */
@ -184,7 +222,7 @@ char g_us_sc_ctrl[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
char g_us_sc_lock[] = { const char g_us_sc_lock[] = {
0x00, 0x1B, '1', '2', '3', '4', '5', '6', /* 0x00 - 0x07 */ 0x00, 0x1B, '1', '2', '3', '4', '5', '6', /* 0x00 - 0x07 */
'7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */ '7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* 0x10 - 0x17 */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* 0x10 - 0x17 */
@ -203,7 +241,7 @@ char g_us_sc_lock[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
char g_us_sc_lock_shift[] = { const char g_us_sc_lock_shift[] = {
0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */ 0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */
'&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */ '&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* 0x10 - 0x17 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* 0x10 - 0x17 */
@ -222,7 +260,7 @@ char g_us_sc_lock_shift[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
char g_us_sc_ctrl_shift[] = { const char g_us_sc_ctrl_shift[] = {
0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */ 0x00, 0x1B, '!', '@', '#', '$', '%', '^', /* 0x00 - 0x07 */
'&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */ '&', '*', '(', ')', '_', '+', 0x08, 0x09, /* 0x08 - 0x0F */
0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* 0x10 - 0x17 */ 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* 0x10 - 0x17 */
@ -241,6 +279,46 @@ char g_us_sc_ctrl_shift[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
}; };
/* Right Alt */
const char g_us_sc_alt[] = {
0x00, 0x1B, '1', '2', 0x9C, 0x9E, '5', '6', /* 0x00 - 0x07 ... British Pound, and Euro */
'7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* 0x10 - 0x17 */
'o', 'p', '[', ']', 0x0D, 0x00, 'a', 's', /* 0x18 - 0x1F */
'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 0x20 - 0x27 */
0x27, '`', 0x00, '\\', 'z', 'x', 'c', 'v', /* 0x28 - 0x2F */
'b', 'n', 'm', ',', '.', '/', 0x00, '*', /* 0x30 - 0x37 */
0x00, ' ', 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, /* 0x38 - 0x3F */
0x8F, 0x90, 0x91, 0x92, 0x93, 0x00, 0x00, 0x80, /* 0x40 - 0x47 */
0x86, 0x84, '-', 0x89, '5', 0x88, '+', 0x83, /* 0x48 - 0x4F */
0x87, 0x85, 0x81, 0x82, 0x00, 0x00, 0x00, 0x94, /* 0x50 - 0x57 */
0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58 - 0x5F */
0x00, 0x00, 0x81, 0x80, 0x84, 0x82, 0x83, 0x85, /* 0x60 - 0x67 */
0x86, 0x89, 0x87, 0x88, '/', 0x0D, 0x00, 0x00, /* 0x68 - 0x6F */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70 - 0x77 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
};
/* Right Alt and Shift/CAPS */
const char g_us_sc_alt_shift[] = {
0x00, 0x1B, '1', '2', 0x9C, 0x9E, '5', '6', /* 0x00 - 0x07 */
'7', '8', '9', '0', '-', '=', 0x08, 0x09, /* 0x08 - 0x0F */
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* 0x10 - 0x17 */
'O', 'P', '[', ']', 0x0D, 0x00, 'A', 'S', /* 0x18 - 0x1F */
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', /* 0x20 - 0x27 */
0x27, '`', 0x00, '\\', 'Z', 'X', 'C', 'V', /* 0x28 - 0x2F */
'B', 'N', 'M', ',', '.', '/', 0x00, '*', /* 0x30 - 0x37 */
0x00, ' ', 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, /* 0x38 - 0x3F */
0x8F, 0x90, 0x91, 0x92, 0x93, 0x00, 0x00, 0x80, /* 0x40 - 0x47 */
0x86, 0x84, '-', 0x89, '5', 0x88, '+', 0x83, /* 0x48 - 0x4F */
0x87, 0x85, 0x81, 0x82, 0x00, 0x00, 0x00, 0x94, /* 0x50 - 0x57 */
0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58 - 0x5F */
0x00, 0x00, 0x81, 0x80, 0x84, 0x82, 0x83, 0x85, /* 0x60 - 0x67 */
0x86, 0x89, 0x87, 0x88, '/', 0x0D, 0x00, 0x00, /* 0x68 - 0x6F */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70 - 0x77 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x78 - 0x7F */
};
/* /*
* Code... * Code...
*/ */
@ -252,10 +330,13 @@ char g_us_sc_ctrl_shift[] = {
* 0 if successful, -1 if there was no response after PS2_RETRY_MAX tries * 0 if successful, -1 if there was no response after PS2_RETRY_MAX tries
*/ */
short ps2_wait_out() { short ps2_wait_out() {
short count = 0; long target_ticks;
log(LOG_TRACE, "ps2_wait_out");
target_ticks = rtc_get_jiffies() + PS2_TIMEOUT_JF;
while ((*PS2_STATUS & PS2_STAT_OBF) == 0) { while ((*PS2_STATUS & PS2_STAT_OBF) == 0) {
if (count++ > PS2_RETRY_MAX) { if (rtc_get_jiffies() > target_ticks) {
return -1; return -1;
} }
} }
@ -270,10 +351,13 @@ short ps2_wait_out() {
* 0 if successful, -1 if there was no response after PS2_RETRY_MAX tries * 0 if successful, -1 if there was no response after PS2_RETRY_MAX tries
*/ */
short ps2_wait_in() { short ps2_wait_in() {
short count = 0; long target_ticks;
log(LOG_TRACE, "ps2_wait_in");
target_ticks = rtc_get_jiffies() + PS2_TIMEOUT_JF;
while ((*PS2_STATUS & PS2_STAT_IBF) != 0) { while ((*PS2_STATUS & PS2_STAT_IBF) != 0) {
if (count++ > PS2_RETRY_MAX) { if (rtc_get_jiffies() > target_ticks) {
return -1; return -1;
} }
} }
@ -633,6 +717,58 @@ void kbd_handle_irq() {
} }
} }
/*
* Catch special keys and convert them to their ANSI terminal codes
*
* Characters 0x80 - 0x95 are reserved for function keys, arrow keys, etc.
* This function maps them to the ANSI escape codes
*
* Inputs:
* modifiers = the current modifier bit flags (ALT, CTRL, META, etc)
* c = the character found from the scan code.
*/
char kbd_to_ansi(unsigned char modifiers, unsigned char c) {
if ((c >= 0x80) && (c <= 0x95)) {
/* The key is a function key or a special control key */
const char * sequence;
/* After ESC, all sequences have [ */
rb_word_put(&g_kbd_control.char_buf, '[');
/* Check to see if we need to send a modifier sequence */
if (modifiers & (KBD_MOD_SHIFT | KBD_MOD_CTRL | KBD_MOD_ALT | KBD_MOD_OS)) {
unsigned char code_bcd;
short modifier_code = 0;
short i;
modifier_code = (modifiers >> 2) & 0x0E;
code_bcd = i_to_bcd(modifier_code);
if (code_bcd & 0xF0) {
rb_word_put(&g_kbd_control.char_buf, ((code_bcd & 0xF0) >> 4) + '0');
}
rb_word_put(&g_kbd_control.char_buf, (code_bcd & 0x0F) + '0');
rb_word_put(&g_kbd_control.char_buf, ';');
}
/* Get the expanded sequence and put it in the queue */
for (sequence = ansi_keys[c - 0x80]; *sequence != 0; sequence++) {
rb_word_put(&g_kbd_control.char_buf, *sequence);
}
return 0x1B; /* Start the sequence with an escape */
} else if (c == 0x1B) {
/* ESC should be doubled, to distinguish from the start of an escape sequence */
rb_word_put(&g_kbd_control.char_buf, 0x1B);
return c;
} else {
/* Not a special key: return the character unmodified */
return c;
}
}
/* /*
* Try to get a character from the keyboard... * Try to get a character from the keyboard...
* *
@ -659,42 +795,53 @@ char kbd_getc() {
// Check the modifiers to see what we should lookup... // Check the modifiers to see what we should lookup...
if ((modifiers & (KBD_MOD_SHIFT | KBD_MOD_CTRL | KBD_LOCK_CAPS)) == 0) { if ((modifiers & (KBD_MOD_SHIFT | KBD_MOD_CTRL | KBD_LOCK_CAPS | KBD_MOD_ALT)) == 0) {
// No modifiers... just return the base character // No modifiers... just return the base character
return g_kbd_control.keys_unmodified[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_unmodified[scan_code]);
} else if (modifiers & KBD_MOD_ALT) {
if ((( (modifiers & KBD_MOD_SHIFT) == 0) && ((modifiers & KBD_LOCK_CAPS) != 0)) ||
(( (modifiers & KBD_MOD_SHIFT) != 0) && ((modifiers & KBD_LOCK_CAPS) == 0))) {
/* Either SHIFT or CAPSLOCK is active, but not both */
return g_kbd_control.keys_r_alt_shift[scan_code];
} else {
/* No shift, or both SHIFT and CAPS are active */
return g_kbd_control.keys_r_alt[scan_code];
}
} else if (modifiers & KBD_MOD_CTRL) { } else if (modifiers & KBD_MOD_CTRL) {
// If CTRL is pressed... // If CTRL is pressed...
if (modifiers & KBD_MOD_SHIFT) { if (modifiers & KBD_MOD_SHIFT) {
// If SHIFT is also pressed, return CTRL-SHIFT form // If SHIFT is also pressed, return CTRL-SHIFT form
return g_kbd_control.keys_control_shift[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_control_shift[scan_code]);
} else { } else {
// Otherwise, return just CTRL form // Otherwise, return just CTRL form
return g_kbd_control.keys_control[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_control[scan_code]);
} }
} else if (modifiers & KBD_LOCK_CAPS) { } else if (modifiers & KBD_LOCK_CAPS) {
// If CAPS is locked... // If CAPS is locked...
if (modifiers & KBD_MOD_SHIFT) { if (modifiers & KBD_MOD_SHIFT) {
// If SHIFT is also pressed, return CAPS-SHIFT form // If SHIFT is also pressed, return CAPS-SHIFT form
return g_kbd_control.keys_caps_shift[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_caps_shift[scan_code]);
} else { } else {
// Otherwise, return just CAPS form // Otherwise, return just CAPS form
return g_kbd_control.keys_caps[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_caps[scan_code]);
} }
} else { } else {
// SHIFT is pressed, return SHIFT form // SHIFT is pressed, return SHIFT form
return g_kbd_control.keys_shift[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_shift[scan_code]);
} }
} else { } else {
// It's on the right side of the keyboard, NUMLOCK determines lock value // It's on the right side of the keyboard, NUMLOCK determines lock value
// TODO: flesh this out... // TODO: flesh this out...
return g_kbd_control.keys_unmodified[scan_code]; return kbd_to_ansi(modifiers, g_kbd_control.keys_unmodified[scan_code]);
} }
} }
@ -712,14 +859,12 @@ char kbd_getc() {
* Handle an interrupt from the PS/2 mouse port * Handle an interrupt from the PS/2 mouse port
*/ */
void mouse_handle_irq() { void mouse_handle_irq() {
unsigned char status = *PS2_STATUS; //unsigned char status = *PS2_STATUS;
unsigned char mouse_byte = *PS2_DATA_BUF; unsigned char mouse_byte = *PS2_DATA_BUF;
/* Clear the pending interrupt flag for the mouse */ /* Clear the pending interrupt flag for the mouse */
int_clear(INT_MOUSE); int_clear(INT_MOUSE);
*ScreenText_A = *ScreenText_A + 1;
if ((g_mouse_state == 0) && ((mouse_byte & 0x08) != 0x08)) { if ((g_mouse_state == 0) && ((mouse_byte & 0x08) != 0x08)) {
/* /*
* If this is the first byte in the packet, bit 4 must be set * If this is the first byte in the packet, bit 4 must be set
@ -793,7 +938,7 @@ short ps2_mouse_get_packet() {
result = ps2_mouse_command(MOUSE_CMD_REQPACK); result = ps2_mouse_command(MOUSE_CMD_REQPACK);
if (result == -1) { if (result == -1) {
log_num(LOG_ERROR, "MOUSE_CMD_REQPACK: ", result); log_num(LOG_INFO, "MOUSE_CMD_REQPACK: ", result);
return result; return result;
} }
@ -853,7 +998,7 @@ short mouse_init() {
result = ps2_mouse_command(MOUSE_CMD_RESET); result = ps2_mouse_command(MOUSE_CMD_RESET);
if (result == -1) { if (result == -1) {
log_num(LOG_ERROR, "MOUSE_CMD_RESET: ", result); log_num(LOG_INFO, "MOUSE_CMD_RESET: ", result);
return result; return result;
} }
@ -861,7 +1006,7 @@ short mouse_init() {
result = ps2_mouse_command_repeatable(MOUSE_CMD_DISABLE); result = ps2_mouse_command_repeatable(MOUSE_CMD_DISABLE);
if (result != PS2_RESP_ACK) { if (result != PS2_RESP_ACK) {
log_num(LOG_ERROR, "MOUSE_CMD_DISABLE: ", result); log_num(LOG_INFO, "MOUSE_CMD_DISABLE: ", result);
return result; return result;
} }
@ -869,7 +1014,7 @@ short mouse_init() {
result = ps2_mouse_command_repeatable(MOUSE_CMD_DEFAULTS); result = ps2_mouse_command_repeatable(MOUSE_CMD_DEFAULTS);
if (result != PS2_RESP_ACK) { if (result != PS2_RESP_ACK) {
log_num(LOG_ERROR, "MOUSE_CMD_DEFAULTS: ", result); log_num(LOG_INFO, "MOUSE_CMD_DEFAULTS: ", result);
return result; return result;
} }
@ -877,13 +1022,13 @@ short mouse_init() {
result = ps2_mouse_command_repeatable(MOUSE_CMD_SETRES); result = ps2_mouse_command_repeatable(MOUSE_CMD_SETRES);
if (result != PS2_RESP_ACK) { if (result != PS2_RESP_ACK) {
log_num(LOG_ERROR, "MOUSE_CMD_SETRES: ", result); log_num(LOG_INFO, "MOUSE_CMD_SETRES: ", result);
return result; return result;
} }
result = ps2_mouse_command_repeatable(0x00); result = ps2_mouse_command_repeatable(0x00);
if (result != PS2_RESP_ACK) { if (result != PS2_RESP_ACK) {
log_num(LOG_ERROR, "MOUSE_CMD_SETRES resolution: ", result); log_num(LOG_INFO, "MOUSE_CMD_SETRES resolution: ", result);
return result; return result;
} }
@ -891,19 +1036,22 @@ short mouse_init() {
result = ps2_mouse_command_repeatable(MOUSE_CMD_ENABLE); result = ps2_mouse_command_repeatable(MOUSE_CMD_ENABLE);
if (result != PS2_RESP_ACK) { if (result != PS2_RESP_ACK) {
log_num(LOG_ERROR, "MOUSE_CMD_ENABLE: ", result); log_num(LOG_INFO, "MOUSE_CMD_ENABLE: ", result);
return result; return result;
} }
/* Set up the mouse pointer */ /* Set up the mouse pointer */
short src_offset = 0;
short dest_offset = 0;
for (i = 0; i < 256; i++) { for (i = 0; i < 256; i++) {
short src_offset = 3*i; low_components = (Color_Pointer_bin[src_offset+1] << 8) + Color_Pointer_bin[src_offset];
short dest_offset = 2*i;
low_components = Color_Pointer_bin[src_offset+1] << 8 + Color_Pointer_bin[src_offset];
hi_components = Color_Pointer_bin[src_offset+2]; hi_components = Color_Pointer_bin[src_offset+2];
MousePointer_Mem_A[dest_offset] = low_components; MousePointer_Mem_A[dest_offset] = low_components;
MousePointer_Mem_A[dest_offset+1] = hi_components; MousePointer_Mem_A[dest_offset+1] = hi_components;
src_offset += 3;
dest_offset += 2;
} }
/* Enable the mouse pointer on channel A */ /* Enable the mouse pointer on channel A */
@ -912,6 +1060,81 @@ short mouse_init() {
return 0; return 0;
} }
/*
* Set the keyboard translation tables
*
* The translation tables provided to the keyboard consist of eight
* consecutive tables of 128 characters each. Each table maps from
* the MAKE scan code of a key to its appropriate 8-bit character code.
*
* The tables included must include, in order:
* - UNMODIFIED: Used when no modifier keys are pressed or active
* - SHIFT: Used when the SHIFT modifier is pressed
* - CTRL: Used when the CTRL modifier is pressed
* - CTRL-SHIFT: Used when both CTRL and SHIFT are pressed
* - CAPSLOCK: Used when CAPSLOCK is down but SHIFT is not pressed
* - CAPSLOCK-SHIFT: Used when CAPSLOCK is down and SHIFT is pressed
* - ALT: Used when only ALT is presse
* - ALT-SHIFT: Used when ALT is pressed and either CAPSLOCK is down
* or SHIFT is pressed (but not both)
*
* Inputs:
* tables = pointer to the keyboard translation tables (0 to reset to default)
*
* Returns:
* 0 on success, a negative number if there was an error
*/
short kbd_layout(const char * tables) {
short i;
/* Are we resetting the tables? */
if (tables == 0) {
/* Yes... free the old table if needed */
if (g_kbd_control.translation_table != 0) {
free(g_kbd_control.translation_table);
}
/* Reset the translation tables to their default values */
g_kbd_control.keys_unmodified = g_us_sc_unmodified;
g_kbd_control.keys_shift = g_us_sc_shift;
g_kbd_control.keys_control = g_us_sc_ctrl;
g_kbd_control.keys_control_shift = g_us_sc_ctrl_shift;
g_kbd_control.keys_caps = g_us_sc_lock;
g_kbd_control.keys_caps_shift = g_us_sc_lock_shift;
g_kbd_control.keys_r_alt = g_us_sc_alt;
g_kbd_control.keys_r_alt_shift = g_us_sc_alt_shift;
} else {
/* No: we're setting new tables */
/* Allocate a space for all the tables in the kernel's memory, if we don't have one already */
if (g_kbd_control.translation_table == 0) {
g_kbd_control.translation_table = (char *)malloc(KBD_XLATE_TABLE_SIZE);
if (g_kbd_control.translation_table == 0) {
/* We couldn't allocate... return out of memory */
return ERR_OUT_OF_MEMORY;
}
}
/* Copy the tables into kernel memory */
for (i = 0; i < KBD_XLATE_TABLE_SIZE; i++) {
g_kbd_control.translation_table[i] = tables[i];
}
/* Set the lookup tables to the individual tables in the collection */
g_kbd_control.keys_unmodified = g_kbd_control.translation_table;
g_kbd_control.keys_shift = g_kbd_control.keys_unmodified + 128;
g_kbd_control.keys_control = g_kbd_control.keys_shift + 128;
g_kbd_control.keys_control_shift = g_kbd_control.keys_control + 128;
g_kbd_control.keys_caps = g_kbd_control.keys_control_shift + 128;
g_kbd_control.keys_caps_shift = g_kbd_control.keys_caps + 128;
g_kbd_control.keys_r_alt = g_kbd_control.keys_caps_shift + 128;
g_kbd_control.keys_r_alt_shift = g_kbd_control.keys_r_alt + 128;
}
return 0;
}
/* /*
* Initialize the PS2 controller and any attached devices * Initialize the PS2 controller and any attached devices
* Enable keyboard and mouse interrupts as appropriate. * Enable keyboard and mouse interrupts as appropriate.
@ -939,6 +1162,9 @@ short ps2_init() {
g_kbd_control.keys_control_shift = g_us_sc_ctrl_shift; g_kbd_control.keys_control_shift = g_us_sc_ctrl_shift;
g_kbd_control.keys_caps = g_us_sc_lock; g_kbd_control.keys_caps = g_us_sc_lock;
g_kbd_control.keys_caps_shift = g_us_sc_lock_shift; g_kbd_control.keys_caps_shift = g_us_sc_lock_shift;
g_kbd_control.keys_r_alt = g_us_sc_alt;
g_kbd_control.keys_r_alt_shift = g_us_sc_alt_shift;
g_kbd_control.translation_table = 0;
// Disable the PS/2 interrupts... // Disable the PS/2 interrupts...
@ -987,7 +1213,7 @@ short ps2_init() {
if (mouse_present) { if (mouse_present) {
/* Initialize the mouse */ /* Initialize the mouse */
if (mouse_error = mouse_init()) { if (mouse_error = mouse_init()) {
log_num(LOG_ERROR, "Unable to initialize mouse", res); log_num(LOG_INFO, "Unable to initialize mouse", res);
} }
} }
@ -1021,12 +1247,3 @@ short ps2_init() {
return(0); return(0);
} }
char kbd_getc_poll() {
if (ps2_wait_out() == 0) {
kbd_handle_irq();
return kbd_getc();
} else {
return 0;
}
}

View file

@ -44,7 +44,28 @@ extern unsigned short kbd_get_scancode();
*/ */
extern char kbd_getc(); extern char kbd_getc();
extern char kbd_getc_poll(); /*
* Set the keyboard translation tables
*
* The translation tables provided to the keyboard consist of eight
* consecutive tables of 128 characters each. Each table maps from
* the MAKE scan code of a key to its appropriate 8-bit character code.
*
* The tables included must include, in order:
* - UNMODIFIED: Used when no modifier keys are pressed or active
* - SHIFT: Used when the SHIFT modifier is pressed
* - CTRL: Used when the CTRL modifier is pressed
* - CTRL-SHIFT: Used when both CTRL and SHIFT are pressed
* - CAPSLOCK: Used when CAPSLOCK is down but SHIFT is not pressed
* - CAPSLOCK-SHIFT: Used when CAPSLOCK is down and SHIFT is pressed
* - ALT: Used when only ALT is presse
* - ALT-SHIFT: Used when ALT is pressed and either CAPSLOCK is down
* or SHIFT is pressed (but not both)
*
* Inputs:
* tables = pointer to the keyboard translation tables
*/
extern short kbd_layout(const char * tables);
/* /*
* Query the mouse for an update packet (use if we aren't using interrupts) * Query the mouse for an update packet (use if we aren't using interrupts)

View file

@ -4,9 +4,10 @@
#include "log.h" #include "log.h"
#include "interrupt.h" #include "interrupt.h"
#include "gabe_reg.h"
#include "rtc.h" #include "rtc.h"
#include "rtc_reg.h" #include "rtc_reg.h"
#include "simpleio.h" #include "timers.h"
static long rtc_ticks; static long rtc_ticks;
@ -16,41 +17,57 @@ static long rtc_ticks;
void rtc_handle_int() { void rtc_handle_int() {
unsigned char flags; unsigned char flags;
flags = *RTC_FLAGS; /* Periodic interrupt: increment the ticks counter */
if (flags | RTC_PF) { rtc_ticks++;
/* Peridic interrupt: increment the ticks counter */
rtc_ticks++;
}
} }
/* /*
* Initialize the RTC * Initialize the RTC
*/ */
void rtc_init() { void rtc_init() {
unsigned char flags;
unsigned char rates; unsigned char rates;
unsigned char enables; unsigned char enables;
// int_disable(INT_RTC); log(LOG_TRACE, "rtc_init");
//
// /* Reset the ticks counter */ int_disable(INT_RTC);
// rtc_ticks = 0;
//
// /* Set the periodic interrupt to 976.5625 microseconds */
// *RTC_RATES = (*RTC_RATES & RTC_RATES_WD) | RTC_RATE_976us;
//
// /* Enable the periodic interrupt */
*RTC_RATES = 0;
*RTC_ENABLES = 0; // RTC_PIE;
/* Make sure the RTC is on */ /* Make sure the RTC is on */
*RTC_CTRL = RTC_STOP; *RTC_CTRL = RTC_STOP;
/* Register our interrupt handler and clear out any pending interrupts */ /*
* For the moment: Every so often, the RTC interrupt gets acknowledged
* without clearing the flags. Until I can sort out why, I will use
* the SOF A interrupt as a surrogate for the RTC jiffie timer
*/
// /* Set the periodic interrupt to 15 millisecs */
// *RTC_RATES = RTC_RATE_15ms;
// int_register(INT_RTC, rtc_handle_int); // int_register(INT_RTC, rtc_handle_int);
// int_clear(INT_RTC);
/* Enable the periodic interrupt */
// flags = *RTC_FLAGS;
// *RTC_ENABLES = RTC_PIE;
// int_enable(INT_RTC); // int_enable(INT_RTC);
} }
/*
* Make sure the RTC tick counter is enabled
*/
void rtc_enable_ticks() {
/* Set the periodic interrupt to 15 millisecs */
*RTC_RATES = RTC_RATE_15ms;
unsigned char flags = *RTC_FLAGS;
*RTC_ENABLES = RTC_PIE;
int_enable(INT_RTC);
}
/* /*
* Set the time on the RTC * Set the time on the RTC
* *
@ -205,22 +222,15 @@ void rtc_get_time(p_time time) {
} }
/* /*
* Get the number of ticks since the system last booted. * Get the number of jiffies since the system last booted.
* *
* NOTE: a tick is almost, but not quite, 1ms. The RTC periodic interrupt * NOTE: a jiffie is 1/60 of a second. This timer will not be
* period does not line up with a 1ms timer, but it comes close. * 100% precise, so it should be used for timeout purposes
* Therefore, a tick will be 976.5625 microseconds... a little faster * where precision is not critical.
* than 1ms.
* *
* Returns: * Returns:
* the number of ticks since the last reset * the number of jiffies since the last reset
*/ */
long rtc_get_ticks() { long rtc_get_jiffies() {
long result = 0; return timers_jiffies();
int_disable(INT_RTC); /* Make sure we aren't changing the tick counter during the query */
result = rtc_ticks;
int_enable(INT_RTC);
return rtc_ticks;
} }

View file

@ -21,6 +21,11 @@ typedef struct s_time {
*/ */
extern void rtc_init(); extern void rtc_init();
/*
* Make sure the RTC tick counter is enabled
*/
extern void rtc_enable_ticks();
/* /*
* Set the time on the RTC * Set the time on the RTC
* *
@ -38,16 +43,15 @@ extern void rtc_set_time(p_time time);
extern void rtc_get_time(p_time time); extern void rtc_get_time(p_time time);
/* /*
* Get the number of ticks since the system last booted. * Get the number of jiffies since the system last booted.
* *
* NOTE: a tick is almost, but not quite, 1ms. The RTC periodic interrupt * NOTE: a jiffie is 1/60 of a second. This timer will not be
* period does not line up with a 1ms timer, but it comes close. * 100% precise, so it should be used for timeout purposes
* Therefore, a tick will be 976.5625 microseconds... a little faster * where precision is not critical.
* than 1ms.
* *
* Returns: * Returns:
* the number of ticks since the last reset * the number of jiffies since the last reset
*/ */
extern long rtc_get_ticks(); extern long rtc_get_jiffies();
#endif #endif

View file

@ -3,14 +3,22 @@
*/ */
#include "log.h" #include "log.h"
// #include "fatfs/ff.h"
#include "constants.h" #include "constants.h"
#include "errors.h" #include "errors.h"
#include "gabe_reg.h"
#include "indicators.h"
#include "dev/block.h" #include "dev/block.h"
#include "sdc_reg.h" #include "sdc_reg.h"
#include "dev/rtc.h"
#include "dev/sdc.h" #include "dev/sdc.h"
#include "dev/text_screen_iii.h" #include "dev/text_screen_iii.h"
//
// Constants
//
#define SDC_TIMEOUT_JF 20 /* Timeout in jiffies (1/60 second) */
unsigned char g_sdc_status = SDC_STAT_NOINIT; unsigned char g_sdc_status = SDC_STAT_NOINIT;
unsigned char g_sdc_error = 0; unsigned char g_sdc_error = 0;
@ -51,13 +59,11 @@ short sdc_protected() {
// is_on = if 0, turn the LED off, otherwise turn the LED on // is_on = if 0, turn the LED off, otherwise turn the LED on
// //
void sdc_set_led(short is_on) { void sdc_set_led(short is_on) {
// volatile unsigned char *gabe_control = (unsigned char *)GABE_MSTR_CTRL; if (is_on) {
// *GABE_CTRL_REG = *GABE_CTRL_REG | SDCARD_LED;
// if (is_on) { } else {
// *gabe_control = *gabe_control | GABE_CTRL_SDC_LED; *GABE_CTRL_REG = *GABE_CTRL_REG & ~SDCARD_LED;
// } else { }
// *gabe_control = *gabe_control & ~GABE_CTRL_SDC_LED;
// }
} }
// //
@ -67,11 +73,13 @@ void sdc_set_led(short is_on) {
// 0 on success, DEV_TIMEOUT on timeout // 0 on success, DEV_TIMEOUT on timeout
// //
short sdc_wait_busy() { short sdc_wait_busy() {
long timer_ticks;
int retry_count = MAX_TRIES_BUSY; int retry_count = MAX_TRIES_BUSY;
unsigned char status; unsigned char status;
timer_ticks = rtc_get_jiffies() + SDC_TIMEOUT_JF;
do { do {
if (retry_count-- == 0) { if (rtc_get_jiffies() > timer_ticks) {
// If we have run out of tries, return a TIMEOUT error // If we have run out of tries, return a TIMEOUT error
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
@ -145,7 +153,8 @@ short sdc_read(long lba, unsigned char * buffer, short size) {
return DEV_NOMEDIA; return DEV_NOMEDIA;
} }
sdc_set_led(1); // Turn on the SDC LED /* Turn on the SDC LED */
ind_set(IND_SDC, IND_ON);
// Send the LBA to the SDC // Send the LBA to the SDC
@ -164,7 +173,9 @@ short sdc_read(long lba, unsigned char * buffer, short size) {
g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors
if (g_sdc_error != 0) { if (g_sdc_error != 0) {
sdc_set_led(0); // Turn off the SDC LED /* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_CANNOT_READ; return DEV_CANNOT_READ;
} else { } else {
@ -174,6 +185,9 @@ short sdc_read(long lba, unsigned char * buffer, short size) {
// Get the number of bytes to be read and make sure there is room // Get the number of bytes to be read and make sure there is room
count = *SDC_RX_FIFO_DATA_CNT_HI << 8 | *SDC_RX_FIFO_DATA_CNT_LO; count = *SDC_RX_FIFO_DATA_CNT_HI << 8 | *SDC_RX_FIFO_DATA_CNT_LO;
if (count > size) { if (count > size) {
/* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_BOUNDS_ERR; return DEV_BOUNDS_ERR;
} }
@ -185,14 +199,22 @@ short sdc_read(long lba, unsigned char * buffer, short size) {
g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors
if (g_sdc_error != 0) { if (g_sdc_error != 0) {
/* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_CANNOT_READ; return DEV_CANNOT_READ;
} else { } else {
/* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
// Success: return the byte count // Success: return the byte count
return count; return count;
} }
} }
} else { } else {
sdc_set_led(0); // Turn off the SDC LED /* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
} }
@ -222,7 +244,8 @@ short sdc_write(long lba, const unsigned char * buffer, short size) {
return DEV_NOMEDIA; return DEV_NOMEDIA;
} }
sdc_set_led(1); // Turn on the SDC LED /* Turn on the SDC LED */
ind_set(IND_SDC, IND_ON);
if (size <= SDC_SECTOR_SIZE) { if (size <= SDC_SECTOR_SIZE) {
// Copy the data to the SDC, if there isn't too much... // Copy the data to the SDC, if there isn't too much...
@ -238,6 +261,9 @@ short sdc_write(long lba, const unsigned char * buffer, short size) {
} }
} else { } else {
/* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
// If size is too big, return a BOUNDS error // If size is too big, return a BOUNDS error
return DEV_BOUNDS_ERR; return DEV_BOUNDS_ERR;
} }
@ -259,15 +285,22 @@ short sdc_write(long lba, const unsigned char * buffer, short size) {
g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors g_sdc_error = *SDC_TRANS_ERROR_REG; // Check for errors
if (g_sdc_error != 0) { if (g_sdc_error != 0) {
sdc_set_led(0); // Turn off the SDC LED /* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_CANNOT_WRITE; return DEV_CANNOT_WRITE;
} else { } else {
/* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
// Success: return the byte count // Success: return the byte count
return size; return size;
} }
} else { } else {
sdc_set_led(0); // Turn off the SDC LED /* Turn off the SDC LED */
ind_set(IND_SDC, IND_OFF);
return DEV_TIMEOUT; return DEV_TIMEOUT;
} }
} }

View file

@ -5,7 +5,8 @@
#include "constants.h" #include "constants.h"
#include "vicky_general.h" #include "vicky_general.h"
#include "text_screen_iii.h" #include "text_screen_iii.h"
#include "rsrc/font/foenix_st_8_8.h" #include "simpleio.h"
#include "rsrc/font/MSX_CP437_8x8.h"
#define MAX_TEXT_CHANNELS 2 #define MAX_TEXT_CHANNELS 2
@ -13,12 +14,14 @@
* Structure to hold pointers to the text channel's registers and memory * Structure to hold pointers to the text channel's registers and memory
*/ */
typedef struct s_text_channel { typedef struct s_text_channel {
volatile uint32_t * master_control; unsigned char current_color;
volatile unsigned long * master_control;
volatile char * text_cells; volatile char * text_cells;
volatile uint8_t * color_cells; volatile char * color_cells;
volatile uint32_t * cursor_settings; volatile unsigned long * cursor_settings;
volatile uint32_t * cursor_position; volatile unsigned long * cursor_position;
volatile uint32_t * border_control; volatile unsigned long * border_control;
short columns_max; short columns_max;
short rows_max; short rows_max;
@ -28,13 +31,11 @@ typedef struct s_text_channel {
short x; short x;
short y; short y;
volatile char * text_cursor_ptr; volatile char * text_cursor_ptr;
volatile uint8_t * color_cursor_ptr; volatile unsigned char * color_cursor_ptr;
uint8_t current_color;
} t_text_channel, *p_text_channel; } t_text_channel, *p_text_channel;
static t_text_channel text_channel[MAX_TEXT_CHANNELS]; static t_text_channel text_channel[MAX_TEXT_CHANNELS];
// 0xHHLL, 0xHHLL // 0xHHLL, 0xHHLL
// 0xGGBB, 0xAARR // 0xGGBB, 0xAARR
const unsigned short fg_color_lut [32] = { const unsigned short fg_color_lut [32] = {
@ -79,19 +80,45 @@ const unsigned short bg_color_lut [32] = {
* Initialize the text screen driver * Initialize the text screen driver
*/ */
int text_init() { int text_init() {
short need_hires = 0;
int i, x; int i, x;
p_text_channel chan_a = &text_channel[0]; p_text_channel chan_a = &text_channel[0];
#if MODEL == MODEL_FOENIX_A2560K
p_text_channel chan_b = &text_channel[1]; p_text_channel chan_b = &text_channel[1];
#endif
for (i = 0; i < MAX_TEXT_CHANNELS; i++) {
text_channel[i].master_control = 0xffffffff;
text_channel[i].text_cells = 0xffffffff;
text_channel[i].color_cells = 0xffffffff;
text_channel[i].cursor_settings = 0xffffffff;
text_channel[i].cursor_position = 0xffffffff;
text_channel[i].border_control = 0xffffffff;
text_channel[i].text_cursor_ptr = 0xffffffff;
text_channel[i].color_cursor_ptr = 0xffffffff;
text_channel[i].current_color = 0;
text_channel[i].columns_max = 0;
text_channel[i].rows_max = 0;
text_channel[i].columns_visible = 0;
text_channel[i].rows_visible = 0;
text_channel[i].x = 0;
text_channel[i].y = 0;
}
// Init CLUT for the Color Memory // Init CLUT for the Color Memory
for (i = 0; i<32; i++) { for (i = 0; i<32; i++) {
FG_CLUT_A[i] = fg_color_lut[i]; FG_CLUT_A[i] = fg_color_lut[i];
FG_CLUT_B[i] = fg_color_lut[i];
BG_CLUT_A[i] = bg_color_lut[i]; BG_CLUT_A[i] = bg_color_lut[i];
#if MODEL == MODEL_FOENIX_A2560K
FG_CLUT_B[i] = fg_color_lut[i];
BG_CLUT_B[i] = bg_color_lut[i]; BG_CLUT_B[i] = bg_color_lut[i];
#endif
} }
/* TODO: initialize everything... only do a screen if it's present */ /* Initialize everything... only do a screen if it's present */
need_hires = ((*VKY3_DIP_REG & VKY3_DIP_HIRES) == 0) ? 1 : 0;
chan_a->master_control = MasterControlReg_A; chan_a->master_control = MasterControlReg_A;
chan_a->text_cells = ScreenText_A; chan_a->text_cells = ScreenText_A;
@ -100,8 +127,11 @@ int text_init() {
chan_a->cursor_position = CursorControlReg_H_A; chan_a->cursor_position = CursorControlReg_H_A;
chan_a->border_control = BorderControlReg_L_A; chan_a->border_control = BorderControlReg_L_A;
*chan_a->master_control = 1; /* Set to text only mode: 640x480 */ if (need_hires) {
// *chan_a->border_control = 0; /* Set to no border */ *chan_a->master_control = VKY3_MCR_800x600 | VKY3_MCR_TEXT_EN; /* Set to text only mode: 800x600 */
} else {
*chan_a->master_control = VKY3_MCR_640x480 | VKY3_MCR_TEXT_EN; /* Set to text only mode: 640x480 */
}
chan_a->border_control[0] = 0x00102001; // Enable chan_a->border_control[0] = 0x00102001; // Enable
chan_a->border_control[1] = 0x00000040; //Dark Blue chan_a->border_control[1] = 0x00000040; //Dark Blue
@ -109,15 +139,18 @@ int text_init() {
/* Set the font for channel A */ /* Set the font for channel A */
for (i = 0; i < 0x800; i++) { for (i = 0; i < 0x800; i++) {
unsigned char b = foenix_st_8x8[i]; unsigned char b = MSX_CP437_8x8_bin[i];
VICKY_TXT_FONT_A[i] = b; VICKY_TXT_FONT_A[i] = b;
} }
text_set_border(0, 1, 0x20, 0x10, 0x00008080);
text_setsizes(0); text_setsizes(0);
text_set_color(0, 12, 4); text_set_color(0, 0xf, 4);
text_clear(0, 2); text_set_cursor(0, 0xF3, 0x7F, 1, 1);
text_set_cursor(0, 0xF3, 0xB1, 1, 1);
text_set_xy(0, 0, 0); text_set_xy(0, 0, 0);
text_clear(0, 2);
#if MODEL == MODEL_FOENIX_A2560K
chan_b->master_control = MasterControlReg_B; chan_b->master_control = MasterControlReg_B;
chan_b->text_cells = ScreenText_B; chan_b->text_cells = ScreenText_B;
@ -126,7 +159,11 @@ int text_init() {
chan_b->cursor_position = CursorControlReg_H_B; chan_b->cursor_position = CursorControlReg_H_B;
chan_b->border_control = BorderControlReg_L_B; chan_b->border_control = BorderControlReg_L_B;
*chan_b->master_control = 1; /* Set to text only mode: 640x480 */ if (need_hires) {
*chan_b->master_control = VKY3_MCR_800x600 | VKY3_MCR_TEXT_EN; /* Set to text only mode: 800x600 */
} else {
*chan_b->master_control = VKY3_MCR_640x480 | VKY3_MCR_TEXT_EN; /* Set to text only mode: 640x480 */
}
chan_b->border_control[0] = 0x00102000; // Enable chan_b->border_control[0] = 0x00102000; // Enable
chan_b->border_control[1] = 0x00400000; //Dark Red chan_b->border_control[1] = 0x00400000; //Dark Red
@ -134,19 +171,48 @@ int text_init() {
text_setsizes(1); text_setsizes(1);
text_set_color(1, 4, 3); text_set_color(1, 4, 3);
text_clear(1, 2); text_clear(1, 2);
text_set_cursor(1, 0xF3, 0xB1, 1, 1); text_set_cursor(1, 0xF3, 0x7F, 1, 1);
text_set_xy(1, 0, 0); text_set_xy(1, 0, 0);
/* Set the font for channel B */ /* Set the font for channel B */
for (i = 0; i < 0x800; i++) { for (i = 0; i < 0x800; i++) {
unsigned char b = foenix_st_8x8[i]; unsigned char b = MSX_CP437_8x8_bin[i];
VICKY_TXT_FONT_B[i] = b; VICKY_TXT_FONT_B[i] = b;
} }
#endif
return 0; return 0;
} }
/*
* Set the border
*
* Inputs:
* screen = the screen number 0 for channel A, 1 for channel B
* visible = 0 to hide, any other number to show
* width = the horizontal thickness of the border in pixels
* height = the vertical thickness of the border in pixels
* color = the RGB color (xxRRGGBB)
*/
void text_set_border(short screen, short visible, short width, short height, unsigned long color) {
if (screen < MAX_TEXT_CHANNELS) {
p_text_channel chan = &text_channel[screen];
if (visible) {
/* Set the width and color */
chan->border_control[0] = ((height & 0xff) << 16) | ((width & 0xff) << 8) | 1;
chan->border_control[1] = (color & 0x00ff0000) | ((color & 0xff) << 8) | ((color & 0xff00) >> 8);
} else {
/* Hide the border and make it 0 width */
chan->border_control[0] = 0;
chan->border_control[1] = 0;
}
}
}
/* /*
* Set the cursor properties * Set the cursor properties
* *
@ -192,7 +258,8 @@ void text_set_xy(short screen, unsigned short x, unsigned short y) {
chan->x = x; chan->x = x;
chan->y = y; chan->y = y;
*(chan->cursor_position) = y << 16 | x;
*(chan->cursor_position) = ((unsigned long)y << 16) | (unsigned long)x;
short offset = y * chan->columns_max + x; short offset = y * chan->columns_max + x;
chan->text_cursor_ptr = &chan->text_cells[offset]; chan->text_cursor_ptr = &chan->text_cells[offset];
chan->color_cursor_ptr = &chan->color_cells[offset]; chan->color_cursor_ptr = &chan->color_cells[offset];
@ -335,34 +402,35 @@ void text_clear(short screen, short mode) {
int eos_index = chan->columns_max * chan->rows_max; int eos_index = chan->columns_max * chan->rows_max;
int cursor_index = chan->y * chan->columns_max + chan->x; int cursor_index = chan->y * chan->columns_max + chan->x;
switch (mode) { // switch (mode) {
case 0: // case 0:
/* Clear from cursor to the end of the screen */ // /* Clear from cursor to the end of the screen */
for (i = cursor_index; i < eos_index; i++) { // for (i = cursor_index; i < eos_index; i++) {
chan->text_cells[i] = ' '; // chan->text_cells[i] = ' ';
chan->color_cells[i] = chan->current_color; // chan->color_cells[i] = chan->current_color;
} // }
break; // break;
//
case 1: // case 1:
/* Clear from (0, 0) to cursor */ // /* Clear from (0, 0) to cursor */
for (i = sos_index; i <= cursor_index; i++) { // for (i = sos_index; i <= cursor_index; i++) {
chan->text_cells[i] = ' '; // chan->text_cells[i] = ' ';
chan->color_cells[i] = chan->current_color; // chan->color_cells[i] = chan->current_color;
} // }
break; // break;
//
case 2: // case 2:
/* Clear entire screen */ /* Clear entire screen */
for (i = sos_index; i <= eos_index; i++) { for (i = 0; i < 0x2000; i++) {
chan->text_cells[i] = ' '; chan->text_cells[i] = ' ';
chan->color_cells[i] = chan->current_color; chan->color_cells[i] = chan->current_color;
} }
break;
default: // break;
break; //
} // default:
// break;
// }
} }
} }

View file

@ -22,6 +22,18 @@ extern int text_init();
*/ */
extern void text_set_cursor(short screen, short color, char character, short rate, short enable); extern void text_set_cursor(short screen, short color, char character, short rate, short enable);
/*
* Set the border
*
* Inputs:
* screen = the screen number 0 for channel A, 1 for channel B
* visible = 0 to hide, any other number to show
* width = the horizontal thickness of the border in pixels
* height = the vertical thickness of the border in pixels
* color = the RGB color (xxRRGGBB)
*/
extern void text_set_border(short screen, short visible, short width, short height, unsigned long color);
/* /*
* Set the position of the cursor on the screen. Adjusts internal pointers used for printing the characters * Set the position of the cursor on the screen. Adjusts internal pointers used for printing the characters
* *

View file

@ -1,66 +0,0 @@
/*
* Definitions for the MIDI ports
*/
#include "midi_reg.h"
#include "dev/midi.h"
/*
* Initilialize the MIDI port
*/
short midi_init() {
*MIDI_CMD = 0xff; /* Send the command to reset the MIDI port */
// while ((*MIDI_STAT & MIDI_STAT_RX_EMPTY) == 0) {
// /* While there is data, throw it out */
// unsigned char dummy = *MIDI_DATA;
// }
*MIDI_CMD = 0x3F; /* Switch the MIDI port into UART mode */
// while ((*MIDI_STAT & MIDI_STAT_RX_EMPTY) == 0) {
// /* While there is data, throw it out */
// unsigned char dummy = *MIDI_DATA;
// }
return 0;
}
/*
* Send a byte to the MIDI port
*
* Inputs:
* b = the byte to send
*/
short midi_put(unsigned char b) {
while ((*MIDI_STAT & MIDI_STAT_TX_BUSY) != 0) {
/* Wait until the MIDI transmitter is not busy */
;
}
/* Send the byte */
*MIDI_DATA = b;
while ((*MIDI_STAT & MIDI_STAT_TX_BUSY) != 0) {
/* Wait until the MIDI transmitter is not busy */
;
}
return 0;
}
/*
* Get a byte from the MIDI port
*
* Returns:
* b = the byte to send
*/
short midi_get_poll() {
if (*MIDI_STAT & MIDI_STAT_RX_EMPTY) {
/* There's no data... return 0 */
return 0;
} else {
/* Get and return the byte */
return (short)*MIDI_DATA;
}
}

View file

@ -1,5 +1,3 @@
override CFLAGS = +../../vbcc/config/m68k-foenix -I. -I.. -I../include
csources = $(wildcard *.c) csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources)) cobjects = $(subst .c,.o,$(csources))

File diff suppressed because it is too large Load diff

View file

@ -25,7 +25,7 @@
/ 3: f_lseek() function is removed in addition to 2. */ / 3: f_lseek() function is removed in addition to 2. */
#define FF_USE_FIND 0 #define FF_USE_FIND 2
/* This option switches filtered directory read functions, f_findfirst() and /* This option switches filtered directory read functions, f_findfirst() and
/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ / f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */

View file

@ -2,21 +2,29 @@
* Startup file for the Foenix/MCP * Startup file for the Foenix/MCP
*/ */
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "sys_general.h" #include "sys_general.h"
#include "simpleio.h" #include "simpleio.h"
#include "log.h" #include "log.h"
#include "indicators.h"
#include "interrupt.h" #include "interrupt.h"
#include "gabe_reg.h" #include "gabe_reg.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "superio.h" #include "superio.h"
#include "dev/kbd_mo.h"
#endif
#include "syscalls.h" #include "syscalls.h"
#include "timers.h"
#include "dev/block.h" #include "dev/block.h"
#include "dev/channel.h" #include "dev/channel.h"
#include "dev/console.h" #include "dev/console.h"
#include "dev/fdc.h"
#include "dev/text_screen_iii.h" #include "dev/text_screen_iii.h"
#include "dev/pata.h" #include "dev/pata.h"
#include "dev/ps2.h" #include "dev/ps2.h"
#include "dev/kbd_mo.h"
#include "dev/rtc.h" #include "dev/rtc.h"
#include "dev/sdc.h" #include "dev/sdc.h"
#include "dev/uart.h" #include "dev/uart.h"
@ -26,10 +34,12 @@
#include "snd/sid.h" #include "snd/sid.h"
#include "fatfs/ff.h" #include "fatfs/ff.h"
#include "cli/cli.h" #include "cli/cli.h"
/* #include "rsrc/bitmaps/splash_a2560k.h"*/ // #include "rsrc/bitmaps/splash_a2560k.h"
#include "rsrc/bitmaps/splash_a2560u.h"
const char* VolumeStr[FF_VOLUMES] = { "sdc", "fdc", "hdc" }; const char* VolumeStr[FF_VOLUMES] = { "sd", "fd", "hd" };
#if MODEL == MODEL_FOENIX_A2560K
/* /*
* Initialize the SuperIO registers * Initialize the SuperIO registers
*/ */
@ -46,7 +56,7 @@ const char* VolumeStr[FF_VOLUMES] = { "sdc", "fdc", "hdc" };
*GP20_REG = 0x00; *GP20_REG = 0x00;
*GP24_REG = 0x01; *GP24_REG = 0x01;
*GP25_REG = 0x05; *GP25_REG = 0x05;
*GP24_REG = 0x84; *GP26_REG = 0x84;
*GP30_REG = 0x01; *GP30_REG = 0x01;
*GP31_REG = 0x01; *GP31_REG = 0x01;
@ -82,76 +92,88 @@ const char* VolumeStr[FF_VOLUMES] = { "sdc", "fdc", "hdc" };
*LED1_REG = 0x01; *LED1_REG = 0x01;
*LED2_REG = 0x02; *LED2_REG = 0x02;
} }
#endif
// /* /*
// * Load and display the splash screen * Load and display the splash screen
// */ */
// void load_splashscreen() { void load_splashscreen() {
// int i; long target_ticks;
// int i;
// /* Turn off the screen */ unsigned char * pixels;
// *MasterControlReg_A = VKY3_MCR_BLANK_EN; unsigned char * vram = VRAM_Bank0;
//
// /* Copy the splash screen LUT */
// for (i = 0; i < sizeof(splash_screen_cmap); i++) {
// LUT_0[i] = splash_screen_cmap[i][0];
// LUT_0[i+1] = splash_screen_cmap[i][1];
// LUT_0[i+2] = splash_screen_cmap[i][2];
// }
//
// /* Copy the bitmap to video RAM */
// for (i = 0; i < sizeof(splash_screen_bmap); i++) {
// VRAM_Bank0[i] = splash_screen_bmap[i];
// }
//
// /* Set up the bitmap */
// *BM0_Addy_Pointer_Reg = 0;
// *BM0_Control_Reg = 1;
//
// /* Turn off the border */
// *BorderControlReg_L_A = 0;
//
// /* Display the splashscreen: 320x200 */
// *MasterControlReg_A = VKY3_MCR_BITMAP_EN | VKY3_MCR_GRAPH_EN | VKY3_MCR_DOUBLE_EN;
//
// for (i = 0; i < 4096*1024; i++) ;
// }
void print_error(short channel, char * message, short code) { /* Turn off the screen */
print(channel, message); *MasterControlReg_A = VKY3_MCR_BLANK_EN;
print(channel, ": ");
print_hex_16(channel, code); for (i = 0; i < 256; i++) {
print(channel, "\n"); LUT_0[4*i] = splashscreen_lut[4*i];
} LUT_0[4*i+1] = splashscreen_lut[4*i+1];
LUT_0[4*i+2] = splashscreen_lut[4*i+2];
LUT_0[4*i+3] = splashscreen_lut[4*i+3];
}
/* Copy the bitmap to video RAM */
for (pixels = splashscreen_pix; *pixels != 0;) {
unsigned char count = *pixels++;
unsigned char pixel = *pixels++;
for (i = 0; i < count; i++) {
*vram++ = pixel;
}
}
/* Set up the bitmap */
*BM0_Addy_Pointer_Reg = 0;
*BM0_Control_Reg = 1;
/* Turn off the border */
*BorderControlReg_L_A = 0;
/* Set a background color for the bitmap mode */
*BackGroundControlReg_A = 0x00800000;
/* Display the splashscreen: 640x480 */
*MasterControlReg_A = VKY3_MCR_GRAPH_EN | VKY3_MCR_BITMAP_EN;
/* Play the SID test bong on the Gideon SID implementation */
sid_test_internal();
}
void print_error(short channel, char * message, short code) {
print(channel, message);
print(channel, ": ");
print_hex_16(channel, code);
print(channel, "\n");
}
/* /*
* Initialize the kernel systems. * Initialize the kernel systems.
*/ */
void initialize() { void initialize() {
long target_jiffies;
int i; int i;
short res; short res;
/* Set the logging level */ /* Set the logging level */
log_setlevel(LOG_ERROR); log_setlevel(LOG_ERROR);
/* Hide the mouse */ // /* Hide the mouse */
mouse_set_visible(0); mouse_set_visible(0);
/* Display the splash screen */
/* load_splashscreen(); */
/* Initialize the text channels */ /* Initialize the text channels */
text_init(); text_init();
/* Initialize the indicators, and turn on the power indicator */
ind_init();
ind_set(IND_POWER, IND_ON);
/* Initialize the interrupt system */ /* Initialize the interrupt system */
int_init(); int_init();
/* Set the power LED to purple */ #if MODEL == MODEL_FOENIX_A2560K
*RGB_LED_L = 0x00FF;
*RGB_LED_H = 0x00FF;
/* Initialize the SuperIO chip */ /* Initialize the SuperIO chip */
init_superio(); init_superio();
#endif
/* Mute the PSG */ /* Mute the PSG */
psg_mute_all(); psg_mute_all();
@ -162,9 +184,6 @@ void initialize() {
/* Initialize the SID chips */ /* Initialize the SID chips */
sid_init_all(); sid_init_all();
/* Play the SID test bong on the Gideon SID implementation */
sid_test_internal();
cdev_init_system(); // Initialize the channel device system cdev_init_system(); // Initialize the channel device system
log(LOG_INFO, "Channel device system ready."); log(LOG_INFO, "Channel device system ready.");
@ -177,9 +196,20 @@ void initialize() {
log(LOG_INFO, "Console installed."); log(LOG_INFO, "Console installed.");
} }
/* Initialize the timers the MCP uses */
timers_init();
/* Initialize the real time clock */ /* Initialize the real time clock */
rtc_init(); rtc_init();
target_jiffies = sys_time_jiffies() + 300; /* 5 seconds minimum */
/* Enable all interrupts */
int_enable_all();
/* Display the splash screen */
load_splashscreen();
if (res = pata_install()) { if (res = pata_install()) {
log_num(LOG_ERROR, "FAILED: PATA driver installation", res); log_num(LOG_ERROR, "FAILED: PATA driver installation", res);
} else { } else {
@ -200,11 +230,13 @@ void initialize() {
DEBUG("PS/2 keyboard initialized."); DEBUG("PS/2 keyboard initialized.");
} }
#if MODEL == MODEL_FOENIX_A2560K
if (res = kbdmo_init()) { if (res = kbdmo_init()) {
log_num(LOG_ERROR, "FAILED: A2560K built-in keyboard initialization", res); log_num(LOG_ERROR, "FAILED: A2560K built-in keyboard initialization", res);
} else { } else {
log(LOG_INFO, "A2560K built-in keyboard initialized."); log(LOG_INFO, "A2560K built-in keyboard initialized.");
} }
#endif
if (res = cli_init()) { if (res = cli_init()) {
log_num(LOG_ERROR, "FAILED: CLI initialization", res); log_num(LOG_ERROR, "FAILED: CLI initialization", res);
@ -218,125 +250,16 @@ void initialize() {
log(LOG_INFO, "File system initialized."); log(LOG_INFO, "File system initialized.");
} }
/* Enable all interrupts */ /* Wait until the target duration has been reached _or_ the user presses a key */
int_enable_all(); while (target_jiffies > sys_time_jiffies()) {
} short scan_code = sys_kbd_scancode();
if (scan_code != 0) {
void uart_send(short uart, char * message) { break;
int i, j;
for (i = 0; i < strlen(message); i++) {
uart_put(uart, message[i]);
}
}
void uart_test_send(short uart) {
while (1) {
int j;
uart_put(uart, 'a');
for (j = 1; j < 10000; j++) ;
}
}
void try_format(short screen, char * path) {
FATFS fs; /* Filesystem object */
FIL fil; /* File object */
FRESULT res; /* API result code */
UINT bw; /* Bytes written */
BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
/* Format the HDD with default parameters */
res = f_mkfs(path, 0, work, sizeof work);
if (res) {
print(screen, "Could not format drive.\n");
return;
}
/* Give a work area to the default drive */
f_mount(&fs, path, 0);
/* Create a file as new */
res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
if (res) {
print(screen, "Could not create hello.txt.\n");
return;
}
/* Write a message */
f_write(&fil, "Hello, World!\r\n", 15, &bw);
if (bw != 15) {
print(screen, "Error writing file.\n");
return;
}
/* Close the file */
f_close(&fil);
/* Unregister work area */
f_mount(0, "", 0);
}
void try_write(short screen, char * path) {
FATFS fs; /* Filesystem object */
FIL fil; /* File object */
FRESULT res; /* API result code */
UINT bw; /* Bytes written */
/* Give a work area to the default drive */
f_mount(&fs, path, 0);
/* Create a file as new */
res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
if (res) {
print(screen, "Could not create hello.txt: ");
print_hex_16(screen, res);
print(screen, "\n");
return;
}
/* Write a message */
f_write(&fil, "Hello, World!\r\n", 15, &bw);
if (bw != 15) {
print(screen, "Error writing file.\n");
return;
}
/* Close the file */
f_close(&fil);
/* Unregister work area */
f_mount(0, "", 0);
}
unsigned char test_block_1[512];
unsigned char test_block_2[512];
void try_bdev_getput(short screen, short dev) {
int i;
for (i = 0; i < 512; i++) {
test_block_1[i] = (unsigned short)i & 0xff;
}
short n = bdev_write(dev, 0x010000, test_block_1, 512);
if (n != 512) {
print(screen, "Could not write block.\n");
return;
}
n = bdev_read(dev, 0x010000, test_block_2, 512);
if (n != 512) {
print(screen, "Could not read block.\n");
return;
}
for (i = 0; i < 512; i++) {
if (test_block_1[i] != test_block_2[i]) {
print(screen, "Block did not verify.\n");
return;
} }
} }
print(screen, "BDEV read/write success.\n"); /* Go back to text mode */
text_init();
} }
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
@ -348,7 +271,7 @@ int main(int argc, char * argv[]) {
const char * title_3 = "\x1b[37m AAAAA 222 555 6666 0 0 U U"; const char * title_3 = "\x1b[37m AAAAA 222 555 6666 0 0 U U";
const char * title_4 = "\x1b[37m A A 2 5 6 6 0 0 U U"; const char * title_4 = "\x1b[37m A A 2 5 6 6 0 0 U U";
const char * title_5 = "\x1b[37m A A 22222 5555 666 000 UUU"; const char * title_5 = "\x1b[37m A A 22222 5555 666 000 UUU";
#elif MODEL == MODEL_FOENIX_A2560U #elif MODEL == MODEL_FOENIX_A2560U_PLUS
const char * title_1 = "\x1b[37m A 2222 55555 666 000 U U +"; const char * title_1 = "\x1b[37m A 2222 55555 666 000 U U +";
const char * title_2 = "\x1b[37m A A 2 5 6 0 0 U U +"; const char * title_2 = "\x1b[37m A A 2 5 6 0 0 U U +";
const char * title_3 = "\x1b[37m AAAAA 222 555 6666 0 0 U U +++++"; const char * title_3 = "\x1b[37m AAAAA 222 555 6666 0 0 U U +++++";
@ -370,6 +293,7 @@ int main(int argc, char * argv[]) {
char welcome[255]; char welcome[255];
short result; short result;
short i;
initialize(); initialize();
@ -379,6 +303,13 @@ int main(int argc, char * argv[]) {
sprintf(welcome, "Foenix/MCP v%02d.%02d-alpha+%04d\n\nType \"HELP\" or \"?\" for command summary.", VER_MAJOR, VER_MINOR, VER_BUILD); sprintf(welcome, "Foenix/MCP v%02d.%02d-alpha+%04d\n\nType \"HELP\" or \"?\" for command summary.", VER_MAJOR, VER_MINOR, VER_BUILD);
sys_chan_write(0, welcome, strlen(welcome)); sys_chan_write(0, welcome, strlen(welcome));
// #if MODEL == MODEL_FOENIX_A2560K
// fdc_init();
// if (fdc_ioctrl(FDC_CTRL_MOTOR_ON, 0, 0)) {
// log(LOG_ERROR, "Could not turn on the floppy drive motor.");
// }
// #endif
cli_repl(0); cli_repl(0);
log(LOG_INFO, "Stopping."); log(LOG_INFO, "Stopping.");

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* /*
* Registers and memory blocks for VICKY III * Registers and memory blocks for VICKY III for the A2560K
*/ */
#ifndef __VICKYIII_General_H #ifndef __VICKYIII_General_H
@ -15,11 +15,23 @@
#define VKY3_MCR_GRAPH_EN 0x00000004 /* Graphic Mode Enable */ #define VKY3_MCR_GRAPH_EN 0x00000004 /* Graphic Mode Enable */
#define VKY3_MCR_BITMAP_EN 0x00000008 /* Bitmap Engine Enable */ #define VKY3_MCR_BITMAP_EN 0x00000008 /* Bitmap Engine Enable */
#define VKY3_MCR_RESOLUTION_MASK 0x00000300 /* Resolution - 00: 640x480, 01:800x600, 10: 1024x768, 11: 640x400 */ #define VKY3_MCR_RESOLUTION_MASK 0x00000300 /* Resolution - 00: 640x480, 01:800x600, 10: 1024x768, 11: 640x400 */
#define VKY3_MCR_640x480 0x00000000
#define VKY3_MCR_800x600 0x00000100
#define VKY3_MCR_1024x768 0x00000200
#define VKY3_MCR_640x400 0x00000300
#define VKY3_MCR_DOUBLE_EN 0x00000400 /* Doubling Pixel */ #define VKY3_MCR_DOUBLE_EN 0x00000400 /* Doubling Pixel */
#define VKY3_MCR_GAMMA_EN 0x00010000 /* GAMMA Enable */ #define VKY3_MCR_GAMMA_EN 0x00010000 /* GAMMA Enable */
#define VKY3_MCR_MANUAL_GAMMA_EN 0x00020000 /* Enable Manual GAMMA Enable */ #define VKY3_MCR_MANUAL_GAMMA_EN 0x00020000 /* Enable Manual GAMMA Enable */
#define VKY3_MCR_BLANK_EN 0x00040000 /* Turn OFF sync (to monitor in sleep mode) */ #define VKY3_MCR_BLANK_EN 0x00040000 /* Turn OFF sync (to monitor in sleep mode) */
/* Access to DIP switch information (read only) */
#define VKY3_DIP_REG ((volatile unsigned short *)0x00C40002)
/* Bits 0 - 12: Master Control Register data */
#define VKY3_DIP_GAMMA 0x2000 /* DIP switch indication for Gamma correction */
#define VKY3_DIP_HIRES 0x4000 /* DIP switch for high resolution mode */
#define VKY3_PLL_ACTIVE_CLK 0x8000 /* Active Clock --- 0: 25.175Mhz, 1: 40Mhz */
#define BorderControlReg_L_A ((volatile uint32_t *)0x00C40004) #define BorderControlReg_L_A ((volatile uint32_t *)0x00C40004)
#define VKY3_BRDR_EN 0x00000001 /* Border Enable */ #define VKY3_BRDR_EN 0x00000001 /* Border Enable */
#define VKY3_X_SCROLL_MASK 0x00000070 /* X Scroll */ #define VKY3_X_SCROLL_MASK 0x00000070 /* X Scroll */

View file

@ -0,0 +1,43 @@
/*
* Define the locations of all the FDC registers
*/
#ifndef __FDC_A2560K_H
#define __FDC_A2560K_H
#define FDC_BASE ((volatile unsigned char *)0x00C023F0)
#define FDC_DOR ((volatile unsigned char *)0x00C023F2) /* Read/Write - Digital Output Register */
// FDC_DOR_DSEL0 = $01 ; Drive 0 Select
// FDC_DOR_DSEL1 = $02 ; Drive 1 Select
// FDC_DOR_NRESET = $04 ; Reset the FDC
// FDC_DOR_DMAEN = $08 ; Enable DMA
// FDC_DOR_MOT0 = $10 ; Turn on motor 0
// FDC_DOR_MOT1 = $20 ; Turn on motor 1
// FDC_DOR_MOT2 = $40 ; Turn on motor 2
// FDC_DOR_MOT3 = $80 ; Turn on motor 3
#define FDC_MSR ((volatile unsigned char *)0x00C023F4) /* Read - Main Status Register */
// FDC_MSR_DRV0BSY = $01 ; Indicates if drive 0 is busy
// FDC_MSR_DRV1BSY = $02 ; Indicates if drive 1 is busy
// FDC_MSR_CMDBSY = $10 ; Indicates if a command is in progress
// FDC_MSR_NONDMA = $20 ;
// FDC_MSR_DIO = $40 ; Data direction: 1 = read, 0 = write
// FDC_MSR_RQM = $80 ; 1 = host can transfer data, 0 = host must wait
#define FDC_DSR ((volatile unsigned char *)0x00C023F4) /* Write - Data Select Register */
// ; Bit[0..1] = data rate
// ; Bit[2..4] = precompensation select
// FDC_DSR_LOPWR = $40 ; Turn on low power mode
// FDC_DSR_RESET = $80 ; Software reset of the FDC
#define FDC_DATA ((volatile unsigned char *)0x00C023F5) /* Read/Write - Data - FIFO */
#define FDC_RSV ((volatile unsigned char *)0x00C023F6) /* Reserved */
#define FDC_DIR ((volatile unsigned char *)0x00C023F7) /* Read - Digital Input Register */
// FDC_DIR_DSKCHG = $80 ; Indicates if the disk has changed
#define FDC_CCR ((volatile unsigned char *)0x00C023F7) /* Write - Configuration Control Register */
// ; Bit[0..1] = Data rate
#endif

View file

@ -7,121 +7,12 @@
#define PATA_DATA_16 ((volatile unsigned short *)0x00C00400) #define PATA_DATA_16 ((volatile unsigned short *)0x00C00400)
#define PATA_DATA_8 ((volatile unsigned char *)0x00C00400) #define PATA_DATA_8 ((volatile unsigned char *)0x00C00400)
#define PATA_ERROR ((volatile unsigned char *)0x00C00402) #define PATA_ERROR ((volatile unsigned char *)0x00C00402)
#define PATA_ERR_AMNF 0x01 // Error: Address mark not found
#define PATA_ERR_TKZNF 0x02 // Error: Track 0 not found
#define PATA_ERR_ABRT 0x04 // Error: Aborted command
#define PATA_ERR_MCR 0x08 // Error: Media change request
#define PATA_ERR_IDNF 0x10 // Error: ID not found
#define PATA_ERR_MC 0x20 // Error: Media change
#define PATA_ERR_UNC 0x40 // Error: Uncorrectable data error
#define PATA_ERR_BBK 0x80 // Error: Bad block detected
#define PATA_SECT_CNT ((volatile unsigned char *)0x00C00404) #define PATA_SECT_CNT ((volatile unsigned char *)0x00C00404)
#define PATA_SECT_SRT ((volatile unsigned char *)0x00C00406) #define PATA_SECT_SRT ((volatile unsigned char *)0x00C00406)
#define PATA_CLDR_LO ((volatile unsigned char *)0x00C00408) #define PATA_CLDR_LO ((volatile unsigned char *)0x00C00408)
#define PATA_CLDR_HI ((volatile unsigned char *)0x00C0040A) #define PATA_CLDR_HI ((volatile unsigned char *)0x00C0040A)
#define PATA_HEAD ((volatile unsigned char *)0x00C0040C) #define PATA_HEAD ((volatile unsigned char *)0x00C0040C)
#define PATA_CMD_STAT ((volatile unsigned char *)0x00C0040E) #define PATA_CMD_STAT ((volatile unsigned char *)0x00C0040E)
#define PATA_STAT_BSY 0x80 // BSY (Busy) is set whenever the device has control of the command Block Registers.
#define PATA_STAT_DRDY 0x40 // DRDY (Device Ready) is set to indicate that the device is capable of accepting all command codes.
#define PATA_STAT_DF 0x20 // DF (Device Fault) indicates a device fault error has been detected.
#define PATA_STAT_DSC 0x10 // DSC (Device Seek Complete) indicates that the device heads are settled over a track.
#define PATA_STAT_DRQ 0x08 // DRQ (Data Request) indicates that the device is ready to transfer a unsigned short or char of data between
// the host and the device.
#define PATA_STAT_CORR 0x04 // CORR (Corrected Data) is used to indicate a correctable data error.
#define PATA_STAT_IDX 0x02 // Vendor specific bit
#define PATA_STAT_ERR 0x01 // ERR (Error) indicates that an error occurred during execution of the previous command.
#define PATA_CMD_INIT 0x00
#define PATA_CMD_READ_SECTOR 0x20 // 0x21
#define PATA_CMD_WRITE_SECTOR 0x30
#define PATA_CMD_IDENTITY 0xEC
/*
* - BSY (Busy) is set whenever the device has control of the command
* Block Registers. When the BSY bit is equal to one, a write to a
* command block register by the host shall be ignored by the
* device.
*
* The device shall not change the state of the DRQ bit unless the
* BSY bit is equal to one. When the last block of a PIO data in
* command has been transferred by the host, then the DRQ bit is
* cleared without the BSY bit being set.
*
* When the BSY bit equals zero, the device may only change the IDX,
* DRDY, DF, DSC, and CORR bits in the Status register and the Data
* register. None of the other command block registers nor other
* bits within the Status register shall be changed by the device.
*
* NOTE - BIOSs and software device drivers that sample status as
* soon as the BSY bit is cleared to zero may not detect the
* assertion of the CORR bit by the device. After the host has
* written the Command register either the BSY bit shall be set, or
* if the BSY bit is cleared, the DRQ bit shall be set, until
* command completion.
*
* NOTE - The BSY bit is set and then cleared so quickly, that host
* detection of the BSY bit being set is not certain.
*
* The BSY bit shall be set by the device under the following
* circumstances:
* a) within 400 ns after either the negation of RESET- or the
* setting of the SRST bit in the Device Control register;
* b) within 400 ns after writing the Command register if the DRQ
* bit is not set;
* c) between blocks of a data transfer during PIO data in
* commands if the DRQ bit is not set;
* d) after the transfer of a data block during PIO data out
* commands if the DRQ bit is not set;
* e) during the data transfer of DMA commands if the DRQ bit is
* not set.
*
* The device shall not set the BSY bit at any other time.
*
* - DRDY (Device Ready) is set to indicate that the device is capable
* of accepting all command codes. This bit shall be cleared at
* power on. Devices that implement the power management features
* shall maintain the DRDY bit equal to one when they are in the
* Idle or Standby power modes. When the state of the DRDY bit
* changes, it shall not change again until after the host reads the
* status register.
*
* When the DRDY bit is equal to zero, a device responds as follows:
* a) the device shall accept and attempt to execute the EXECUTE
* DEVICE DIAGNOSTIC and INITIALIZE DEVICE PARAMETERS commands;
* b) If a device accepts commands other than EXECUTE DEVICE
* DIAGNOSTIC and INITIALIZE DEVICE PARAMETERS during the time the
* DRDY bit is equal to zero, the results are vendor specific.
*
* - DF (Device Fault) indicates a device fault error has been
* detected. The internal status or internal conditions that causes
* this error to be indicated is vendor specific.
*
* - DSC (Device Seek Complete) indicates that the device heads are
* settled over a track. When an error occurs, this bit shall not be
* changed until the Status register is read by the host, at which
* time the bit again indicates the current Seek Complete status.
*
* - DRQ (Data Request) indicates that the device is ready to transfer
* a unsigned short or char of data between the host and the device.
*
* - CORR (Corrected Data) is used to indicate a correctable data
* error. The definition of what constitutes a correctable error is
* vendor specific. This condition does not terminate a data
* transfer.
*
* - IDX (Index) is vendor specific.
*
* - ERR (Error) indicates that an error occurred during execution of
* the previous command. The bits in the Error register have
* additional information regarding the cause of the error. Once the
* device has set the error bit, the device shall not change the
* contents of the following items until a new command has been
* accepted, the SRST bit is set to one, or RESET- is asserted: the
* ERR bit in the Status register.
*/
#endif #endif

View file

@ -0,0 +1,14 @@
#ifndef __PS2_A2560K_H
#define __PS2_A2560K_H
/*
* Ports for the PS/2 keyboard and mouse on the A2560K
*/
#define PS2_STATUS ((unsigned char *)0x00C02064)
#define PS2_CMD_BUF ((unsigned char *)0x00C02064)
#define PS2_OUT_BUF ((unsigned char *)0x00C02060)
#define PS2_INPT_BUF ((unsigned char *)0x00C02060)
#define PS2_DATA_BUF ((unsigned char *)0x00C02060)
#endif

View file

@ -5,29 +5,9 @@
#ifndef __SDC_A2560K_H #ifndef __SDC_A2560K_H
#define __SDC_A2560K_H #define __SDC_A2560K_H
// SDC_TRANS_TYPE_REG #define GABE_SDC_REG ((volatile unsigned short *)0x00C0051A)
#define SDC_TRANS_DIRECT 0x00 // 00 = Direct Access #define GABE_SDC_PRESENT 0x0010 /* Is an SD card present? --- 0:Yes, 1:No */
#define SDC_TRANS_INIT_SD 0x01 // 01 = Init SD #define GABE_SDC_WPROT 0x0020 /* Is the SD card write protected? --- 0:Yes, 1:No */
#define SDC_TRANS_READ_BLK 0x02 // 10 = RW_READ_BLOCK (512 Bytes)
#define SDC_TRANS_WRITE_BLK 0x03 // 11 = RW_WRITE_SD_BLOCK
// SDC_TRANS_CONTROL_REG
#define SDC_TRANS_START 0x01
// SDC_TRANS_STATUS_REG
#define SDC_TRANS_BUSY 0x01 // 1= Transaction Busy
// SDC_TRANS_ERROR_REG
#define SDC_TRANS_INIT_NO_ERR 0x00 // Init Error Report [1:0]
#define SDC_TRANS_INIT_CMD0_ERR 0x01
#define SDC_TRANS_INIT_CMD1_ERR 0x02
#define SDC_TRANS_RD_NO_ERR 0x00 // Read Error Report [3:2]
#define SDC_TRANS_RD_CMD_ERR 0x04
#define SDC_TRANS_RD_TOKEN_ERR 0x08
#define SDC_TRANS_WR_NO_ERR 0x00 // Write Report Error [5:4]
#define SDC_TRANS_WR_CMD_ERR 0x10
#define SDC_TRANS_WR_DATA_ERR 0x20
#define SDC_TRANS_WR_BUSY_ERR 0x30
#define SDC_VERSION_REG ((unsigned char *)0x00C00300) #define SDC_VERSION_REG ((unsigned char *)0x00C00300)
#define SDC_CONTROL_REG ((unsigned char *)0x00C00301) #define SDC_CONTROL_REG ((unsigned char *)0x00C00301)

View file

@ -0,0 +1,212 @@
/*
* Sound device register definitions for the A2560K
*/
#ifndef __SOUND_A2560K_H
#define __SOUND_A2560K_H
#define PSG_PORT ((volatile unsigned char *)0x00C20100) /* Control register for the SN76489 */
#define OPL3_PORT ((volatile unsigned char *)0x00C20200) /* Access port for the OPL3 */
#define OPM_EXT_BASE ((volatile unsigned char *)0x00C20600) /* External OPM base address */
#define OPN2_EXT_BASE ((volatile unsigned char *)0x00C20400) /* External OPN2 base address */
#define OPM_INT_BASE ((volatile unsigned char *)0x00C20C00) /* Internal OPM base address */
#define OPN2_INT_BASE ((volatile unsigned char *)0x00C20A00) /* Internal OPN2 base address */
#define CODEC ((volatile unsigned short *)0x00C20E00) /* Control register for the CODEC */
/*
* A2560K supports two external, physical SID chips.
* It also implements the Gideon FPGA based SID in either stereo or mono (neutral) form
*
* $00C20800..$00C008FF - Extern Left SID
* $00C20900..$00C009FF - Extern Right SID
* $00C21000..$00C211FF - Internal SID Left
* $00C21200..$00C213FF - Internal SID Right
* $00C21400..$00C215FF - Internal SID Neutral
*/
/*
* External SID Left Channel
*/
#define SID_EXT_L_V1_FREQ_LO ((unsigned char *)0x00C20800)
#define SID_EXT_L_V1_FREQ_HI ((unsigned char *)0x00C20801)
#define SID_EXT_L_V1_PW_LO ((unsigned char *)0x00C20802)
#define SID_EXT_L_V1_PW_HI ((unsigned char *)0x00C20803)
#define SID_EXT_L_V1_CTRL ((unsigned char *)0x00C20804)
#define SID_EXT_L_V1_ATCK_DECY ((unsigned char *)0x00C20805)
#define SID_EXT_L_V1_SSTN_RLSE ((unsigned char *)0x00C20806)
#define SID_EXT_L_V2_FREQ_LO ((unsigned char *)0x00C20807)
#define SID_EXT_L_V2_FREQ_HI ((unsigned char *)0x00C20808)
#define SID_EXT_L_V2_PW_LO ((unsigned char *)0x00C20809)
#define SID_EXT_L_V2_PW_HI ((unsigned char *)0x00C2080A)
#define SID_EXT_L_V2_CTRL ((unsigned char *)0x00C2080B)
#define SID_EXT_L_V2_ATCK_DECY ((unsigned char *)0x00C2080C)
#define SID_EXT_L_V2_SSTN_RLSE ((unsigned char *)0x00C2080D)
#define SID_EXT_L_V3_FREQ_LO ((unsigned char *)0x00C2080E)
#define SID_EXT_L_V3_FREQ_HI ((unsigned char *)0x00C2080F)
#define SID_EXT_L_V3_PW_LO ((unsigned char *)0x00C20810)
#define SID_EXT_L_V3_PW_HI ((unsigned char *)0x00C20811)
#define SID_EXT_L_V3_CTRL ((unsigned char *)0x00C20812)
#define SID_EXT_L_V3_ATCK_DECY ((unsigned char *)0x00C20813)
#define SID_EXT_L_V3_SSTN_RLSE ((unsigned char *)0x00C20814)
#define SID_EXT_L_FC_LO ((unsigned char *)0x00C20815)
#define SID_EXT_L_FC_HI ((unsigned char *)0x00C20816)
#define SID_EXT_L_RES_FILT ((unsigned char *)0x00C20817)
#define SID_EXT_L_MODE_VOL ((unsigned char *)0x00C20818)
#define SID_EXT_L_POT_X ((unsigned char *)0x00C20819)
#define SID_EXT_L_POT_Y ((unsigned char *)0x00C2081A)
#define SID_EXT_L_OSC3_RND ((unsigned char *)0x00C2081B)
#define SID_EXT_L_ENV3 ((unsigned char *)0x00C2081C)
#define SID_EXT_L_NOT_USED0 ((unsigned char *)0x00C2081D)
#define SID_EXT_L_NOT_USED1 ((unsigned char *)0x00C2081E)
#define SID_EXT_L_NOT_USED2 ((unsigned char *)0x00C2081F)
/*
* External SID Right Channel
*/
#define SID_EXT_R_V1_FREQ_LO ((unsigned char *)0x00C20900)
#define SID_EXT_R_V1_FREQ_HI ((unsigned char *)0x00C20901)
#define SID_EXT_R_V1_PW_LO ((unsigned char *)0x00C20902)
#define SID_EXT_R_V1_PW_HI ((unsigned char *)0x00C20903)
#define SID_EXT_R_V1_CTRL ((unsigned char *)0x00C20904)
#define SID_EXT_R_V1_ATCK_DECY ((unsigned char *)0x00C20905)
#define SID_EXT_R_V1_SSTN_RLSE ((unsigned char *)0x00C20906)
#define SID_EXT_R_V2_FREQ_LO ((unsigned char *)0x00C20907)
#define SID_EXT_R_V2_FREQ_HI ((unsigned char *)0x00C20908)
#define SID_EXT_R_V2_PW_LO ((unsigned char *)0x00C20909)
#define SID_EXT_R_V2_PW_HI ((unsigned char *)0x00C2090A)
#define SID_EXT_R_V2_CTRL ((unsigned char *)0x00C2090B)
#define SID_EXT_R_V2_ATCK_DECY ((unsigned char *)0x00C2090C)
#define SID_EXT_R_V2_SSTN_RLSE ((unsigned char *)0x00C2090D)
#define SID_EXT_R_V3_FREQ_LO ((unsigned char *)0x00C2090E)
#define SID_EXT_R_V3_FREQ_HI ((unsigned char *)0x00C2090F)
#define SID_EXT_R_V3_PW_LO ((unsigned char *)0x00C20910)
#define SID_EXT_R_V3_PW_HI ((unsigned char *)0x00C20911)
#define SID_EXT_R_V3_CTRL ((unsigned char *)0x00C20912)
#define SID_EXT_R_V3_ATCK_DECY ((unsigned char *)0x00C20913)
#define SID_EXT_R_V3_SSTN_RLSE ((unsigned char *)0x00C20914)
#define SID_EXT_R_FC_LO ((unsigned char *)0x00C20915)
#define SID_EXT_R_FC_HI ((unsigned char *)0x00C20916)
#define SID_EXT_R_RES_FILT ((unsigned char *)0x00C20917)
#define SID_EXT_R_MODE_VOL ((unsigned char *)0x00C20918)
#define SID_EXT_R_POT_X ((unsigned char *)0x00C20919)
#define SID_EXT_R_POT_Y ((unsigned char *)0x00C2091A)
#define SID_EXT_R_OSC3_RND ((unsigned char *)0x00C2091B)
#define SID_EXT_R_ENV3 ((unsigned char *)0x00C2091C)
#define SID_EXT_R_NOT_USED0 ((unsigned char *)0x00C2091D)
#define SID_EXT_R_NOT_USED1 ((unsigned char *)0x00C2091E)
#define SID_EXT_R_NOT_USED2 ((unsigned char *)0x00C2091F)
/*
* Internal SID Left Channel
*/
#define SID_INT_L_V1_FREQ_LO ((unsigned char *)0x00C21000)
#define SID_INT_L_V1_FREQ_HI ((unsigned char *)0x00C21001)
#define SID_INT_L_V1_PW_LO ((unsigned char *)0x00C21002)
#define SID_INT_L_V1_PW_HI ((unsigned char *)0x00C21003)
#define SID_INT_L_V1_CTRL ((unsigned char *)0x00C21004)
#define SID_INT_L_V1_ATCK_DECY ((unsigned char *)0x00C21005)
#define SID_INT_L_V1_SSTN_RLSE ((unsigned char *)0x00C21006)
#define SID_INT_L_V2_FREQ_LO ((unsigned char *)0x00C21007)
#define SID_INT_L_V2_FREQ_HI ((unsigned char *)0x00C21008)
#define SID_INT_L_V2_PW_LO ((unsigned char *)0x00C21009)
#define SID_INT_L_V2_PW_HI ((unsigned char *)0x00C2100A)
#define SID_INT_L_V2_CTRL ((unsigned char *)0x00C2100B)
#define SID_INT_L_V2_ATCK_DECY ((unsigned char *)0x00C2100C)
#define SID_INT_L_V2_SSTN_RLSE ((unsigned char *)0x00C2100D)
#define SID_INT_L_V3_FREQ_LO ((unsigned char *)0x00C2100E)
#define SID_INT_L_V3_FREQ_HI ((unsigned char *)0x00C2100F)
#define SID_INT_L_V3_PW_LO ((unsigned char *)0x00C21010)
#define SID_INT_L_V3_PW_HI ((unsigned char *)0x00C21011)
#define SID_INT_L_V3_CTRL ((unsigned char *)0x00C21012)
#define SID_INT_L_V3_ATCK_DECY ((unsigned char *)0x00C21013)
#define SID_INT_L_V3_SSTN_RLSE ((unsigned char *)0x00C21014)
#define SID_INT_L_FC_LO ((unsigned char *)0x00C21015)
#define SID_INT_L_FC_HI ((unsigned char *)0x00C21016)
#define SID_INT_L_RES_FILT ((unsigned char *)0x00C21017)
#define SID_INT_L_MODE_VOL ((unsigned char *)0x00C21018)
#define SID_INT_L_POT_X ((unsigned char *)0x00C21019)
#define SID_INT_L_POT_Y ((unsigned char *)0x00C2101A)
#define SID_INT_L_OSC3_RND ((unsigned char *)0x00C2101B)
#define SID_INT_L_ENV3 ((unsigned char *)0x00C2101C)
#define SID_INT_L_NOT_USED0 ((unsigned char *)0x00C2101D)
#define SID_INT_L_NOT_USED1 ((unsigned char *)0x00C2101E)
#define SID_INT_L_NOT_USED2 ((unsigned char *)0x00C2101F)
/*
* Internal SID Right Channel
*/
#define SID_INT_R_V1_FREQ_LO ((unsigned char *)0x00C21200)
#define SID_INT_R_V1_FREQ_HI ((unsigned char *)0x00C21201)
#define SID_INT_R_V1_PW_LO ((unsigned char *)0x00C21202)
#define SID_INT_R_V1_PW_HI ((unsigned char *)0x00C21203)
#define SID_INT_R_V1_CTRL ((unsigned char *)0x00C21204)
#define SID_INT_R_V1_ATCK_DECY ((unsigned char *)0x00C21205)
#define SID_INT_R_V1_SSTN_RLSE ((unsigned char *)0x00C21206)
#define SID_INT_R_V2_FREQ_LO ((unsigned char *)0x00C21207)
#define SID_INT_R_V2_FREQ_HI ((unsigned char *)0x00C21208)
#define SID_INT_R_V2_PW_LO ((unsigned char *)0x00C21209)
#define SID_INT_R_V2_PW_HI ((unsigned char *)0x00C2120A)
#define SID_INT_R_V2_CTRL ((unsigned char *)0x00C2120B)
#define SID_INT_R_V2_ATCK_DECY ((unsigned char *)0x00C2120C)
#define SID_INT_R_V2_SSTN_RLSE ((unsigned char *)0x00C2120D)
#define SID_INT_R_V3_FREQ_LO ((unsigned char *)0x00C2120E)
#define SID_INT_R_V3_FREQ_HI ((unsigned char *)0x00C2120F)
#define SID_INT_R_V3_PW_LO ((unsigned char *)0x00C21210)
#define SID_INT_R_V3_PW_HI ((unsigned char *)0x00C21211)
#define SID_INT_R_V3_CTRL ((unsigned char *)0x00C21212)
#define SID_INT_R_V3_ATCK_DECY ((unsigned char *)0x00C21213)
#define SID_INT_R_V3_SSTN_RLSE ((unsigned char *)0x00C21214)
#define SID_INT_R_FC_LO ((unsigned char *)0x00C21215)
#define SID_INT_R_FC_HI ((unsigned char *)0x00C21216)
#define SID_INT_R_RES_FILT ((unsigned char *)0x00C21217)
#define SID_INT_R_MODE_VOL ((unsigned char *)0x00C21218)
#define SID_INT_R_POT_X ((unsigned char *)0x00C21219)
#define SID_INT_R_POT_Y ((unsigned char *)0x00C2121A)
#define SID_INT_R_OSC3_RND ((unsigned char *)0x00C2121B)
#define SID_INT_R_ENV3 ((unsigned char *)0x00C2121C)
#define SID_INT_R_NOT_USED0 ((unsigned char *)0x00C2121D)
#define SID_INT_R_NOT_USED1 ((unsigned char *)0x00C2121E)
#define SID_INT_R_NOT_USED2 ((unsigned char *)0x00C2121F)
/*
* Internal SID Neutral Channel - When writting here, the value is written in R and L Channel at the same time
*/
#define SID_INT_N_V1_FREQ_LO ((unsigned char *)0x00C41200)
#define SID_INT_N_V1_FREQ_HI ((unsigned char *)0x00C41201)
#define SID_INT_N_V1_PW_LO ((unsigned char *)0x00C41202)
#define SID_INT_N_V1_PW_HI ((unsigned char *)0x00C41203)
#define SID_INT_N_V1_CTRL ((unsigned char *)0x00C41204)
#define SID_INT_N_V1_ATCK_DECY ((unsigned char *)0x00C41205)
#define SID_INT_N_V1_SSTN_RLSE ((unsigned char *)0x00C41206)
#define SID_INT_N_V2_FREQ_LO ((unsigned char *)0x00C41207)
#define SID_INT_N_V2_FREQ_HI ((unsigned char *)0x00C41208)
#define SID_INT_N_V2_PW_LO ((unsigned char *)0x00C41209)
#define SID_INT_N_V2_PW_HI ((unsigned char *)0x00C4120A)
#define SID_INT_N_V2_CTRL ((unsigned char *)0x00C4120B)
#define SID_INT_N_V2_ATCK_DECY ((unsigned char *)0x00C4120C)
#define SID_INT_N_V2_SSTN_RLSE ((unsigned char *)0x00C4120D)
#define SID_INT_N_V3_FREQ_LO ((unsigned char *)0x00C4120E)
#define SID_INT_N_V3_FREQ_HI ((unsigned char *)0x00C4120F)
#define SID_INT_N_V3_PW_LO ((unsigned char *)0x00C41210)
#define SID_INT_N_V3_PW_HI ((unsigned char *)0x00C41211)
#define SID_INT_N_V3_CTRL ((unsigned char *)0x00C41212)
#define SID_INT_N_V3_ATCK_DECY ((unsigned char *)0x00C41213)
#define SID_INT_N_V3_SSTN_RLSE ((unsigned char *)0x00C41214)
#define SID_INT_N_FC_LO ((unsigned char *)0x00C41215)
#define SID_INT_N_FC_HI ((unsigned char *)0x00C41216)
#define SID_INT_N_RES_FILT ((unsigned char *)0x00C41217)
#define SID_INT_N_MODE_VOL ((unsigned char *)0x00C41218)
#define SID_INT_N_POT_X ((unsigned char *)0x00C41219)
#define SID_INT_N_POT_Y ((unsigned char *)0x00C4121A)
#define SID_INT_N_OSC3_RND ((unsigned char *)0x00C4121B)
#define SID_INT_N_ENV3 ((unsigned char *)0x00C4121C)
#define SID_INT_N_NOT_USED0 ((unsigned char *)0x00C4121D)
#define SID_INT_N_NOT_USED1 ((unsigned char *)0x00C4121E)
#define SID_INT_N_NOT_USED2 ((unsigned char *)0x00C4121F)
#endif

View file

@ -0,0 +1,98 @@
/*
* Registers and memory blocks for VICKY III on the A2560U and A2560U+
*/
#ifndef __VICKYIII_General_H
#define __VICKYIII_General_H
/*
* Screen Channel A
*/
#define MasterControlReg_A ((volatile unsigned long *)0x00B40000)
#define VKY3_MCR_TEXT_EN 0x00000001 /* Text Mode Enable */
#define VKY3_MCR_TEXT_OVRLY 0x00000002 /* Text Mode overlay */
#define VKY3_MCR_GRAPH_EN 0x00000004 /* Graphic Mode Enable */
#define VKY3_MCR_BITMAP_EN 0x00000008 /* Bitmap Engine Enable */
#define VKY3_MCR_RESOLUTION_MASK 0x00000300 /* Resolution - 00: 640x480, 01:800x600, 10: 1024x768, 11: 640x400 */
#define VKY3_MCR_640x480 0x00000000
#define VKY3_MCR_800x600 0x00000100
#define VKY3_MCR_1024x768 0x00000200
#define VKY3_MCR_640x400 0x00000300
#define VKY3_MCR_DOUBLE_EN 0x00000400 /* Doubling Pixel */
#define VKY3_MCR_GAMMA_EN 0x00010000 /* GAMMA Enable */
#define VKY3_MCR_MANUAL_GAMMA_EN 0x00020000 /* Enable Manual GAMMA Enable */
#define VKY3_MCR_BLANK_EN 0x00040000 /* Turn OFF sync (to monitor in sleep mode) */
/* Access to DIP switch information (read only) */
#define VKY3_DIP_REG ((volatile unsigned short *)0x00B40002)
/* Bits 0 - 12: Master Control Register data */
#define VKY3_DIP_GAMMA 0x2000 /* DIP switch indication for Gamma correction */
#define VKY3_DIP_HIRES 0x4000 /* DIP switch for high resolution mode */
#define VKY3_PLL_ACTIVE_CLK 0x8000 /* Active Clock --- 0: 25.175Mhz, 1: 40Mhz */
#define BorderControlReg_L_A ((volatile unsigned long *)0x00B40004)
#define VKY3_BRDR_EN 0x00000001 /* Border Enable */
#define VKY3_X_SCROLL_MASK 0x00000070 /* X Scroll */
#define VKY3_X_SIZE_MASK 0x00003f00 /* X Size */
#define VKY3_Y_SIZE_MASK 0x003f0000 /* Y Size */
#define BorderControlReg_H_A ((volatile unsigned long *)0x00B40008)
#define BackGroundControlReg_A ((volatile unsigned long *)0x00B4000C)
#define CursorControlReg_L_A ((volatile unsigned long *)0x00B40010)
#define CursorControlReg_H_A ((volatile unsigned long *)0x00B40014)
#define LineInterrupt0_A ((volatile unsigned short *)0x00B40018)
#define LineInterrupt1_A ((volatile unsigned short *)0x00B4001A)
#define LineInterrupt2_A ((volatile unsigned short *)0x00B4001C)
#define LineInterrupt3_A ((volatile unsigned short *)0x00B4001E)
#define MousePointer_Mem_A ((volatile unsigned short *)0x00B40400)
#define MousePtr_A_CTRL_Reg ((volatile unsigned short *)0x00B40C00)
#define MousePtr_En 0x0001
#define MousePtr_A_X_Pos ((volatile unsigned short *)0x00B40C02)
#define MousePtr_A_Y_Pos ((volatile unsigned short *)0x00B40C04)
#define MousePtr_A_Mouse0 ((volatile unsigned short *)0x00B40C0A)
#define MousePtr_A_Mouse1 ((volatile unsigned short *)0x00B40C0C)
#define MousePtr_A_Mouse2 ((volatile unsigned short *)0x00B40C0E)
#define ScreenText_A ((volatile char *)0x00B60000) /* Text matrix */
#define ColorText_A ((volatile unsigned char *)0x00B68000) /* Color matrix */
#define FG_CLUT_A ((volatile unsigned short *)0x00B6C400) /* Foreground LUT */
#define BG_CLUT_A ((volatile unsigned short *)0x00B6C440) /* Background LUT */
#define BM0_Control_Reg ((volatile unsigned long *)0x00B40100)
#define BM0_Addy_Pointer_Reg ((volatile unsigned long *)0x00B40104)
#define Sprite_0_CTRL ((volatile unsigned short *)0x00B41000)
#define Sprite_0_ADDY_HI ((volatile unsigned short *)0x00B41002)
#define Sprite_0_POS_X ((volatile unsigned short *)0x00B41004)
#define Sprite_0_POS_Y ((volatile unsigned short *)0x00B41006)
/*
* Color lookup tables
*/
#define LUT_0 ((volatile unsigned char *)0x00B42000)
#define LUT_1 ((volatile unsigned char *)0x00B42400)
#define LUT_2 ((volatile unsigned char *)0x00B42800)
#define LUT_3 ((volatile unsigned char *)0x00B42C00)
#define LUT_4 ((volatile unsigned char *)0x00B43000)
#define LUT_5 ((volatile unsigned char *)0x00B43400)
#define LUT_6 ((volatile unsigned char *)0x00B43800)
#define LUT_7 ((volatile unsigned char *)0x00B43C00)
/*
* Text mode font memory
*/
#define VICKY_TXT_FONT_A ((volatile unsigned char *)0x00B48000) /* $00C48000..$00C48FFF - FONT MEMORY Channel A */
/*
* Location of VRAM
*/
#define VRAM_Bank0 ((volatile unsigned char *)0x00C00000)
#endif

View file

@ -0,0 +1,18 @@
/*
* Definitions to access the PATA port on the A2560U and A2560U+
*/
#ifndef __PATA_A2560U_H
#define __PATA_A2560U_H
#define PATA_DATA_16 ((volatile unsigned short *)0x00B00400)
#define PATA_DATA_8 ((volatile unsigned char *)0x00B00400)
#define PATA_ERROR ((volatile unsigned char *)0x00B00402)
#define PATA_SECT_CNT ((volatile unsigned char *)0x00B00404)
#define PATA_SECT_SRT ((volatile unsigned char *)0x00B00406)
#define PATA_CLDR_LO ((volatile unsigned char *)0x00B00408)
#define PATA_CLDR_HI ((volatile unsigned char *)0x00B0040A)
#define PATA_HEAD ((volatile unsigned char *)0x00B0040C)
#define PATA_CMD_STAT ((volatile unsigned char *)0x00B0040E)
#endif

View file

@ -0,0 +1,14 @@
#ifndef __PS2_A2560U_H
#define __PS2_A2560U_H
/*
* Ports for the PS/2 keyboard and mouse on the A2560U and A2560U+
*/
#define PS2_STATUS ((unsigned char *)0x00B02804)
#define PS2_CMD_BUF ((unsigned char *)0x00B02804)
#define PS2_OUT_BUF ((unsigned char *)0x00B02800)
#define PS2_INPT_BUF ((unsigned char *)0x00B02800)
#define PS2_DATA_BUF ((unsigned char *)0x00B02800)
#endif

View file

@ -0,0 +1,35 @@
/*
* Definitions for access to the SDC controller for the A2560U and A2560U+
*/
#ifndef __SDC_A2560U_H
#define __SDC_A2560U_H
#define GABE_SDC_REG ((volatile unsigned short *)0x00B0051A)
#define GABE_SDC_PRESENT 0x0010 /* Is an SD card present? --- 0:Yes, 1:No */
#define GABE_SDC_WPROT 0x0020 /* Is the SD card write protected? --- 0:Yes, 1:No */
#define SDC_VERSION_REG ((unsigned char *)0x00B00300)
#define SDC_CONTROL_REG ((unsigned char *)0x00B00301)
#define SDC_TRANS_TYPE_REG ((unsigned char *)0x00B00302)
#define SDC_TRANS_CONTROL_REG ((unsigned char *)0x00B00303)
#define SDC_TRANS_STATUS_REG ((unsigned char *)0x00B00304)
#define SDC_TRANS_ERROR_REG ((unsigned char *)0x00B00305)
#define SDC_DIRECT_ACCESS_REG ((unsigned char *)0x00B00306)
#define SDC_SD_ADDR_7_0_REG ((unsigned char *)0x00B00307)
#define SDC_SD_ADDR_15_8_REG ((unsigned char *)0x00B00308)
#define SDC_SD_ADDR_23_16_REG ((unsigned char *)0x00B00309)
#define SDC_SD_ADDR_31_24_REG ((unsigned char *)0x00B0030A)
#define SDC_SPI_CLK_DEL_REG ((unsigned char *)0x00B0030B)
#define SDC_RX_FIFO_DATA_REG ((unsigned char *)0x00B00310)
#define SDC_RX_FIFO_DATA_CNT_HI ((unsigned char *)0x00B00312)
#define SDC_RX_FIFO_DATA_CNT_LO ((unsigned char *)0x00B00313)
#define SDC_RX_FIFO_CTRL_REG ((unsigned char *)0x00B00314)
#define SDC_TX_FIFO_DATA_REG ((unsigned char *)0x00B00320)
#define SDC_TX_FIFO_CTRL_REG ((unsigned char *)0x00B00324)
#endif

View file

@ -0,0 +1,134 @@
/*
* Sound device register definitions for the A2560U and A2560U+
*/
#ifndef __SOUND_A2560U_H
#define __SOUND_A2560U_H
#define PSG_PORT ((volatile unsigned char *)0x00B20130) /* Control register for the SN76489 */
#define OPL3_PORT ((volatile unsigned char *)0x00B20200) /* Access port for the OPL3 */
#define OPM_INT_BASE ((volatile unsigned char *)0x00B20C00) /* Internal OPM base address */
#define OPN2_INT_BASE ((volatile unsigned char *)0x00B20A00) /* Internal OPN2 base address */
#define CODEC ((volatile unsigned short *)0x00B20E00) /* Control register for the CODEC */
/*
* A2560U supports two external, physical SID chips.
* It also implements the Gideon FPGA based SID in either stereo or mono (neutral) form
*
* $00C21000..$00C211FF - Internal SID Left
* $00C21200..$00C213FF - Internal SID Right
* $00C21400..$00C215FF - Internal SID Neutral
*/
/*
* Internal SID Left Channel
*/
#define SID_INT_L_V1_FREQ_LO ((unsigned char *)0x00B21000)
#define SID_INT_L_V1_FREQ_HI ((unsigned char *)0x00B21001)
#define SID_INT_L_V1_PW_LO ((unsigned char *)0x00B21002)
#define SID_INT_L_V1_PW_HI ((unsigned char *)0x00B21003)
#define SID_INT_L_V1_CTRL ((unsigned char *)0x00B21004)
#define SID_INT_L_V1_ATCK_DECY ((unsigned char *)0x00B21005)
#define SID_INT_L_V1_SSTN_RLSE ((unsigned char *)0x00B21006)
#define SID_INT_L_V2_FREQ_LO ((unsigned char *)0x00B21007)
#define SID_INT_L_V2_FREQ_HI ((unsigned char *)0x00B21008)
#define SID_INT_L_V2_PW_LO ((unsigned char *)0x00B21009)
#define SID_INT_L_V2_PW_HI ((unsigned char *)0x00B2100A)
#define SID_INT_L_V2_CTRL ((unsigned char *)0x00B2100B)
#define SID_INT_L_V2_ATCK_DECY ((unsigned char *)0x00B2100C)
#define SID_INT_L_V2_SSTN_RLSE ((unsigned char *)0x00B2100D)
#define SID_INT_L_V3_FREQ_LO ((unsigned char *)0x00B2100E)
#define SID_INT_L_V3_FREQ_HI ((unsigned char *)0x00B2100F)
#define SID_INT_L_V3_PW_LO ((unsigned char *)0x00B21010)
#define SID_INT_L_V3_PW_HI ((unsigned char *)0x00B21011)
#define SID_INT_L_V3_CTRL ((unsigned char *)0x00B21012)
#define SID_INT_L_V3_ATCK_DECY ((unsigned char *)0x00B21013)
#define SID_INT_L_V3_SSTN_RLSE ((unsigned char *)0x00B21014)
#define SID_INT_L_FC_LO ((unsigned char *)0x00B21015)
#define SID_INT_L_FC_HI ((unsigned char *)0x00B21016)
#define SID_INT_L_RES_FILT ((unsigned char *)0x00B21017)
#define SID_INT_L_MODE_VOL ((unsigned char *)0x00B21018)
#define SID_INT_L_POT_X ((unsigned char *)0x00B21019)
#define SID_INT_L_POT_Y ((unsigned char *)0x00B2101A)
#define SID_INT_L_OSC3_RND ((unsigned char *)0x00B2101B)
#define SID_INT_L_ENV3 ((unsigned char *)0x00B2101C)
#define SID_INT_L_NOT_USED0 ((unsigned char *)0x00B2101D)
#define SID_INT_L_NOT_USED1 ((unsigned char *)0x00B2101E)
#define SID_INT_L_NOT_USED2 ((unsigned char *)0x00B2101F)
/*
* Internal SID Right Channel
*/
#define SID_INT_R_V1_FREQ_LO ((unsigned char *)0x00B21200)
#define SID_INT_R_V1_FREQ_HI ((unsigned char *)0x00B21201)
#define SID_INT_R_V1_PW_LO ((unsigned char *)0x00B21202)
#define SID_INT_R_V1_PW_HI ((unsigned char *)0x00B21203)
#define SID_INT_R_V1_CTRL ((unsigned char *)0x00B21204)
#define SID_INT_R_V1_ATCK_DECY ((unsigned char *)0x00B21205)
#define SID_INT_R_V1_SSTN_RLSE ((unsigned char *)0x00B21206)
#define SID_INT_R_V2_FREQ_LO ((unsigned char *)0x00B21207)
#define SID_INT_R_V2_FREQ_HI ((unsigned char *)0x00B21208)
#define SID_INT_R_V2_PW_LO ((unsigned char *)0x00B21209)
#define SID_INT_R_V2_PW_HI ((unsigned char *)0x00B2120A)
#define SID_INT_R_V2_CTRL ((unsigned char *)0x00B2120B)
#define SID_INT_R_V2_ATCK_DECY ((unsigned char *)0x00B2120C)
#define SID_INT_R_V2_SSTN_RLSE ((unsigned char *)0x00B2120D)
#define SID_INT_R_V3_FREQ_LO ((unsigned char *)0x00B2120E)
#define SID_INT_R_V3_FREQ_HI ((unsigned char *)0x00B2120F)
#define SID_INT_R_V3_PW_LO ((unsigned char *)0x00B21210)
#define SID_INT_R_V3_PW_HI ((unsigned char *)0x00B21211)
#define SID_INT_R_V3_CTRL ((unsigned char *)0x00B21212)
#define SID_INT_R_V3_ATCK_DECY ((unsigned char *)0x00B21213)
#define SID_INT_R_V3_SSTN_RLSE ((unsigned char *)0x00B21214)
#define SID_INT_R_FC_LO ((unsigned char *)0x00B21215)
#define SID_INT_R_FC_HI ((unsigned char *)0x00B21216)
#define SID_INT_R_RES_FILT ((unsigned char *)0x00B21217)
#define SID_INT_R_MODE_VOL ((unsigned char *)0x00B21218)
#define SID_INT_R_POT_X ((unsigned char *)0x00B21219)
#define SID_INT_R_POT_Y ((unsigned char *)0x00B2121A)
#define SID_INT_R_OSC3_RND ((unsigned char *)0x00B2121B)
#define SID_INT_R_ENV3 ((unsigned char *)0x00B2121C)
#define SID_INT_R_NOT_USED0 ((unsigned char *)0x00B2121D)
#define SID_INT_R_NOT_USED1 ((unsigned char *)0x00B2121E)
#define SID_INT_R_NOT_USED2 ((unsigned char *)0x00B2121F)
/*
* Internal SID Neutral Channel - When writting here, the value is written in R and L Channel at the same time
*/
#define SID_INT_N_V1_FREQ_LO ((unsigned char *)0x00B21400)
#define SID_INT_N_V1_FREQ_HI ((unsigned char *)0x00B21401)
#define SID_INT_N_V1_PW_LO ((unsigned char *)0x00B21402)
#define SID_INT_N_V1_PW_HI ((unsigned char *)0x00B21403)
#define SID_INT_N_V1_CTRL ((unsigned char *)0x00B21404)
#define SID_INT_N_V1_ATCK_DECY ((unsigned char *)0x00B21405)
#define SID_INT_N_V1_SSTN_RLSE ((unsigned char *)0x00B21406)
#define SID_INT_N_V2_FREQ_LO ((unsigned char *)0x00B21407)
#define SID_INT_N_V2_FREQ_HI ((unsigned char *)0x00B21408)
#define SID_INT_N_V2_PW_LO ((unsigned char *)0x00B21409)
#define SID_INT_N_V2_PW_HI ((unsigned char *)0x00B2140A)
#define SID_INT_N_V2_CTRL ((unsigned char *)0x00B2140B)
#define SID_INT_N_V2_ATCK_DECY ((unsigned char *)0x00B2140C)
#define SID_INT_N_V2_SSTN_RLSE ((unsigned char *)0x00B2140D)
#define SID_INT_N_V3_FREQ_LO ((unsigned char *)0x00B2140E)
#define SID_INT_N_V3_FREQ_HI ((unsigned char *)0x00B2140F)
#define SID_INT_N_V3_PW_LO ((unsigned char *)0x00B21410)
#define SID_INT_N_V3_PW_HI ((unsigned char *)0x00B21411)
#define SID_INT_N_V3_CTRL ((unsigned char *)0x00B21412)
#define SID_INT_N_V3_ATCK_DECY ((unsigned char *)0x00B21413)
#define SID_INT_N_V3_SSTN_RLSE ((unsigned char *)0x00B21414)
#define SID_INT_N_FC_LO ((unsigned char *)0x00B21415)
#define SID_INT_N_FC_HI ((unsigned char *)0x00B21416)
#define SID_INT_N_RES_FILT ((unsigned char *)0x00B21417)
#define SID_INT_N_MODE_VOL ((unsigned char *)0x00B21418)
#define SID_INT_N_POT_X ((unsigned char *)0x00B21419)
#define SID_INT_N_POT_Y ((unsigned char *)0x00B2141A)
#define SID_INT_N_OSC3_RND ((unsigned char *)0x00B2141B)
#define SID_INT_N_ENV3 ((unsigned char *)0x00B2141C)
#define SID_INT_N_NOT_USED0 ((unsigned char *)0x00B2141D)
#define SID_INT_N_NOT_USED1 ((unsigned char *)0x00B2141E)
#define SID_INT_N_NOT_USED2 ((unsigned char *)0x00B2141F)
#endif

View file

@ -5,22 +5,44 @@
#ifndef __ERRORS_H #ifndef __ERRORS_H
#define __ERRORS_H #define __ERRORS_H
#define MAX_ERROR_NUMBER 16 // Largest (absolute value) of the error number // #define MAX_ERROR_NUMBER 16 // Largest (absolute value) of the error number
#define ERR_GENERAL -1 // A general error condition
#define DEV_ERR_BADDEV -2 // Device number is bad (too big or no device assigned)
#define DEV_TIMEOUT -3 // The block device function timed out
#define DEV_CANNOT_INIT -4 // The block device could not initilize
#define DEV_CANNOT_READ -5 // The device cannot complete the READ
#define DEV_CANNOT_WRITE -6 // The device cannot complete the WRITE
#define DEV_BOUNDS_ERR -7 // The buffer provided is not big enough
#define DEV_NOMEDIA -8 // There is no media present for that device
#define DEV_WRITEPROT -9 // The media is write protected
#define ERR_BADCHANNEL -10 // The channel number was bad
#define ERR_OUT_OF_HANDLES -11 // There are no available handles for channels files etc.
#define ERR_BAD_HANDLE -12 // The handle passed was not valid
#define ERR_BAD_EXTENSION -13 // The path to load did not have an extension that matched registered loaders
#define ERR_OUT_OF_MEMORY -14 // Unable to allocate more memory
#define ERR_BAD_BINARY -15 // Bad binary file format... i.e. binary format does not match expectations
#define ERR_NOT_EXECUTABLE -16 // Binary file format does not have a starting address
#define ERR_NOT_FOUND -17 // Resource not found
#define FSYS_ERR_DISK_ERR -18 /* (1) A hard error occurred in the low level disk I/O layer */
#define FSYS_ERR_INT_ERR -19 /* (2) Assertion failed */
#define FSYS_ERR_NOT_READY -20 /* (3) The physical drive cannot work */
#define FSYS_ERR_NO_FILE -21 /* (4) Could not find the file */
#define FSYS_ERR_NO_PATH -22 /* (5) Could not find the path */
#define FSYS_ERR_INVALID_NAME -23 /* (6) The path name format is invalid */
#define FSYS_ERR_DENIED -24 /* (7) Access denied due to prohibited access or directory full */
#define FSYS_ERR_EXIST -25 /* (8) Access denied due to prohibited access */
#define FSYS_ERR_INVALID_OBJECT -26 /* (9) The file/directory object is invalid */
#define FSYS_ERR_WRITE_PROTECTED -27 /* (10) The physical drive is write protected */
#define FSYS_ERR_INVALID_DRIVE -28 /* (11) The logical drive number is invalid */
#define FSYS_ERR_NOT_ENABLED -29 /* (12) The volume has no work area */
#define FSYS_ERR_NO_FILESYSTEM -30 /* (13) There is no valid FAT volume */
#define FSYS_ERR_MKFS_ABORTED -31 /* (14) The f_mkfs() aborted due to any problem */
#define FSYS_ERR_TIMEOUT -32 /* (15) Could not get a grant to access the volume within defined period */
#define FSYS_ERR_LOCKED -33 /* (16) The operation is rejected according to the file sharing policy */
#define FSYS_ERR_NOT_ENOUGH_CORE -34 /* (17) LFN working buffer could not be allocated */
#define FSYS_ERR_TOO_MANY_OPEN_FILES -35 /* (18) Number of open files > FF_FS_LOCK */
#define FSYS_ERR_INVALID_PARAMETER -36 /* (19) Given parameter is invalid */
#define ERR_GENERAL -1 // A general error condition
#define DEV_ERR_BADDEV -2 // Device number is bad (too big or no device assigned)
#define DEV_TIMEOUT -3 // The block device function timed out
#define DEV_CANNOT_INIT -4 // The block device could not initilize
#define DEV_CANNOT_READ -5 // The device cannot complete the READ
#define DEV_CANNOT_WRITE -6 // The device cannot complete the WRITE
#define DEV_BOUNDS_ERR -7 // The buffer provided is not big enough
#define DEV_NOMEDIA -8 // There is no media present for that device
#define DEV_WRITEPROT -9 // The media is write protected
#define ERR_BADCHANNEL -10 // The channel number was bad
#define ERR_OUT_OF_HANDLES -11 // There are no available handles for channels, files, etc.
#define ERR_BAD_HANDLE -12 // The handle passed was not valid
#define ERR_BAD_EXTENSION -13 // The path to load did not have an extension that matched registered loaders
#define ERR_OUT_OF_MEMORY -14 // Unable to allocate more memory
#define ERR_BAD_BINARY -15 // Bad binary file format... i.e. binary format does not match expectations
#define ERR_NOT_EXECUTABLE -16 // Binary file format does not have a starting address
#endif #endif

47
src/include/fdc_reg.h Normal file
View file

@ -0,0 +1,47 @@
/*
* Define the locations of all the FDC registers
*/
#ifndef __FDC_REG_H
#define __FDC_REG_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "A2560K/fdc_a2560k.h"
#endif
/* Read/Write - Digital Output Register */
#define FDC_DOR_DSEL0 0x01 /* Drive 0 Select */
#define FDC_DOR_DSEL1 0x02 /* Drive 1 Select */
#define FDC_DOR_NRESET 0x04 /* Reset the FDC */
#define FDC_DOR_DMAEN 0x08 /* Enable DMA */
#define FDC_DOR_MOT0 0x10 /* Turn on motor 0 */
#define FDC_DOR_MOT1 0x20 /* Turn on motor 1 */
#define FDC_DOR_MOT2 0x40 /* Turn on motor 2 */
#define FDC_DOR_MOT3 0x80 /* Turn on motor 3 */
/* Read - Main Status Register */
#define FDC_MSR_DRV0BSY 0x01 /* Indicates if drive 0 is busy */
#define FDC_MSR_DRV1BSY 0x02 /* Indicates if drive 1 is busy */
#define FDC_MSR_CMDBSY 0x10 /* Indicates if a command is in progress */
#define FDC_MSR_NONDMA 0x20
#define FDC_MSR_DIO 0x40 /* Data direction: 1 = read, 0 = write */
#define FDC_MSR_RQM 0x80 /* 1 = host can transfer data, 0 = host must wait */
/* Write - Data Select Register
* Bit[0..1] = data rate
* Bit[2..4] = precompensation select
*/
#define FDC_DSR_LOPWR 0x40 /* Turn on low power mode */
#define FDC_DSR_RESET 0x80 /* Software reset of the FDC */
/* Read - Digital Input Register */
#define FDC_DIR_DSKCHG 0x80 /* Indicates if the disk has changed */
/* Write - Configuration Control Register
* Bit[0..1] = Data rate
*/
#endif

View file

@ -5,11 +5,14 @@
#ifndef __GABE_REG_H #ifndef __GABE_REG_H
#define __GABE_REG_H #define __GABE_REG_H
#include "sys_general.h"
#define POWER_ON_LED 0x0001 #define POWER_ON_LED 0x0001
#define SDCARD_LED 0x0002 #define SDCARD_LED 0x0002
#define BUZZER_CONTROL 0x0004 #define BUZZER_CONTROL 0x0004
#define MANUAL_RESET 0x8000 // Make sure the word "DEAD" is written in GABE_RESET_ID #define MANUAL_RESET 0x8000 // Make sure the word "DEAD" is written in GABE_RESET_ID
#if MODEL == MODEL_FOENIX_A2560K
#define GABE_CTRL_REG ((volatile unsigned short *)0x00C00000) #define GABE_CTRL_REG ((volatile unsigned short *)0x00C00000)
#define GABE_RESET_ID ((volatile unsigned short *)0x00C00002) #define GABE_RESET_ID ((volatile unsigned short *)0x00C00002)
#define GABE_LFSR_REG0 ((volatile unsigned short *)0x00C00004) #define GABE_LFSR_REG0 ((volatile unsigned short *)0x00C00004)
@ -26,11 +29,15 @@
#define GABE_CHIP_VERSION ((volatile unsigned short *)0x00C00010) #define GABE_CHIP_VERSION ((volatile unsigned short *)0x00C00010)
#define GABE_CHIP_NUMBER ((volatile unsigned short *)0x00C00012) #define GABE_CHIP_NUMBER ((volatile unsigned short *)0x00C00012)
#define GABE_DIP_REG ((volatile unsigned short *)0x00C00518)
#define GABE_DIP_BOOT_MASK 0x0003 /* Mask for the boot mode: */
#define GABE_DIP_USER_MASK 0x0300 /* Mask for the user switches: */
/* /*
* 16-bit register controlling the key of the A2560K built-in keyboard * 16-bit register controlling the key of the A2560K built-in keyboard
*/ */
#define GABE_MO_LEDS ((volatile unsigned short *)0x00C00006) #define GABE_MO_LEDS ((volatile unsigned short *)0x00C0000C)
#define GABE_MO_LED_0_B 0x0001 /* LED 0 (Close to DEL key) -- Blue ON */ #define GABE_MO_LED_0_B 0x0001 /* LED 0 (Close to DEL key) -- Blue ON */
#define GABE_MO_LED_0_G 0x0002 /* LED 0 (Close to DEL key) -- Green ON */ #define GABE_MO_LED_0_G 0x0002 /* LED 0 (Close to DEL key) -- Green ON */
#define GABE_MO_LED_0_R 0x0004 /* LED 0 (Close to DEL key) -- Red ON */ #define GABE_MO_LED_0_R 0x0004 /* LED 0 (Close to DEL key) -- Red ON */
@ -44,4 +51,42 @@
#define GABE_MO_LED_3_G 0x0400 /* LED 2 (caps lock, Rev C) -- Green ON */ #define GABE_MO_LED_3_G 0x0400 /* LED 2 (caps lock, Rev C) -- Green ON */
#define GABE_MO_LED_3_R 0x0800 /* LED 2 (caps lock, Rev C) -- Red ON */ #define GABE_MO_LED_3_R 0x0800 /* LED 2 (caps lock, Rev C) -- Red ON */
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#define GABE_CTRL_REG ((volatile unsigned short *)0x00B00000)
#define GABE_RESET_ID ((volatile unsigned short *)0x00B00002)
#define GABE_LFSR_REG0 ((volatile unsigned short *)0x00B00004)
#define GABE_LFSR_REG1 ((volatile unsigned short *)0x00B00006)
#define RGB_LED_L ((volatile unsigned short *)0x00B00008) // Writing Only - A2560K Only - 0x__RR
#define RGB_LED_H ((volatile unsigned short *)0x00B0000A) // Writing Only - A2560K Only - 0xGGBB
#define GABE_LFSR_DATA ((volatile unsigned short *)0x00B00008) // Read Only
#define GABE_LFSR_STAT ((volatile unsigned short *)0x00B0000A) // Read Only
#define GABE_MACHINE_ID ((volatile unsigned short *)0x00B0000C) // Machine ID - Read Only
#define GABE_MACH_ID_MASK 0x0003 // 1001 = A2560U and U+
#define GABE_MEMORY_BANKS 0x00C0 // 10 = 2 MB, 11 = 4 MB
#define GABE_CPU_SPEED 0x0F00
#define GABE_CPU_ID 0xF000 // 0000 = MC68SEC000 @ 20MHz
#define FPGA_DATE_YEAR ((volatile unsigned short *)0x00B40030) // YYYY
#define FPGA_DATE_MONTHDAY ((volatile unsigned short *)0x00B40032) // MMDD
#define PCB_REV_1 ((volatile unsigned short *)0x00B40034) // Null terminated string describing the PCB
#define PCB_REV_2 ((volatile unsigned short *)0x00B40036)
#define FPGA_SUBVER ((volatile unsigned short *)0x00B40038)
#define FPGA_VER ((volatile unsigned short *)0x00B4003A)
#define FPGA_MODEL_L ((volatile unsigned short *)0x00B4003C)
#define FPGA_MODEL_H ((volatile unsigned short *)0x00B4003E)
#define GABE_CHIP_SUBREV ((volatile unsigned short *)0x00B0000E)
#define GABE_CHIP_VERSION ((volatile unsigned short *)0x00B00010)
#define GABE_CHIP_NUMBER ((volatile unsigned short *)0x00B00012)
#define GABE_DIP_REG ((volatile unsigned short *)0x00B00518)
#define GABE_DIP_BOOT_MASK 0x0003 /* Mask for the boot mode: */
#define GABE_DIP_USER_MASK 0x0300 /* Mask for the user switches: */
#endif
#endif #endif

View file

@ -5,11 +5,15 @@
#ifndef __MIDI_REG_H #ifndef __MIDI_REG_H
#define __MIDI_REG_H #define __MIDI_REG_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#define MIDI_DATA ((volatile unsigned char *)0x00C02330) #define MIDI_DATA ((volatile unsigned char *)0x00C02330)
#define MIDI_STAT ((volatile unsigned char *)0x00C02331) #define MIDI_STAT ((volatile unsigned char *)0x00C02331)
#define MIDI_CMD ((volatile unsigned char *)0x00C02331) #define MIDI_CMD ((volatile unsigned char *)0x00C02331)
#define MIDI_STAT_TX_BUSY 0x80 #define MIDI_STAT_TX_BUSY 0x80
#define MIDI_STAT_RX_EMPTY 0x40 #define MIDI_STAT_RX_EMPTY 0x40
#endif
#endif #endif

View file

@ -6,14 +6,124 @@
#define __PATA_REG_H #define __PATA_REG_H
#include "types.h" #include "types.h"
#include "sys_general.h"
// #if SYSTEM == A2560K #if MODEL == MODEL_FOENIX_A2560K
// /* PATA registers for the A2560K */ #include "A2560K/pata_a2560k.h"
#include "A2560K/PATA_a2560k.h" #elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/pata_a2560u.h"
#endif
// #elif SYSTEM == C256_FMX || SYSTEM == C256_U || SYSTEM == C256_U_PLUS /*
// /* VICKY registers for the C256 FMX, U, and U+ */ * Bit definitions
// #include "FMX/vicky_general.h" */
// #endif
#define PATA_ERR_AMNF 0x01 // Error: Address mark not found
#define PATA_ERR_TKZNF 0x02 // Error: Track 0 not found
#define PATA_ERR_ABRT 0x04 // Error: Aborted command
#define PATA_ERR_MCR 0x08 // Error: Media change request
#define PATA_ERR_IDNF 0x10 // Error: ID not found
#define PATA_ERR_MC 0x20 // Error: Media change
#define PATA_ERR_UNC 0x40 // Error: Uncorrectable data error
#define PATA_ERR_BBK 0x80 // Error: Bad block detected
#define PATA_STAT_BSY 0x80 // BSY (Busy) is set whenever the device has control of the command Block Registers.
#define PATA_STAT_DRDY 0x40 // DRDY (Device Ready) is set to indicate that the device is capable of accepting all command codes.
#define PATA_STAT_DF 0x20 // DF (Device Fault) indicates a device fault error has been detected.
#define PATA_STAT_DSC 0x10 // DSC (Device Seek Complete) indicates that the device heads are settled over a track.
#define PATA_STAT_DRQ 0x08 // DRQ (Data Request) indicates that the device is ready to transfer a unsigned short or char of data between
// the host and the device.
#define PATA_STAT_CORR 0x04 // CORR (Corrected Data) is used to indicate a correctable data error.
#define PATA_STAT_IDX 0x02 // Vendor specific bit
#define PATA_STAT_ERR 0x01 // ERR (Error) indicates that an error occurred during execution of the previous command.
#define PATA_CMD_INIT 0x00
#define PATA_CMD_READ_SECTOR 0x20
#define PATA_CMD_WRITE_SECTOR 0x30
#define PATA_CMD_IDENTITY 0xEC
/*
* - BSY (Busy) is set whenever the device has control of the command
* Block Registers. When the BSY bit is equal to one, a write to a
* command block register by the host shall be ignored by the
* device.
*
* The device shall not change the state of the DRQ bit unless the
* BSY bit is equal to one. When the last block of a PIO data in
* command has been transferred by the host, then the DRQ bit is
* cleared without the BSY bit being set.
*
* When the BSY bit equals zero, the device may only change the IDX,
* DRDY, DF, DSC, and CORR bits in the Status register and the Data
* register. None of the other command block registers nor other
* bits within the Status register shall be changed by the device.
*
* NOTE - BIOSs and software device drivers that sample status as
* soon as the BSY bit is cleared to zero may not detect the
* assertion of the CORR bit by the device. After the host has
* written the Command register either the BSY bit shall be set, or
* if the BSY bit is cleared, the DRQ bit shall be set, until
* command completion.
*
* NOTE - The BSY bit is set and then cleared so quickly, that host
* detection of the BSY bit being set is not certain.
*
* The BSY bit shall be set by the device under the following
* circumstances:
* a) within 400 ns after either the negation of RESET- or the
* setting of the SRST bit in the Device Control register;
* b) within 400 ns after writing the Command register if the DRQ
* bit is not set;
* c) between blocks of a data transfer during PIO data in
* commands if the DRQ bit is not set;
* d) after the transfer of a data block during PIO data out
* commands if the DRQ bit is not set;
* e) during the data transfer of DMA commands if the DRQ bit is
* not set.
*
* The device shall not set the BSY bit at any other time.
*
* - DRDY (Device Ready) is set to indicate that the device is capable
* of accepting all command codes. This bit shall be cleared at
* power on. Devices that implement the power management features
* shall maintain the DRDY bit equal to one when they are in the
* Idle or Standby power modes. When the state of the DRDY bit
* changes, it shall not change again until after the host reads the
* status register.
*
* When the DRDY bit is equal to zero, a device responds as follows:
* a) the device shall accept and attempt to execute the EXECUTE
* DEVICE DIAGNOSTIC and INITIALIZE DEVICE PARAMETERS commands;
* b) If a device accepts commands other than EXECUTE DEVICE
* DIAGNOSTIC and INITIALIZE DEVICE PARAMETERS during the time the
* DRDY bit is equal to zero, the results are vendor specific.
*
* - DF (Device Fault) indicates a device fault error has been
* detected. The internal status or internal conditions that causes
* this error to be indicated is vendor specific.
*
* - DSC (Device Seek Complete) indicates that the device heads are
* settled over a track. When an error occurs, this bit shall not be
* changed until the Status register is read by the host, at which
* time the bit again indicates the current Seek Complete status.
*
* - DRQ (Data Request) indicates that the device is ready to transfer
* a unsigned short or char of data between the host and the device.
*
* - CORR (Corrected Data) is used to indicate a correctable data
* error. The definition of what constitutes a correctable error is
* vendor specific. This condition does not terminate a data
* transfer.
*
* - IDX (Index) is vendor specific.
*
* - ERR (Error) indicates that an error occurred during execution of
* the previous command. The bits in the Error register have
* additional information regarding the cause of the error. Once the
* device has set the error bit, the device shall not change the
* contents of the following items until a new command has been
* accepted, the SRST bit is set to one, or RESET- is asserted: the
* ERR bit in the Status register.
*/
#endif #endif

View file

@ -8,6 +8,12 @@
#include "sys_general.h" #include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "A2560K/ps2_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/ps2_a2560u.h"
#endif
/* /*
* Status flags * Status flags
*/ */
@ -54,26 +60,4 @@
#define MOUSE_CMD_DEFAULTS 0xF6 /* Mouse command: set defaults */ #define MOUSE_CMD_DEFAULTS 0xF6 /* Mouse command: set defaults */
#define MOUSE_CMD_RESET 0xFF /* Mouse command: reset the mouse */ #define MOUSE_CMD_RESET 0xFF /* Mouse command: reset the mouse */
// #if SYSTEM == SYS_FOENIX_U || SYSTEM == SYS_FOENIX_U_PLUS
// #define PS2_STATUS ((unsigned char *)0xAF1807)
// #define PS2_CMD_BUF ((unsigned char *)0xAF1807)
// #define PS2_OUT_BUF ((unsigned char *)0xAF1803)
// #define PS2_INPT_BUF ((unsigned char *)0xAF1803)
// #define PS2_DATA_BUF ((unsigned char *)0xAF1803)
//
// #elif SYSTEM == SYS_FOENIX_FMX
// #define PS2_STATUS ((unsigned char *)0xAF1064)
// #define PS2_CMD_BUF ((unsigned char *)0xAF1064)
// #define PS2_OUT_BUF ((unsigned char *)0xAF1060)
// #define PS2_INPT_BUF ((unsigned char *)0xAF1060)
// #define PS2_DATA_BUF ((unsigned char *)0xAF1060)
//
// #elif SYSTEM == SYS_FOENIX_A2560K
#define PS2_STATUS ((unsigned char *)0x00C02064)
#define PS2_CMD_BUF ((unsigned char *)0x00C02064)
#define PS2_OUT_BUF ((unsigned char *)0x00C02060)
#define PS2_INPT_BUF ((unsigned char *)0x00C02060)
#define PS2_DATA_BUF ((unsigned char *)0x00C02060)
// #endif
#endif #endif

View file

@ -5,8 +5,11 @@
#ifndef __RTC_REG_H #ifndef __RTC_REG_H
#define __RTC_REG_H #define __RTC_REG_H
#define RTC_BASE ((volatile unsigned char *)0x00C00080) #include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#define RTC_BASE ((volatile unsigned char *)0x00C00080)
#define RTC_SEC ((volatile unsigned char *)0x00C00080) #define RTC_SEC ((volatile unsigned char *)0x00C00080)
#define RTC_ALRM_SEC ((volatile unsigned char *)0x00C00081) #define RTC_ALRM_SEC ((volatile unsigned char *)0x00C00081)
#define RTC_MIN ((volatile unsigned char *)0x00C00082) #define RTC_MIN ((volatile unsigned char *)0x00C00082)
@ -24,10 +27,35 @@
#define RTC_CTRL ((volatile unsigned char *)0x00C0008E) #define RTC_CTRL ((volatile unsigned char *)0x00C0008E)
#define RTC_CENTURY ((volatile unsigned char *)0x00C0008F) #define RTC_CENTURY ((volatile unsigned char *)0x00C0008F)
#elif MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#define RTC_BASE ((volatile unsigned char *)0x00B00080)
#define RTC_SEC ((volatile unsigned char *)0x00B00080)
#define RTC_ALRM_SEC ((volatile unsigned char *)0x00B00082)
#define RTC_MIN ((volatile unsigned char *)0x00B00084)
#define RTC_ALRM_MIN ((volatile unsigned char *)0x00B00086)
#define RTC_HOUR ((volatile unsigned char *)0x00B00088)
#define RTC_ALRM_HOUR ((volatile unsigned char *)0x00B0008A)
#define RTC_DAY ((volatile unsigned char *)0x00B0008C)
#define RTC_ALRM_DAY ((volatile unsigned char *)0x00B0008E)
#define RTC_DAY_OF_WEEK ((volatile unsigned char *)0x00B00090)
#define RTC_MONTH ((volatile unsigned char *)0x00B00092)
#define RTC_YEAR ((volatile unsigned char *)0x00B00094)
#define RTC_RATES ((volatile unsigned char *)0x00B00096)
#define RTC_ENABLES ((volatile unsigned char *)0x00B00098)
#define RTC_FLAGS ((volatile unsigned char *)0x00B0009A)
#define RTC_CTRL ((volatile unsigned char *)0x00B0009C)
#define RTC_CENTURY ((volatile unsigned char *)0x00B0009E)
#endif
/* Rate fields and settings */ /* Rate fields and settings */
#define RTC_RATES_WD 0xf0 #define RTC_RATES_WD 0xf0
#define RTC_RATES_RS 0x0f #define RTC_RATES_RS 0x0f
#define RTC_RATE_976us 0x06 #define RTC_RATE_976us 0x06
#define RTC_RATE_4ms 0x04
#define RTC_RATE_15ms 0x0A
/* Enable bits */ /* Enable bits */
#define RTC_AIE 0x08 #define RTC_AIE 0x08

View file

@ -6,14 +6,40 @@
#define __SDC_REG_H #define __SDC_REG_H
#include "types.h" #include "types.h"
#include "sys_general.h"
// #if SYSTEM == A2560K #if MODEL == MODEL_FOENIX_A2560K
// /* PATA registers for the A2560K */
#include "A2560K/sdc_a2560k.h" #include "A2560K/sdc_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/sdc_a2560u.h"
#endif
// #elif SYSTEM == C256_FMX || SYSTEM == C256_U || SYSTEM == C256_U_PLUS /*
// /* VICKY registers for the C256 FMX, U, and U+ */ * Bit definitions
// #include "FMX/vicky_general.h" */
// #endif
// SDC_TRANS_TYPE_REG
#define SDC_TRANS_DIRECT 0x00 // 00 = Direct Access
#define SDC_TRANS_INIT_SD 0x01 // 01 = Init SD
#define SDC_TRANS_READ_BLK 0x02 // 10 = RW_READ_BLOCK (512 Bytes)
#define SDC_TRANS_WRITE_BLK 0x03 // 11 = RW_WRITE_SD_BLOCK
// SDC_TRANS_CONTROL_REG
#define SDC_TRANS_START 0x01
// SDC_TRANS_STATUS_REG
#define SDC_TRANS_BUSY 0x01 // 1= Transaction Busy
// SDC_TRANS_ERROR_REG
#define SDC_TRANS_INIT_NO_ERR 0x00 // Init Error Report [1:0]
#define SDC_TRANS_INIT_CMD0_ERR 0x01
#define SDC_TRANS_INIT_CMD1_ERR 0x02
#define SDC_TRANS_RD_NO_ERR 0x00 // Read Error Report [3:2]
#define SDC_TRANS_RD_CMD_ERR 0x04
#define SDC_TRANS_RD_TOKEN_ERR 0x08
#define SDC_TRANS_WR_NO_ERR 0x00 // Write Report Error [5:4]
#define SDC_TRANS_WR_CMD_ERR 0x10
#define SDC_TRANS_WR_DATA_ERR 0x20
#define SDC_TRANS_WR_BUSY_ERR 0x30
#endif #endif

17
src/include/sound_reg.h Normal file
View file

@ -0,0 +1,17 @@
/*
* Master include file for all the sound device registers
*/
#ifndef __SOUND_REG_H
#define __SOUND_REG_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "A2560K/sound_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL_FOENIX_A2560U_PLUS
#include "A2560U/sound_a2560u.h"
#endif
#endif

View file

@ -20,7 +20,7 @@
* Syscall function numbers * Syscall function numbers
*/ */
/* Miscellaneous control calls */ /* Core calls */
#define KFN_EXIT 0x00 /* Quick the current program and return to the command line */ #define KFN_EXIT 0x00 /* Quick the current program and return to the command line */
#define KFN_WARMBOOT 0x01 /* Do a soft re-initialization */ #define KFN_WARMBOOT 0x01 /* Do a soft re-initialization */
@ -29,8 +29,9 @@
#define KFN_INT_DISABLE 0x04 /* Disable an interrupt */ #define KFN_INT_DISABLE 0x04 /* Disable an interrupt */
#define KFN_INT_ENABLE_ALL 0x05 /* Enable all interrupts */ #define KFN_INT_ENABLE_ALL 0x05 /* Enable all interrupts */
#define KFN_INT_DISABLE_ALL 0x06 /* Disable all interrupts */ #define KFN_INT_DISABLE_ALL 0x06 /* Disable all interrupts */
#define KFN_INT_CLEAR 0x05 /* Clear (acknowledge) an interrupt */ #define KFN_INT_CLEAR 0x07 /* Clear (acknowledge) an interrupt */
#define KFN_INT_PENDING 0x06 /* Return true if the interrupt is pending */ #define KFN_INT_PENDING 0x08 /* Return true if the interrupt is pending */
#define KFN_SYS_GET_INFO 0x09 /* Get information about the computer */
/* Channel system calls */ /* Channel system calls */
@ -44,7 +45,10 @@
#define KFN_CHAN_STATUS 0x17 /* Get the status of a channel */ #define KFN_CHAN_STATUS 0x17 /* Get the status of a channel */
#define KFN_CHAN_IOCTRL 0x18 /* Send a command to a channel (channel dependent functionality) */ #define KFN_CHAN_IOCTRL 0x18 /* Send a command to a channel (channel dependent functionality) */
#define KFN_CHAN_REGISTER 0x19 /* Register a channel device driver */ #define KFN_CHAN_REGISTER 0x19 /* Register a channel device driver */
#define KFN_TEXT_SETSIZES 0x1A /* Adjusts the screen size based on the current graphics mode */ #define KFN_CHAN_OPEN 0x1A /* Open a channel device */
#define KFN_CHAN_CLOSE 0x1B /* Close an open channel (not for files) */
#define KFN_TEXT_SETSIZES 0x1C /* Adjusts the screen size based on the current graphics mode */
/* Block device system calls */ /* Block device system calls */
@ -68,17 +72,24 @@
#define KFN_RENAME 0x38 /* Rename a file */ #define KFN_RENAME 0x38 /* Rename a file */
#define KFN_MKDIR 0x39 /* Create a directory */ #define KFN_MKDIR 0x39 /* Create a directory */
#define KFN_LOAD 0x3A /* Load a file into memory */ #define KFN_LOAD 0x3A /* Load a file into memory */
#define KFN_SAVE 0x3B /* Save a block of memory to a file */ #define KFN_GET_LABEL 0x3B /* Read the label of a volume */
#define KFN_RUN 0x3C /* Load an execute a binary file */ #define KFN_SET_LABEL 0x3C /* Set the label of a volume */
#define KFN_LOAD_REGISTER 0x3D /* Register a file type handler for executable binaries */ #define KFN_SET_CWD 0x3D /* Set the current working directory */
#define KFN_GET_CWD 0x3E /* Get the current working directory */
#define KFN_LOAD_REGISTER 0x3F /* Register a file type handler for executable binaries */
/* Timer calls */ /* Process and memory calls */
#define KFN_DELAY 0x40 /* Block for a certain amount of time */ #define KFN_RUN 0x40 /* Load an execute a binary file */
#define KFN_SET_ALARM 0x41 /* Set an alarm for a certain amount of time */
#define KFN_GET_TIMECODE 0x42 /* Gets the current time code (increments since boot) */ /* Misc calls */
#define KFN_SET_DATETIME 0x43 /* Set the real time clock date-time */
#define KFN_GET_DATETIME 0x44 /* Get the real time clock date-time */ #define KFN_TIME_JIFFIES 0x50 /* Gets the current time code (increments since boot) */
#define KFN_TIME_SETRTC 0x51 /* Set the real time clock date-time */
#define KFN_TIME_GETRTC 0x52 /* Get the real time clock date-time */
#define KFN_KBD_SCANCODE 0x53 /* Get the next scan code from the keyboard */
#define KFN_KBD_LAYOUT 0x54 /* Set the translation tables for the keyboard */
#define KFN_ERR_MESSAGE 0x55 /* Return an error description, given an error number */
/* /*
* Call into the kernel (provided by assembly) * Call into the kernel (provided by assembly)
@ -154,6 +165,14 @@ extern p_int_handler sys_int_register(unsigned short n, p_int_handler handler);
*/ */
extern short sys_int_pending(unsigned short n); extern short sys_int_pending(unsigned short n);
/*
* Fill out a s_sys_info structure with the information about the current system
*
* Inputs:
* info = pointer to a s_sys_info structure to fill out
*/
extern void sys_get_info(p_sys_info info);
/* /*
* Acknowledge an interrupt (clear out its pending flag) * Acknowledge an interrupt (clear out its pending flag)
* *
@ -276,6 +295,30 @@ extern short sys_chan_seek(short channel, long position, short base);
*/ */
extern short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size); extern short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size);
/*
* Open a channel
*
* Inputs:
* dev = the device number to have a channel opened
* path = a "path" describing how the device is to be open
* mode = is the device to be read, written, both? (0x01 = READ flag, 0x02 = WRITE flag, 0x03 = READ and WRITE)
*
* Returns:
* the number of the channel opened, negative number on error
*/
extern short sys_chan_open(short dev, uint8_t * path, short mode);
/*
* Close a channel
*
* Inputs:
* chan = the number of the channel to close
*
* Returns:
* nothing useful
*/
extern short sys_chan_close(short chan);
/*** /***
*** Block device system calls *** Block device system calls
***/ ***/
@ -349,4 +392,286 @@ extern short sys_bdev_flush(short dev);
// //
extern short sys_bdev_ioctrl(short dev, short command, unsigned char * buffer, short size); extern short sys_bdev_ioctrl(short dev, short command, unsigned char * buffer, short size);
/*
* File System Calls
*/
/**
* Attempt to open a file given the path to the file and the mode.
*
* Inputs:
* path = the ASCIIZ string containing the path to the file.
* mode = the mode (e.g. r/w/create)
*
* Returns:
* the channel ID for the open file (negative if error)
*/
extern short sys_fsys_open(const char * path, short mode);
/**
* Close access to a previously open file.
*
* Inputs:
* fd = the channel ID for the file
*
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_close(short fd);
/**
* Attempt to open a directory for scanning
*
* Inputs:
* path = the path to the directory to open
*
* Returns:
* the handle to the directory if >= 0. An error if < 0
*/
extern short sys_fsys_opendir(const char * path);
/**
* Close access to a previously open file.
*
* Inputs:
* fd = the channel ID for the file
*
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_close(short fd);
/**
* Attempt to open a directory for scanning
*
* Inputs:
* path = the path to the directory to open
*
* Returns:
* the handle to the directory if >= 0. An error if < 0
*/
extern short sys_fsys_opendir(const char * path);
/**
* Close a previously open directory
*
* Inputs:
* dir = the directory handle to close
*
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_closedir(short dir);
/**
* Attempt to read an entry from an open directory
*
* Inputs:
* dir = the handle of the open directory
* file = pointer to the t_file_info structure to fill out.
*
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_readdir(short dir, p_file_info file);
/**
* Open a directory given the path and search for the first file matching the pattern.
*
* Inputs:
* path = the path to the directory to search
* pattern = the file name pattern to search for
* file = pointer to the t_file_info structure to fill out
*
* Returns:
* the directory handle to use for subsequent calls if >= 0, error if negative
*/
extern short sys_fsys_findfirst(const char * path, const char * pattern, p_file_info file);
/**
* Open a directory given the path and search for the first file matching the pattern.
*
* Inputs:
* dir = the handle to the directory (returned by fsys_findfirst) to search
* file = pointer to the t_file_info structure to fill out
*
* Returns:
* 0 on success, error if negative
*/
extern short sys_fsys_findnext(short dir, p_file_info file);
/*
* Get the label for the drive holding the path
*
* Inputs:
* path = path to the drive
* label = buffer that will hold the label... should be at least 35 bytes
*/
extern short sys_fsys_get_label(const char * path, char * label);
/*
* Set the label for the drive holding the path
*
* Inputs:
* drive = drive number
* label = buffer that holds the label
*/
extern short sys_fsys_set_label(short drive, const char * label);
/**
* Create a directory
*
* Inputs:
* path = the path of the directory to create.
*
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_mkdir(const char * path);
/**
* Delete a file or directory
*
* Inputs:
* path = the path of the file or directory to delete.
*
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_delete(const char * path);
/**
* Rename a file or directory
*
* Inputs:
* old_path = the current path to the file
* new_path = the new path for the file
*
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_rename(const char * old_path, const char * new_path);
/**
* Change the current working directory (and drive)
*
* Inputs:
* path = the path that should be the new current
*
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_setcwd(const char * path);
/**
* Get the current working drive and directory
*
* Inputs:
* path = the buffer in which to store the directory
* size = the size of the buffer in bytes
*
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_getcwd(char * path, short size);
/*
* Load a file into memory at the designated destination address.
*
* If destination = 0, the file must be in a recognized binary format
* that specifies its own loading address.
*
* Inputs:
* path = the path to the file to load
* destination = the destination address (0 for use file's address)
* start = pointer to the long variable to fill with the starting address
* (0 if not an executable, any other number if file is executable
* with a known starting address)
*
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_load(const char * path, long destination, long * start);
/*
* Register a file loading routine
*
* A file loader, takes a channel number to load from and returns a
* short that is the status of the load.
*
* Inputs:
* extension = the file extension to map to
* loader = pointer to the file load routine to add
*
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_register_loader(const char * extension, p_file_loader loader);
/*
* Miscellaneous
*/
/*
* Get the number of jiffies since the system last booted.
*
* NOTE: a jiffie is 1/60 of a second. This timer will not be
* 100% precise, so it should be used for timeout purposes
* where precision is not critical.
*
* Returns:
* the number of jiffies since the last reset
*/
extern long sys_time_jiffies();
/*
* Set the time on the RTC
*
* Inputs:
* time = pointer to a t_time record containing the correct time
*/
extern void sys_rtc_set_time(p_time time);
/*
* Get the time on the RTC
*
* Inputs:
* time = pointer to a t_time record in which to put the current time
*/
extern void sys_rtc_get_time(p_time time);
/*
* Return the next scan code from the keyboard... 0 if nothing pending
*/
extern unsigned short sys_kbd_scancode();
/*
* Return an error message given an error number
*/
extern const char * sys_err_message(short err_number);
/*
* Set the keyboard translation tables
*
* The translation tables provided to the keyboard consist of eight
* consecutive tables of 128 characters each. Each table maps from
* the MAKE scan code of a key to its appropriate 8-bit character code.
*
* The tables included must include, in order:
* - UNMODIFIED: Used when no modifier keys are pressed or active
* - SHIFT: Used when the SHIFT modifier is pressed
* - CTRL: Used when the CTRL modifier is pressed
* - CTRL-SHIFT: Used when both CTRL and SHIFT are pressed
* - CAPSLOCK: Used when CAPSLOCK is down but SHIFT is not pressed
* - CAPSLOCK-SHIFT: Used when CAPSLOCK is down and SHIFT is pressed
* - ALT: Used when only ALT is presse
* - ALT-SHIFT: Used when ALT is pressed and either CAPSLOCK is down
* or SHIFT is pressed (but not both)
*
* Inputs:
* tables = pointer to the keyboard translation tables
*/
extern short sys_kbd_layout(const char * tables);
#endif #endif

View file

@ -5,10 +5,22 @@
#ifndef __UART_REG_H #ifndef __UART_REG_H
#define __UART_REG_H #define __UART_REG_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#define UART1_BASE 0x00C023F8 /* Base address for UART 1 (COM1) */ #define UART1_BASE 0x00C023F8 /* Base address for UART 1 (COM1) */
#define UART2_BASE 0x00C022F8 /* Base address for UART 2 (COM2) */ #define UART2_BASE 0x00C022F8 /* Base address for UART 2 (COM2) */
// Register Offsets #elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#define UART1_BASE 0x00B028F8 /* Base address for UART 1 (COM1) */
#define UART2_BASE 0x00B028F9 /* Base address for UART 2 (COM2) */
#endif
/*
* Register Offsets
*/
#define UART_TRHB 0x00 /* Transmit/Receive Hold Buffer */ #define UART_TRHB 0x00 /* Transmit/Receive Hold Buffer */
#define UART_DLL UART_TRHB /* Divisor Latch Low Byte */ #define UART_DLL UART_TRHB /* Divisor Latch Low Byte */
#define UART_DLH 0x01 /* Divisor Latch High Byte */ #define UART_DLH 0x01 /* Divisor Latch High Byte */
@ -67,6 +79,20 @@
#define LSR_ERR_OVERRUN 0x02 /* Overrun error */ #define LSR_ERR_OVERRUN 0x02 /* Overrun error */
#define LSR_DATA_AVAIL 0x01 /* Data is ready in the receive buffer */ #define LSR_DATA_AVAIL 0x01 /* Data is ready in the receive buffer */
#if MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#define UART_300 4167 /* Code for 300 bps */
#define UART_1200 1042 /* Code for 1200 bps */
#define UART_2400 521 /* Code for 2400 bps */
#define UART_4800 260 /* Code for 4800 bps */
#define UART_9600 130 /* Code for 9600 bps */
#define UART_19200 65 /* Code for 19200 bps */
#define UART_38400 33 /* Code for 28400 bps */
#define UART_57600 22 /* Code for 57600 bps */
#define UART_115200 11 /* Code for 115200 bps */
#else
#define UART_300 384 /* Code for 300 bps */ #define UART_300 384 /* Code for 300 bps */
#define UART_1200 96 /* Code for 1200 bps */ #define UART_1200 96 /* Code for 1200 bps */
#define UART_2400 48 /* Code for 2400 bps */ #define UART_2400 48 /* Code for 2400 bps */
@ -78,3 +104,7 @@
#define UART_115200 1 /* Code for 115200 bps */ #define UART_115200 1 /* Code for 115200 bps */
#endif #endif
#endif

View file

@ -6,14 +6,13 @@
#define __vicky_general_h #define __vicky_general_h
#include "types.h" #include "types.h"
#include "sys_general.h"
// #if SYSTEM == A2560K #if MODEL == MODEL_FOENIX_A2560K
// /* VICKY registers for the A2560K */ #include "A2560K/VICKYIII_a2560k.h"
#include "A2560K/VICKYIII_General.h" #elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/VICKYIII_a2560u.h"
#endif
// #elif SYSTEM == C256_FMX || SYSTEM == C256_U || SYSTEM == C256_U_PLUS
// /* VICKY registers for the C256 FMX, U, and U+ */
// #include "FMX/vicky_general.h"
// #endif
#endif #endif

130
src/indicators.c Normal file
View file

@ -0,0 +1,130 @@
/*
* System independent routines for controlling the built in indicator LEDs
*
* Indicators on the C256 and most of the A2560 lines of computers will be built in to
* the board and contolled by GABE. They will usually be simple off-on indicators.
*
* On the A2560K, the indicators are RGB LEDs on the keyboard or build into the machine.
*/
#include "gabe_reg.h"
#include "indicators.h"
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "dev/kbd_mo.h"
#endif
/*
* Initialize the indicators
*
* Generally, this means the indicators will all be turned off
*/
void ind_init() {
#if MODEL == MODEL_FOENIX_A2560K
/* The keyboard LEDs will be initialized by the keyboard code */
/* Turn off the power LED */
*RGB_LED_L = 0x0000;
*RGB_LED_H = 0x0000;
#endif
}
#if MODEL == MODEL_FOENIX_A2560K
short ind_state_color(short state) {
switch (state) {
case IND_ON:
/* Green for on */
return 0x02;
case IND_ERROR:
/* Red for error */
return 0x04;
default:
/* Anything else is off */
return 0;
}
}
void ind_set_power(short state) {
switch (state) {
case IND_ON:
/* Purple for on */
*RGB_LED_L = 0x00FF;
*RGB_LED_H = 0x00FF;
break;
case IND_ERROR:
/* Red for error */
*RGB_LED_L = 0x0000;
*RGB_LED_H = 0x0000;
break;
default:
/* Anything else is off */
*RGB_LED_L = 0x0000;
*RGB_LED_H = 0x0000;
break;
}
}
void ind_set_fdc(short state) {
kbdmo_set_fdc_led(ind_state_color(state));
}
void ind_set_sdc(short state) {
kbdmo_set_sdc_led(ind_state_color(state));
}
void ind_set_hdc(short state) {
kbdmo_set_hdc_led(ind_state_color(state));
}
#else
void ind_set_power(short state) {
;
}
void ind_set_fdc(short state) {
;
}
void ind_set_sdc(short state) {
;
}
void ind_set_hdc(short state) {
;
}
#endif
/*
* Set an indicator to the given state
*
* Inputs:
* ind_number = the number of the indicator to change
* state = the state the indicator should take (on, off, error)
*/
void ind_set(short ind_number, short state) {
switch (ind_number) {
case IND_POWER:
ind_set_power(state);
break;
case IND_FDC:
ind_set_fdc(state);
break;
case IND_SDC:
ind_set_sdc(state);
break;
case IND_HDC:
ind_set_hdc(state);
break;
default:
break;
}
}

38
src/indicators.h Normal file
View file

@ -0,0 +1,38 @@
/*
* System independent routines for controlling the built in indicator LEDs
*
* Indicators on the C256 and most of the A2560 lines of computers will be built in to
* the board and contolled by GABE. They will usually be simple off-on indicators.
*
* On the A2560K, the indicators are RGB LEDs on the keyboard or build into the machine.
*/
#ifndef __INDICATORS_H
#define __INDICATORS_H
#define IND_OFF 0x00 /* The LED should be off */
#define IND_ON 0x01 /* The LED should be on for a normal condition */
#define IND_ERROR 0x02 /* The LED should be on for an error condition (if possible) */
#define IND_POWER 0x00 /* Number for the power LED */
#define IND_SDC 0x01 /* Number for the SD Card's LED */
#define IND_HDC 0x02 /* Number for the hard drive (IDE) LED */
#define IND_FDC 0x03 /* Number for the flopy drive LED */
/*
* Initialize the indicators
*
* Generally, this means the indicators will all be turned off
*/
extern void ind_init();
/*
* Set an indicator to the given state
*
* Inputs:
* ind_number = the number of the indicator to change
* state = the state the indicator should take (on, off, error)
*/
extern void ind_set(short ind_number, short state);
#endif

View file

@ -157,16 +157,18 @@ void int_vicky_channel_a() {
unsigned short mask = 1; unsigned short mask = 1;
unsigned short pending = *PENDING_GRP0 & 0xff; unsigned short pending = *PENDING_GRP0 & 0xff;
/* Acknowledge all the pending interrupts:
* NOTE: we have to do this, even if there is no handler for the interrupt */
*PENDING_GRP0 = 0x00ff;
if (pending != 0) { if (pending != 0) {
for (n = 0; n < 8; n++) { for (n = 0; n < 8; n++) {
if (pending & mask) { if (pending & mask) {
p_int_handler handler = g_int_handler[n]; p_int_handler handler = g_int_handler[n];
if (handler) { if (handler) {
/* If we got a handler, call it */ /* If we got a handler, call it */
handler(); handler();
/* And acknowledge the interrupt */
int_clear(n);
} }
} }
@ -184,6 +186,10 @@ void int_vicky_channel_b() {
unsigned short mask = 1; unsigned short mask = 1;
unsigned short pending = (*PENDING_GRP0 >> 8) & 0xff; unsigned short pending = (*PENDING_GRP0 >> 8) & 0xff;
/* Acknowledge all the pending interrupts:
* NOTE: we have to do this, even if there is no handler for the interrupt */
*PENDING_GRP0 = 0xff00;
if (pending != 0) { if (pending != 0) {
for (n = 8; n < 16; n++) { for (n = 8; n < 16; n++) {
if (pending & mask) { if (pending & mask) {
@ -191,9 +197,6 @@ void int_vicky_channel_b() {
if (handler) { if (handler) {
/* If we got a handler, call it */ /* If we got a handler, call it */
handler(); handler();
/* And acknowledge the interrupt */
int_clear(n);
} }
} }

View file

@ -5,6 +5,8 @@
#ifndef __INTERRUPT_H #ifndef __INTERRUPT_H
#define __INTERRUPT_H #define __INTERRUPT_H
#include "sys_general.h"
/* Type declaration for an interrupt handler */ /* Type declaration for an interrupt handler */
typedef void (*p_int_handler)(); typedef void (*p_int_handler)();
@ -12,6 +14,8 @@ typedef void (*p_int_handler)();
* Interrupt control registers * Interrupt control registers
*/ */
#if MODEL == MODEL_FOENIX_A2560K
#define PENDING_GRP0 ((volatile unsigned short *)0x00C00100) #define PENDING_GRP0 ((volatile unsigned short *)0x00C00100)
#define PENDING_GRP1 ((volatile unsigned short *)0x00C00102) #define PENDING_GRP1 ((volatile unsigned short *)0x00C00102)
#define PENDING_GRP2 ((volatile unsigned short *)0x00C00104) #define PENDING_GRP2 ((volatile unsigned short *)0x00C00104)
@ -28,6 +32,27 @@ typedef void (*p_int_handler)();
#define MASK_GRP1 ((volatile unsigned short *)0x00C0011A) #define MASK_GRP1 ((volatile unsigned short *)0x00C0011A)
#define MASK_GRP2 ((volatile unsigned short *)0x00C0011C) #define MASK_GRP2 ((volatile unsigned short *)0x00C0011C)
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#define PENDING_GRP0 ((volatile unsigned short *)0x00B00100)
#define PENDING_GRP1 ((volatile unsigned short *)0x00B00102)
#define PENDING_GRP2 ((volatile unsigned short *)0x00B00104)
#define POL_GRP0 ((volatile unsigned short *)0x00B00108)
#define POL_GRP1 ((volatile unsigned short *)0x00B0010A)
#define POL_GRP2 ((volatile unsigned short *)0x00B0010C)
#define EDGE_GRP0 ((volatile unsigned short *)0x00B00110)
#define EDGE_GRP1 ((volatile unsigned short *)0x00B00112)
#define EDGE_GRP2 ((volatile unsigned short *)0x00B00114)
#define MASK_GRP0 ((volatile unsigned short *)0x00B00118)
#define MASK_GRP1 ((volatile unsigned short *)0x00B0011A)
#define MASK_GRP2 ((volatile unsigned short *)0x00B0011C)
#endif
/* /*
* For A2560K: $00C00100..$00C001FF - Interrupt Controllers * For A2560K: $00C00100..$00C001FF - Interrupt Controllers
*/ */
@ -172,15 +197,31 @@ extern void int_init();
* Enable all interrupts * Enable all interrupts
* *
* NOTE: this is actually provided in the low level assembly * NOTE: this is actually provided in the low level assembly
*
* Returns:
* a machine dependent representation of the interrupt masking prior to enabling
*/ */
extern void int_enable_all(); extern short int_enable_all();
/* /*
* Disable all interrupts * Disable all interrupts
* *
* NOTE: this is actually provided in the low level assembly * NOTE: this is actually provided in the low level assembly
*
* Returns:
* a machine dependent representation of the interrupt masking prior to disabling
*/ */
extern void int_disable_all(); extern short int_disable_all();
/*
* Restore interrupt masking state returned by a previous call to int_enable/int_disable
*
* NOTE: this is actually provided in the low level assembly
*
* Inputs:
* int_mask = machine dependent representation of the interrupt masking
*/
extern void int_restore(short int_mask);
/* /*
* Disable an interrupt by masking it * Disable an interrupt by masking it

177
src/log.c
View file

@ -15,6 +15,183 @@ void log_init() {
log_level = 999; log_level = 999;
} }
unsigned short panic_number; /* The number of the kernel panic */
unsigned long panic_pc; /* The PC where the issue occurred */
unsigned long panic_address; /* The address that was accessed (for some exceptions) */
const char * err_messages[] = {
"OK",
"error",
"bad device number",
"operation timed out",
"device could not be initialized",
"could not read from device",
"could not write to device",
"out of bounds",
"no media",
"device is write protected",
"bad channel number",
"out of handles",
"bad handle",
"unknown file type",
"out of memory",
"bad binary file",
"file is not executable",
"not found",
"low level disk error",
"file system assertion failed",
"device not ready",
"file not found",
"directory not found",
"invalid path name",
"access denied",
"prohibited access",
"invalid object",
"drive is write protected",
"invalid drive",
"volume has no work area",
"no file system found",
"creation of file system aborted",
"file system timeout",
"file locked",
"not enough core",
"too many open files",
"file system invalid parameter"
};
/*
* Return human readable message for an error number
*/
const char * err_message(short err_number) {
short index = 0 - err_number;
if (index < sizeof(err_messages)) {
return err_messages[index];
} else {
return "unknown error";
}
}
/*
* Print an error message
*
* Inputs:
* channel = the number of the channel to print to
* message = a message string to print before the error
* err_number = the number of the error
*/
void err_print(short channel, const char * message, short err_number) {
char buffer[80];
if (err_number < 0) {
sprintf(buffer, "%s: %s\n", message, err_message(err_number));
} else {
sprintf(buffer, "%s: #%d\n", message, err_number);
}
sys_chan_write(channel, buffer, strlen(buffer));
}
/*
* Display a panic screen
*/
void panic() {
char buffer[80];
short column = 18;
short row = 10;
short address_expected = 0;
/* Shut off all interrupts */
int_disable_all();
/* Re-initialize the text screen */
text_init();
text_set_border(0, 0, 0, 0, 0);
text_set_color(0, 15, 1);
text_set_cursor(0, 0, 0, 0, 0);
text_clear(0, 2);
text_set_xy(0, column, row++);
sprintf(buffer, "\xDA\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xBF");
print(0, buffer);
text_set_xy(0, column, row++);
sprintf(buffer, "\xB3 \xB3");
print(0, buffer);
text_set_xy(0, column, row++);
sprintf(buffer, "\xB3 Oh dear, something has gone wrong... \xB3");
print(0, buffer);
text_set_xy(0, column, row++);
sprintf(buffer, "\xB3 \xB3");
print(0, buffer);
text_set_xy(0, column, row++);
switch (panic_number) {
case 2:
sprintf(buffer, "\xB3 Bus Error \xB3");
address_expected = 1;
break;
case 3:
sprintf(buffer, "\xB3 Address Error \xB3");
address_expected = 1;
break;
case 4:
sprintf(buffer, "\xB3 Illegal Instruction Error \xB3");
break;
case 5:
sprintf(buffer, "\xB3 Division by Zero Error \xB3");
break;
case 6:
sprintf(buffer, "\xB3 Range Check Exception \xB3");
break;
case 7:
sprintf(buffer, "\xB3 Overflow Exception \xB3");
break;
case 8:
sprintf(buffer, "\xB3 Privilege Exception \xB3");
break;
case 24:
sprintf(buffer, "\xB3 Spurious Interrupt \xB3");
break;
default:
sprintf(buffer, "\xB3 Unknown Exception \xB3");
break;
}
print(0, buffer);
text_set_xy(0, column, row++);
sprintf(buffer, "\xB3 \xB3");
print(0, buffer);
if (address_expected) {
text_set_xy(0, column, row++);
print(0, "\xB3 PC: ");
print_hex_32(0, panic_pc);
print(0, " Address: ");
print_hex_32(0, panic_address);
print(0, " \xB3");
} else {
text_set_xy(0, column, row++);
print(0, "\xB3 PC: ");
print_hex_32(0, panic_pc);
print(0, " \xB3");
}
text_set_xy(0, column, row++);
sprintf(buffer, "\xB3 \xB3");
print(0, buffer);
text_set_xy(0, column, row++);
sprintf(buffer, "\xC0\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xD9");
print(0, buffer);
/* Wait forever */
while (1) ;
}
/* /*
* Set the maximum level of verbosity in logging. * Set the maximum level of verbosity in logging.
* To be printed, a message must have a level lower or equal to this level. * To be printed, a message must have a level lower or equal to this level.

View file

@ -12,6 +12,29 @@
#define LOG_TRACE 4 /* Log tracing information (like entry into a subroutine) */ #define LOG_TRACE 4 /* Log tracing information (like entry into a subroutine) */
#define LOG_VERBOSE 5 /* Log a truly verbose message... the sort you almost never want to bother with */ #define LOG_VERBOSE 5 /* Log a truly verbose message... the sort you almost never want to bother with */
/*
* Return human readable message for an error number
*/
extern const char * err_message(short err_number);
/*
* Print an error message
*
* Inputs:
* channel = the number of the channel to print to
* message = a message string to print before the error
* err_number = the number of the error
*/
extern void err_print(short channel, const char * message, short err_number);
/*
* Display a panic screen
*
* Inputs:
* vector = the number of the vector that was called
*/
extern void panic(unsigned short exception_number);
/* /*
* Set the maximum level of verbosity in logging. * Set the maximum level of verbosity in logging.
* To be printed, a message must have a level lower or equal to this level. * To be printed, a message must have a level lower or equal to this level.

View file

@ -1,5 +1,3 @@
override CFLAGS = +../../vbcc/config/m68k-foenix -I. -I.. -I../include
asources = startup_m68k.s asources = startup_m68k.s
aobjects = $(subst .s,.o,$(asources)) aobjects = $(subst .s,.o,$(asources))
csources = bios_m68k.c csources = bios_m68k.c

View file

@ -8,14 +8,23 @@
#include "types.h" #include "types.h"
#include "syscalls.h" #include "syscalls.h"
#include "interrupt.h" #include "interrupt.h"
#include "proc.h"
#include "dev/channel.h" #include "dev/channel.h"
#include "dev/block.h" #include "dev/block.h"
#include "dev/fsys.h" #include "dev/fsys.h"
#include "dev/rtc.h"
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K
#include "dev/kbd_mo.h"
#else
#include "dev/ps2.h"
#endif
/* /*
* Determine the correct system function implementation and call it. * Determine the correct system function implementation and call it.
*/ */
int32_t syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32_t param2, int32_t param3, int32_t param4, int32_t param5) { unsigned long syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32_t param2, int32_t param3, int32_t param4, int32_t param5) {
switch (function & 0x00f0) { switch (function & 0x00f0) {
case 0x00: case 0x00:
/* Core System Calls */ /* Core System Calls */
@ -39,12 +48,10 @@ int32_t syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32
return; return;
case KFN_INT_ENABLE_ALL: case KFN_INT_ENABLE_ALL:
int_enable_all(); return int_enable_all();
return;
case KFN_INT_DISABLE_ALL: case KFN_INT_DISABLE_ALL:
int_disable_all(); return int_disable_all();
return;
case KFN_INT_CLEAR: case KFN_INT_CLEAR:
int_clear((unsigned short)param0); int_clear((unsigned short)param0);
@ -53,6 +60,10 @@ int32_t syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32
case KFN_INT_PENDING: case KFN_INT_PENDING:
return int_pending((unsigned short)param0); return int_pending((unsigned short)param0);
case KFN_SYS_GET_INFO:
sys_get_information((p_sys_info)param0);
return;
default: default:
break; break;
} }
@ -88,6 +99,12 @@ int32_t syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32
case KFN_CHAN_IOCTRL: case KFN_CHAN_IOCTRL:
return chan_ioctrl((short)param0, (short)param1, (unsigned char *)param2, (short)param3); return chan_ioctrl((short)param0, (short)param1, (unsigned char *)param2, (short)param3);
case KFN_CHAN_OPEN:
return chan_open((short)param0, (const char *)param1, (short)param2);
case KFN_CHAN_CLOSE:
return chan_close((short)param0);
case KFN_CHAN_REGISTER: case KFN_CHAN_REGISTER:
return cdev_register((p_dev_chan)param0); return cdev_register((p_dev_chan)param0);
@ -152,12 +169,72 @@ int32_t syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32
case KFN_RENAME: case KFN_RENAME:
return fsys_rename((const char *)param0, (const char *)param1); return fsys_rename((const char *)param0, (const char *)param1);
case KFN_LOAD:
return fsys_load((char *)param0, (long)param1, (long *)param2);
case KFN_GET_LABEL:
return fsys_getlabel((char *)param0, (char *)param1);
case KFN_SET_LABEL:
return fsys_setlabel((short)param0, (char *)param1);
case KFN_GET_CWD:
return fsys_get_cwd((char *)param0);
case KFN_SET_CWD:
return fsys_set_cwd((char *)param0);
case KFN_LOAD_REGISTER:
return fsys_register_loader((char *)param0, (p_file_loader)param1);
default: default:
break; break;
} }
break; break;
case 0x40:
/* Process and Memory functions */
case KFN_RUN:
return proc_run((char *)param0, (int)param1, (char *)param2);
break;
case 0x50:
/* Misc functions */
switch (function) {
case KFN_TIME_JIFFIES:
return rtc_get_jiffies();
case KFN_TIME_SETRTC:
rtc_set_time((p_time)param0);
return 0;
case KFN_TIME_GETRTC:
rtc_get_time((p_time)param0);
return 0;
case KFN_KBD_SCANCODE:
#if MODEL == MODEL_FOENIX_A2560K
return kbdmo_get_scancode();
#else
return kbd_get_scancode();
#endif
case KFN_ERR_MESSAGE:
return (unsigned long)err_message((short)param0);
case KFN_KBD_LAYOUT:
#if MODEL == MODEL_FOENIX_A2560K
return kbdmo_layout((const char *)param0);
#else
return kbd_layout((const char *)param0);
#endif
default:
break;
}
default: default:
break; break;
} }

View file

@ -1,5 +1,7 @@
xref ___main xref ___main
xref _cli_rerepl xref _cli_rerepl
xref _panic
xref _panic_number
xdef _syscall xdef _syscall
xdef ___exit xdef ___exit
@ -8,17 +10,24 @@
xdef _call_user xdef _call_user
xdef _restart_cli xdef _restart_cli
;
; Interrupt registers for A2560U and U+
;
PENDING_GRP0 = $00B00100
PENDING_GRP1 = $00B00102
PENDING_GRP2 = $00B00104
section "vectors",code section "vectors",code
dc.l ___STACK ; 00 - Initial stack pointer dc.l ___STACK ; 00 - Initial stack pointer
dc.l coldboot ; 01 - Initial PC dc.l coldboot ; 01 - Initial PC
dc.l not_impl ; 02 - Bus error dc.l _handle_bus_err ; 02 - Bus error
dc.l not_impl ; 03 - Address error dc.l _handle_addr_err ; 03 - Address error
dc.l not_impl ; 04 - Illegal instruction dc.l _handle_inst_err ; 04 - Illegal instruction
dc.l not_impl ; 05 - Zero divide dc.l _handle_div0_err ; 05 - Zero divide
dc.l not_impl ; 06 - CHK instruction dc.l _handle_chk_err ; 06 - CHK instruction
dc.l not_impl ; 07 - TRAPV instruction dc.l _handle_trapv_err ; 07 - TRAPV instruction
dc.l not_impl ; 08 - Priviledge error dc.l _handle_priv_err ; 08 - Privilege error
dc.l not_impl ; 09 - Trace dc.l not_impl ; 09 - Trace
dc.l not_impl ; 10 - Line 1010 dc.l not_impl ; 10 - Line 1010
dc.l not_impl ; 11 - Line 1111 dc.l not_impl ; 11 - Line 1111
@ -34,13 +43,13 @@
dc.l not_impl ; 21 - Reserved dc.l not_impl ; 21 - Reserved
dc.l not_impl ; 22 - Reserved dc.l not_impl ; 22 - Reserved
dc.l not_impl ; 23 - Reserved dc.l not_impl ; 23 - Reserved
dc.l not_impl ; 24 - Spurious Interrupt dc.l _handle_spurious ; 24 - Spurious Interrupt
dc.l autovec1 ; 25 - Level 1 Interrupt Autovector dc.l not_impl ; 25 - Level 1 Interrupt Autovector
dc.l autovec2 ; 26 - Level 2 Interrupt Autovector dc.l not_impl ; 26 - Level 2 Interrupt Autovector
dc.l not_impl ; 27 - Level 3 Interrupt Autovector dc.l not_impl ; 27 - Level 3 Interrupt Autovector
dc.l not_impl ; 28 - Level 4 Interrupt Autovector dc.l not_impl ; 28 - Level 4 Interrupt Autovector
dc.l not_impl ; 29 - Level 5 Interrupt Autovector dc.l not_impl ; 29 - Level 5 Interrupt Autovector
dc.l not_impl ; 30 - Level 6 Interrupt Autovector dc.l autovec2 ; 30 - Level 6 Interrupt Autovector
dc.l not_impl ; 31 - Level 7 Interrupt Autovector dc.l not_impl ; 31 - Level 7 Interrupt Autovector
dc.l not_impl ; 32 - TRAP #0 dc.l not_impl ; 32 - TRAP #0
dc.l not_impl ; 33 - TRAP #1 dc.l not_impl ; 33 - TRAP #1
@ -77,38 +86,36 @@
dc.l interrupt_x10 ; 64 - Interrupt 0x10 - SuperIO - PS/2 Keyboard dc.l interrupt_x10 ; 64 - Interrupt 0x10 - SuperIO - PS/2 Keyboard
dc.l interrupt_x11 ; 65 - Interrupt 0x11 - A2560K Built-in Keyboard (Mo) dc.l interrupt_x11 ; 65 - Interrupt 0x11 - A2560K Built-in Keyboard (Mo)
dc.l interrupt_x12 ; 66 - Interrupt 0x12 - SuperIO - PS/2 Mouse dc.l interrupt_x12 ; 66 - Interrupt 0x12 - SuperIO - PS/2 Mouse
; dc.l interrupt_x13 ; 67 - Interrupt 0x13 - SuperIO - COM1 dc.l not_impl ; 67 - Interrupt 0x13 - SuperIO - COM1
; dc.l interrupt_x14 ; 68 - Interrupt 0x14 - SuperIO - COM2 dc.l not_impl ; 68 - Interrupt 0x14 - SuperIO - COM2
; dc.l interrupt_x15 ; 69 - Interrupt 0x15 - SuperIO - LPT1 dc.l not_impl ; 69 - Interrupt 0x15 - SuperIO - LPT1
; dc.l interrupt_x16 ; 70 - Interrupt 0x16 - SuperIO - Floppy Disk Controller dc.l not_impl ; 70 - Interrupt 0x16 - SuperIO - Floppy Disk Controller
; dc.l interrupt_x17 ; 71 - Interrupt 0x17 - SuperIO - MIDI dc.l not_impl ; 71 - Interrupt 0x17 - SuperIO - MIDI
; dc.l interrupt_x18 ; 72 - Interrupt 0x18 - Timer 0 dc.l not_impl ; 72 - Interrupt 0x18 - Timer 0
; dc.l interrupt_x19 ; 73 - Interrupt 0x19 - Timer 1 dc.l not_impl ; 73 - Interrupt 0x19 - Timer 1
; dc.l interrupt_x1A ; 74 - Interrupt 0x1A - Timer 2 dc.l not_impl ; 74 - Interrupt 0x1A - Timer 2
; dc.l interrupt_x1B ; 76 - Interrupt 0x1B - Timer 3 dc.l not_impl ; 76 - Interrupt 0x1B - Timer 3
; dc.l interrupt_x1C ; 75 - Interrupt 0x1C - Timer 4 dc.l not_impl ; 75 - Interrupt 0x1C - Timer 4
; dc.l not_impl ; 77 - Interrupt 0x1D - Reserved dc.l not_impl ; 77 - Interrupt 0x1D - Reserved
; dc.l not_impl ; 78 - Interrupt 0x1E - Reserved dc.l not_impl ; 78 - Interrupt 0x1E - Reserved
dc.l interrupt_x1F ; 79 - Interrupt 0x1F - Real Time Clock dc.l interrupt_x1F ; 79 - Interrupt 0x1F - Real Time Clock
; dc.l interrupt_x20 ; 80 - Interrupt 0x20 - IDE HDD Generated Interrupt dc.l not_impl ; 80 - Interrupt 0x20 - IDE HDD Generated Interrupt
; dc.l interrupt_x21 ; 81 - Interrupt 0x21 - SDCard Insert dc.l not_impl ; 81 - Interrupt 0x21 - SDCard Insert
; dc.l interrupt_x22 ; 82 - Interrupt 0x22 - SDCard Controller dc.l not_impl ; 82 - Interrupt 0x22 - SDCard Controller
; dc.l interrupt_x23 ; 83 - Interrupt 0x23 - Internal OPM dc.l not_impl ; 83 - Interrupt 0x23 - Internal OPM
; dc.l interrupt_x24 ; 84 - Interrupt 0x24 - External OPN2 dc.l not_impl ; 84 - Interrupt 0x24 - External OPN2
; dc.l interrupt_x25 ; 85 - Interrupt 0x25 - External OPL3 dc.l not_impl ; 85 - Interrupt 0x25 - External OPL3
; dc.l interrupt_x26 ; 86 - Interrupt 0x26 - Reserved dc.l not_impl ; 86 - Interrupt 0x26 - Reserved
; dc.l interrupt_x27 ; 87 - Interrupt 0x27 - Reserved dc.l not_impl ; 87 - Interrupt 0x27 - Reserved
; dc.l interrupt_x28 ; 88 - Interrupt 0x28 - Beatrix Interrupt 0 dc.l not_impl ; 88 - Interrupt 0x28 - Beatrix Interrupt 0
; dc.l interrupt_x29 ; 89 - Interrupt 0x29 - Beatrix Interrupt 1 dc.l not_impl ; 89 - Interrupt 0x29 - Beatrix Interrupt 1
; dc.l interrupt_x2A ; 90 - Interrupt 0x2A - Beatrix Interrupt 2 dc.l not_impl ; 90 - Interrupt 0x2A - Beatrix Interrupt 2
; dc.l interrupt_x2B ; 91 - Interrupt 0x2B - Beatrix Interrupt 3 dc.l not_impl ; 91 - Interrupt 0x2B - Beatrix Interrupt 3
; dc.l interrupt_x2C ; 92 - Interrupt 0x2C - Reserved dc.l not_impl ; 92 - Interrupt 0x2C - Reserved
; dc.l interrupt_x2D ; 93 - Interrupt 0x2D - DAC1 Playback Done Interrupt (48K) dc.l not_impl ; 93 - Interrupt 0x2D - DAC1 Playback Done Interrupt (48K)
; dc.l interrupt_x2E ; 94 - Interrupt 0x2E - Reserved dc.l not_impl ; 94 - Interrupt 0x2E - Reserved
; dc.l interrupt_x2F ; 95 - Interrupt 0x2F - DAC0 Playback Done Interrupt (44.1K) dc.l not_impl ; 95 - Interrupt 0x2F - DAC0 Playback Done Interrupt (44.1K)
; TODO: make room for reserved and User Interrupt Vectors
code code
@ -119,13 +126,13 @@ coldboot: lea ___STACK,sp
move.l #___BSSSIZE,d0 move.l #___BSSSIZE,d0
beq callmain beq callmain
clrloop: clr.l (a0)+ ; clrloop: clr.l (a0)+
subq.l #4,d0 ; subq.l #4,d0
bne clrloop ; bne clrloop
; Set TRAP #13 vector handler ; Set TRAP #15 vector handler
lea h_trap_15,a0 ; Address of the handler lea h_trap_15,a0 ; Address of the handler
move.l #(13+32)<<2,a1 ; TRAP#13 vector address move.l #(13+32)<<2,a1 ; TRAP#15 vector address
move.l a0,(a1) ; Set the vector move.l a0,(a1) ; Set the vector
callmain: jsr ___main ; call __main to transfer to the C code callmain: jsr ___main ; call __main to transfer to the C code
@ -158,27 +165,29 @@ autovec2: movem.l d0-d7/a0-a6,-(a7)
; ;
int_dispatch: int_dispatch:
lea _g_int_handler,a0 ; Look in the interrupt handler table lea _g_int_handler,a0 ; Look in the interrupt handler table
movea.l (0,a0,d0),a1 ; Get the address of the handler move.l (0,a0,d0),d0 ; Get the address of the handler
beq intdis_end ; If there isn't one, just return beq intdis_end ; If there isn't one, just return
movea.l d0,a0
jsr (a0) ; If there is, call it.
jsr (a1) ; If there is, call it. intdis_end: movem.l (a7)+,d0-d7/a0-a6 ; Restore affected registers
intdis_end: movem.l (a7)+,d0-d7/a0-a6 ; Restore the registers
rte rte
; ;
; Interrupt Vector 0x10 -- SuperIO Keyboard ; Interrupt Vector 0x10 -- SuperIO Keyboard
; ;
interrupt_x10: interrupt_x10:
movem.l d0-d7/a0-a6,-(a7) ; Save all the registers move.w #$0001,(PENDING_GRP1) ; Clear the flag for INT 10
movem.l d0-d7/a0-a6,-(a7) ; Save affected registers
move.w #($10<<2),d0 ; Get the offset to interrupt 0x11 move.w #($10<<2),d0 ; Get the offset to interrupt 0x11
bra int_dispatch ; And process the interrupt bra int_dispatch
; ;
; Interrupt Vector 0x11 -- A2560K "Mo" keyboard ; Interrupt Vector 0x11 -- A2560K "Mo" keyboard
; ;
interrupt_x11: interrupt_x11:
movem.l d0-d7/a0-a6,-(a7) ; Save all the registers move.w #$0002,(PENDING_GRP1) ; Clear the flag for INT 11
movem.l d0-d7/a0-a6,-(a7) ; Save affected registers
move.w #($11<<2),d0 ; Get the offset to interrupt 0x11 move.w #($11<<2),d0 ; Get the offset to interrupt 0x11
bra int_dispatch ; And process the interrupt bra int_dispatch ; And process the interrupt
@ -186,21 +195,28 @@ interrupt_x11:
; Interrupt Vector 0x12 -- SuperIO Mouse ; Interrupt Vector 0x12 -- SuperIO Mouse
; ;
interrupt_x12: interrupt_x12:
movem.l d0-d7/a0-a6,-(a7) ; Save all the registers move.w #$0004,(PENDING_GRP1) ; Clear the flag for INT 12
movem.l d0-d7/a0-a6,-(a7) ; Save affected registers
move.w #($12<<2),d0 ; Get the offset to interrupt 0x11 move.w #($12<<2),d0 ; Get the offset to interrupt 0x11
bra int_dispatch ; And process the interrupt bra int_dispatch ; And process the interrupt
; jsr _mouse_handle_irq
; movem.l (a7)+,d0-d7/a0-a6 ; Restore the registers
; rte
; ;
; Interrupt Vector 0x1F -- RTC ; Interrupt Vector 0x1F -- RTC
; ;
interrupt_x1F: interrupt_x1F:
movem.l d0-d7/a0-a6,-(a7) ; Save all the registers move.w #$8000,(PENDING_GRP1) ; Clear the flag for INT 1F
movem.l d0-d7/a0-a6,-(a7) ; Save affected registers
move.w #($1f<<2),d0 ; Get the offset to interrupt 0x1f move.w #($1f<<2),d0 ; Get the offset to interrupt 0x1f
bra int_dispatch ; And process the interrupt bra int_dispatch ; And process the interrupt
;
; Interrupt Vector 0x21 -- SDCard Insert
;
interrupt_x21:
movem.l d0-d7/a0-a6,-(a7) ; Save affected registers
move.w #($21<<2),d0 ; Get the offset to interrupt 0x1f
bra int_dispatch ; And process the interrupt
; ;
; Unimplemented Exception Handler -- just return ; Unimplemented Exception Handler -- just return
; ;
@ -209,15 +225,111 @@ not_impl: rte
; ;
; Enable all interrupts ; Enable all interrupts
; ;
_int_enable_all: andi.w #$F8FF,SR _int_enable_all: move.w SR,d0 ; Save the old level for return
andi.w #$0700,d0
lsr.w #8,d0
ext.l d0
andi.w #$F8FF,SR ; Clear the level
rts rts
; ;
; Disable all interrupts ; Disable all interrupts
; ;
_int_disable_all: ori.w #$0700,SR _int_disable_all: move.w SR,d0 ; Save the old level for return
andi.w #$0700,d0
lsr.w #8,d0
ext.l d0
ori.w #$0700,SR ; Set the level to 7
rts rts
;
; Restore interrupt priority
;
_int_restore: move.w (4,sp),d0 ; Get the priority into d0
andi.w #3,d0
lsl.w #8,d0
move.w sr,d1 ; Get the current SR into d1
andi.w #$F8FF,d1 ; Clear the old priority
or.w d0,d1 ; And set it to the current
move.w d1,sr ; And set the level
rts
;
; Handlers for the various exceptions...
;
; These all go to the kernel panic screen after placing the
; triggering PC address in "panic_pc" and the number of the exception
; in "panic_number". Bus and address errors will also put the
; address involved in "panic_address".
;
_handle_bus_err:
lea _panic_number,a0
lea _panic_pc,a1
lea _panic_address,a2
move.w #2,(a0)
move.l (10,a7),(a1)
move.l (2,a7),(a2)
bra call_panic
_handle_addr_err:
lea _panic_number,a0
lea _panic_pc,a1
lea _panic_address,a2
move.w #3,(a0)
move.l (10,a7),(a1)
move.l (2,a7),(a2)
bra call_panic
_handle_inst_err:
lea _panic_number,a0
lea _panic_pc,a1
move.w #4,(a0)
move.l (2,a7),(a1)
bra call_panic
_handle_div0_err:
lea _panic_number,a0
lea _panic_pc,a1
move.w #5,(a0)
move.l (2,a7),(a1)
bra call_panic
_handle_chk_err:
lea _panic_number,a0
lea _panic_pc,a1
move.w #6,(a0)
move.l (2,a7),(a1)
bra call_panic
_handle_trapv_err:
lea _panic_number,a0
lea _panic_pc,a1
move.w #7,(a0)
move.l (2,a7),(a1)
bra call_panic
_handle_priv_err:
lea _panic_number,a0
lea _panic_pc,a1
move.w #8,(a0)
move.l (2,a7),(a1)
bra call_panic
_handle_spurious:
lea _panic_number,a0
lea _panic_pc,a1
move.w #24,(a0)
move.l (2,a7),(a1)
bra call_panic
call_panic: jsr _panic
panic_lock: bra panic_lock
; ;
; Function to make a system call based on the number of the system function: ; Function to make a system call based on the number of the system function:
; int32_t syscall(int32_t number, int32_t p0, int32_t p1, int32_t p2, int32_t p3, int32_t p4, int32_t p5) ; int32_t syscall(int32_t number, int32_t p0, int32_t p1, int32_t p2, int32_t p3, int32_t p4, int32_t p5)
@ -237,7 +349,6 @@ _syscall:
movem.l (sp)+,d1-d7 ; Restore caller's registers movem.l (sp)+,d1-d7 ; Restore caller's registers
rts rts
; ;
; TRAP#15 handler... transfer control to the C dispatcher ; TRAP#15 handler... transfer control to the C dispatcher
; ;
@ -265,11 +376,16 @@ h_trap_15:
; a1 = location to set user stack pointer ; a1 = location to set user stack pointer
; ;
_call_user: _call_user:
move.l (4,a7),a0 move.l (4,a7),a0 ; Get the pointer to the code to start
move.l (8,a7),a1 move.l (8,a7),a1 ; Get the pointer to the process's stack
move.l (12,a7),d0 ; Get the number of parameters passed
move.l (16,a7),a2 ; Get the pointer to the parameters
andi #$dfff,sr ; Drop into user mode andi #$dfff,sr ; Drop into user mode
movea.l a1,a7 ; Set the stack movea.l a1,a7 ; Set the stack
jmp (a0)
move.l a2,-(a7) ; Push the parameters list
move.l d0,-(a7) ; Push the parameter count
jsr (a0)
_restart_cli: _restart_cli:
lea ___STACK,sp lea ___STACK,sp

12079
src/mapfile

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@
#include "log.h" #include "log.h"
#include "dev/fsys.h" #include "dev/fsys.h"
static const long k_default_stack = 0x0000ffff; /* For now... we're just going to put the user stack under 0x00010000 */ static const long k_default_stack = 0x00010000; /* For now... we're just going to put the user stack under 0x00010000 */
static int g_proc_result; static int g_proc_result;
/* /*
@ -18,7 +18,7 @@ static int g_proc_result;
*/ */
extern void restart_cli(); extern void restart_cli();
extern void call_user(long start, long stack); extern void call_user(long start, long stack, int argc, char * argv[]);
/* /*
* Start a user mode process * Start a user mode process
@ -26,15 +26,17 @@ extern void call_user(long start, long stack);
* Inputs: * Inputs:
* start = the address to start execution * start = the address to start execution
* stack = the location to start the user mode stack * stack = the location to start the user mode stack
* argc = the number of parameters
* argv = the array of parameters
*/ */
void proc_exec(long start, long stack) { void proc_exec(long start, long stack, int argc, char * argv[]) {
TRACE("proc_exec"); TRACE("proc_exec");
log_num(LOG_INFO, "proc_exec start: ", start); log_num(LOG_INFO, "proc_exec start: ", start);
log_num(LOG_INFO, "proc_exec stack: ", stack); log_num(LOG_INFO, "proc_exec stack: ", stack);
g_proc_result = 0; g_proc_result = 0;
call_user(start, stack); call_user(start, stack, argc, argv);
} }
/* /*
@ -63,11 +65,13 @@ int proc_get_result() {
* *
* Inputs: * Inputs:
* path = the path to try to load * path = the path to try to load
* argc = the number of parameters
* argv = the array of parameters
* *
* Returns: * Returns:
* returns an error code on failure, will not return on success * returns an error code on failure, will not return on success
*/ */
short proc_run(const char * path) { short proc_run(const char * path, int argc, char * argv[]) {
TRACE("proc_run"); TRACE("proc_run");
@ -79,7 +83,7 @@ short proc_run(const char * path) {
short result = fsys_load(path, 0, &start); short result = fsys_load(path, 0, &start);
if (result == 0) { if (result == 0) {
if (start != 0) { if (start != 0) {
proc_exec(start, k_default_stack); proc_exec(start, k_default_stack, argc, argv);
} else { } else {
log_num(LOG_ERROR, "Couldn't execute file: ", result); log_num(LOG_ERROR, "Couldn't execute file: ", result);
return ERR_NOT_EXECUTABLE; return ERR_NOT_EXECUTABLE;

View file

@ -15,8 +15,10 @@
* Inputs: * Inputs:
* start = the address to start execution * start = the address to start execution
* stack = the location to start the user mode stack * stack = the location to start the user mode stack
* argc = the number of parameters
* argv = the array of parameters
*/ */
extern void proc_exec(long start, long stack); extern void proc_exec(long start, long stack, int argc, char * argv[]);
/* /*
* Quit the current user process * Quit the current user process
@ -39,10 +41,12 @@ extern int proc_get_result();
* *
* Inputs: * Inputs:
* path = the path to try to load * path = the path to try to load
* argc = the number of parameters
* argv = the array of parameters
* *
* Returns: * Returns:
* returns an error code on failure, will not return on success * returns an error code on failure, will not return on success
*/ */
extern short proc_run(const char * path); extern short proc_run(const char * path, int argc, char * argv[]);
#endif #endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

63
src/rsrc/bitmaps/bmp2c.py Normal file
View file

@ -0,0 +1,63 @@
#
# Convert an image for the C256
#
from PIL import Image
from optparse import OptionParser
def emit(output, count, pixel_count, last_pixel):
if count % 16 == 0:
if count == 0:
output.write("\t0x{0:02X}, 0x{1:02X}".format(pixel_count, last_pixel))
else:
output.write(",\n\t0x{0:02X}, 0x{1:02X}".format(pixel_count, last_pixel))
else:
output.write(", 0x{0:02X}, 0x{1:02X}".format(pixel_count, last_pixel))
parser = OptionParser()
parser.add_option("-i", "--input", dest="input", help="Source image file")
parser.add_option("-o", "--output", dest="output", default="image.h", help="Destination for image and color data.")
(options, args) = parser.parse_args()
if options.input:
with open(options.output, "w") as output_file:
with Image.open(options.input) as im:
output_file.write("unsigned char splashscreen_lut[] = {\n")
palette = im.getpalette()
while palette:
r = palette.pop(0)
g = palette.pop(0)
b = palette.pop(0)
output_file.write("\t0x{0:02X}, 0x{1:02X}, 0x{2:02X}, 0x00,\n".format(b, g, r))
output_file.write("}\n\n")
last_pixel = -1
pixel_count = 0
count = 0
output_file.write("unsigned char splashscreen_pix[] = {\n")
(w, h) = im.size
for v in range(0, h):
for u in range(0, w):
pixel = im.getpixel((u, v))
if last_pixel != pixel:
if last_pixel != -1:
emit(output_file, count, pixel_count, last_pixel)
count = count + 2
pixel_count = 1
last_pixel = pixel
else:
pixel_count = pixel_count + 1
if pixel_count == 256:
emit(output_file, count, pixel_count-1, last_pixel)
count = count + 2
pixel_count = 1
last_pixel = pixel
emit(output_file, count, pixel_count, last_pixel)
output_file.write(", 0x00, 0x00\n}\n")
else:
parser.print_help()

827
src/rsrc/bitmaps/image.h Normal file
View file

@ -0,0 +1,827 @@
unsigned char splashscreen_lut[] = {
0x00, 0x00, 0xFF, 0x00,
0x08, 0x08, 0xFE, 0x00,
0x0B, 0x0B, 0xFD, 0x00,
0x5F, 0x5F, 0x00, 0x00,
0x60, 0x60, 0x00, 0x00,
0x61, 0x61, 0x00, 0x00,
0x62, 0x62, 0x00, 0x00,
0x63, 0x63, 0x00, 0x00,
0x64, 0x64, 0x00, 0x00,
0x65, 0x65, 0x00, 0x00,
0x66, 0x66, 0x00, 0x00,
0x67, 0x67, 0x00, 0x00,
0x68, 0x68, 0x00, 0x00,
0x69, 0x69, 0x00, 0x00,
0x6A, 0x6A, 0x00, 0x00,
0x6B, 0x6B, 0x00, 0x00,
0x6D, 0x6D, 0x00, 0x00,
0x6E, 0x6E, 0x00, 0x00,
0x29, 0x29, 0xF3, 0x00,
0x6F, 0x6F, 0x00, 0x00,
0x2A, 0x2A, 0xF3, 0x00,
0x70, 0x70, 0x00, 0x00,
0x71, 0x71, 0x00, 0x00,
0x72, 0x72, 0x00, 0x00,
0x73, 0x73, 0x00, 0x00,
0x77, 0x77, 0x00, 0x00,
0x78, 0x78, 0x00, 0x00,
0x79, 0x79, 0x00, 0x00,
0x7B, 0x7B, 0x00, 0x00,
0x7C, 0x7C, 0x00, 0x00,
0x7E, 0x7E, 0x00, 0x00,
0x80, 0x80, 0x00, 0x00,
0x80, 0x80, 0x01, 0x00,
0x81, 0x81, 0x02, 0x00,
0x80, 0x80, 0x06, 0x00,
0x81, 0x81, 0x0D, 0x00,
0x83, 0x83, 0x07, 0x00,
0x81, 0x81, 0x12, 0x00,
0x84, 0x84, 0x09, 0x00,
0x82, 0x82, 0x16, 0x00,
0x82, 0x82, 0x19, 0x00,
0x86, 0x86, 0x0F, 0x00,
0x83, 0x83, 0x1F, 0x00,
0x83, 0x83, 0x22, 0x00,
0x84, 0x84, 0x24, 0x00,
0x85, 0x85, 0x29, 0x00,
0x8A, 0x8A, 0x18, 0x00,
0x85, 0x85, 0x2B, 0x00,
0x8B, 0x8B, 0x1D, 0x00,
0x86, 0x86, 0x30, 0x00,
0x8C, 0x8C, 0x20, 0x00,
0x87, 0x87, 0x33, 0x00,
0x69, 0x69, 0x9E, 0x00,
0x6A, 0x6A, 0x9B, 0x00,
0x68, 0x68, 0xA2, 0x00,
0x6B, 0x6B, 0x99, 0x00,
0x6D, 0x6D, 0x94, 0x00,
0x6B, 0x6B, 0x9B, 0x00,
0x88, 0x88, 0x36, 0x00,
0x8E, 0x8E, 0x24, 0x00,
0x8F, 0x8F, 0x27, 0x00,
0x89, 0x89, 0x3C, 0x00,
0x90, 0x90, 0x29, 0x00,
0x90, 0x90, 0x2A, 0x00,
0x8A, 0x8A, 0x3F, 0x00,
0x8B, 0x8B, 0x41, 0x00,
0x92, 0x92, 0x2F, 0x00,
0x93, 0x93, 0x30, 0x00,
0x93, 0x93, 0x32, 0x00,
0x8D, 0x8D, 0x47, 0x00,
0x94, 0x94, 0x33, 0x00,
0x8E, 0x8E, 0x49, 0x00,
0x94, 0x94, 0x35, 0x00,
0x95, 0x95, 0x36, 0x00,
0x8F, 0x8F, 0x4C, 0x00,
0x8F, 0x8F, 0x4E, 0x00,
0x97, 0x97, 0x3B, 0x00,
0x6D, 0x80, 0x94, 0x00,
0x98, 0x98, 0x3F, 0x00,
0x92, 0x92, 0x54, 0x00,
0x6B, 0x80, 0x99, 0x00,
0x92, 0x92, 0x56, 0x00,
0x6A, 0x80, 0x9B, 0x00,
0x6B, 0x80, 0x9B, 0x00,
0x69, 0x80, 0x9E, 0x00,
0x93, 0x93, 0x58, 0x00,
0x68, 0x80, 0xA2, 0x00,
0x9A, 0x9A, 0x44, 0x00,
0x6D, 0xB3, 0x00, 0x00,
0x9B, 0x9B, 0x45, 0x00,
0x95, 0x95, 0x5C, 0x00,
0x6B, 0xB6, 0x00, 0x00,
0x6A, 0xB7, 0x00, 0x00,
0x6B, 0xB7, 0x00, 0x00,
0x69, 0xB9, 0x00, 0x00,
0xB3, 0xB3, 0x00, 0x00,
0x9E, 0x9E, 0x4D, 0x00,
0x98, 0x98, 0x62, 0x00,
0x9E, 0x9E, 0x4E, 0x00,
0x98, 0x98, 0x63, 0x00,
0x68, 0xBB, 0x00, 0x00,
0xB6, 0xB6, 0x00, 0x00,
0xB7, 0xB7, 0x00, 0x00,
0x9A, 0x9A, 0x66, 0x00,
0xB9, 0xB9, 0x00, 0x00,
0xA1, 0xA1, 0x54, 0x00,
0xA2, 0xA2, 0x57, 0x00,
0x9C, 0x9C, 0x6C, 0x00,
0xBB, 0xBB, 0x00, 0x00,
0x9D, 0x9D, 0x6D, 0x00,
0x29, 0x80, 0xF3, 0x00,
0x2A, 0x80, 0xF3, 0x00,
0x00, 0x80, 0xFF, 0x00,
0x0B, 0x80, 0xFD, 0x00,
0x08, 0x80, 0xFE, 0x00,
0x9F, 0x9F, 0x72, 0x00,
0xA7, 0xA7, 0x63, 0x00,
0xA2, 0xA2, 0x77, 0x00,
0xA8, 0xA8, 0x66, 0x00,
0xA4, 0xA4, 0x7C, 0x00,
0xAA, 0xAA, 0x6B, 0x00,
0xA7, 0xA7, 0x81, 0x00,
0xAC, 0xAC, 0x71, 0x00,
0xAE, 0xAE, 0x74, 0x00,
0xAA, 0xAA, 0x85, 0x00,
0xAC, 0xAC, 0x8A, 0x00,
0xB2, 0xB2, 0x7D, 0x00,
0xB2, 0xB2, 0x7E, 0x00,
0xAF, 0xAF, 0x8D, 0x00,
0x6D, 0xB3, 0x94, 0x00,
0xB5, 0xB5, 0x84, 0x00,
0xB1, 0xB1, 0x92, 0x00,
0xB5, 0xB5, 0x86, 0x00,
0x6B, 0xB6, 0x99, 0x00,
0x6A, 0xB7, 0x9B, 0x00,
0x6B, 0xB7, 0x9B, 0x00,
0xB3, 0xB3, 0x95, 0x00,
0xB7, 0xB7, 0x8A, 0x00,
0x69, 0xB9, 0x9E, 0x00,
0xB6, 0xB6, 0x99, 0x00,
0xB9, 0xB9, 0x8F, 0x00,
0x68, 0xBB, 0xA2, 0x00,
0xBB, 0xBB, 0x92, 0x00,
0xB8, 0xB8, 0x9D, 0x00,
0x2A, 0xF5, 0x00, 0x00,
0x29, 0xF6, 0x00, 0x00,
0xBC, 0xBC, 0x96, 0x00,
0xBA, 0xBA, 0xA0, 0x00,
0xBB, 0xBB, 0xA1, 0x00,
0xBC, 0xBC, 0xA3, 0x00,
0x08, 0xFE, 0x00, 0x00,
0x0B, 0xFE, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00,
0xC0, 0xC0, 0x9E, 0x00,
0xBE, 0xBE, 0xA6, 0x00,
0xC1, 0xC1, 0xA1, 0x00,
0xBF, 0xBF, 0xA8, 0x00,
0xC2, 0xC2, 0xA2, 0x00,
0xC0, 0xC0, 0xA9, 0x00,
0xC2, 0xC2, 0xA4, 0x00,
0xC1, 0xC1, 0xAA, 0x00,
0xC4, 0xC4, 0xA8, 0x00,
0xC3, 0xC3, 0xAD, 0x00,
0xC3, 0xC3, 0xAE, 0x00,
0xF5, 0xF5, 0x00, 0x00,
0xC5, 0xC5, 0xAA, 0x00,
0xF6, 0xF6, 0x00, 0x00,
0xC4, 0xC4, 0xAF, 0x00,
0xC5, 0xC5, 0xB0, 0x00,
0xC6, 0xC6, 0xAD, 0x00,
0xC5, 0xC5, 0xB1, 0x00,
0xC6, 0xC6, 0xB2, 0x00,
0xC7, 0xC7, 0xAF, 0x00,
0xC7, 0xC7, 0xB3, 0x00,
0xC8, 0xC8, 0xB0, 0x00,
0xC8, 0xC8, 0xB2, 0x00,
0xC8, 0xC8, 0xB4, 0x00,
0xC8, 0xC8, 0xB5, 0x00,
0xC9, 0xC9, 0xB3, 0x00,
0xC9, 0xC9, 0xB6, 0x00,
0xC9, 0xC9, 0xB7, 0x00,
0xFE, 0xFE, 0x00, 0x00,
0xCA, 0xCA, 0xB6, 0x00,
0xCA, 0xCA, 0xB7, 0x00,
0xCA, 0xCA, 0xB8, 0x00,
0xFF, 0xFF, 0x00, 0x00,
0xCB, 0xCB, 0xB8, 0x00,
0xCB, 0xCB, 0xB9, 0x00,
0xCB, 0xCB, 0xBA, 0x00,
0xCC, 0xCC, 0xB9, 0x00,
0xCC, 0xCC, 0xBA, 0x00,
0xCC, 0xCC, 0xBB, 0x00,
0xCD, 0xCD, 0xBB, 0x00,
0xCD, 0xCD, 0xBC, 0x00,
0x2A, 0xF5, 0xF3, 0x00,
0x29, 0xF6, 0xF3, 0x00,
0x0B, 0xFE, 0xFD, 0x00,
0x08, 0xFE, 0xFE, 0x00,
0x00, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0xFF, 0x00,
0xC8, 0xC8, 0xC8, 0x00,
0xC9, 0xC9, 0xC9, 0x00,
0xCA, 0xCA, 0xCA, 0x00,
0xCB, 0xCB, 0xCB, 0x00,
0xCC, 0xCC, 0xCC, 0x00,
0xCD, 0xCD, 0xCD, 0x00,
0xCE, 0xCE, 0xCE, 0x00,
0xCF, 0xCF, 0xCF, 0x00,
0xD0, 0xD0, 0xD0, 0x00,
0xD1, 0xD1, 0xD1, 0x00,
0xD2, 0xD2, 0xD2, 0x00,
0xD3, 0xD3, 0xD3, 0x00,
0xD4, 0xD4, 0xD4, 0x00,
0xD5, 0xD5, 0xD5, 0x00,
0xD6, 0xD6, 0xD6, 0x00,
0xD7, 0xD7, 0xD7, 0x00,
0xD8, 0xD8, 0xD8, 0x00,
0xD9, 0xD9, 0xD9, 0x00,
0xDA, 0xDA, 0xDA, 0x00,
0xDB, 0xDB, 0xDB, 0x00,
0xDC, 0xDC, 0xDC, 0x00,
0xDD, 0xDD, 0xDD, 0x00,
0xDE, 0xDE, 0xDE, 0x00,
0xDF, 0xDF, 0xDF, 0x00,
0xE0, 0xE0, 0xE0, 0x00,
0xE1, 0xE1, 0xE1, 0x00,
0xE2, 0xE2, 0xE2, 0x00,
0xE3, 0xE3, 0xE3, 0x00,
0xE4, 0xE4, 0xE4, 0x00,
0xE5, 0xE5, 0xE5, 0x00,
0xE6, 0xE6, 0xE6, 0x00,
0xE7, 0xE7, 0xE7, 0x00,
0xE8, 0xE8, 0xE8, 0x00,
0xE9, 0xE9, 0xE9, 0x00,
0xEA, 0xEA, 0xEA, 0x00,
0xEB, 0xEB, 0xEB, 0x00,
0xEC, 0xEC, 0xEC, 0x00,
0xED, 0xED, 0xED, 0x00,
0xEE, 0xEE, 0xEE, 0x00,
0xEF, 0xEF, 0xEF, 0x00,
0xF0, 0xF0, 0xF0, 0x00,
0xF1, 0xF1, 0xF1, 0x00,
0xF2, 0xF2, 0xF2, 0x00,
0xF3, 0xF3, 0xF3, 0x00,
0xF4, 0xF4, 0xF4, 0x00,
0xF5, 0xF5, 0xF5, 0x00,
0xF6, 0xF6, 0xF6, 0x00,
0xF7, 0xF7, 0xF7, 0x00,
0xF8, 0xF8, 0xF8, 0x00,
0xF9, 0xF9, 0xF9, 0x00,
0xFA, 0xFA, 0xFA, 0x00,
0xFB, 0xFB, 0xFB, 0x00,
0xFC, 0xFC, 0xFC, 0x00,
0xFD, 0xFD, 0xFD, 0x00,
0xFE, 0xFE, 0xFE, 0x00,
0xFF, 0xFF, 0xFF, 0x00,
}
unsigned char splashscreen_pix[] = {
0x00, 0x-1, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x62, 0x1F, 0x01, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x81, 0x1F, 0x03, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x01, 0xC7, 0x2B, 0x1F,
0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x02, 0xC7, 0x28, 0x1F, 0x06, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x24, 0x1F, 0x08, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F,
0x06, 0xC7, 0x20, 0x1F, 0x0A, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x07, 0xC7, 0x1E, 0x1F,
0x0B, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x55, 0x1F, 0x08, 0xC7, 0x1A, 0x1F, 0x0D, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x57, 0x1F, 0x07, 0xC7, 0x17, 0x1F, 0x0F, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x59, 0x1F,
0x07, 0xC7, 0x13, 0x1F, 0x11, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5B, 0x1F, 0x07, 0xC7, 0x10, 0x1F,
0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5C, 0x1F, 0x07, 0xC7, 0x0D, 0x1F, 0x13, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x5F, 0x1F, 0x07, 0xC7, 0x09, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x63, 0x1F,
0x07, 0xC7, 0x05, 0x1F, 0x14, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x65, 0x1F, 0x07, 0xC7, 0x02, 0x1F,
0x14, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x69, 0x1F, 0x19, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6D, 0x1F,
0x15, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F,
0x14, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F,
0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6F, 0x1F,
0x17, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x1A, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x69, 0x1F,
0x13, 0xC7, 0x03, 0x1F, 0x07, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x65, 0x1F, 0x13, 0xC7, 0x07, 0x1F,
0x07, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x61, 0x1F, 0x13, 0xC7, 0x0A, 0x1F, 0x07, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x5F, 0x1F, 0x13, 0xC7, 0x0D, 0x1F, 0x07, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5D, 0x1F,
0x11, 0xC7, 0x10, 0x1F, 0x08, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5B, 0x1F, 0x0F, 0xC7, 0x14, 0x1F,
0x07, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5A, 0x1F, 0x0D, 0xC7, 0x18, 0x1F, 0x07, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x58, 0x1F, 0x0C, 0xC7, 0x1A, 0x1F, 0x08, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x56, 0x1F,
0x0A, 0xC7, 0x1E, 0x1F, 0x07, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x55, 0x1F, 0x08, 0xC7, 0x22, 0x1F,
0x06, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x06, 0xC7, 0x25, 0x1F, 0x05, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x29, 0x1F, 0x03, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F,
0x03, 0xC7, 0x2B, 0x1F, 0x02, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x01, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0x13, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0x72, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x78, 0x1F, 0x0C, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x76, 0x1F, 0x0E, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x74, 0x1F, 0x10, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x72, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x71, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x6F, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x6F, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x70, 0x1F, 0x13, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x72, 0x1F, 0x10, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x74, 0x1F, 0x0E, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x76, 0x1F, 0x0C, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x78, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0x10, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x80, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x54, 0x1F, 0x04, 0xC7, 0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7,
0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x28, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x79, 0x1F, 0x0E, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x72, 0x1F, 0x17, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6A, 0x1F, 0x1D, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x65, 0x1F, 0x21, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x61, 0x1F, 0x24, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x5F, 0x1F, 0x26, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5D, 0x1F, 0x28, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x5B, 0x1F, 0x2A, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x59, 0x1F, 0x2C, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x57, 0x1F, 0x2D, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x57, 0x1F, 0x2E, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x55, 0x1F, 0x0D, 0xC7, 0x17, 0x1F, 0x0B, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x55, 0x1F, 0x08, 0xC7,
0x20, 0x1F, 0x08, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x06, 0xC7, 0x25, 0x1F, 0x05, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x53, 0x1F, 0x05, 0xC7, 0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x53, 0x1F, 0x04, 0xC7, 0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x04, 0xC7,
0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x52, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x03, 0xC7,
0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x04, 0xC7, 0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x52, 0x1F, 0x04, 0xC7, 0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x52, 0x1F, 0x05, 0xC7,
0x28, 0x1F, 0x05, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x53, 0x1F, 0x05, 0xC7, 0x26, 0x1F, 0x05, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x08, 0xC7, 0x20, 0x1F, 0x08, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x54, 0x1F, 0x0C, 0xC7, 0x18, 0x1F, 0x0C, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x55, 0x1F, 0x2E, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x56, 0x1F, 0x2E, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x57, 0x1F, 0x2C, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x59, 0x1F, 0x2A, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5B, 0x1F, 0x28, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x5D, 0x1F, 0x26, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x5F, 0x1F, 0x24, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x62, 0x1F, 0x20, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x65, 0x1F, 0x1D, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x6A, 0x1F, 0x18, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x71, 0x1F, 0x0E, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xE9, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x80, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x80, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x80, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7,
0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7,
0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7,
0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12,
0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7,
0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x6B, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7, 0xFF, 0x12, 0xFF, 0x12, 0x54, 0x1F, 0x30, 0xC7,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x79, 0x1F, 0x01, 0x38, 0x01, 0x12, 0x4C, 0x00, 0x01, 0x12,
0x01, 0x39, 0xFF, 0x12, 0xFF, 0x12, 0x34, 0x1F, 0x01, 0x14, 0x4E, 0x00, 0x01, 0x02, 0x01, 0x34,
0xFF, 0x12, 0xFF, 0x12, 0x33, 0x1F, 0x01, 0x14, 0x4F, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x12,
0xFF, 0x12, 0x32, 0x1F, 0x01, 0x38, 0x01, 0x12, 0x4F, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x12,
0xFF, 0x12, 0x7E, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x7E, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x7E, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x7E, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x2D, 0x1F, 0x01, 0x4D, 0x01, 0x6E, 0x48, 0x70, 0x01, 0x6E, 0x01, 0x53, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x5C, 0x1F, 0x05, 0xC7,
0x0D, 0x1F, 0x0D, 0xC7, 0x09, 0x1F, 0x10, 0xC7, 0x08, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F, 0x0D, 0xC7,
0x14, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x6F, 0x4A, 0x70, 0x01, 0x71,
0x01, 0x54, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x5B, 0x1F, 0x05, 0xC7, 0x0C, 0x1F, 0x0F, 0xC7, 0x07, 0x1F, 0x11, 0xC7, 0x07, 0x1F, 0x0F, 0xC7,
0x08, 0x1F, 0x0F, 0xC7, 0x13, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x6F,
0x4B, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x5A, 0x1F, 0x05, 0xC7, 0x0B, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x45, 0x1F, 0x01, 0x4D, 0x01, 0x6E, 0x4B, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x58, 0x1F, 0x07, 0xC7, 0x0A, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8E, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x57, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8F, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x56, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x90, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x55, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x91, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x54, 0x1F, 0x03, 0xC7, 0x01, 0x1F,
0x03, 0xC7, 0x0A, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x81, 0x01, 0xC3, 0x44, 0xC6, 0x01, 0xC3,
0x01, 0x87, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x53, 0x1F, 0x03, 0xC7,
0x01, 0x1F, 0x03, 0xC7, 0x0A, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0xC2, 0x46, 0xC6, 0x01, 0xC4,
0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x51, 0x1F, 0x04, 0xC7,
0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0xC2, 0x47, 0xC6, 0x01, 0xC4,
0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x50, 0x1F, 0x04, 0xC7,
0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x81, 0x01, 0xC3, 0x47, 0xC6,
0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x34, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x12, 0x4F, 0x1F,
0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8A, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x4E, 0x1F, 0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8B, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x12, 0x4D, 0x1F, 0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x06, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8C, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x4B, 0x1F, 0x05, 0xC7, 0x01, 0x1F, 0x05, 0xC7, 0x13, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x8D, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x4A, 0x1F, 0x04, 0xC7, 0x02, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x06, 0xC7, 0x07, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F,
0x01, 0x58, 0x01, 0x91, 0x40, 0x98, 0x01, 0x91, 0x01, 0x5D, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x34, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x12,
0x49, 0x1F, 0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x08, 0x1F, 0x10, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x90, 0x42, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x48, 0x1F, 0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x06, 0xC7,
0x08, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x90, 0x43, 0x98, 0x01, 0x97,
0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x47, 0x1F, 0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7,
0x11, 0x1F, 0x05, 0xC7, 0x09, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x10, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x58,
0x01, 0x91, 0x43, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x46, 0x1F,
0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7, 0x10, 0x1F, 0x06, 0xC7, 0x09, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x86, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x44, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x05, 0xC7, 0x0F, 0x1F, 0x05, 0xC7,
0x16, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x87, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x43, 0x1F, 0x05, 0xC7, 0x03, 0x1F,
0x05, 0xC7, 0x0E, 0x1F, 0x06, 0xC7, 0x16, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x88, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x42, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x05, 0xC7, 0x0E, 0x1F, 0x05, 0xC7, 0x17, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x89, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x54, 0x01, 0x71, 0x03, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x41, 0x1F, 0x05, 0xC7, 0x03, 0x1F,
0x05, 0xC7, 0x0D, 0x1F, 0x06, 0xC7, 0x17, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0x5F, 0x01, 0xA6, 0x3C, 0xB9, 0x01, 0xA6, 0x01, 0x66, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x40, 0x1F, 0x04, 0xC7, 0x05, 0x1F, 0x04, 0xC7, 0x0D, 0x1F, 0x05, 0xC7, 0x18, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0xA4, 0x3E, 0xB9, 0x01, 0xB5,
0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x3E, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x05, 0xC7, 0x0B, 0x1F, 0x06, 0xC7,
0x18, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0xA4,
0x3F, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x3D, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x05, 0xC7,
0x0A, 0x1F, 0x06, 0xC7, 0x19, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x45, 0x1F, 0x01, 0x5F, 0x01, 0xA6, 0x3F, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x3C, 0x1F,
0x0F, 0xC7, 0x0A, 0x1F, 0x06, 0xC7, 0x0D, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x82, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71,
0x03, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x3B, 0x1F, 0x0F, 0xC7, 0x09, 0x1F, 0x06, 0xC7, 0x0E, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x83, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x3A, 0x1F, 0x0F, 0xC7, 0x09, 0x1F,
0x06, 0xC7, 0x0E, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x84, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0x39, 0x1F, 0x10, 0xC7, 0x07, 0x1F, 0x06, 0xC7, 0x0F, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x85, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x37, 0x1F, 0x11, 0xC7, 0x07, 0x1F, 0x06, 0xC7, 0x0F, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x86, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x36, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x06, 0xC7, 0x10, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x87, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x35, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x06, 0xC7, 0x10, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x67, 0x1F, 0x01, 0x40, 0x01, 0x8F, 0x01, 0x93, 0x01, 0x47, 0x1D, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x34, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x05, 0x1F, 0x06, 0xC7, 0x11, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x65, 0x1F, 0x01, 0x22, 0x01, 0x77, 0x01, 0xB7, 0x02, 0xC1,
0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B, 0x1C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x8A, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0x33, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x11, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7,
0x64, 0x1F, 0x01, 0x4F, 0x01, 0x9C, 0x06, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x1C, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x31, 0x1F, 0x06, 0xC7, 0x08, 0x1F,
0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7, 0x62, 0x1F, 0x01, 0x2C, 0x01, 0x7D, 0x01, 0xBE, 0x09, 0xC1,
0x01, 0x93, 0x01, 0x47, 0x1B, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x12, 0x30, 0x1F, 0x05, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7, 0x61, 0x1F,
0x01, 0x63, 0x01, 0xA3, 0x0C, 0xC1, 0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B, 0x1A, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x2F, 0x1F, 0x05, 0xC7, 0x09, 0x1F,
0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7, 0x07, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x0F, 0xC7, 0x08, 0x1F,
0x0F, 0xC7, 0x14, 0x1F, 0x0F, 0xC7, 0x60, 0x1F, 0x01, 0x33, 0x01, 0x88, 0x06, 0xC1, 0x01, 0xA5,
0x01, 0x76, 0x01, 0x3B, 0x01, 0x8E, 0x06, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x1A, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0x2E, 0x1F, 0x05, 0xC7, 0x09, 0x1F,
0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7, 0x08, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F,
0x0D, 0xC7, 0x16, 0x1F, 0x0D, 0xC7, 0x60, 0x1F, 0x01, 0x73, 0x01, 0xB1, 0x05, 0xC1, 0x01, 0xAC,
0x01, 0x7B, 0x01, 0x49, 0x01, 0x48, 0x02, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x06, 0xC1, 0x01, 0x93,
0x01, 0x47, 0x19, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x1B, 0x1F, 0x01, 0x47, 0x01, 0x95, 0x05, 0xC1, 0x01, 0xB2, 0x01, 0x7E, 0x01, 0x4C,
0x03, 0x48, 0x04, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x05, 0xC1, 0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B,
0x18, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12,
0x18, 0x1F, 0x01, 0x27, 0x01, 0x79, 0x01, 0xB8, 0x04, 0xC1, 0x01, 0xBA, 0x01, 0x84, 0x01, 0x4E,
0x05, 0x48, 0x06, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x05, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x18, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12, 0x16, 0x1F,
0x01, 0x55, 0x01, 0xA0, 0x04, 0xC1, 0x01, 0xBF, 0x01, 0x8C, 0x01, 0x59, 0x07, 0x48, 0x08, 0x17,
0x01, 0x3B, 0x01, 0x8E, 0x05, 0xC1, 0x01, 0x93, 0x01, 0x47, 0x17, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12, 0x13, 0x1F, 0x01, 0x2D, 0x01, 0x80,
0x01, 0xBF, 0x04, 0xC1, 0x01, 0x92, 0x01, 0x62, 0x09, 0x48, 0x0A, 0x17, 0x01, 0x3B, 0x01, 0x8E,
0x04, 0xC1, 0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B, 0x16, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12, 0x11, 0x1F, 0x01, 0x6D, 0x01, 0xAB, 0x04, 0xC1,
0x01, 0x99, 0x01, 0x6A, 0x0B, 0x48, 0x0C, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x04, 0xC1, 0x01, 0xA8,
0x01, 0x6D, 0x16, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12,
0xFF, 0x12, 0x10, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x17, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12, 0x0F, 0x1F, 0x06, 0xC1,
0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x18, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E, 0x01, 0x97, 0x03, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x12, 0xFF, 0x12, 0x0E, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1,
0x19, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x34, 0x01, 0x02, 0xFF, 0x12, 0xC1, 0x00, 0x01, 0x12, 0x01, 0x38, 0x4D, 0x1F,
0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x34, 0x01, 0x02, 0xFF, 0x12,
0xC1, 0x00, 0x01, 0x14, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1B, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0xFF, 0x12, 0xC0, 0x00, 0x01, 0x14, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48,
0x0E, 0x17, 0x06, 0xC1, 0x1C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x37, 0x01, 0x12, 0xFF, 0x12, 0xBE, 0x00, 0x01, 0x12,
0x01, 0x38, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1D, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E, 0x01, 0x97, 0x03, 0x98,
0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0xFF, 0x12, 0xFF, 0x12,
0x15, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1E, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0xFF, 0x12, 0xFF, 0x12, 0x14, 0x1F,
0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1F, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0xFF, 0x12, 0xFF, 0x12, 0x13, 0x1F, 0x06, 0xC1,
0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x20, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0xFF, 0x12, 0xFF, 0x12, 0x12, 0x1F, 0x06, 0xC1, 0x0D, 0x48,
0x0E, 0x17, 0x06, 0xC1, 0x21, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71, 0xFF, 0x12,
0xC5, 0x70, 0x01, 0x6E, 0x01, 0x4D, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1,
0x22, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71, 0xFF, 0x12, 0xC5, 0x70, 0x01, 0x6F,
0x4D, 0x1F, 0x06, 0xC1, 0x0B, 0x48, 0x01, 0x42, 0x01, 0x1A, 0x01, 0x09, 0x01, 0x15, 0x0C, 0x17,
0x06, 0xC1, 0x23, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0xFF, 0x12, 0xC4, 0x70,
0x01, 0x6F, 0x4D, 0x1F, 0x06, 0xC1, 0x0A, 0x48, 0x01, 0x2E, 0x01, 0x0F, 0x01, 0x08, 0x01, 0x03,
0x01, 0x04, 0x01, 0x0E, 0x0B, 0x17, 0x06, 0xC1, 0x24, 0x1F, 0x01, 0x68, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x50,
0x01, 0x6E, 0xFF, 0x12, 0xC2, 0x70, 0x01, 0x6E, 0x01, 0x4D, 0x4D, 0x1F, 0x06, 0xC1, 0x08, 0x48,
0x01, 0x44, 0x01, 0x1E, 0x03, 0x08, 0x03, 0x03, 0x01, 0x08, 0x01, 0x13, 0x09, 0x17, 0x06, 0xC1,
0x25, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0xFF, 0x12, 0xFF, 0x12, 0x19, 0x1F, 0x06, 0xC1, 0x07, 0x48, 0x01, 0x32,
0x01, 0x11, 0x04, 0x08, 0x05, 0x03, 0x01, 0x0D, 0x01, 0x16, 0x07, 0x17, 0x06, 0xC1, 0x26, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0xFF, 0x12, 0xFF, 0x12, 0x18, 0x1F, 0x06, 0xC1, 0x05, 0x48, 0x01, 0x46, 0x01, 0x21,
0x01, 0x09, 0x05, 0x08, 0x06, 0x03, 0x01, 0x06, 0x01, 0x11, 0x06, 0x17, 0x06, 0xC1, 0x27, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0xFF, 0x12, 0xFF, 0x12, 0x17, 0x1F, 0x06, 0xC1, 0x01, 0x99, 0x01, 0x6A, 0x02, 0x48,
0x01, 0x3C, 0x01, 0x16, 0x07, 0x08, 0x08, 0x03, 0x01, 0x0C, 0x01, 0x16, 0x02, 0x17, 0x01, 0x3B,
0x01, 0x8E, 0x06, 0xC1, 0x28, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0xFF, 0x12, 0xFF, 0x12, 0x16, 0x1F, 0x08, 0xC1,
0x01, 0x92, 0x01, 0x30, 0x01, 0x0A, 0x08, 0x08, 0x09, 0x03, 0x01, 0x05, 0x01, 0x26, 0x01, 0x8E,
0x08, 0xC1, 0x29, 0x1F, 0x01, 0x68, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4,
0xFF, 0x12, 0xC9, 0xC6, 0x01, 0xC3, 0x01, 0x81, 0x4D, 0x1F, 0x07, 0xC1, 0x01, 0xA9, 0x01, 0x44,
0x01, 0x13, 0x01, 0x0F, 0x01, 0x09, 0x07, 0x08, 0x08, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x01, 0x15,
0x01, 0x57, 0x01, 0xAE, 0x07, 0xC1, 0x2A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x8A, 0x01, 0xC4, 0xFF, 0x12, 0xC9, 0xC6, 0x01, 0xC2, 0x4D, 0x1F, 0x06, 0xC1, 0x01, 0x82,
0x01, 0x1B, 0x04, 0x13, 0x01, 0x0E, 0x06, 0x08, 0x06, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x04, 0x13,
0x01, 0x1D, 0x01, 0x82, 0x06, 0xC1, 0x2B, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0xFF, 0x12, 0xC8, 0xC6, 0x01, 0xC2, 0x4D, 0x1F, 0x06, 0xC1, 0x01, 0x89,
0x01, 0x20, 0x05, 0x13, 0x01, 0x11, 0x01, 0x0D, 0x04, 0x08, 0x04, 0x03, 0x01, 0x07, 0x01, 0x0F,
0x06, 0x13, 0x01, 0x24, 0x01, 0x89, 0x06, 0xC1, 0x2C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x85, 0x01, 0xC3, 0xFF, 0x12, 0xC6, 0xC6, 0x01, 0xC3, 0x01, 0x81, 0x4D, 0x1F,
0x07, 0xC1, 0x01, 0xB6, 0x01, 0x74, 0x01, 0x18, 0x05, 0x13, 0x01, 0x11, 0x01, 0x0D, 0x02, 0x08,
0x02, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x06, 0x13, 0x01, 0x1A, 0x01, 0x78, 0x01, 0xBD, 0x07, 0xC1,
0x2D, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0xFF, 0x12, 0xFF, 0x12, 0x1D, 0x1F, 0x09, 0xC1,
0x01, 0x9F, 0x01, 0x3E, 0x06, 0x13, 0x01, 0x10, 0x01, 0x0B, 0x01, 0x07, 0x01, 0x0F, 0x06, 0x13,
0x01, 0x16, 0x01, 0x60, 0x01, 0xAE, 0x09, 0xC1, 0x2E, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0xFF, 0x12, 0xFF, 0x12, 0x1C, 0x1F, 0x01, 0x67, 0x01, 0xA2, 0x09, 0xC1, 0x01, 0x7F, 0x01, 0x1C,
0x0D, 0x13, 0x01, 0x3F, 0x01, 0x9B, 0x09, 0xC1, 0x01, 0xA2, 0x01, 0x6B, 0x2F, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0xFF, 0x12, 0xFF, 0x12, 0x1C, 0x1F, 0x01, 0x28, 0x01, 0x79, 0x01, 0xB4,
0x08, 0xC1, 0x01, 0xAF, 0x01, 0x69, 0x01, 0x15, 0x09, 0x13, 0x01, 0x24, 0x01, 0x89, 0x09, 0xC1,
0x01, 0xAD, 0x01, 0x77, 0x01, 0x25, 0x31, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0xFF, 0x12,
0xFF, 0x12, 0x1D, 0x1F, 0x01, 0x3A, 0x01, 0x83, 0x01, 0xBF, 0x08, 0xC1, 0x01, 0x92, 0x01, 0x29,
0x06, 0x13, 0x01, 0x1A, 0x01, 0x78, 0x01, 0xBD, 0x08, 0xC1, 0x01, 0xB8, 0x01, 0x7D, 0x01, 0x2C,
0x34, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E,
0x01, 0x97, 0xFF, 0x12, 0xCD, 0x98, 0x01, 0x91, 0x01, 0x58, 0x52, 0x1F, 0x01, 0x55, 0x01, 0x9A,
0x08, 0xC1, 0x01, 0xBD, 0x01, 0x7A, 0x01, 0x19, 0x02, 0x13, 0x01, 0x16, 0x01, 0x60, 0x01, 0xAE,
0x08, 0xC1, 0x01, 0xBE, 0x01, 0x88, 0x01, 0x3D, 0x37, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E, 0x01, 0x97, 0xFF, 0x12, 0xCD, 0x98, 0x01, 0x90,
0x54, 0x1F, 0x01, 0x6D, 0x01, 0xAA, 0x08, 0xC1, 0x01, 0xA1, 0x01, 0x48, 0x01, 0x43, 0x01, 0x9D,
0x09, 0xC1, 0x01, 0x93, 0x01, 0x4A, 0x3A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0xFF, 0x12, 0xCC, 0x98, 0x01, 0x90, 0x55, 0x1F,
0x01, 0x2C, 0x01, 0x7C, 0x01, 0xB8, 0x11, 0xC1, 0x01, 0x9E, 0x01, 0x61, 0x3D, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5B, 0x01, 0x91, 0xFF, 0x12,
0xCA, 0x98, 0x01, 0x91, 0x01, 0x58, 0x57, 0x1F, 0x01, 0x41, 0x01, 0x8B, 0x0E, 0xC1, 0x01, 0xA7,
0x01, 0x73, 0x01, 0x22, 0x3F, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0xFF, 0x12, 0xFF, 0x12, 0x2D, 0x1F, 0x01, 0x5A, 0x01, 0x9C, 0x0A, 0xC1, 0x01, 0xB3, 0x01, 0x7C,
0x01, 0x2A, 0x42, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x12,
0xFF, 0x12, 0x2D, 0x1F, 0x01, 0x23, 0x01, 0x75, 0x01, 0xB0, 0x06, 0xC1, 0x01, 0xBB, 0x01, 0x80,
0x01, 0x31, 0x45, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x12,
0xFF, 0x12, 0x2E, 0x1F, 0x01, 0x2F, 0x01, 0x7D, 0x01, 0xBC, 0x02, 0xC1, 0x01, 0xC0, 0x01, 0x8F,
0x01, 0x45, 0x48, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x12,
0xFF, 0x12, 0x2F, 0x1F, 0x01, 0x4B, 0x01, 0x94, 0x01, 0x95, 0x01, 0x51, 0x4B, 0x1F, 0x01, 0x68,
0x01, 0xB5, 0xFF, 0x12, 0xD1, 0xB9, 0x01, 0xA6, 0x01, 0x5F, 0xAE, 0x1F, 0x01, 0x68, 0x01, 0xB5,
0xFF, 0x12, 0xD1, 0xB9, 0x01, 0xA4, 0xAF, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0xFF, 0x12, 0xD0, 0xB9,
0x01, 0xA4, 0xB0, 0x1F, 0x01, 0x65, 0x01, 0xA6, 0xFF, 0x12, 0xCE, 0xB9, 0x01, 0xA6, 0x01, 0x5F,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x00, 0x00
}

View file

@ -0,0 +1,827 @@
unsigned char splashscreen_lut[] = {
0x00, 0x00, 0xFF, 0x00,
0x08, 0x08, 0xFE, 0x00,
0x0B, 0x0B, 0xFD, 0x00,
0x5F, 0x5F, 0x00, 0x00,
0x60, 0x60, 0x00, 0x00,
0x61, 0x61, 0x00, 0x00,
0x62, 0x62, 0x00, 0x00,
0x63, 0x63, 0x00, 0x00,
0x64, 0x64, 0x00, 0x00,
0x65, 0x65, 0x00, 0x00,
0x66, 0x66, 0x00, 0x00,
0x67, 0x67, 0x00, 0x00,
0x68, 0x68, 0x00, 0x00,
0x69, 0x69, 0x00, 0x00,
0x6A, 0x6A, 0x00, 0x00,
0x6B, 0x6B, 0x00, 0x00,
0x6D, 0x6D, 0x00, 0x00,
0x6E, 0x6E, 0x00, 0x00,
0x29, 0x29, 0xF3, 0x00,
0x6F, 0x6F, 0x00, 0x00,
0x2A, 0x2A, 0xF3, 0x00,
0x70, 0x70, 0x00, 0x00,
0x71, 0x71, 0x00, 0x00,
0x72, 0x72, 0x00, 0x00,
0x73, 0x73, 0x00, 0x00,
0x77, 0x77, 0x00, 0x00,
0x78, 0x78, 0x00, 0x00,
0x79, 0x79, 0x00, 0x00,
0x7B, 0x7B, 0x00, 0x00,
0x7C, 0x7C, 0x00, 0x00,
0x7E, 0x7E, 0x00, 0x00,
0x80, 0x80, 0x00, 0x00,
0x80, 0x80, 0x01, 0x00,
0x81, 0x81, 0x02, 0x00,
0x80, 0x80, 0x06, 0x00,
0x81, 0x81, 0x0D, 0x00,
0x83, 0x83, 0x07, 0x00,
0x81, 0x81, 0x12, 0x00,
0x84, 0x84, 0x09, 0x00,
0x82, 0x82, 0x16, 0x00,
0x82, 0x82, 0x19, 0x00,
0x86, 0x86, 0x0F, 0x00,
0x83, 0x83, 0x1F, 0x00,
0x83, 0x83, 0x22, 0x00,
0x84, 0x84, 0x24, 0x00,
0x85, 0x85, 0x29, 0x00,
0x8A, 0x8A, 0x18, 0x00,
0x85, 0x85, 0x2B, 0x00,
0x8B, 0x8B, 0x1D, 0x00,
0x86, 0x86, 0x30, 0x00,
0x8C, 0x8C, 0x20, 0x00,
0x87, 0x87, 0x33, 0x00,
0x69, 0x69, 0x9E, 0x00,
0x6A, 0x6A, 0x9B, 0x00,
0x68, 0x68, 0xA2, 0x00,
0x6B, 0x6B, 0x99, 0x00,
0x6D, 0x6D, 0x94, 0x00,
0x6B, 0x6B, 0x9B, 0x00,
0x88, 0x88, 0x36, 0x00,
0x8E, 0x8E, 0x24, 0x00,
0x8F, 0x8F, 0x27, 0x00,
0x89, 0x89, 0x3C, 0x00,
0x90, 0x90, 0x29, 0x00,
0x90, 0x90, 0x2A, 0x00,
0x8A, 0x8A, 0x3F, 0x00,
0x8B, 0x8B, 0x41, 0x00,
0x92, 0x92, 0x2F, 0x00,
0x93, 0x93, 0x30, 0x00,
0x93, 0x93, 0x32, 0x00,
0x8D, 0x8D, 0x47, 0x00,
0x94, 0x94, 0x33, 0x00,
0x8E, 0x8E, 0x49, 0x00,
0x94, 0x94, 0x35, 0x00,
0x95, 0x95, 0x36, 0x00,
0x8F, 0x8F, 0x4C, 0x00,
0x8F, 0x8F, 0x4E, 0x00,
0x97, 0x97, 0x3B, 0x00,
0x6D, 0x80, 0x94, 0x00,
0x98, 0x98, 0x3F, 0x00,
0x92, 0x92, 0x54, 0x00,
0x6B, 0x80, 0x99, 0x00,
0x92, 0x92, 0x56, 0x00,
0x6A, 0x80, 0x9B, 0x00,
0x6B, 0x80, 0x9B, 0x00,
0x69, 0x80, 0x9E, 0x00,
0x93, 0x93, 0x58, 0x00,
0x68, 0x80, 0xA2, 0x00,
0x9A, 0x9A, 0x44, 0x00,
0x6D, 0xB3, 0x00, 0x00,
0x9B, 0x9B, 0x45, 0x00,
0x95, 0x95, 0x5C, 0x00,
0x6B, 0xB6, 0x00, 0x00,
0x6A, 0xB7, 0x00, 0x00,
0x6B, 0xB7, 0x00, 0x00,
0x69, 0xB9, 0x00, 0x00,
0xB3, 0xB3, 0x00, 0x00,
0x9E, 0x9E, 0x4D, 0x00,
0x98, 0x98, 0x62, 0x00,
0x9E, 0x9E, 0x4E, 0x00,
0x98, 0x98, 0x63, 0x00,
0x68, 0xBB, 0x00, 0x00,
0xB6, 0xB6, 0x00, 0x00,
0xB7, 0xB7, 0x00, 0x00,
0x9A, 0x9A, 0x66, 0x00,
0xB9, 0xB9, 0x00, 0x00,
0xA1, 0xA1, 0x54, 0x00,
0xA2, 0xA2, 0x57, 0x00,
0x9C, 0x9C, 0x6C, 0x00,
0xBB, 0xBB, 0x00, 0x00,
0x9D, 0x9D, 0x6D, 0x00,
0x29, 0x80, 0xF3, 0x00,
0x2A, 0x80, 0xF3, 0x00,
0x00, 0x80, 0xFF, 0x00,
0x0B, 0x80, 0xFD, 0x00,
0x08, 0x80, 0xFE, 0x00,
0x9F, 0x9F, 0x72, 0x00,
0xA7, 0xA7, 0x63, 0x00,
0xA2, 0xA2, 0x77, 0x00,
0xA8, 0xA8, 0x66, 0x00,
0xA4, 0xA4, 0x7C, 0x00,
0xAA, 0xAA, 0x6B, 0x00,
0xA7, 0xA7, 0x81, 0x00,
0xAC, 0xAC, 0x71, 0x00,
0xAE, 0xAE, 0x74, 0x00,
0xAA, 0xAA, 0x85, 0x00,
0xAC, 0xAC, 0x8A, 0x00,
0xB2, 0xB2, 0x7D, 0x00,
0xB2, 0xB2, 0x7E, 0x00,
0xAF, 0xAF, 0x8D, 0x00,
0x6D, 0xB3, 0x94, 0x00,
0xB5, 0xB5, 0x84, 0x00,
0xB1, 0xB1, 0x92, 0x00,
0xB5, 0xB5, 0x86, 0x00,
0x6B, 0xB6, 0x99, 0x00,
0x6A, 0xB7, 0x9B, 0x00,
0x6B, 0xB7, 0x9B, 0x00,
0xB3, 0xB3, 0x95, 0x00,
0xB7, 0xB7, 0x8A, 0x00,
0x69, 0xB9, 0x9E, 0x00,
0xB6, 0xB6, 0x99, 0x00,
0xB9, 0xB9, 0x8F, 0x00,
0x68, 0xBB, 0xA2, 0x00,
0xBB, 0xBB, 0x92, 0x00,
0xB8, 0xB8, 0x9D, 0x00,
0x2A, 0xF5, 0x00, 0x00,
0x29, 0xF6, 0x00, 0x00,
0xBC, 0xBC, 0x96, 0x00,
0xBA, 0xBA, 0xA0, 0x00,
0xBB, 0xBB, 0xA1, 0x00,
0xBC, 0xBC, 0xA3, 0x00,
0x08, 0xFE, 0x00, 0x00,
0x0B, 0xFE, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00,
0xC0, 0xC0, 0x9E, 0x00,
0xBE, 0xBE, 0xA6, 0x00,
0xC1, 0xC1, 0xA1, 0x00,
0xBF, 0xBF, 0xA8, 0x00,
0xC2, 0xC2, 0xA2, 0x00,
0xC0, 0xC0, 0xA9, 0x00,
0xC2, 0xC2, 0xA4, 0x00,
0xC1, 0xC1, 0xAA, 0x00,
0xC4, 0xC4, 0xA8, 0x00,
0xC3, 0xC3, 0xAD, 0x00,
0xC3, 0xC3, 0xAE, 0x00,
0xF5, 0xF5, 0x00, 0x00,
0xC5, 0xC5, 0xAA, 0x00,
0xF6, 0xF6, 0x00, 0x00,
0xC4, 0xC4, 0xAF, 0x00,
0xC5, 0xC5, 0xB0, 0x00,
0xC6, 0xC6, 0xAD, 0x00,
0xC5, 0xC5, 0xB1, 0x00,
0xC6, 0xC6, 0xB2, 0x00,
0xC7, 0xC7, 0xAF, 0x00,
0xC7, 0xC7, 0xB3, 0x00,
0xC8, 0xC8, 0xB0, 0x00,
0xC8, 0xC8, 0xB2, 0x00,
0xC8, 0xC8, 0xB4, 0x00,
0xC8, 0xC8, 0xB5, 0x00,
0xC9, 0xC9, 0xB3, 0x00,
0xC9, 0xC9, 0xB6, 0x00,
0xC9, 0xC9, 0xB7, 0x00,
0xFE, 0xFE, 0x00, 0x00,
0xCA, 0xCA, 0xB6, 0x00,
0xCA, 0xCA, 0xB7, 0x00,
0xCA, 0xCA, 0xB8, 0x00,
0xFF, 0xFF, 0x00, 0x00,
0xCB, 0xCB, 0xB8, 0x00,
0xCB, 0xCB, 0xB9, 0x00,
0xCB, 0xCB, 0xBA, 0x00,
0xCC, 0xCC, 0xB9, 0x00,
0xCC, 0xCC, 0xBA, 0x00,
0xCC, 0xCC, 0xBB, 0x00,
0xCD, 0xCD, 0xBB, 0x00,
0xCD, 0xCD, 0xBC, 0x00,
0x2A, 0xF5, 0xF3, 0x00,
0x29, 0xF6, 0xF3, 0x00,
0x0B, 0xFE, 0xFD, 0x00,
0x08, 0xFE, 0xFE, 0x00,
0x00, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0xFF, 0x00,
0xC8, 0xC8, 0xC8, 0x00,
0xC9, 0xC9, 0xC9, 0x00,
0xCA, 0xCA, 0xCA, 0x00,
0xCB, 0xCB, 0xCB, 0x00,
0xCC, 0xCC, 0xCC, 0x00,
0xCD, 0xCD, 0xCD, 0x00,
0xCE, 0xCE, 0xCE, 0x00,
0xCF, 0xCF, 0xCF, 0x00,
0xD0, 0xD0, 0xD0, 0x00,
0xD1, 0xD1, 0xD1, 0x00,
0xD2, 0xD2, 0xD2, 0x00,
0xD3, 0xD3, 0xD3, 0x00,
0xD4, 0xD4, 0xD4, 0x00,
0xD5, 0xD5, 0xD5, 0x00,
0xD6, 0xD6, 0xD6, 0x00,
0xD7, 0xD7, 0xD7, 0x00,
0xD8, 0xD8, 0xD8, 0x00,
0xD9, 0xD9, 0xD9, 0x00,
0xDA, 0xDA, 0xDA, 0x00,
0xDB, 0xDB, 0xDB, 0x00,
0xDC, 0xDC, 0xDC, 0x00,
0xDD, 0xDD, 0xDD, 0x00,
0xDE, 0xDE, 0xDE, 0x00,
0xDF, 0xDF, 0xDF, 0x00,
0xE0, 0xE0, 0xE0, 0x00,
0xE1, 0xE1, 0xE1, 0x00,
0xE2, 0xE2, 0xE2, 0x00,
0xE3, 0xE3, 0xE3, 0x00,
0xE4, 0xE4, 0xE4, 0x00,
0xE5, 0xE5, 0xE5, 0x00,
0xE6, 0xE6, 0xE6, 0x00,
0xE7, 0xE7, 0xE7, 0x00,
0xE8, 0xE8, 0xE8, 0x00,
0xE9, 0xE9, 0xE9, 0x00,
0xEA, 0xEA, 0xEA, 0x00,
0xEB, 0xEB, 0xEB, 0x00,
0xEC, 0xEC, 0xEC, 0x00,
0xED, 0xED, 0xED, 0x00,
0xEE, 0xEE, 0xEE, 0x00,
0xEF, 0xEF, 0xEF, 0x00,
0xF0, 0xF0, 0xF0, 0x00,
0xF1, 0xF1, 0xF1, 0x00,
0xF2, 0xF2, 0xF2, 0x00,
0xF3, 0xF3, 0xF3, 0x00,
0xF4, 0xF4, 0xF4, 0x00,
0xF5, 0xF5, 0xF5, 0x00,
0xF6, 0xF6, 0xF6, 0x00,
0xF7, 0xF7, 0xF7, 0x00,
0xF8, 0xF8, 0xF8, 0x00,
0xF9, 0xF9, 0xF9, 0x00,
0xFA, 0xFA, 0xFA, 0x00,
0xFB, 0xFB, 0xFB, 0x00,
0xFC, 0xFC, 0xFC, 0x00,
0xFD, 0xFD, 0xFD, 0x00,
0xFE, 0xFE, 0xFE, 0x00,
0xFF, 0xFF, 0xFF, 0x00,
}
unsigned char splashscreen_pix[] = {
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xDC, 0x1F, 0x01, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x7F, 0x1F, 0x03, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x01, 0xC7, 0x2B, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x52, 0x1F, 0x02, 0xC7, 0x28, 0x1F, 0x06, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x04, 0xC7,
0x24, 0x1F, 0x08, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x06, 0xC7, 0x20, 0x1F, 0x0A, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x07, 0xC7, 0x1E, 0x1F, 0x0B, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x53, 0x1F, 0x08, 0xC7, 0x1A, 0x1F, 0x0D, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x55, 0x1F, 0x07, 0xC7,
0x17, 0x1F, 0x0F, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x57, 0x1F, 0x07, 0xC7, 0x13, 0x1F, 0x11, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x59, 0x1F, 0x07, 0xC7, 0x10, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x5A, 0x1F, 0x07, 0xC7, 0x0D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5D, 0x1F, 0x07, 0xC7,
0x09, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x61, 0x1F, 0x07, 0xC7, 0x05, 0x1F, 0x14, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x63, 0x1F, 0x07, 0xC7, 0x02, 0x1F, 0x14, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x67, 0x1F, 0x19, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6B, 0x1F, 0x15, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6D, 0x1F, 0x14, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6D, 0x1F, 0x17, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x69, 0x1F, 0x1A, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x67, 0x1F, 0x13, 0xC7, 0x03, 0x1F, 0x07, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x63, 0x1F, 0x13, 0xC7, 0x07, 0x1F, 0x07, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x5F, 0x1F, 0x13, 0xC7, 0x0A, 0x1F, 0x07, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5D, 0x1F, 0x13, 0xC7,
0x0D, 0x1F, 0x07, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5B, 0x1F, 0x11, 0xC7, 0x10, 0x1F, 0x08, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x59, 0x1F, 0x0F, 0xC7, 0x14, 0x1F, 0x07, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x58, 0x1F, 0x0D, 0xC7, 0x18, 0x1F, 0x07, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x56, 0x1F, 0x0C, 0xC7,
0x1A, 0x1F, 0x08, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x54, 0x1F, 0x0A, 0xC7, 0x1E, 0x1F, 0x07, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x53, 0x1F, 0x08, 0xC7, 0x22, 0x1F, 0x06, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F,
0x52, 0x1F, 0x06, 0xC7, 0x25, 0x1F, 0x05, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x04, 0xC7,
0x29, 0x1F, 0x03, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x03, 0xC7, 0x2B, 0x1F, 0x02, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x01, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0x09, 0x1F, 0x30, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7,
0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0x61, 0x1F, 0x30, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x76, 0x1F, 0x0C, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x74, 0x1F, 0x0E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x72, 0x1F, 0x10, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x70, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6F, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6D, 0x1F, 0x13, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x6E, 0x1F, 0x13, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6E, 0x1F, 0x12, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x70, 0x1F, 0x10, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x72, 0x1F, 0x0E, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x74, 0x1F, 0x0C, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x76, 0x1F, 0x30, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0x06, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x7E, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x04, 0xC7, 0x28, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x04, 0xC7, 0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x04, 0xC7, 0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x04, 0xC7, 0x0F, 0x1F, 0x04, 0xC7, 0x15, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0x6D, 0x1F, 0x0E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x70, 0x1F, 0x17, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x68, 0x1F, 0x1D, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x63, 0x1F, 0x21, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x5F, 0x1F, 0x24, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5D, 0x1F, 0x26, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x5B, 0x1F, 0x28, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x59, 0x1F, 0x2A, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x57, 0x1F, 0x2C, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x55, 0x1F, 0x2D, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x55, 0x1F, 0x2E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x53, 0x1F, 0x0D, 0xC7, 0x17, 0x1F,
0x0B, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x53, 0x1F, 0x08, 0xC7, 0x20, 0x1F, 0x08, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x52, 0x1F, 0x06, 0xC7, 0x25, 0x1F, 0x05, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x51, 0x1F,
0x05, 0xC7, 0x28, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x51, 0x1F, 0x04, 0xC7, 0x2A, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F, 0x04, 0xC7, 0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x50, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F,
0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F, 0x03, 0xC7, 0x2C, 0x1F,
0x03, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x50, 0x1F, 0x03, 0xC7, 0x2C, 0x1F, 0x03, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F,
0x04, 0xC7, 0x2A, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F, 0x04, 0xC7, 0x2A, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x50, 0x1F, 0x05, 0xC7, 0x28, 0x1F, 0x05, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x51, 0x1F, 0x05, 0xC7, 0x26, 0x1F, 0x05, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x08, 0xC7, 0x20, 0x1F, 0x08, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x0C, 0xC7, 0x18, 0x1F,
0x0C, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x53, 0x1F, 0x2E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x54, 0x1F,
0x2E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x55, 0x1F, 0x2C, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x57, 0x1F,
0x2A, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x59, 0x1F, 0x28, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5B, 0x1F,
0x26, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x5D, 0x1F, 0x24, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x60, 0x1F,
0x20, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x63, 0x1F, 0x1D, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x68, 0x1F,
0x18, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x6F, 0x1F, 0x0E, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xE5, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x7E, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x7E, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x7E, 0x1F, 0x04, 0xC7, 0x11, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F,
0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F,
0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F,
0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F,
0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F,
0xFF, 0x1F, 0x69, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x04, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x69, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F,
0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0x52, 0x1F, 0x30, 0xC7, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0x5E, 0x1F, 0x01, 0x38, 0x01, 0x12, 0x4C, 0x00, 0x01, 0x12, 0x01, 0x39, 0xFF, 0x1F, 0xFF, 0x1F,
0x32, 0x1F, 0x01, 0x14, 0x4E, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x1F, 0xFF, 0x1F, 0x31, 0x1F,
0x01, 0x14, 0x4F, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x1F, 0xFF, 0x1F, 0x30, 0x1F, 0x01, 0x38,
0x01, 0x12, 0x4F, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x1F, 0xFF, 0x1F, 0x7C, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x7C, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x7C, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x7C, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x2B, 0x1F, 0x01, 0x4D,
0x01, 0x6E, 0x48, 0x70, 0x01, 0x6E, 0x01, 0x53, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x5B, 0x1F, 0x05, 0xC7, 0x0D, 0x1F, 0x0D, 0xC7, 0x09, 0x1F,
0x10, 0xC7, 0x08, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F, 0x0D, 0xC7, 0x14, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0x6F, 0x4A, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x5A, 0x1F, 0x05, 0xC7, 0x0C, 0x1F,
0x0F, 0xC7, 0x07, 0x1F, 0x11, 0xC7, 0x07, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x0F, 0xC7, 0x13, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x6F, 0x4B, 0x70, 0x01, 0x71, 0x01, 0x54,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x59, 0x1F,
0x05, 0xC7, 0x0B, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x4D, 0x01, 0x6E,
0x4B, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x57, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x8E, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x56, 0x1F, 0x07, 0xC7, 0x0A, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8F, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F,
0x55, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x90, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x1F, 0x54, 0x1F, 0x07, 0xC7, 0x0A, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x91, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x53, 0x1F, 0x03, 0xC7, 0x01, 0x1F, 0x03, 0xC7, 0x0A, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x45, 0x1F, 0x01, 0x81, 0x01, 0xC3, 0x44, 0xC6, 0x01, 0xC3, 0x01, 0x87, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x52, 0x1F, 0x03, 0xC7, 0x01, 0x1F, 0x03, 0xC7, 0x0A, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0xC2, 0x46, 0xC6, 0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x50, 0x1F, 0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0xC2, 0x47, 0xC6, 0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x4F, 0x1F, 0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0x81, 0x01, 0xC3, 0x47, 0xC6, 0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x34, 0x01, 0x02,
0x03, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x1F, 0x4E, 0x1F, 0x04, 0xC7, 0x01, 0x1F, 0x04, 0xC7,
0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x8A, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x4D, 0x1F, 0x04, 0xC7, 0x01, 0x1F,
0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8B, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x4C, 0x1F, 0x04, 0xC7,
0x01, 0x1F, 0x04, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x06, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x8C, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x4A, 0x1F, 0x05, 0xC7, 0x01, 0x1F,
0x05, 0xC7, 0x13, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x8D, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x49, 0x1F, 0x04, 0xC7, 0x02, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x06, 0xC7,
0x07, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x58, 0x01, 0x91, 0x40, 0x98,
0x01, 0x91, 0x01, 0x5D, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x34,
0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x01, 0x34, 0xFF, 0x1F, 0x48, 0x1F, 0x04, 0xC7, 0x03, 0x1F,
0x04, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x08, 0x1F, 0x10, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F,
0x01, 0x90, 0x42, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x47, 0x1F,
0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x06, 0xC7, 0x08, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x0F, 0xC7, 0x08, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0x90, 0x43, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x1F, 0x46, 0x1F, 0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7, 0x11, 0x1F, 0x05, 0xC7, 0x09, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x10, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x58, 0x01, 0x91, 0x43, 0x98, 0x01, 0x97,
0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x45, 0x1F, 0x04, 0xC7, 0x03, 0x1F, 0x04, 0xC7,
0x10, 0x1F, 0x06, 0xC7, 0x09, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x86, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x43, 0x1F,
0x05, 0xC7, 0x03, 0x1F, 0x05, 0xC7, 0x0F, 0x1F, 0x05, 0xC7, 0x16, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x87, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x42, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x05, 0xC7, 0x0E, 0x1F, 0x06, 0xC7,
0x16, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x88, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x41, 0x1F, 0x05, 0xC7, 0x03, 0x1F,
0x05, 0xC7, 0x0E, 0x1F, 0x05, 0xC7, 0x17, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x89, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71,
0x03, 0x70, 0x01, 0x71, 0x01, 0x54, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x40, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x05, 0xC7, 0x0D, 0x1F, 0x06, 0xC7,
0x17, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x5F,
0x01, 0xA6, 0x3C, 0xB9, 0x01, 0xA6, 0x01, 0x66, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x3F, 0x1F, 0x04, 0xC7, 0x05, 0x1F,
0x04, 0xC7, 0x0D, 0x1F, 0x05, 0xC7, 0x18, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x45, 0x1F, 0x01, 0xA4, 0x3E, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x3D, 0x1F,
0x05, 0xC7, 0x05, 0x1F, 0x05, 0xC7, 0x0B, 0x1F, 0x06, 0xC7, 0x18, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0xA4, 0x3F, 0xB9, 0x01, 0xB5, 0x01, 0x68,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x1F, 0x3C, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x05, 0xC7, 0x0A, 0x1F, 0x06, 0xC7, 0x19, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x45, 0x1F, 0x01, 0x5F, 0x01, 0xA6,
0x3F, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x3B, 0x1F, 0x0F, 0xC7, 0x0A, 0x1F, 0x06, 0xC7,
0x0D, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x82, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71, 0x03, 0x70, 0x01, 0x71, 0x01, 0x54,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x3A, 0x1F,
0x0F, 0xC7, 0x09, 0x1F, 0x06, 0xC7, 0x0E, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x83, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x39, 0x1F, 0x0F, 0xC7, 0x09, 0x1F, 0x06, 0xC7, 0x0E, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x84, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x38, 0x1F, 0x10, 0xC7, 0x07, 0x1F,
0x06, 0xC7, 0x0F, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x85, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F,
0x36, 0x1F, 0x11, 0xC7, 0x07, 0x1F, 0x06, 0xC7, 0x0F, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x86, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x35, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F,
0x06, 0xC7, 0x10, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F,
0x05, 0xC7, 0x87, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F,
0x34, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x06, 0xC7, 0x10, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7,
0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x67, 0x1F, 0x01, 0x40,
0x01, 0x8F, 0x01, 0x93, 0x01, 0x47, 0x1D, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x33, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x06, 0xC7,
0x11, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x06, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x12, 0x1F, 0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7,
0x65, 0x1F, 0x01, 0x22, 0x01, 0x77, 0x01, 0xB7, 0x02, 0xC1, 0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B,
0x1C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC4, 0x01, 0x8A, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x32, 0x1F,
0x05, 0xC7, 0x07, 0x1F, 0x05, 0xC7, 0x05, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F,
0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7, 0x64, 0x1F, 0x01, 0x4F, 0x01, 0x9C,
0x06, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x1C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x30, 0x1F, 0x06, 0xC7, 0x08, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7,
0x62, 0x1F, 0x01, 0x2C, 0x01, 0x7D, 0x01, 0xBE, 0x09, 0xC1, 0x01, 0x93, 0x01, 0x47, 0x1B, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0x2F, 0x1F, 0x05, 0xC7,
0x09, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7, 0x06, 0x1F, 0x11, 0xC7, 0x06, 0x1F, 0x11, 0xC7,
0x06, 0x1F, 0x11, 0xC7, 0x12, 0x1F, 0x11, 0xC7, 0x61, 0x1F, 0x01, 0x63, 0x01, 0xA3, 0x0C, 0xC1,
0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B, 0x1A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x2E, 0x1F, 0x05, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7,
0x07, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x0F, 0xC7, 0x08, 0x1F, 0x0F, 0xC7, 0x14, 0x1F, 0x0F, 0xC7,
0x60, 0x1F, 0x01, 0x33, 0x01, 0x88, 0x06, 0xC1, 0x01, 0xA5, 0x01, 0x76, 0x01, 0x3B, 0x01, 0x8E,
0x06, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x1A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0x2D, 0x1F, 0x05, 0xC7, 0x09, 0x1F, 0x05, 0xC7, 0x03, 0x1F, 0x12, 0xC7,
0x08, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F, 0x0D, 0xC7, 0x0A, 0x1F, 0x0D, 0xC7, 0x16, 0x1F, 0x0D, 0xC7,
0x60, 0x1F, 0x01, 0x73, 0x01, 0xB1, 0x05, 0xC1, 0x01, 0xAC, 0x01, 0x7B, 0x01, 0x49, 0x01, 0x48,
0x02, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x06, 0xC1, 0x01, 0x93, 0x01, 0x47, 0x19, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC4, 0x01, 0x8A,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x19, 0x1F, 0x01, 0x47,
0x01, 0x95, 0x05, 0xC1, 0x01, 0xB2, 0x01, 0x7E, 0x01, 0x4C, 0x03, 0x48, 0x04, 0x17, 0x01, 0x3B,
0x01, 0x8E, 0x05, 0xC1, 0x01, 0xBB, 0x01, 0x7D, 0x01, 0x2B, 0x18, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02,
0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x16, 0x1F, 0x01, 0x27, 0x01, 0x79,
0x01, 0xB8, 0x04, 0xC1, 0x01, 0xBA, 0x01, 0x84, 0x01, 0x4E, 0x05, 0x48, 0x06, 0x17, 0x01, 0x3B,
0x01, 0x8E, 0x05, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x18, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00,
0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x14, 0x1F, 0x01, 0x55, 0x01, 0xA0, 0x04, 0xC1,
0x01, 0xBF, 0x01, 0x8C, 0x01, 0x59, 0x07, 0x48, 0x08, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x05, 0xC1,
0x01, 0x93, 0x01, 0x47, 0x17, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36,
0xFF, 0x1F, 0xFF, 0x1F, 0x11, 0x1F, 0x01, 0x2D, 0x01, 0x80, 0x01, 0xBF, 0x04, 0xC1, 0x01, 0x92,
0x01, 0x62, 0x09, 0x48, 0x0A, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x04, 0xC1, 0x01, 0xBB, 0x01, 0x7D,
0x01, 0x2B, 0x16, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F,
0xFF, 0x1F, 0x0F, 0x1F, 0x01, 0x6D, 0x01, 0xAB, 0x04, 0xC1, 0x01, 0x99, 0x01, 0x6A, 0x0B, 0x48,
0x0C, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x04, 0xC1, 0x01, 0xA8, 0x01, 0x6D, 0x16, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35,
0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x0E, 0x1F, 0x06, 0xC1,
0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x17, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01,
0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F, 0x0D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1,
0x18, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E,
0x01, 0x97, 0x03, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x01, 0x36, 0xFF, 0x1F, 0xFF, 0x1F,
0x0C, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x19, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x34, 0x01, 0x02,
0xFF, 0x00, 0xC0, 0x00, 0x01, 0x12, 0x01, 0x38, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17,
0x06, 0xC1, 0x1A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0x05, 0x1F, 0x01, 0x34, 0x01, 0x02, 0xFF, 0x00, 0xC0, 0x00, 0x01, 0x14, 0x4D, 0x1F,
0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1B, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52,
0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F, 0x01, 0x35, 0x01, 0x02, 0xFF, 0x00,
0xBF, 0x00, 0x01, 0x14, 0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1C, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0x05, 0x1F,
0x01, 0x37, 0x01, 0x12, 0xFF, 0x00, 0xBD, 0x00, 0x01, 0x12, 0x01, 0x38, 0x4D, 0x1F, 0x06, 0xC1,
0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x1D, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E, 0x01, 0x97, 0x03, 0x98, 0x01, 0x97, 0x01, 0x5E, 0x05, 0x1F,
0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71,
0x03, 0x70, 0x01, 0x72, 0x01, 0x56, 0xFF, 0x1F, 0xFF, 0x1F, 0x13, 0x1F, 0x06, 0xC1, 0x0D, 0x48,
0x0E, 0x17, 0x06, 0xC1, 0x1E, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C,
0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86,
0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70,
0x01, 0x72, 0x01, 0x56, 0xFF, 0x1F, 0xFF, 0x1F, 0x12, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17,
0x06, 0xC1, 0x1F, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72,
0x01, 0x56, 0xFF, 0x1F, 0xFF, 0x1F, 0x11, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1,
0x20, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6,
0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0x03, 0x70, 0x01, 0x72, 0x01, 0x56,
0xFF, 0x1F, 0xFF, 0x1F, 0x10, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x21, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0x05, 0x1F, 0x01, 0x54, 0x01, 0x71, 0xFF, 0x70, 0xC4, 0x70, 0x01, 0x6E, 0x01, 0x4D,
0x4D, 0x1F, 0x06, 0xC1, 0x0D, 0x48, 0x0E, 0x17, 0x06, 0xC1, 0x22, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F,
0x01, 0x54, 0x01, 0x71, 0xFF, 0x70, 0xC4, 0x70, 0x01, 0x6F, 0x4D, 0x1F, 0x06, 0xC1, 0x0B, 0x48,
0x01, 0x42, 0x01, 0x1A, 0x01, 0x09, 0x01, 0x15, 0x0C, 0x17, 0x06, 0xC1, 0x23, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D,
0x05, 0x1F, 0x01, 0x52, 0x01, 0x71, 0xFF, 0x70, 0xC3, 0x70, 0x01, 0x6F, 0x4D, 0x1F, 0x06, 0xC1,
0x0A, 0x48, 0x01, 0x2E, 0x01, 0x0F, 0x01, 0x08, 0x01, 0x03, 0x01, 0x04, 0x01, 0x0E, 0x0B, 0x17,
0x06, 0xC1, 0x24, 0x1F, 0x01, 0x68, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4,
0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0x05, 0x1F, 0x01, 0x50, 0x01, 0x6E, 0xFF, 0x70, 0xC1, 0x70,
0x01, 0x6E, 0x01, 0x4D, 0x4D, 0x1F, 0x06, 0xC1, 0x08, 0x48, 0x01, 0x44, 0x01, 0x1E, 0x03, 0x08,
0x03, 0x03, 0x01, 0x08, 0x01, 0x13, 0x09, 0x17, 0x06, 0xC1, 0x25, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0xFF, 0x1F,
0xFF, 0x1F, 0x17, 0x1F, 0x06, 0xC1, 0x07, 0x48, 0x01, 0x32, 0x01, 0x11, 0x04, 0x08, 0x05, 0x03,
0x01, 0x0D, 0x01, 0x16, 0x07, 0x17, 0x06, 0xC1, 0x26, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0xFF, 0x1F, 0xFF, 0x1F,
0x16, 0x1F, 0x06, 0xC1, 0x05, 0x48, 0x01, 0x46, 0x01, 0x21, 0x01, 0x09, 0x05, 0x08, 0x06, 0x03,
0x01, 0x06, 0x01, 0x11, 0x06, 0x17, 0x06, 0xC1, 0x27, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9,
0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64,
0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5, 0x01, 0x8D, 0xFF, 0x1F, 0xFF, 0x1F,
0x15, 0x1F, 0x06, 0xC1, 0x01, 0x99, 0x01, 0x6A, 0x02, 0x48, 0x01, 0x3C, 0x01, 0x16, 0x07, 0x08,
0x08, 0x03, 0x01, 0x0C, 0x01, 0x16, 0x02, 0x17, 0x01, 0x3B, 0x01, 0x8E, 0x06, 0xC1, 0x28, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97,
0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0x03, 0xC6, 0x01, 0xC5,
0x01, 0x8D, 0xFF, 0x1F, 0xFF, 0x1F, 0x14, 0x1F, 0x08, 0xC1, 0x01, 0x92, 0x01, 0x30, 0x01, 0x0A,
0x08, 0x08, 0x09, 0x03, 0x01, 0x05, 0x01, 0x26, 0x01, 0x8E, 0x08, 0xC1, 0x29, 0x1F, 0x01, 0x68,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x68, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98,
0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4, 0xFF, 0xC6, 0xC8, 0xC6, 0x01, 0xC3,
0x01, 0x81, 0x4D, 0x1F, 0x07, 0xC1, 0x01, 0xA9, 0x01, 0x44, 0x01, 0x13, 0x01, 0x0F, 0x01, 0x09,
0x07, 0x08, 0x08, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x01, 0x15, 0x01, 0x57, 0x01, 0xAE, 0x07, 0xC1,
0x2A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x8A, 0x01, 0xC4, 0xFF, 0xC6,
0xC8, 0xC6, 0x01, 0xC2, 0x4D, 0x1F, 0x06, 0xC1, 0x01, 0x82, 0x01, 0x1B, 0x04, 0x13, 0x01, 0x0E,
0x06, 0x08, 0x06, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x04, 0x13, 0x01, 0x1D, 0x01, 0x82, 0x06, 0xC1,
0x2B, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x86, 0x01, 0xC4, 0xFF, 0xC6,
0xC7, 0xC6, 0x01, 0xC2, 0x4D, 0x1F, 0x06, 0xC1, 0x01, 0x89, 0x01, 0x20, 0x05, 0x13, 0x01, 0x11,
0x01, 0x0D, 0x04, 0x08, 0x04, 0x03, 0x01, 0x07, 0x01, 0x0F, 0x06, 0x13, 0x01, 0x24, 0x01, 0x89,
0x06, 0xC1, 0x2C, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0x05, 0x1F, 0x01, 0x85, 0x01, 0xC3,
0xFF, 0xC6, 0xC5, 0xC6, 0x01, 0xC3, 0x01, 0x81, 0x4D, 0x1F, 0x07, 0xC1, 0x01, 0xB6, 0x01, 0x74,
0x01, 0x18, 0x05, 0x13, 0x01, 0x11, 0x01, 0x0D, 0x02, 0x08, 0x02, 0x03, 0x01, 0x07, 0x01, 0x0F,
0x06, 0x13, 0x01, 0x1A, 0x01, 0x78, 0x01, 0xBD, 0x07, 0xC1, 0x2D, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96,
0x01, 0x64, 0xFF, 0x1F, 0xFF, 0x1F, 0x1B, 0x1F, 0x09, 0xC1, 0x01, 0x9F, 0x01, 0x3E, 0x06, 0x13,
0x01, 0x10, 0x01, 0x0B, 0x01, 0x07, 0x01, 0x0F, 0x06, 0x13, 0x01, 0x16, 0x01, 0x60, 0x01, 0xAE,
0x09, 0xC1, 0x2E, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0xFF, 0x1F, 0xFF, 0x1F, 0x1A, 0x1F,
0x01, 0x67, 0x01, 0xA2, 0x09, 0xC1, 0x01, 0x7F, 0x01, 0x1C, 0x0D, 0x13, 0x01, 0x3F, 0x01, 0x9B,
0x09, 0xC1, 0x01, 0xA2, 0x01, 0x6B, 0x2F, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C, 0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0xFF, 0x1F,
0xFF, 0x1F, 0x1A, 0x1F, 0x01, 0x28, 0x01, 0x79, 0x01, 0xB4, 0x08, 0xC1, 0x01, 0xAF, 0x01, 0x69,
0x01, 0x15, 0x09, 0x13, 0x01, 0x24, 0x01, 0x89, 0x09, 0xC1, 0x01, 0xAD, 0x01, 0x77, 0x01, 0x25,
0x31, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0x03, 0x98, 0x01, 0x96, 0x01, 0x64, 0xFF, 0x1F, 0xFF, 0x1F, 0x1B, 0x1F, 0x01, 0x3A,
0x01, 0x83, 0x01, 0xBF, 0x08, 0xC1, 0x01, 0x92, 0x01, 0x29, 0x06, 0x13, 0x01, 0x1A, 0x01, 0x78,
0x01, 0xBD, 0x08, 0xC1, 0x01, 0xB8, 0x01, 0x7D, 0x01, 0x2C, 0x34, 0x1F, 0x01, 0x66, 0x01, 0xB5,
0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5E, 0x01, 0x97, 0xFF, 0x98, 0xCC, 0x98,
0x01, 0x91, 0x01, 0x58, 0x52, 0x1F, 0x01, 0x55, 0x01, 0x9A, 0x08, 0xC1, 0x01, 0xBD, 0x01, 0x7A,
0x01, 0x19, 0x02, 0x13, 0x01, 0x16, 0x01, 0x60, 0x01, 0xAE, 0x08, 0xC1, 0x01, 0xBE, 0x01, 0x88,
0x01, 0x3D, 0x37, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F,
0x01, 0x5E, 0x01, 0x97, 0xFF, 0x98, 0xCC, 0x98, 0x01, 0x90, 0x54, 0x1F, 0x01, 0x6D, 0x01, 0xAA,
0x08, 0xC1, 0x01, 0xA1, 0x01, 0x48, 0x01, 0x43, 0x01, 0x9D, 0x09, 0xC1, 0x01, 0x93, 0x01, 0x4A,
0x3A, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5C,
0x01, 0x97, 0xFF, 0x98, 0xCB, 0x98, 0x01, 0x90, 0x55, 0x1F, 0x01, 0x2C, 0x01, 0x7C, 0x01, 0xB8,
0x11, 0xC1, 0x01, 0x9E, 0x01, 0x61, 0x3D, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5,
0x01, 0x6C, 0x05, 0x1F, 0x01, 0x5B, 0x01, 0x91, 0xFF, 0x98, 0xC9, 0x98, 0x01, 0x91, 0x01, 0x58,
0x57, 0x1F, 0x01, 0x41, 0x01, 0x8B, 0x0E, 0xC1, 0x01, 0xA7, 0x01, 0x73, 0x01, 0x22, 0x3F, 0x1F,
0x01, 0x66, 0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x1F, 0xFF, 0x1F, 0x2B, 0x1F,
0x01, 0x5A, 0x01, 0x9C, 0x0A, 0xC1, 0x01, 0xB3, 0x01, 0x7C, 0x01, 0x2A, 0x42, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x1F, 0xFF, 0x1F, 0x2B, 0x1F, 0x01, 0x23,
0x01, 0x75, 0x01, 0xB0, 0x06, 0xC1, 0x01, 0xBB, 0x01, 0x80, 0x01, 0x31, 0x45, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x1F, 0xFF, 0x1F, 0x2C, 0x1F, 0x01, 0x2F,
0x01, 0x7D, 0x01, 0xBC, 0x02, 0xC1, 0x01, 0xC0, 0x01, 0x8F, 0x01, 0x45, 0x48, 0x1F, 0x01, 0x66,
0x01, 0xB5, 0x03, 0xB9, 0x01, 0xB5, 0x01, 0x6C, 0xFF, 0x1F, 0xFF, 0x1F, 0x2D, 0x1F, 0x01, 0x4B,
0x01, 0x94, 0x01, 0x95, 0x01, 0x51, 0x4B, 0x1F, 0x01, 0x68, 0x01, 0xB5, 0xFF, 0xB9, 0xD0, 0xB9,
0x01, 0xA6, 0x01, 0x5F, 0xAE, 0x1F, 0x01, 0x68, 0x01, 0xB5, 0xFF, 0xB9, 0xD0, 0xB9, 0x01, 0xA4,
0xAF, 0x1F, 0x01, 0x66, 0x01, 0xB5, 0xFF, 0xB9, 0xCF, 0xB9, 0x01, 0xA4, 0xB0, 0x1F, 0x01, 0x65,
0x01, 0xA6, 0xFF, 0xB9, 0xCD, 0xB9, 0x01, 0xA6, 0x01, 0x5F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1F,
0x69, 0x1F, 0x00, 0x00
}

BIN
src/rsrc/font/MSX_ASCII.bin Normal file

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,173 @@
unsigned char MSX_CP437_8x8_bin[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81,
0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0x7e,
0x00, 0x6c, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10, 0x38, 0x7c, 0xfe,
0x7c, 0x38, 0x10, 0x00, 0x38, 0x38, 0xfe, 0xfe, 0x54, 0x10, 0x7c, 0x00,
0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x38, 0x7c, 0x00, 0x00, 0x00, 0x18, 0x3c,
0x3c, 0x18, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff,
0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00, 0xff, 0xe7, 0xdb, 0xbd,
0xbd, 0xdb, 0xe7, 0xff, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff,
0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x30, 0x28, 0x24, 0x24,
0x28, 0x20, 0xe0, 0xc0, 0x3c, 0x24, 0x3c, 0x24, 0x24, 0xe4, 0xdc, 0x18,
0x10, 0x54, 0x28, 0xc6, 0x28, 0x54, 0x10, 0x00, 0x20, 0x30, 0x38, 0x3c,
0x38, 0x30, 0x20, 0x00, 0x04, 0x0c, 0x1c, 0x3c, 0x1c, 0x0c, 0x04, 0x00,
0x10, 0x38, 0x7c, 0x10, 0x10, 0x7c, 0x38, 0x10, 0x48, 0x48, 0x48, 0x48,
0x48, 0x00, 0x48, 0x00, 0x3e, 0x4a, 0x4a, 0x3a, 0x0a, 0x0a, 0x0a, 0x00,
0x1c, 0x20, 0x18, 0x24, 0x24, 0x18, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7e, 0x7e, 0x00, 0x10, 0x38, 0x7c, 0x10, 0x7c, 0x38, 0x10, 0xff,
0x10, 0x38, 0x54, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x54, 0x38, 0x10, 0x00, 0x20, 0x40, 0xff, 0x40, 0x20, 0x00, 0x00,
0x00, 0x04, 0x02, 0xff, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x42, 0xff, 0x42, 0x24, 0x00, 0x00,
0x00, 0x10, 0x38, 0x7c, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7c, 0x38,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x28, 0x28, 0x28, 0x00,
0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x7c, 0x28, 0x7c, 0x28, 0x28, 0x00,
0x10, 0x3c, 0x50, 0x38, 0x14, 0x78, 0x10, 0x00, 0x60, 0x64, 0x08, 0x10,
0x20, 0x4c, 0x0c, 0x00, 0x20, 0x50, 0x50, 0x20, 0x54, 0x48, 0x34, 0x00,
0x08, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x40,
0x40, 0x20, 0x10, 0x00, 0x10, 0x08, 0x04, 0x04, 0x04, 0x08, 0x10, 0x00,
0x10, 0x54, 0x38, 0x10, 0x38, 0x54, 0x10, 0x00, 0x00, 0x10, 0x10, 0x7c,
0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00,
0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00,
0x38, 0x44, 0x44, 0x54, 0x44, 0x44, 0x38, 0x00, 0x10, 0x30, 0x50, 0x10,
0x10, 0x10, 0x7c, 0x00, 0x38, 0x44, 0x04, 0x08, 0x30, 0x40, 0x7c, 0x00,
0x38, 0x44, 0x04, 0x18, 0x04, 0x44, 0x38, 0x00, 0x08, 0x18, 0x28, 0x48,
0x7c, 0x08, 0x08, 0x00, 0x7c, 0x40, 0x70, 0x08, 0x04, 0x08, 0x70, 0x00,
0x18, 0x20, 0x40, 0x78, 0x44, 0x44, 0x38, 0x00, 0x7c, 0x44, 0x08, 0x10,
0x10, 0x10, 0x10, 0x00, 0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x3c, 0x04, 0x08, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00,
0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x7c, 0x00,
0x00, 0x7c, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00,
0x38, 0x44, 0x04, 0x08, 0x10, 0x00, 0x10, 0x00, 0x38, 0x44, 0x04, 0x34,
0x54, 0x54, 0x38, 0x00, 0x10, 0x28, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x00,
0x78, 0x24, 0x24, 0x38, 0x24, 0x24, 0x78, 0x00, 0x18, 0x24, 0x40, 0x40,
0x40, 0x24, 0x18, 0x00, 0x70, 0x28, 0x24, 0x24, 0x24, 0x28, 0x70, 0x00,
0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7c, 0x00, 0x7c, 0x40, 0x40, 0x78,
0x40, 0x40, 0x40, 0x00, 0x38, 0x44, 0x40, 0x5c, 0x44, 0x44, 0x38, 0x00,
0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x00, 0x38, 0x10, 0x10, 0x10,
0x10, 0x10, 0x38, 0x00, 0x1c, 0x08, 0x08, 0x08, 0x48, 0x48, 0x30, 0x00,
0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x40, 0x40, 0x40, 0x40,
0x40, 0x40, 0x7c, 0x00, 0x44, 0x6c, 0x54, 0x54, 0x44, 0x44, 0x44, 0x00,
0x44, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x44, 0x00, 0x38, 0x44, 0x44, 0x44,
0x44, 0x44, 0x38, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00,
0x38, 0x44, 0x44, 0x44, 0x54, 0x48, 0x34, 0x00, 0x78, 0x44, 0x44, 0x78,
0x50, 0x48, 0x44, 0x00, 0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x38, 0x00,
0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x38, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x28, 0x10, 0x00,
0x44, 0x44, 0x44, 0x54, 0x54, 0x6c, 0x44, 0x00, 0x44, 0x44, 0x28, 0x10,
0x28, 0x44, 0x44, 0x00, 0x44, 0x44, 0x44, 0x38, 0x10, 0x10, 0x10, 0x00,
0x7c, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7c, 0x00, 0x3c, 0x20, 0x20, 0x20,
0x20, 0x20, 0x3c, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00,
0x3c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3c, 0x00, 0x10, 0x28, 0x44, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00,
0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x04,
0x3c, 0x44, 0x3c, 0x00, 0x40, 0x40, 0x58, 0x64, 0x44, 0x64, 0x58, 0x00,
0x00, 0x00, 0x38, 0x44, 0x40, 0x44, 0x38, 0x00, 0x04, 0x04, 0x34, 0x4c,
0x44, 0x4c, 0x34, 0x00, 0x00, 0x00, 0x38, 0x44, 0x7c, 0x40, 0x38, 0x00,
0x18, 0x24, 0x20, 0x78, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x38, 0x44,
0x44, 0x3c, 0x04, 0x38, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00,
0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00, 0x00, 0x08, 0x00, 0x18,
0x08, 0x08, 0x48, 0x30, 0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48, 0x00,
0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x68, 0x54,
0x54, 0x54, 0x54, 0x00, 0x00, 0x00, 0x58, 0x64, 0x44, 0x44, 0x44, 0x00,
0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x58, 0x64,
0x64, 0x58, 0x40, 0x40, 0x00, 0x00, 0x34, 0x4c, 0x4c, 0x34, 0x04, 0x04,
0x00, 0x00, 0x58, 0x64, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x3c, 0x40,
0x38, 0x04, 0x78, 0x00, 0x20, 0x20, 0x78, 0x20, 0x20, 0x24, 0x18, 0x00,
0x00, 0x00, 0x48, 0x48, 0x48, 0x48, 0x34, 0x00, 0x00, 0x00, 0x44, 0x44,
0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x44, 0x44, 0x54, 0x54, 0x28, 0x00,
0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x44, 0x44,
0x4c, 0x34, 0x04, 0x38, 0x00, 0x00, 0x7c, 0x08, 0x10, 0x20, 0x7c, 0x00,
0x0c, 0x10, 0x10, 0x20, 0x10, 0x10, 0x0c, 0x00, 0x10, 0x10, 0x10, 0x00,
0x10, 0x10, 0x10, 0x00, 0x30, 0x08, 0x08, 0x04, 0x08, 0x08, 0x30, 0x00,
0x20, 0x54, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x00, 0x18, 0x24, 0x40, 0x40, 0x24, 0x18, 0x08, 0x30,
0x48, 0x00, 0x48, 0x48, 0x48, 0x48, 0x34, 0x00, 0x08, 0x10, 0x38, 0x44,
0x7c, 0x40, 0x38, 0x00, 0x10, 0x28, 0x38, 0x04, 0x3c, 0x44, 0x3c, 0x00,
0x28, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x3c, 0x00, 0x20, 0x10, 0x38, 0x04,
0x3c, 0x44, 0x3c, 0x00, 0x38, 0x28, 0x38, 0x04, 0x3c, 0x44, 0x3c, 0x00,
0x00, 0x38, 0x44, 0x40, 0x44, 0x38, 0x10, 0x30, 0x10, 0x28, 0x38, 0x44,
0x7c, 0x40, 0x38, 0x00, 0x28, 0x00, 0x38, 0x44, 0x7c, 0x40, 0x38, 0x00,
0x20, 0x10, 0x38, 0x44, 0x7c, 0x40, 0x38, 0x00, 0x28, 0x00, 0x00, 0x30,
0x10, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00,
0x20, 0x10, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00, 0x28, 0x00, 0x10, 0x28,
0x44, 0x7c, 0x44, 0x00, 0x10, 0x28, 0x10, 0x28, 0x44, 0x7c, 0x44, 0x00,
0x08, 0x10, 0x7c, 0x40, 0x78, 0x40, 0x7c, 0x00, 0x00, 0x00, 0x6e, 0x10,
0x7c, 0x90, 0x6e, 0x00, 0x3e, 0x50, 0x90, 0xfc, 0x90, 0x90, 0x9e, 0x00,
0x10, 0x28, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x28, 0x00, 0x38, 0x44,
0x44, 0x44, 0x38, 0x00, 0x20, 0x10, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0x10, 0x28, 0x00, 0x48, 0x48, 0x48, 0x34, 0x00, 0x20, 0x10, 0x00, 0x48,
0x48, 0x48, 0x34, 0x00, 0x28, 0x00, 0x44, 0x44, 0x4c, 0x34, 0x04, 0x38,
0x28, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, 0x28, 0x00, 0x44, 0x44,
0x44, 0x44, 0x38, 0x00, 0x00, 0x10, 0x38, 0x54, 0x50, 0x54, 0x38, 0x10,
0x18, 0x24, 0x20, 0x78, 0x20, 0x22, 0x7c, 0x00, 0x44, 0x44, 0x28, 0x7c,
0x10, 0x7c, 0x10, 0x00, 0x38, 0x44, 0xf0, 0x40, 0xf0, 0x44, 0x38, 0x00,
0x18, 0x24, 0x20, 0x70, 0x20, 0x20, 0x20, 0xc0, 0x08, 0x10, 0x38, 0x04,
0x3c, 0x44, 0x3c, 0x00, 0x10, 0x20, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00,
0x08, 0x10, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x10, 0x20, 0x00, 0x48,
0x48, 0x48, 0x34, 0x00, 0x28, 0x50, 0x00, 0x58, 0x64, 0x44, 0x44, 0x00,
0x14, 0x28, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x00, 0x30, 0x08, 0x38, 0x48,
0x38, 0x00, 0x00, 0x00, 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x10, 0x20, 0x40, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7c,
0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x04, 0x04, 0x00, 0x00,
0x42, 0x44, 0x4e, 0x52, 0x2e, 0x48, 0x8e, 0x00, 0x42, 0x44, 0x4a, 0x5a,
0x2e, 0x42, 0x82, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
0x00, 0x12, 0x24, 0x48, 0x24, 0x12, 0x00, 0x00, 0x00, 0x90, 0x48, 0x24,
0x48, 0x90, 0x00, 0x00, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22,
0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xee, 0xbb, 0xee, 0xbb,
0xee, 0xbb, 0xee, 0xbb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0, 0x10,
0xf0, 0x10, 0x10, 0x10, 0x28, 0x28, 0x28, 0xe8, 0x28, 0x28, 0x28, 0x28,
0x00, 0x00, 0x00, 0xf8, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0xf0, 0x10,
0xf0, 0x10, 0x10, 0x10, 0x28, 0x28, 0xe8, 0x08, 0xe8, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0xf8, 0x08,
0xe8, 0x28, 0x28, 0x28, 0x28, 0x28, 0xe8, 0x08, 0xf8, 0x00, 0x00, 0x00,
0x28, 0x28, 0x28, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xf0, 0x10,
0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xff,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x1f, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x28, 0x28, 0x28, 0x2f,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x2f, 0x20, 0x3f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x20, 0x2f, 0x28, 0x28, 0x28, 0x28, 0x28, 0xef, 0x00,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xef, 0x28, 0x28, 0x28,
0x28, 0x28, 0x2f, 0x20, 0x2f, 0x28, 0x28, 0x28, 0x00, 0x00, 0xff, 0x00,
0xff, 0x00, 0x00, 0x00, 0x28, 0x28, 0xef, 0x00, 0xef, 0x28, 0x28, 0x28,
0x10, 0x10, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x10, 0x10, 0x10,
0x00, 0x00, 0x00, 0xff, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x3f,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1f, 0x10, 0x1f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3f,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0x28, 0x28, 0x28, 0x28,
0x10, 0x10, 0xff, 0x10, 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x48, 0x48, 0x48, 0x34, 0x00,
0x00, 0x00, 0x38, 0x44, 0x78, 0x44, 0x78, 0x40, 0x7c, 0x40, 0x40, 0x40,
0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x7e, 0x24, 0x24, 0x24, 0x24, 0x00,
0x7c, 0x40, 0x20, 0x10, 0x20, 0x40, 0x7c, 0x00, 0x00, 0x00, 0x3e, 0x44,
0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x48, 0x48, 0x48, 0x48, 0x70, 0x80,
0x00, 0x00, 0x34, 0x58, 0x10, 0x10, 0x10, 0x00, 0x7c, 0x10, 0x28, 0x44,
0x28, 0x10, 0x7c, 0x00, 0x38, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x44, 0x28, 0x28, 0x6c, 0x00, 0x3c, 0x20, 0x18, 0x44,
0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x6c, 0x92, 0x92, 0x6c, 0x00, 0x00,
0x00, 0x24, 0x4a, 0x52, 0x22, 0x5c, 0x40, 0x00, 0x00, 0x00, 0x3c, 0x40,
0x38, 0x40, 0x3c, 0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00,
0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10,
0x10, 0x7c, 0x00, 0x00, 0x20, 0x10, 0x08, 0x10, 0x20, 0x00, 0x38, 0x00,
0x08, 0x10, 0x20, 0x10, 0x08, 0x00, 0x38, 0x00, 0x0c, 0x12, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60,
0x00, 0x10, 0x00, 0x7c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x54, 0x08,
0x20, 0x54, 0x08, 0x00, 0x00, 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x00, 0x1e, 0x10, 0x10, 0x10, 0x10, 0x90, 0x50, 0x20,
0x00, 0x38, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x38, 0x04, 0x1c, 0x20,
0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more