Merge Peter's stuff. Rework the Makefile so it takes care of everything.

This is work in progress.
Some stuff from Peter's C256 branch was commented and I uncommented it because I didn't want things disabled for the A2560 but they seem to cause problems with Calypsi 65816.
This commit is contained in:
Vincent Barrilliot 2023-11-03 00:25:05 +01:00
parent bc56588af5
commit ad3795147a
94 changed files with 6518 additions and 5329 deletions

Binary file not shown.

View file

@ -1,323 +0,0 @@
import intelhex
import wdc
import foenix
import srec
import configparser
import re
import sys
import argparse
import os
from serial.tools import list_ports
FLASH_SIZE = 524288 # Required size of flash file: 512 KB
CHUNK_SIZE = 4096 # Size of block of binary data to transfer
label_file = ""
to_send = ""
port = ""
start_address = ""
count = ""
label = ""
def confirm(question):
return input(question).lower().strip()[:1] == "y"
def revision(port):
"""Get the version code for the debug port."""
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
c256.enter_debug()
try:
data = c256.get_revision()
return "%X" % data
finally:
c256.exit_debug()
finally:
c256.close()
def upload_binary(port, filename, address):
"""Upload a binary file into the C256 memory."""
with open(filename, "rb") as f:
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
c256.enter_debug()
try:
current_addr = int(address, 16)
block = f.read(CHUNK_SIZE)
while block:
c256.write_block(current_addr, block)
current_addr += len(block)
block = f.read(CHUNK_SIZE)
finally:
c256.exit_debug()
finally:
c256.close()
def program_flash(port, filename, hex_address):
"""Program the flash memory using the contents of the C256's RAM."""
base_address = int(hex_address, 16)
address = base_address
print("About to upload image to address 0x{:X}".format(address), flush=True)
#if os.path.getsize(filename) == FLASH_SIZE:
if confirm("Are you sure you want to reprogram the flash memory? (y/n): "):
with open(filename, "rb") as f:
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
c256.enter_debug()
try:
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)
c256.erase_flash()
print("Flash memory erased...", flush=True)
c256.program_flash(base_address)
print("Flash memory programmed...")
finally:
c256.exit_debug()
finally:
c256.close()
# else:
# print("The provided flash file is not the right size.")
def dereference(port, file, label):
"""Get the address contained in the pointer with the label in the label file."""
c256 = foenix.FoenixDebugPort()
try:
address = lookup(file, label)
c256.open(port)
c256.enter_debug()
try:
data = c256.read_block(int(address, 16), 3)
deref = data[2] << 16 | data[1] << 8 | data[0]
return "%X" % deref
finally:
c256.exit_debug()
finally:
c256.close()
def lookup(file, label):
"""Return the hex address linked to the passed label in the label file."""
with open(file) as f:
for line in f:
match = re.match('^(\S+)\s*\=\s*\$(\S+)', line)
if match:
if match.group(1) == label:
return match.group(2)
sys.stderr.write("Could not find a definition for that label.\n")
sys.exit(2)
def display(base_address, data):
"""Write a block of data to the console in a nice, hexadecimal format."""
text_buff = ""
for i in range(0, len(data)):
if (i % 16) == 0:
if text_buff != "":
sys.stdout.write(" {}\n".format(text_buff))
text_buff = ""
sys.stdout.write("{:06X}: ".format(base_address + i))
elif (i % 8) == 0:
sys.stdout.write(" ")
sys.stdout.write("{:02X}".format(data[i]))
b = bytearray(1)
b[0] = data[i]
if (b[0] & 0x80 == 0):
c = b.decode('ascii')
if c.isprintable():
text_buff = text_buff + c
else:
text_buff = text_buff + "."
else:
text_buff = text_buff + "."
sys.stdout.write(' {}\n'.format(text_buff))
def send_wdc(port, filename):
"""Send the data in the hex file 'filename' to the C256 on the given serial port."""
infile = wdc.WdcBinFile()
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
infile.open(filename)
try:
infile.set_handler(lambda address, data: c256.write_block(address, data))
c256.enter_debug()
try:
# Process the lines in the hex file
infile.read_blocks()
finally:
c256.exit_debug()
finally:
infile.close()
finally:
c256.close()
def send_srec(port, filename):
"""Send the data in the SREC hex file 'filename' to the C256 on the given serial port."""
infile = srec.SRECFile()
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
infile.open(filename)
try:
infile.set_handler(lambda address, data: c256.write_block(address, bytes.fromhex(data)))
c256.enter_debug()
try:
# Process the lines in the hex file
infile.read_lines()
finally:
c256.exit_debug()
finally:
infile.close()
finally:
c256.close()
def send(port, filename):
"""Send the data in the hex file 'filename' to the C256 on the given serial port."""
infile = intelhex.HexFile()
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
infile.open(filename)
try:
infile.set_handler(lambda address, data: c256.write_block(address, bytes.fromhex(data)))
c256.enter_debug()
try:
# Process the lines in the hex file
infile.read_lines()
finally:
c256.exit_debug()
finally:
infile.close()
finally:
c256.close()
def get(port, address, length):
"""Read a block of data from the C256."""
c256 = foenix.FoenixDebugPort()
try:
c256.open(port)
c256.enter_debug()
try:
data = c256.read_block(int(address, 16), int(length, 16))
display(int(address, 16), data)
finally:
c256.exit_debug()
finally:
c256.close()
def list_serial_ports():
serial_ports = list_ports.comports()
if len(serial_ports) == 0:
print("No serial ports found")
for serial_port in serial_ports:
print(f"{serial_port.device}")
print(f" Description: {serial_port.description}")
print(f" Manufacturer: {serial_port.manufacturer}")
print(f" Product: {serial_port.product}")
print()
config = configparser.ConfigParser()
config.read('c256.ini')
parser = argparse.ArgumentParser(description='Manage the C256 Foenix through its debug port.')
parser.add_argument("--port", dest="port", default=config['DEFAULT'].get('port', 'COM3'),
help="Specify the serial port to use to access the C256 debug port.")
parser.add_argument("--list-ports", dest="list_ports", action="store_true",
help="List available serial ports.")
parser.add_argument("--label-file", dest="label_file", default=config['DEFAULT'].get('labels', 'basic8'),
help="Specify the label file to use for dereference and lookup")
parser.add_argument("--count", dest="count", default="10", help="the number of bytes to read")
parser.add_argument("--dump", metavar="ADDRESS", dest="dump_address",
help="Read memory from the C256's memory and display it.")
parser.add_argument("--deref", metavar="LABEL", dest="deref_name",
help="Lookup the address stored at LABEL and display the memory there.")
parser.add_argument("--lookup", metavar="LABEL", dest="lookup_name",
help="Display the memory starting at the address indicated by the label.")
parser.add_argument("--revision", action="store_true", dest="revision",
help="Display the revision code of the debug interface.")
parser.add_argument("--flash", metavar="BINARY FILE", dest="flash_file",
help="Attempt to reprogram the flash using the binary file provided.")
parser.add_argument("--binary", metavar="BINARY FILE", dest="binary_file",
help="Upload a binary file to the C256's RAM.")
parser.add_argument("--address", metavar="ADDRESS", dest="address",
default=config['DEFAULT'].get('flash_address', '380000'),
help="Provide the starting address of the memory block to use in flashing memory.")
parser.add_argument("--upload", metavar="HEX FILE", dest="hex_file",
help="Attempt to reprogram the flash using the binary file provided.")
parser.add_argument("--upload-wdc", metavar="BINARY FILE", dest="wdc_file",
help="Upload a WDCTools binary hex file. (WDCLN.EXE -HZ)")
parser.add_argument("--upload-srec", metavar="SREC FILE", dest="srec_file",
help="Upload a Motorola SREC hex file.")
options = parser.parse_args()
try:
if options.port != "":
if options.hex_file:
send(options.port, options.hex_file)
elif options.wdc_file:
send_wdc(options.port, options.wdc_file)
elif options.srec_file:
send_srec(options.port, options.srec_file)
elif options.deref_name and options.label_file:
address = dereference(options.port, options.label_file, options.deref_name)
get(options.port, address, options.count)
elif options.lookup_name and options.label_file:
address = lookup(options.label_file, options.lookup_name)
get(options.port, address, options.count)
elif options.dump_address:
get(options.port, options.dump_address, options.count)
elif options.revision:
rev = revision(options.port)
print(rev)
elif options.address and options.binary_file:
upload_binary(options.port, options.binary_file, options.address)
elif options.address and options.flash_file:
program_flash(options.port, options.flash_file, options.address)
elif options.list_ports:
list_serial_ports()
else:
parser.print_help()
else:
parser.print_help()
finally:
print

View file

@ -1,140 +0,0 @@
import serial
class FoenixDebugPort:
"""Provide the conneciton to a C256 Foenix debug port."""
connection = 0
status0 = 0
status1 = 0
def open(self, port):
"""Open a connection to the C256 Foenix."""
self.connection = serial.Serial(port=port,
baudrate=6000000,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=60,
write_timeout=60)
try:
self.connection.open()
except:
self.connection.close()
self.connection.open()
def is_open(self):
return self.connection.is_open()
def close(self):
"""Close the connection to the C256 Foenix."""
self.connection.close()
def enter_debug(self):
"""Send the command to make the C256 Foenix enter its debug mode."""
self.transfer(0x80, 0, 0, 0)
def exit_debug(self):
"""Send the command to make the C256 Foenix leave its debug mode.
This will make the C256 reset.
"""
self.transfer(0x81, 0, 0, 0)
def erase_flash(self):
"""Send the command to have the C256 Foenix erase its flash memory."""
self.transfer(0x11, 0, 0, 0)
def get_revision(self):
"""Gets the revision code for the debug interface.
RevB2's revision code is 0, RevC4A is 1."""
self.transfer(0xFE, 0, 0, 0)
return self.status1
def program_flash(self, address):
"""Send the command to have the C256 Foenix reprogram its flash memory.
Data to be written should already be in the C256's RAM at address."""
self.transfer(0x10, address, 0, 0)
def write_block(self, address, data):
"""Write a block of data to the specified starting address in the C256's memory."""
self.transfer(0x01, address, data, 0)
def read_block(self, address, length):
"""Read a block of data of the specified length from the specified starting address of the C256's memory."""
return self.transfer(0x00, address, 0, length)
def readbyte(self):
b = self.connection.read(1)
return b[0]
def transfer(self, command, address, data, read_length):
"""Send a command to the C256 Foenix"""
self.status0 = 0
self.status1 = 0
lrc = 0
length = 0
if data == 0:
length = read_length
else:
length = len(data)
# if command == 0x80:
# print('Switching to debug mode')
# elif command == 0x81:
# print('Resetting')
# else:
# print('Writing data of length {:X} to {:X}'.format(length, address))
command_bytes = command.to_bytes(1, 'big')
address_bytes = address.to_bytes(3, 'big')
length_bytes = length.to_bytes(2, 'big')
header = bytearray(7)
header[0] = 0x55
header[1] = command_bytes[0]
header[2] = address_bytes[0]
header[3] = address_bytes[1]
header[4] = address_bytes[2]
header[5] = length_bytes[0]
header[6] = length_bytes[1]
for i in range(0, 6):
lrc = lrc ^ header[i]
if data:
for i in range(0, length):
lrc = lrc ^ data[i]
lrc_bytes = lrc.to_bytes(1, 'big')
if data:
packet = header + data + lrc_bytes
written = self.connection.write(packet)
if written != len(packet):
raise Exception("Could not write packet correctly.")
else:
packet = header + lrc_bytes
written = self.connection.write(packet)
if written != len(packet):
raise Exception("Could not write packet correctly.")
# print('Sent [{}]'.format(packet.hex()))
c = 0
while c != 0xAA:
c = self.readbyte()
# print('Got 0xAA')
read_bytes = 0
if c == 0xAA:
self.status0 = self.readbyte()
self.status1 = self.readbyte()
if read_length > 0:
read_bytes = self.connection.read(read_length)
read_lrc = self.readbyte()
# print("Status: {:X}, {:X}".format(self.status0, self.status1))
return read_bytes

View file

@ -1,52 +0,0 @@
import re
class HexFile:
"""Read information from an Intel Hex file."""
file = 0
base_address = 0
handler = 0
def __init__(self):
self.file = 0
self.base_address = 0
self.handler = 0
def open(self, filename):
self.file = open(filename, 'r')
def set_handler(self, proc):
self.handler = proc
def close(self):
self.file.close()
def read_lines(self):
line = self.file.readline()
while line:
self.parse_line(line)
line = self.file.readline()
def parse_line(self, line):
m = re.match("^:([0-9a-fA-F]{2})([0-9a-fA-F]{4})([0-9a-fA-F]{2})([0-9a-fA-F]*)([0-9a-fA-F]{2})", line)
size = int(m.group(1), 16)
address = int(m.group(2), 16)
code = int(m.group(3), 16)
data = m.group(4)
crc = int(m.group(5), 16)
if code == 0:
if self.handler:
# print('Sending record to {:X}'.format(self.base_address + address))
self.handler(self.base_address + address, data)
elif code == 2:
# Set the base address based on a segment
self.base_address = int(data, 16) << 4 # shity 80x86 real mode addressing : take the address an do *16 to get the final address
# print('Setting base address to {:X}'.format(self.base_address))
elif code == 4:
# Set the base address given on address[31..16]
self.base_address = int(data, 16) << 16
# print('Setting base address to {:X}'.format(self.base_address))

View file

@ -1,81 +0,0 @@
import re
def tailpad(data):
datalen = len(data)
pad = datalen % 4
if pad > 0:
return data.ljust(datalen + pad, '0')
else:
return data
class SRECFile:
"""Read information from a Motorola SREC file."""
file = 0
handler = 0
def __init__(self):
self.file = 0
self.handler = 0
def open(self, filename):
self.file = open(filename, 'r')
def set_handler(self, proc):
self.handler = proc
def close(self):
self.file.close()
def read_lines(self):
line = self.file.readline()
while line:
self.parse_line(line)
line = self.file.readline()
def parse_line(self, line):
# Format of line will vary based on the type, so let's get the type first
m = re.match("^S([0-9a-fA-F])([0-9a-fA-F]+)", line)
code = int(m.group(1), 16)
hex_digits = m.group(2)
# Codes...
# 0 = Comment/header
# 1 = Data with 16-bit address
# 2 = Data with 24-bit address
# 3 = Data with 32-bit address
# 4 = Reserved
# 5 = 16-bit record count
# 6 = 24-bit record count
# 7 = 32-bit start address
# 8 = 24-bit start address
# 9 = 16-bit start address
#
# This code will ignore all records by 1, 2, and 3
if code == 1:
# Unpack a record with a 16-bit address
m2 = re.match("^([0-9a-fA-F]{2})([0-9a-fA-F]{4})([0-9a-fA-F]*)([0-9a-fA-F]{2})", hex_digits)
count = int(m2.group(1), 16)
address = int(m2.group(2), 16)
data = m2.group(3)
crc = int(m2.group(4), 16)
self.handler(address, tailpad(data))
elif code == 2:
# Unpack a record with a 24-bit address
m2 = re.match("^([0-9a-fA-F]{2})([0-9a-fA-F]{6})([0-9a-fA-F]*)([0-9a-fA-F]{2})", hex_digits)
count = int(m2.group(1), 16)
address = int(m2.group(2), 16)
data = m2.group(3)
crc = int(m2.group(4), 16)
self.handler(address, tailpad(data))
elif code == 3:
# Unpack a record with a 32-bit address
m2 = re.match("^([0-9a-fA-F]{2})([0-9a-fA-F]{8})([0-9a-fA-F]*)([0-9a-fA-F]{2})", hex_digits)
count = int(m2.group(1), 16)
address = int(m2.group(2), 16)
data = m2.group(3)
crc = int(m2.group(4), 16)
self.handler(address, tailpad(data))

View file

@ -1,49 +0,0 @@
from pathlib import Path
##
# See: http://www.westerndesigncenter.com/wdc/datasheets/Assembler_Linker.pdf
# page 37
#
# Initial byte 'Z' as signature.
#
# Then for each block:
# 3 byte address
# 3 byte length
# length bytes of data
#
# The final block has an address and length of 0.
#
class WdcBinFile:
"""Reads information from WDCTools BIN formated file"""
data = 0
handler = 0
def __init__(self):
pass
def open(self, filename):
self.data = Path(filename).read_bytes()
def close(self):
self.data = []
def set_handler(self, proc):
self.handler = proc
def read_blocks(self):
offset = 1
while offset < len(self.data):
(addr, block, offset) = self.__read_block(self.data, offset)
if addr > 0:
self.handler(addr, block)
def __read_block(self, data, offset):
addr = int.from_bytes(data[offset:offset+3], byteorder='little', signed=False)
size = int.from_bytes(data[offset+3:offset+6], byteorder='little', signed=False)
if addr == 0:
return (0, [], offset+6)
block = data[offset+6:offset+6+size]
return (addr, block, offset+6+size)

2702
Doxyfile

File diff suppressed because it is too large Load diff

BIN
FoenixMgr.zip Normal file

Binary file not shown.

View file

@ -1,4 +0,0 @@
[DEFAULT]
port=COM5
labels=sample.lbl
flash_address=010000

View file

@ -1,9 +0,0 @@
@echo off
REM Print the contents of memory
REM usage: dump {start address} [{byte count}]
if [%2%]==[] (
python C256Mgr\c256mgr.py --dump %1
) ELSE (
python C256Mgr\c256mgr.py --dump %1 --count %2
)

View file

@ -1,8 +0,0 @@
@echo off
REM Reprogram the flash memory on the C256 Foenix
if [%2%]==[] (
python C256Mgr\c256mgr.py --flash %1
) ELSE (
python C256Mgr\c256mgr.py --flash %1 --address %2
)

View file

@ -1,3 +0,0 @@
#!/bin/sh
# This script will help you flash the Foenix from linux. Tested for A2560U only.
python3 C256Mgr/c256mgr.py --flash src/foenixmcp.bin --address 0x00000

6
foenixmgr.ini Normal file
View file

@ -0,0 +1,6 @@
[DEFAULT]
port=COM3
labels=sample.lbl
flash_address=380000
chunk_size=1024
cpu=65816

View file

@ -1,9 +0,0 @@
@echo off
REM Print the contents of memory at the labeled address
REM usage: lookup {label}
if [%2%]==[] (
python C256Mgr\c256mgr.py --lookup %1
) ELSE (
python C256Mgr\c256mgr.py --lookup %1 --count %2
)

View file

@ -1,3 +0,0 @@
@echo off
REM Get the revision code of the C256 Foenix's debug interface
python C256Mgr\c256mgr.py --revision

View file

@ -1,2 +0,0 @@
@echo off
python C256Mgr\c256mgr.py --upload %1

View file

@ -1,2 +0,0 @@
@echo off
python C256Mgr\c256mgr.py --upload-srec %1

53
src/C256/gentables.py Normal file
View file

@ -0,0 +1,53 @@
#
# Generate the assembly files for both the system call library and the kernel jump tabls
#
sys_call_names = []
# Read in the list of system calls ("sys_")
with open("syscalls.txt", "r") as call_names:
for line in call_names:
# Remove comments
index = line.find("#")
if index == 0:
line = ""
elif index > 0:
line = line[index - 1:]
line = line.strip()
# Skip blank lines
if len(line) > 0:
sys_call_names.append(line)
# Create the system call table, which is used to call into the kernel jump table
with open("syscalls.s", "w") as f:
for call_name in sys_call_names:
f.write("\t.public sys_{}\n".format(call_name))
f.write("\n")
for call_name in sys_call_names:
f.write("\t.extern sjt_{}\n".format(call_name))
f.write("\n\t.section farcode\n\n");
for call_name in sys_call_names:
f.write("sys_{:26}\tjmp long:sjt_{}\n".format(call_name + ": ", call_name))
# Create the kernel jump table
with open("jumptable.s", "w") as f:
for call_name in sys_call_names:
f.write("\t.public sjt_{}\n".format(call_name))
f.write("\n")
for call_name in sys_call_names:
f.write("\t.extern {}\n".format(call_name))
f.write("\n\t.section jumptable\n\n");
for call_name in sys_call_names:
f.write("sjt_{:26}\tjmp long:{}\n".format(call_name + ": ", call_name))

213
src/C256/io_stubs.c Normal file
View file

@ -0,0 +1,213 @@
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include "syscalls.h"
/****************************************************************************
* Name: _Stub_open
*
* Description:
* Open a file.
* The oflag argument are POSIX style mode flags, e.g O_RDONLY which
* are defined in fcntl.h.
* This function is variadic as it optionally can take a mode_t that
* are permissions, e.g 0666. If the file system does not handle
* permissions you can ignore that this function is variadic.
* The return file descriptor shall be a positive number, larger
* than 2 (as 0-2 are used for stdin, stdout and stderr).
* The actual number does not matter and they need not to be
* consequtive, multiple numeric series with gaps between can be used.
*
* Return the obtained file descriptor or EOF (-1) on failure and set
* errno according to the error.
*
****************************************************************************/
int _Stub_open(const char *path, int oflag, ...) {
return -1;
}
/****************************************************************************
* Name: _Stub_close
*
* Description:
* Close a file
*
* Return 0 if operation was OK, EOF otherwise and set errno according to
* the error.
* Note: This will only be invoked for streams opened by _Stub_open(),
* there is no need to check for the standard descriptor 0-2.
*
****************************************************************************/
int _Stub_close(int fd) {
return 0;
}
/****************************************************************************
* Name: _Stub_access
*
* Description:
* Determine if a file can be accessed.
*
****************************************************************************/
int _Stub_access(const char *path, int mode) {
return 0;
}
/****************************************************************************
* Name: _Stub_lseek
*
* Description:
* Change position in a file
*
* Returns the new position in the file in bytes from the beginning of the
* file, or -1 on failure.
*
****************************************************************************/
long _Stub_lseek(int fd, long offset, int whence) {
return 0;
}
/****************************************************************************
* Name: _Stub_fgetpos
*
* Description:
* Change position in a file
*
* Returns 0 on success, non-zero otherwise. In case of an error also set
* errno according to error.
*
****************************************************************************/
int _Stub_fgetpos(int fd, fpos_t *pos) {
return 0;
}
/****************************************************************************
* Name: _Stub_fsetpos
*
* Description:
* Change position in a file
*
* Returns 0 on success, non-zero otherwise. In case of an error also set
* errno according to error.
*
****************************************************************************/
int _Stub_fsetpos(int fd, const fpos_t *pos) {
return 0;
}
/****************************************************************************
* Name: _Stub_read
*
* Description:
* Read from a file
*
* Returns the number of characters read. Return -1 on failure and set
* errno according to the error.
*
****************************************************************************/
size_t _Stub_read(int fd, void *buf, size_t count) {
return 0;
}
/****************************************************************************
* Name: _Stub_write
*
* Description:
* Write to a file
*
* Returns the number of characters actually written. Return -1 on failure and
* set errno according to the error.
*
****************************************************************************/
size_t _Stub_write(int fd, const void *buf, size_t count) {
short channel = 0;
switch (fd) {
case 0:
channel = 0;
break;
case 1:
channel = 0;
break;
case 2:
channel = 1;
break;
default:
channel = 0;
break;
}
for (int i = 0; i < count; i++) {
sys_txt_put(channel, ((const char *)buf)[i]);
}
return count;
}
/****************************************************************************
* Name: _Stub_rename
*
* Description:
* Rename a file or directory
*
* Return 0 on success, -1 otherwise and set errno according to the
* error.
*
****************************************************************************/
int _Stub_rename(const char *oldpath, const char *newpath) {
return 0;
}
/****************************************************************************
* Name: _Stub_remove
*
* Description:
* Remove a file or directory
*
* Return 0 on success, -1 otherwise and set errno according to the
* error.
*
****************************************************************************/
int _Stub_remove(const char *path) {
return 0;
}
/****************************************************************************
* Name: _Stub_exit
*
* Description:
* Terminate the program with an exit code, exit clean-ups are done
* before this function is (finally) called.
*
****************************************************************************/
void _Stub_exit(int exitCode) {
while (1) ;
}
/****************************************************************************
* Name: _Stub_environ
*
* Description:
* Get the environment. On UNIX this is typically a global variable
* 'environ', but in order to make it more flexible and avoid having
* such global variable (which is not part of the C standard) it is
* obtained using the stub interface.
*
* Note:
* This stub function is not implemented by the semi-hosted debug stub
* interface.
*
****************************************************************************/
char** _Stub_environ(void) {
return 0;
}

163
src/C256/jumptable.s Normal file
View file

@ -0,0 +1,163 @@
.public sjt_int_enable_all
.public sjt_int_disable_all
.public sjt_int_disable
.public sjt_int_enable
.public sjt_int_register
.public sjt_int_pending
.public sjt_get_info
.public sjt_int_clear
.public sjt_chan_read_b
.public sjt_chan_read
.public sjt_chan_readline
.public sjt_chan_write_b
.public sjt_chan_write
.public sjt_chan_status
.public sjt_chan_flush
.public sjt_chan_seek
.public sjt_chan_ioctrl
.public sjt_chan_open
.public sjt_chan_close
.public sjt_chan_swap
.public sjt_chan_device
.public sjt_bdev_register
.public sjt_bdev_read
.public sjt_bdev_write
.public sjt_bdev_status
.public sjt_bdev_flush
.public sjt_bdev_ioctrl
.public sjt_mem_get_ramtop
.public sjt_mem_reserve
.public sjt_time_jiffies
.public sjt_rtc_set_time
.public sjt_rtc_get_time
.public sjt_kbd_scancode
.public sjt_err_message
.public sjt_kbd_layout
.public sjt_var_set
.public sjt_var_get
.public sjt_txt_get_capabilities
.public sjt_txt_set_mode
.public sjt_txt_setsizes
.public sjt_txt_set_xy
.public sjt_txt_get_xy
.public sjt_txt_get_region
.public sjt_txt_set_region
.public sjt_txt_set_color
.public sjt_txt_get_color
.public sjt_txt_set_cursor_visible
.public sjt_txt_set_font
.public sjt_txt_get_sizes
.public sjt_txt_set_border
.public sjt_txt_set_border_color
.public sjt_txt_put
.public sjt_txt_print
.extern int_enable_all
.extern int_disable_all
.extern int_disable
.extern int_enable
.extern int_register
.extern int_pending
.extern get_info
.extern int_clear
.extern chan_read_b
.extern chan_read
.extern chan_readline
.extern chan_write_b
.extern chan_write
.extern chan_status
.extern chan_flush
.extern chan_seek
.extern chan_ioctrl
.extern chan_open
.extern chan_close
.extern chan_swap
.extern chan_device
.extern bdev_register
.extern bdev_read
.extern bdev_write
.extern bdev_status
.extern bdev_flush
.extern bdev_ioctrl
.extern mem_get_ramtop
.extern mem_reserve
.extern time_jiffies
.extern rtc_set_time
.extern rtc_get_time
.extern kbd_scancode
.extern err_message
.extern kbd_layout
.extern var_set
.extern var_get
.extern txt_get_capabilities
.extern txt_set_mode
.extern txt_setsizes
.extern txt_set_xy
.extern txt_get_xy
.extern txt_get_region
.extern txt_set_region
.extern txt_set_color
.extern txt_get_color
.extern txt_set_cursor_visible
.extern txt_set_font
.extern txt_get_sizes
.extern txt_set_border
.extern txt_set_border_color
.extern txt_put
.extern txt_print
.section jumptable
sjt_int_enable_all: jmp long:int_enable_all
sjt_int_disable_all: jmp long:int_disable_all
sjt_int_disable: jmp long:int_disable
sjt_int_enable: jmp long:int_enable
sjt_int_register: jmp long:int_register
sjt_int_pending: jmp long:int_pending
sjt_get_info: jmp long:get_info
sjt_int_clear: jmp long:int_clear
sjt_chan_read_b: jmp long:chan_read_b
sjt_chan_read: jmp long:chan_read
sjt_chan_readline: jmp long:chan_readline
sjt_chan_write_b: jmp long:chan_write_b
sjt_chan_write: jmp long:chan_write
sjt_chan_status: jmp long:chan_status
sjt_chan_flush: jmp long:chan_flush
sjt_chan_seek: jmp long:chan_seek
sjt_chan_ioctrl: jmp long:chan_ioctrl
sjt_chan_open: jmp long:chan_open
sjt_chan_close: jmp long:chan_close
sjt_chan_swap: jmp long:chan_swap
sjt_chan_device: jmp long:chan_device
sjt_bdev_register: jmp long:bdev_register
sjt_bdev_read: jmp long:bdev_read
sjt_bdev_write: jmp long:bdev_write
sjt_bdev_status: jmp long:bdev_status
sjt_bdev_flush: jmp long:bdev_flush
sjt_bdev_ioctrl: jmp long:bdev_ioctrl
sjt_mem_get_ramtop: jmp long:mem_get_ramtop
sjt_mem_reserve: jmp long:mem_reserve
sjt_time_jiffies: jmp long:time_jiffies
sjt_rtc_set_time: jmp long:rtc_set_time
sjt_rtc_get_time: jmp long:rtc_get_time
sjt_kbd_scancode: jmp long:kbd_scancode
sjt_err_message: jmp long:err_message
sjt_kbd_layout: jmp long:kbd_layout
sjt_var_set: jmp long:var_set
sjt_var_get: jmp long:var_get
sjt_txt_get_capabilities: jmp long:txt_get_capabilities
sjt_txt_set_mode: jmp long:txt_set_mode
sjt_txt_setsizes: jmp long:txt_setsizes
sjt_txt_set_xy: jmp long:txt_set_xy
sjt_txt_get_xy: jmp long:txt_get_xy
sjt_txt_get_region: jmp long:txt_get_region
sjt_txt_set_region: jmp long:txt_set_region
sjt_txt_set_color: jmp long:txt_set_color
sjt_txt_get_color: jmp long:txt_get_color
sjt_txt_set_cursor_visible: jmp long:txt_set_cursor_visible
sjt_txt_set_font: jmp long:txt_set_font
sjt_txt_get_sizes: jmp long:txt_get_sizes
sjt_txt_set_border: jmp long:txt_set_border
sjt_txt_set_border_color: jmp long:txt_set_border_color
sjt_txt_put: jmp long:txt_put
sjt_txt_print: jmp long:txt_print

View file

@ -0,0 +1,24 @@
(define memories
'((memory flash (address (#x390000 . #x3fffff))
(type rom))
(memory DirectPage (address (#x000000 . #x0000ff))
(section (registers ztiny)))
(memory LoRAM (address (#x004000 . #x008fff))
(section stack data zdata data heap))
(memory NearRAM1 (address (#x010000 . #x017fff))
(section znear near))
(memory NearRAM2 (address (#x018000 . #x01ffff))
(section cnear))
(memory FarRAM1 (address (#x020000 . #x02ffff))
(section far huge))
(memory FarRAM2 (address (#x030000 . #x03ffff))
(section zfar zhuge ))
(memory LoCODE (address (#x00a000 . #x00efff))
(section code cdata jumptable))
(memory Vector (address (#x00ffe0 . #x00ffff))
(section (reset #xfffc)))
(block stack (size #x1000))
(block heap (size #x1000))
(base-address _DirectPageStart DirectPage 0)
(base-address _NearBaseAddress NearRAM1 0)
))

163
src/C256/syscalls.s Normal file
View file

@ -0,0 +1,163 @@
.public sys_int_enable_all
.public sys_int_disable_all
.public sys_int_disable
.public sys_int_enable
.public sys_int_register
.public sys_int_pending
.public sys_get_info
.public sys_int_clear
.public sys_chan_read_b
.public sys_chan_read
.public sys_chan_readline
.public sys_chan_write_b
.public sys_chan_write
.public sys_chan_status
.public sys_chan_flush
.public sys_chan_seek
.public sys_chan_ioctrl
.public sys_chan_open
.public sys_chan_close
.public sys_chan_swap
.public sys_chan_device
.public sys_bdev_register
.public sys_bdev_read
.public sys_bdev_write
.public sys_bdev_status
.public sys_bdev_flush
.public sys_bdev_ioctrl
.public sys_mem_get_ramtop
.public sys_mem_reserve
.public sys_time_jiffies
.public sys_rtc_set_time
.public sys_rtc_get_time
.public sys_kbd_scancode
.public sys_err_message
.public sys_kbd_layout
.public sys_var_set
.public sys_var_get
.public sys_txt_get_capabilities
.public sys_txt_set_mode
.public sys_txt_setsizes
.public sys_txt_set_xy
.public sys_txt_get_xy
.public sys_txt_get_region
.public sys_txt_set_region
.public sys_txt_set_color
.public sys_txt_get_color
.public sys_txt_set_cursor_visible
.public sys_txt_set_font
.public sys_txt_get_sizes
.public sys_txt_set_border
.public sys_txt_set_border_color
.public sys_txt_put
.public sys_txt_print
.extern sjt_int_enable_all
.extern sjt_int_disable_all
.extern sjt_int_disable
.extern sjt_int_enable
.extern sjt_int_register
.extern sjt_int_pending
.extern sjt_get_info
.extern sjt_int_clear
.extern sjt_chan_read_b
.extern sjt_chan_read
.extern sjt_chan_readline
.extern sjt_chan_write_b
.extern sjt_chan_write
.extern sjt_chan_status
.extern sjt_chan_flush
.extern sjt_chan_seek
.extern sjt_chan_ioctrl
.extern sjt_chan_open
.extern sjt_chan_close
.extern sjt_chan_swap
.extern sjt_chan_device
.extern sjt_bdev_register
.extern sjt_bdev_read
.extern sjt_bdev_write
.extern sjt_bdev_status
.extern sjt_bdev_flush
.extern sjt_bdev_ioctrl
.extern sjt_mem_get_ramtop
.extern sjt_mem_reserve
.extern sjt_time_jiffies
.extern sjt_rtc_set_time
.extern sjt_rtc_get_time
.extern sjt_kbd_scancode
.extern sjt_err_message
.extern sjt_kbd_layout
.extern sjt_var_set
.extern sjt_var_get
.extern sjt_txt_get_capabilities
.extern sjt_txt_set_mode
.extern sjt_txt_setsizes
.extern sjt_txt_set_xy
.extern sjt_txt_get_xy
.extern sjt_txt_get_region
.extern sjt_txt_set_region
.extern sjt_txt_set_color
.extern sjt_txt_get_color
.extern sjt_txt_set_cursor_visible
.extern sjt_txt_set_font
.extern sjt_txt_get_sizes
.extern sjt_txt_set_border
.extern sjt_txt_set_border_color
.extern sjt_txt_put
.extern sjt_txt_print
.section farcode
sys_int_enable_all: jmp long:sjt_int_enable_all
sys_int_disable_all: jmp long:sjt_int_disable_all
sys_int_disable: jmp long:sjt_int_disable
sys_int_enable: jmp long:sjt_int_enable
sys_int_register: jmp long:sjt_int_register
sys_int_pending: jmp long:sjt_int_pending
sys_get_info: jmp long:sjt_get_info
sys_int_clear: jmp long:sjt_int_clear
sys_chan_read_b: jmp long:sjt_chan_read_b
sys_chan_read: jmp long:sjt_chan_read
sys_chan_readline: jmp long:sjt_chan_readline
sys_chan_write_b: jmp long:sjt_chan_write_b
sys_chan_write: jmp long:sjt_chan_write
sys_chan_status: jmp long:sjt_chan_status
sys_chan_flush: jmp long:sjt_chan_flush
sys_chan_seek: jmp long:sjt_chan_seek
sys_chan_ioctrl: jmp long:sjt_chan_ioctrl
sys_chan_open: jmp long:sjt_chan_open
sys_chan_close: jmp long:sjt_chan_close
sys_chan_swap: jmp long:sjt_chan_swap
sys_chan_device: jmp long:sjt_chan_device
sys_bdev_register: jmp long:sjt_bdev_register
sys_bdev_read: jmp long:sjt_bdev_read
sys_bdev_write: jmp long:sjt_bdev_write
sys_bdev_status: jmp long:sjt_bdev_status
sys_bdev_flush: jmp long:sjt_bdev_flush
sys_bdev_ioctrl: jmp long:sjt_bdev_ioctrl
sys_mem_get_ramtop: jmp long:sjt_mem_get_ramtop
sys_mem_reserve: jmp long:sjt_mem_reserve
sys_time_jiffies: jmp long:sjt_time_jiffies
sys_rtc_set_time: jmp long:sjt_rtc_set_time
sys_rtc_get_time: jmp long:sjt_rtc_get_time
sys_kbd_scancode: jmp long:sjt_kbd_scancode
sys_err_message: jmp long:sjt_err_message
sys_kbd_layout: jmp long:sjt_kbd_layout
sys_var_set: jmp long:sjt_var_set
sys_var_get: jmp long:sjt_var_get
sys_txt_get_capabilities: jmp long:sjt_txt_get_capabilities
sys_txt_set_mode: jmp long:sjt_txt_set_mode
sys_txt_setsizes: jmp long:sjt_txt_setsizes
sys_txt_set_xy: jmp long:sjt_txt_set_xy
sys_txt_get_xy: jmp long:sjt_txt_get_xy
sys_txt_get_region: jmp long:sjt_txt_get_region
sys_txt_set_region: jmp long:sjt_txt_set_region
sys_txt_set_color: jmp long:sjt_txt_set_color
sys_txt_get_color: jmp long:sjt_txt_get_color
sys_txt_set_cursor_visible: jmp long:sjt_txt_set_cursor_visible
sys_txt_set_font: jmp long:sjt_txt_set_font
sys_txt_get_sizes: jmp long:sjt_txt_get_sizes
sys_txt_set_border: jmp long:sjt_txt_set_border
sys_txt_set_border_color: jmp long:sjt_txt_set_border_color
sys_txt_put: jmp long:sjt_txt_put
sys_txt_print: jmp long:sjt_txt_print

79
src/C256/syscalls.txt Normal file
View file

@ -0,0 +1,79 @@
# A list of system calls to be used to autogenerate the various jump tables and sys calls stubs\
# proc_exit
int_enable_all
int_disable_all
int_disable
int_enable
int_register
int_pending
get_info
int_clear
chan_read_b
chan_read
chan_readline
chan_write_b
chan_write
chan_status
chan_flush
chan_seek
chan_ioctrl
chan_open
chan_close
chan_swap
chan_device
bdev_register
bdev_read
bdev_write
bdev_status
bdev_flush
bdev_ioctrl
# fsys_open
# fsys_close
# fsys_opendir
# fsys_closedir
# fsys_readdir
# fsys_findfirst
# fsys_findnext
# fsys_get_label
# fsys_set_label
# fsys_mkdir
# fsys_delete
# fsys_rename
# fsys_set_cwd
# fsys_get_cwd
# fsys_load
# fsys_register_loader
# fsys_stat
mem_get_ramtop
mem_reserve
time_jiffies
rtc_set_time
rtc_get_time
kbd_scancode
err_message
kbd_layout
# proc_run
var_set
var_get
txt_get_capabilities
txt_set_mode
txt_setsizes
txt_set_xy
txt_get_xy
txt_get_region
txt_set_region
txt_set_color
txt_get_color
txt_set_cursor_visible
txt_set_font
txt_get_sizes
txt_set_border
txt_set_border_color
txt_put
txt_print

40
src/C256/syscalls_c256.c Normal file
View file

@ -0,0 +1,40 @@
#include "syscalls.h"
#include "interrupt.h"
#include "sys_general.h"
#include "timers.h"
#include "dev/channel.h"
#include "dev/block.h"
#include "dev/ps2.h"
#include "dev/rtc.h"
/**
* @brief Translation file to map system calls into the irregularly named implementations.
*
*/
/*
* Get the number of jiffies since the system last booted.
*
* Returns:
* the number of jiffies since the last reset
*/
long time_jiffies() {
return timers_jiffies();
}
/*
* 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
*/
void get_info(p_sys_info info) {
sys_get_information(info);
}
/*
* Return the next scan code from the keyboard... 0 if nothing pending
*/
unsigned short kbd_scancode() {
return kbd_get_scancode();
}

View file

@ -1,11 +1,17 @@
#
# User may over-ride the UNIT and MEMORY parameters to specify target machine
# and where the MCP will run (ram or flash)
#
UNIT := a2560x
MEMORY := flash
UNIT := C256U_PLUS
MEMORY := ram
# The script expects the following environment variables to be set:
# VBCC: path to VBCC distribution
#UNIT := C256U_PLUS
#MEMORY := RAM
# The below doesn't seem true !
# CPU_WDC65816 0x16 /* CPU code for the Western Design Center 65816 */
# CPU_M68000 0x20 /* CPU code for the Motorola 68000 */
# CPU_M68010 0x21 /* CPU code for the Motorola 68010 */
@ -23,154 +29,234 @@ MEMORY := flash
# MODEL_FOENIX_A2560U 9
# MODEL_FOENIX_A2560K 11
# Determine target CPU and MODEL based on the UNIT
# The comments are on a separate line to avoid inserting white space in the commande line where these variables are used
# Unit-specific properties ----------------------------------------------------
ifeq ($(UNIT),a2560k)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# A2560K
export MODEL_NUMBER = 11
export cpu = m68040
MODEL_NUMBER = 11
CPU = m68040
else ifeq ($(UNIT),genx)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# GenX
export MODEL_NUMBER = 4
export cpu = m68040
MODEL_NUMBER = 4
CPU = m68040
else ifeq ($(UNIT),a2560x)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# A2560X
export MODEL_NUMBER = 8
export cpu = m68040
MODEL_NUMBER = 8
CPU = m68040
else ifeq ($(UNIT),a2560u)
# M680SEC00
export CPU_NUMBER = 0
# VASM CPU flag
export VASM_CPU = -m68000
# VBCC CPU flag
export VBCC_CPU = 68000
export MODEL_NUMBER = 9
export cpu = m68k
MODEL_NUMBER = 9
CPU = m68k
else ifeq ($(UNIT),C256U)
CPU = w65816
MODEL_NUMBER = 1
SRCS_FOR_UNIT =
LDFLAGS_FOR_UNIT = C256/ld_lc_c256_u.scm clib-lc-ld.a
else ifeq ($(UNIT),C256U_PLUS)
MODEL_NUMBER = 5
CPU = w65816
SRCS_FOR_UNIT = C256/jumptable.s C256/syscalls.s C256/syscalls_c256.c C256/io_stubs.c
LDFLAGS_FOR_UNIT = C256/ld_lc_c256_fmx.scm clib-lc-ld.a --rtattr printf=medium
else ifeq ($(UNIT),C256_FMX)
CPU = w65816
MODEL_NUMBER = 0
SRCS_FOR_UNIT =
LDFLAGS_FOR_UNIT = C256/ld_lc_c256_fmx.scm clib-lc-ld.a
endif
# Determine the correct configuration file (barring OS)
ifeq ($(MEMORY),ram)
export CFG_FILE = $(VBCC)/config/$(UNIT)_ram
else
export CFG_FILE = $(VBCC)/config/$(UNIT)_flash
# Common defines and includes -------------------------------------------------
DEFINES = # -DKBD_POLLED
ifeq ("$(CPU)","w65816")
CPU_NUMBER = 255
else ifeq ("$(CPU)","m68040") # M68040V or 68040
CPU_NUMBER = 6
else ifeq ("$(CPU)","m68000") # M68000 or 68SEC000
CPU_NUMBER = 0
endif
export AS = vasmm68k_mot
export ASFLAGS = $(VASM_CPU) -quiet -Fvobj -nowarn=62 -DMODEL=$(MODEL_NUMBER)
export CC = vc
DEFINES = -DCPU=$(CPU_NUMBER) -DMODEL=$(MODEL_NUMBER) # -DKBD_POLLED
# Logging level
DEFINES := $(DEFINES) -DCPU=$(CPU_NUMBER) -DMODEL=$(MODEL_NUMBER)
ifeq ("$(DEFAULT_LOG_LEVEL)","")
else
DEFINES := $(DEFINES) -DDEFAULT_LOG_LEVEL=$(DEFAULT_LOG_LEVEL)
DEFINES := $(DEFINES) -DDEFAULT_LOG_LEVEL=$(DEFAULT_LOG_LEVEL)
endif
INCLUDES = -I. -I$(CURDIR)/include -I$(CURDIR)
# Toolchain selection ---------------------------------------------------------
ifeq ($(CPU),w65816)
TOOLCHAIN = calypsi
else
TOOLCHAIN = vbcc
endif
export DEFINES:=$(DEFINES)
# When compiling an image for flash, size to which the image must be padded
PAD_FLASH_SIZE=524288
# Toolchain specific settings -------------------------------------------------
ifeq ($(TOOLCHAIN),calypsi)
CC = cc65816
AS = as65816
LD = ln65816
AR = nlib
# Determine the correct configuration file (barring OS)
ifeq ($(MEMORY),ram)
LD_OUTPUT_TYPE = s37
else
LD_OUTPUT_TYPE = # TODO
endif
CFLAGS = -l --target Foenix --code-model large --data-model large
LDFLAGS=--target foenix --output-format $(LD_OUTPUT_TYPE) --list-file foenixmcp.map
else
CC = vc
AS = vasmm68k_mot
# VBCC
ifeq ("$(CPU)","m68000")
VASM_CPU = -m68000
VBCC_CPU = m68000
else ifeq ("$(CPU)","m68040")
VASM_CPU = -m68040
VBCC_CPU = 68040
endif
# Determine the correct configuration file (barring OS)
ifeq ($(MEMORY),ram)
CFG_FILE = $(VBCC)/config/$(UNIT)_ram
else
CFG_FILE = $(VBCC)/config/$(UNIT)_flash
endif
ifneq ($(OS),Windows_NT)
CFG_FILE := $(CFG_FILE)_linux
endif
ASFLAGS = -Fvobj -nowarn=62 $(VASM_CPU) -quiet
CFLAGS =-c -S -cpu=$(VBCC_CPU) +$(CFG_FILE)
LDFLAGS = +$(CFG_FILE)
endif
# Define OS-dependent tools ---------------------------------------------------
ifeq ("$(PAD_FLASH_SIZE)","")
# When compiling an image for flash, size to which the image must be padded
PAD_FLASH_SIZE = 524288
endif
ifeq ($(OS),Windows_NT)
export CFLAGS = -cpu=$(VBCC_CPU) +$(CFG_FILE) -I. -I$(CURDIR)/include -I$(CURDIR)
export RM = cmd /C del /Q /F
RM = del /F/Q
PAD_CMD = fsutil seteof $@ $(PAD_FLASH_SIZE)
else
export CFLAGS = -cpu=$(VBCC_CPU) +$(CFG_FILE)_linux -I. -I$(CURDIR)/include -I$(CURDIR)
export RM = rm -f
RM = rm -f
PAD_CMD = truncate -s $(PAD_FLASH_SIZE) $@
endif
cpu_assembly_src := $(wildcard $(cpu)/*.s)
cpu_c_src := $(wildcard $(cpu)/*.c)
cpu_assembly_obj := $(subst .s,.o,$(cpu_assembly_src))
cpu_c_obj := $(subst .c,.o,$(cpu_c_src))
ASFLAGS := $(ASFLAGS) $(DEFINES) $(INCLUDES)
CFLAGS := $(CFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS := $(LDFLAGS) $(LDFLAGS_FOR_UNIT)
dev_base_sources = dev/block.c dev/channel.c dev/console.c dev/fsys.c dev/pata.c dev/ps2.c dev/rtc.c dev/sdc.c dev/txt_screen.c dev/uart.c
# New make file (calypsu/makefile per folder)
SRCS = foenixmcp.c log.c memory.c ring_buffer.c simpleio.c sys_general.c variables.c utilities.c $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.s,%.o,$(patsubst %.c,%.o,$(SRCS)))
OBJS_TO_CLEAN = $(subst /,\\,$(OBJS))
LIBS = dev/devices.a snd/sound.a fatfs/fatfs.a
# Old makefile (VBCC)
cpu_s_src := $(wildcard $(CPU)/*.s)
cpu_c_src := $(wildcard $(CPU)/*.c)
cpu_c_obj := $(subst .c,.o,$(cpu_c_src)) $(subst .s,.o,$(cpu_s_src))
# Device drivers
dev_c_src = block.c channel.c console.c fsys.c pata.c ps2.c rtc.c sdc.c txt_screen.c uart.c
dev_s_src =
ifeq ($(UNIT),a2560k)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/kbd_mo.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
dev_c_src := $(dev_c_src) fdc.c kbd_mo.c lpt.c midi.c txt_a2560k_a.c txt_a2560k_b.c m68040/fdc_m68040.c
dev_s_src := $(dev_s_src)
else ifeq ($(UNIT),genx)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
dev_c_src := $(dev_c_src) fdc.c lpt.c midi.c txt_a2560k_a.c txt_a2560k_b.c #m68040/fdc_m68040.c
else ifeq ($(UNIT),a2560x)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
dev_c_src := $(dev_c_src) fdc.c lpt.c midi.c txt_a2560k_a.c txt_a2560k_b.c #m68040/fdc_m68040.c
else ifeq ($(UNIT),a2560u)
dev_c_src := $(dev_base_sources) dev/txt_a2560u.o
else
dev_c_src := $(dev_base_sources)
dev_c_src := $(dev_c_src) txt_a2560u.o
endif
dev_c_obj := $(subst .c,.o,$(dev_c_src))
dev_obj := $(addprefix dev/, $(subst .c,.o,$(dev_c_src))) $(addprefix dev/, $(subst .s,.o,$(dev_s_src)))
snd_c_src := $(wildcard snd/*.c)
snd_c_obj := $(subst .c,.o,$(snd_c_src))
# Sound drivers
snd_c_src = codec.c psg.c sid.c yamaha.c
ifeq ($(UNIT),C256_FMX)
snd_c_src = $(snd_c_src) codec_c256.c
endif
snd_obj := $(addprefix snd/, $(subst .c,.o,$(snd_c_src)))
# File system
fat_c_src := $(wildcard fatfs/*.c)
fat_c_obj := $(subst .c,.o,$(fat_c_src))
fatfs_obj := $(subst .c,.o,$(fat_c_src))
# Command Line Interface
cli_c_src := $(wildcard cli/*.c)
cli_c_obj := $(subst .c,.o,$(cli_c_src))
cli_obj := $(subst .c,.o,$(cli_c_src))
# Base MCP files
c_src := $(wildcard *.c)
c_obj := $(subst .c,.o,$(c_src))
.PHONY: all $(cpu) dev fatfs snd cli
.PHONY: all clean $(CPU) dev fatfs snd cli
# Target selection ------------------------------------------------------------
ifeq ($(MEMORY),ram)
all: foenixmcp.s68 $(cpu) dev snd cli
# ifeq ($(CPU),"w65816")
#all:foenixmcp.s37
# else
all: foenixmcp.s68 $(CPU) dev snd cli
# endif
else
all: foenixmcp.bin $(cpu) dev snd cli
all: foenixmcp.bin $(CPU) dev snd cli
endif
$(cpu):
$(MAKE) --directory=$@
# Per-folder libraries (used by Calypsi)
foenixmcp.s37: $(OBJS) $(LIBS)
@echo Making $@
$(LD) $(LDFLAGS) -o $@ $^
dev:
$(MAKE) --directory=dev
fatfs:
$(MAKE) --directory=fatfs
DEPS = $(c_obj) $(dev_obj) $(fatfs_obj) $(snd_obj) $(cli_obj) $(cpu_c_obj)
snd:
$(MAKE) --directory=snd
# The startup file is already specified in the linker script, so we should not include it in the list of files to link
STARTUP_OBJ=$(CPU)/startup_$(CPU).o
cli:
$(MAKE) --directory=cli
foenixmcp.s68: $(DEPS)
$(CC) $(LDFLAGS) -o $@ $(subst $(STARTUP_OBJ),,$^)
foenixmcp.s68: $(c_obj) $(cpu) dev fatfs snd cli
$(CC) $(CFLAGS) $(DEFINES) -o foenixmcp.s68 $(c_obj) $(cpu_c_obj) $(dev_c_obj) $(fat_c_obj) $(snd_c_obj) $(cli_c_obj)
foenixmcp.bin: $(DEPS)
@echo Making $@
foenixmcp.bin: $(c_obj) $(cpu) dev fatfs snd cli
$(CC) $(CFLAGS) $(DEFINES) -o foenixmcp.bin $(c_obj) $(cpu_c_obj) $(dev_c_obj) $(fat_c_obj) $(snd_c_obj) $(cli_c_obj)
$(CC) $(LDFLAGS) -o $@ $^
$(PAD_CMD)
%.o: %.c $(DEPS)
$(CC) -S -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONEY: clean
ifeq ($(TOOLCHAIN),calypsi)
# Build the object files from C
%.o: %.c
$(CC) -o $@ $^ $(CFLAGS)
# Build the object files from assembly
%.o: %.s
$(AS) -o $@ $(ASFLAGS) $^
else
%.o: %.c
$(CC) -o $@ $< $(CFLAGS)
%.o: %.s
$(AS) -o $@ $< $(ASFLAGS)
endif
# Clean up after a build
clean:
$(RM) *.s68 *.o *.asm
$(MAKE) --directory=$(cpu) clean
$(RM) $(OBJS_TO_CLEAN) foenixmcp.s37 *.lst *.map
$(MAKE) --directory=$(CPU) clean
$(MAKE) --directory=cli clean
$(MAKE) --directory=dev clean
$(MAKE) --directory=fatfs clean
$(MAKE) --directory=snd clean
$(MAKE) --directory=cli clean

76
src/Makefile.PeterC256 Normal file
View file

@ -0,0 +1,76 @@
UNIT := C256U_PLUS
MEMORY := RAM
# Define OS-dependent variables
ifeq ($(OS),Windows_NT)
RM = del /F/Q
else
RM = rm -f
endif
# Define model-specific variables, including tools, source files, compiler flags, etc.
ifeq ($(UNIT),C256U)
CPU=w65816
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=1 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_u.scm clib-lc-ld.a
else ifeq ($(UNIT),C256U_PLUS)
CPU=w65816
SRCS_FOR_UNIT=C256/jumptable.s C256/syscalls.s C256/syscalls_c256.c C256/io_stubs.c
CFLAGS_FOR_UNIT=-DMODEL=5 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_fmx.scm clib-lc-ld.a --rtattr printf=medium
else ifeq ($(UNIT),C256_FMX)
CPU=w65816
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=0 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_fmx.scm clib-lc-ld.a
endif
ifeq ($(CPU),w65816)
CC=cc65816
AS=as65816
LD=ln65816
AR=nlib
endif
INCLUDES=-I. -I./include
CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l
ASFLAGS=$(INCLUDES)
LDFLAGS=--target foenix --output-format s37 $(LDFLAGS_FOR_UNIT) --list-file foenixmcp.map
SRCS = foenixmcp.c log.c memory.c ring_buffer.c simpleio.c sys_general.c variables.c utilities.c $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.s,%.o,$(patsubst %.c,%.o,$(SRCS)))
OBJS4RM = $(subst /,\\,$(OBJS))
LIBS = dev/devices.a snd/sound.a fatfs/fatfs.a
.PHONY: clean
foenixmcp.s37: $(OBJS) $(LIBS)
$(LD) $(LDFLAGS) -o $@ $^
dev/devices.a:
$(MAKE) --directory=dev
snd/sound.a:
$(MAKE) --directory=snd
fatfs/fatfs.a:
$(MAKE) --directory=fatfs
# Build the object files from C
%.o: %.c
$(CC) $(CFLAGS) -o $@ $^
# Build the object files from assembly
%.o: %.s
$(AS) $(ASFLAGS) -o $@ $^
# Clean up after a build
clean:
$(RM) $(OBJS4RM) foenixmcp.s37 *.lst *.map
$(MAKE) --directory=dev clean
$(MAKE) --directory=snd clean
$(MAKE) --directory=fatfs clean

176
src/Makefile_old Normal file
View file

@ -0,0 +1,176 @@
#
# User may over-ride the UNIT and MEMORY parameters to specify target machine
# and where the MCP will run (ram or flash)
#
UNIT := a2560x
MEMORY := flash
# CPU_WDC65816 0x16 /* CPU code for the Western Design Center 65816 */
# CPU_M68000 0x20 /* CPU code for the Motorola 68000 */
# CPU_M68010 0x21 /* CPU code for the Motorola 68010 */
# CPU_M68020 0x22 /* CPU code for the Motorola 68020 */
# CPU_M68030 0x23 /* CPU code for the Motorola 68030 */
# CPU_M68040 0x24 /* CPU code for the Motorola 68040 */
# CPU_I486DX 0x34 /* CPU code for the Intel 486DX */
# MODEL_FOENIX_FMX 0
# MODEL_FOENIX_C256U 1
# MODEL_FOENIX_GENX 4
# MODEL_FOENIX_C256U_PLUS 5
# MODEL_FOENIX_A2560U_PLUS 6
# MODEL_FOENIX_A2560X 8
# MODEL_FOENIX_A2560U 9
# MODEL_FOENIX_A2560K 11
# Determine target CPU and MODEL based on the UNIT
# The comments are on a separate line to avoid inserting white space in the commande line where these variables are used
ifeq ($(UNIT),a2560k)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# A2560K
export MODEL_NUMBER = 11
export cpu = m68040
else ifeq ($(UNIT),genx)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# GenX
export MODEL_NUMBER = 4
export cpu = m68040
else ifeq ($(UNIT),a2560x)
# M68040V
export CPU_NUMBER = 6
# VASM CPU flag
export VASM_CPU = -m68040
# VBCC CPU flag
export VBCC_CPU = 68040
# A2560X
export MODEL_NUMBER = 8
export cpu = m68040
else ifeq ($(UNIT),a2560u)
# M680SEC00
export CPU_NUMBER = 0
# VASM CPU flag
export VASM_CPU = -m68000
# VBCC CPU flag
export VBCC_CPU = 68000
export MODEL_NUMBER = 9
export cpu = m68k
endif
# Determine the correct configuration file (barring OS)
ifeq ($(MEMORY),ram)
export CFG_FILE = $(VBCC)/config/$(UNIT)_ram
else
export CFG_FILE = $(VBCC)/config/$(UNIT)_flash
endif
export AS = vasmm68k_mot
export ASFLAGS = $(VASM_CPU) -quiet -Fvobj -nowarn=62 -DMODEL=$(MODEL_NUMBER)
export CC = vc
DEFINES = -DCPU=$(CPU_NUMBER) -DMODEL=$(MODEL_NUMBER) # -DKBD_POLLED
# Logging level
ifeq ("$(DEFAULT_LOG_LEVEL)","")
else
DEFINES := $(DEFINES) -DDEFAULT_LOG_LEVEL=$(DEFAULT_LOG_LEVEL)
endif
export DEFINES:=$(DEFINES)
# When compiling an image for flash, size to which the image must be padded
PAD_FLASH_SIZE=524288
ifeq ($(OS),Windows_NT)
export CFLAGS = -cpu=$(VBCC_CPU) +$(CFG_FILE) -I. -I$(CURDIR)/include -I$(CURDIR)
export RM = cmd /C del /Q /F
PAD_CMD = fsutil seteof $@ $(PAD_FLASH_SIZE)
else
export CFLAGS = -cpu=$(VBCC_CPU) +$(CFG_FILE)_linux -I. -I$(CURDIR)/include -I$(CURDIR)
export RM = rm -f
PAD_CMD = truncate -s $(PAD_FLASH_SIZE) $@
endif
cpu_assembly_src := $(wildcard $(cpu)/*.s)
cpu_c_src := $(wildcard $(cpu)/*.c)
cpu_assembly_obj := $(subst .s,.o,$(cpu_assembly_src))
cpu_c_obj := $(subst .c,.o,$(cpu_c_src))
dev_base_sources = dev/block.c dev/channel.c dev/console.c dev/fsys.c dev/pata.c dev/ps2.c dev/rtc.c dev/sdc.c dev/txt_screen.c dev/uart.c
ifeq ($(UNIT),a2560k)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/kbd_mo.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
else ifeq ($(UNIT),genx)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
else ifeq ($(UNIT),a2560x)
dev_c_src := $(dev_base_sources) dev/fdc.c dev/lpt.c dev/midi.c dev/txt_a2560k_a.o dev/txt_a2560k_b.o m68040/fdc_m68040.o
else ifeq ($(UNIT),a2560u)
dev_c_src := $(dev_base_sources) dev/txt_a2560u.o
else
dev_c_src := $(dev_base_sources)
endif
dev_c_obj := $(subst .c,.o,$(dev_c_src))
snd_c_src := $(wildcard snd/*.c)
snd_c_obj := $(subst .c,.o,$(snd_c_src))
fat_c_src := $(wildcard fatfs/*.c)
fat_c_obj := $(subst .c,.o,$(fat_c_src))
cli_c_src := $(wildcard cli/*.c)
cli_c_obj := $(subst .c,.o,$(cli_c_src))
c_src := $(wildcard *.c)
c_obj := $(subst .c,.o,$(c_src))
.PHONY: all $(cpu) dev fatfs snd cli
ifeq ($(MEMORY),ram)
all: foenixmcp.s68 $(cpu) dev snd cli
else
all: foenixmcp.bin $(cpu) dev snd cli
endif
$(cpu):
$(MAKE) --directory=$@
dev:
$(MAKE) --directory=dev
fatfs:
$(MAKE) --directory=fatfs
snd:
$(MAKE) --directory=snd
cli:
$(MAKE) --directory=cli
foenixmcp.s68: $(c_obj) $(cpu) dev fatfs snd cli
$(CC) $(CFLAGS) $(DEFINES) -o foenixmcp.s68 $(c_obj) $(cpu_c_obj) $(dev_c_obj) $(fat_c_obj) $(snd_c_obj) $(cli_c_obj)
foenixmcp.bin: $(c_obj) $(cpu) dev fatfs snd cli
$(CC) $(CFLAGS) $(DEFINES) -o foenixmcp.bin $(c_obj) $(cpu_c_obj) $(dev_c_obj) $(fat_c_obj) $(snd_c_obj) $(cli_c_obj)
$(PAD_CMD)
%.o: %.c $(DEPS)
$(CC) -S -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONEY: clean
clean:
$(RM) *.s68 *.o *.asm
$(MAKE) --directory=$(cpu) clean
$(MAKE) --directory=dev clean
$(MAKE) --directory=fatfs clean
$(MAKE) --directory=snd clean
$(MAKE) --directory=cli clean

View file

@ -33,6 +33,8 @@
#include "rsrc/bitmaps/splash_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560X || MODEL == MODEL_FOENIX_GENX
#include "rsrc/bitmaps/splash_a2560x.h"
#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
#include "rsrc/bitmaps/image.h"
#endif
#if MODEL == MODEL_FOENIX_A2560K

View file

@ -1,13 +1,59 @@
csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources))
.PHONY: all
all: $(cobjects)
UNIT := C256U_PLUS
# Define OS-dependent variables
ifeq ($(OS),Windows_NT)
RM = del /F/Q
else
RM = rm -f
endif
# Define model-specific variables, including tools, source files, compiler flags, etc.
ifeq ($(UNIT),C256U)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=1 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256U_PLUS)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=5 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256_FMX)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=0 -DCPU=255 --target Foenix --code-model large --data-model large
endif
INCLUDES=-I.. -I../include
CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l
ASFLAGS=$(INCLUDES)
SRCS = cli.c dos_cmds.c dos_copy.c mem_cmds.c settings.c sound_cmds.c test_cmd2.c $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.c,%.o,$(SRCS))
OBJS4RM = $(subst /,\\,$(OBJS))
.PHONY: all clean
all: cli.a
# Build the CLI library file for this model
cli.a: $(OBJS)
$(AR) $@ $^
# Build the object files from C
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONY: clean
$(CC) $(CFLAGS) -o $@ $^
# Clean up after a build
clean:
$(RM) $(aobjects) $(cobjects) *.asm
$(RM) $(OBJS4RM) cli.a *.lst

View file

@ -1,15 +1,59 @@
csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources))
cobjects = $(subst .c,.o,$(csources))
UNIT := C256U_PLUS
.PHONY: all
all: $(cobjects)
# Define OS-dependent variables
ifeq ($(OS),Windows_NT)
RM = del /F/Q
else
RM = rm -f
endif
# Define model-specific variables, including tools, source files, compiler flags, etc.
ifeq ($(UNIT),C256U)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=txt_c256.c txt_evid.c indicators_c256.c interrupts_c256.c timers_c256.c
CFLAGS_FOR_UNIT=-DMODEL=1 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256U_PLUS)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=txt_c256.c txt_evid.c indicators_c256.c interrupts_c256.c timers_c256.c
CFLAGS_FOR_UNIT=-DMODEL=5 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256_FMX)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=txt_c256.c txt_evid.c indicators_c256.c interrupts_c256.c timers_c256.c
CFLAGS_FOR_UNIT=-DMODEL=0 -DCPU=255 --target Foenix --code-model large --data-model large
endif
INCLUDES=-I.. -I../include
CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l
ASFLAGS=$(INCLUDES)
SRCS = bitmap.c block.c channel.c console.c dma.c fsys.c pata.c ps2.c sdc.c rtc.c txt_screen.c $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.c,%.o,$(SRCS))
OBJS4RM = $(subst /,\\,$(OBJS))
.PHONY: all clean
all: devices.a
# Build the devices library file for this model
devices.a: $(OBJS)
$(AR) $@ $^
# Build the object files from C
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONY: clean
$(CC) $(CFLAGS) -o $@ $^
# Clean up after a build
clean:
$(RM) *.o *.asm
$(RM) $(OBJS4RM) devices.a *.lst

152
src/dev/bitmap.c Normal file
View file

@ -0,0 +1,152 @@
/**
* @file bitmap.c
* @author Peter Weingartner (pjw@tailrecursive.org)
* @brief Simple bitmap management code
* @version 0.1
* @date 2023-10-02
*
*/
#include <stdint.h>
#include "bitmap.h"
#include "dma.h"
#include "vicky_general.h"
#define NUM_BITMAP_PLANES 2
static uint8_t bm_visible = 0; // Track whether a given bitmap plane is visible
/**
* @brief Set the visibility of a given bitmap plane, and the CLUT to use
*
* @param plane the number of the bitmap to update
* @param clut the number of the CLUT to use for the bitmap
* @param is_visible 0 to hide the bitmap, any other number to show it
*/
void bm_set_visibility(short plane, short clut, short is_visible) {
uint8_t new_control_value = (clut & 0x03) << 1 | (is_visible) ? 1 : 0;
switch(plane) {
case 0:
*bm0_control = new_control_value;
if (is_visible) {
bm_visible |= 0x01;
} else {
bm_visible &= ~0x01;
}
break;
case 1:
*bm1_control = new_control_value;
if (is_visible) {
bm_visible |= 0x02;
} else {
bm_visible &= ~0x02;
}
break;
default:
break;
}
if (bm_visible) {
tvky_mstr_ctrl->raw = tvky_mstr_ctrl->raw | VKY_MCR_TEXT_OVERLAY | VKY_MCR_GRAPHICS | VKY_MCR_BITMAP;
} else {
tvky_mstr_ctrl->raw = tvky_mstr_ctrl->raw & ~(VKY_MCR_TEXT_OVERLAY | VKY_MCR_GRAPHICS | VKY_MCR_BITMAP);
}
}
/**
* @brief Set the
*
* @param plane the number of the bitmap to set
* @param src the address of the bitmap data to use (should be in video RAM)
*/
void bm_set_data(short plane, uint8_t * src) {
uint32_t src_raw = (uint32_t)src - (uint32_t)vram_base;
switch (plane) {
case 0:
bm0_address[0] = (uint8_t)(src_raw & 0xff);
bm0_address[1] = (uint8_t)((src_raw >> 8) & 0xff);
bm0_address[2] = (uint8_t)((src_raw >> 16) & 0xff);
break;
case 1:
bm1_address[0] = (uint8_t)(src_raw & 0xff);
bm1_address[1] = (uint8_t)((src_raw >> 8) & 0xff);
bm1_address[2] = (uint8_t)((src_raw >> 16) & 0xff);
break;
default:
break;
}
}
/**
* @brief Fill the bitmap data with a given color
*
* @param dest the area of video RAM to fill
* @param color the color index to fill it with
* @param width the width of the image in pixels
* @param height the height of the image in pixels
*/
void bm_fill(uint8_t * dest, uint8_t color, int width, int height) {
vdma_fill_linear(dest, color, (long)width * (long)height);
}
/**
* @brief Load the color lookup table
*
* @param clut number of the CLUT to load
* @param src pointer to the source data for the CLUT (in B, G, R, A order)
*/
void bm_load_clut(short clut, uint8_t * src) {
uint8_t * base = (uint8_t *)((uint32_t)VKY_GR_CLUT_0 + 4l * 256l * (uint32_t)clut);
tvky_bg_color->blue = src[0];
tvky_bg_color->green = src[1];
tvky_bg_color->red = src[2];
for (int i = 0; i < 4 * 256; i++) {
base[i] = src[i];
}
}
/**
* @brief Load RLE bitmap data into video RAM
*
* @param dest address to load with the expanded bitmap data (should be in video RAM)
* @param src address of the RLE data to expand
* @param width the width of the image in pixels
* @param height the height of the image in pixels
*/
void bm_load_rle(uint8_t * dest, uint8_t * src, int width, int height) {
uint32_t my_base = (uint32_t)dest;
// Clear the image map
bm_fill(dest, 0, width, height);
uint8_t count = *(src++);
while (count != 0) {
uint8_t value = *(src++);
if (value != 0) {
volatile uint8_t * my_pointer = (uint8_t *)my_base;
for (int i = 0; i < count; i++) {
my_pointer[i] = value;
}
}
my_base += count;
count = *(src++);
}
}
/**
* @brief Initialize the bitmap system
*
*/
void bm_init() {
bm_visible = 0;
}

62
src/dev/bitmap.h Normal file
View file

@ -0,0 +1,62 @@
/**
* @brief Definitions for functions to manage bitmap displays
*
*/
#ifndef __BITMAP_H__
#define __BITMAP_H__
#include <stdint.h>
/**
* @brief Set the visibility of a given bitmap plane, and the CLUT to use
*
* @param plane the number of the bitmap to update
* @param clut the number of the CLUT to use for the bitmap
* @param is_visible 0 to hide the bitmap, any other number to show it
*/
extern void bm_set_visibility(short plane, short clut, short is_visible);
/**
* @brief Set the
*
* @param plane the number of the bitmap to set
* @param src the address of the bitmap data to use (should be in video RAM)
*/
extern void bm_set_data(short plane, uint8_t * src);
/**
* @brief Fill the bitmap data with a given color
*
* @param dest the area of video RAM to fill
* @param color the color index to fill it with
* @param width the width of the image in pixels
* @param height the height of the image in pixels
*/
extern void bm_fill(uint8_t * dest, uint8_t color, int width, int height);
/**
* @brief Load the color lookup table
*
* @param clut number of the CLUT to load
* @param src pointer to the source data for the CLUT (in B, G, R, A order)
*/
extern void bm_load_clut(short clut, uint8_t * src);
/**
* @brief Load RLE bitmap data into video RAM
*
* @param dest address to load with the expanded bitmap data (should be in video RAM)
* @param src address of the RLE data to expand
* @param width the width of the image in pixels
* @param height the height of the image in pixels
*/
extern void bm_load_rle(uint8_t * dest, uint8_t * src, int width, int height);
/**
* @brief Initialize the bitmap system
*
*/
extern void bm_init();
#endif

View file

@ -94,10 +94,13 @@ extern short cdev_register(p_dev_chan device);
/*
* Get a free channel
*
* Inputs:
* the device to associate with the channel
*
* Returns:
* A pointer to the free channel, 0 if none are available.
*/
extern p_channel chan_alloc();
extern p_channel chan_alloc(short dev);
/*
* Return a channel to the pool of unused channels

71
src/dev/dma.c Normal file
View file

@ -0,0 +1,71 @@
#include <stdint.h>
#include "dma.h"
#include "dma_reg.h"
#include "vicky_general.h"
/**
* @brief Check if an address is in the range of video RAM
*
* @param address the address to check
* @return short 0 if it is not in video RAM, 1 if it is in video RAM
*/
short is_vram(uint8_t * address) {
if ((uint32_t)address >= (uint32_t)vram_base) {
return 1;
} else {
return 0;
}
}
/**
* @brief Wait while the VDMA engine is busy
*
*/
void vdma_wait() {
while ((*VDMA_STAT & VDMA_STAT_TFR_BUSY) != 0) ;
}
/**
* @brief Fill video memory using a linear VDMA operation
*
* @param dest the address of memory to fill (must be in video RAM)
* @param value the value to put into memory
* @param count the number of bytes to fill
*/
void vdma_fill_linear(uint8_t * dest, uint8_t value, long count) {
if (is_vram(dest)) {
// We'll just ignore non-vram addresses
// Make sure any previous transfer is complete
vdma_wait();
*VDMA_CTRL = 0;
// Set us up for a 1D fill
*VDMA_CTRL = VDMA_CTRL_EN | VDMA_CTRL_FILL;
// Set the fill value
*VDMA_FILL_VALUE = value;
// Set the destination address
uint32_t dest_vram_address = (uint32_t)dest - (uint32_t)vram_base;
VDMA_DST_ADDR[0] = (uint8_t)(dest_vram_address & 0xff);
VDMA_DST_ADDR[1] = (uint8_t)((dest_vram_address >> 8) & 0xff);
VDMA_DST_ADDR[2] = (uint8_t)((dest_vram_address >> 16) & 0xff);
// Set the count
VDMA_SIZE[0] = (uint8_t)(count & 0xff);
VDMA_SIZE[1] = (uint8_t)((count >> 8) & 0xff);
VDMA_SIZE[2] = (uint8_t)((count >> 16) & 0xff);
// Start the transfer
*VDMA_CTRL = VDMA_CTRL_EN | VDMA_CTRL_FILL | VDMA_CTRL_TRF;
// Wait for completion
vdma_wait();
// Turn off the VDMA engine
*VDMA_CTRL = 0;
}
}

20
src/dev/dma.h Normal file
View file

@ -0,0 +1,20 @@
/**
* @brief Definitions for functions to manage DMA transfers
*
*/
#ifndef __DMA_H__
#define __DMA_H__
#include <stdint.h>
/**
* @brief Fill video memory using a linear VDMA operation
*
* @param dest the address of memory to fill (must be in video RAM)
* @param value the value to put into memory
* @param count the number of bytes to fill
*/
extern void vdma_fill_linear(uint8_t * dest, uint8_t value, long count);
#endif

62
src/dev/indicators_c256.c Normal file
View file

@ -0,0 +1,62 @@
/**
* @file indicators_c256.c
* @brief Indicator control logic for the C256 line
* @version 0.1
* @date 2023-08-30
*
* Indicators on the C256 include the SD card LED and the power LED. They can be on or off.
* An error state will equate to being off. This code also sets the two status LEDs to their
* default blinking state.
*
*/
#include "indicators.h"
#include "gabe_reg.h"
/*
* 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) {
uint8_t bit = 0;
// Figure out which bit to manipulate
switch (ind_number) {
case IND_POWER:
bit = GABE_CTRL_PWR_LED;
break;
case IND_SDC:
bit = GABE_CTRL_SDC_LED;
break;
default:
// Any other indicator is ignored
return;
}
if (state == IND_ON) {
// Flip the bit on
*GABE_CTRL_REG |= bit;
} else {
// Flip the bit off
*GABE_CTRL_REG &= ~bit;
}
}
/*
* Initialize the indicators
*
* Generally, this means the indicators will all be turned off
*/
void ind_init() {
*GABE_CTRL_REG = 0;
*GABE_LED_FLASH_CTRL = 0x03;
ind_set(IND_POWER, IND_ON);
ind_set(IND_SDC, IND_OFF);
}

597
src/dev/interrupts_c256.c Normal file
View file

@ -0,0 +1,597 @@
/*
* Definitions for the interrupt controls for the C256 machines
*/
#include <calypsi/intrinsics65816.h>
#include <string.h>
#include "features.h"
#include "interrupt.h"
#include "log.h"
// FoenixMCP interrupt number -> C256 group and mask:
// INT_SOF_A 0x00 --> 0x00, 0x01 (Main screen start-of-frame)
// INT_SOL_A 0x01 --> 0x00, 0x02 (Main screen start-of-line)
// INT_VICKY_A_1 0x02 --> 0x01, 0x02 (Sprite Collision)
// INT_VICKY_A_2 0x03 --> 0x01, 0x04 (Bitmap Collision)
// INT_VICKY_A_3 0x04 --> 0x02, 0x08 (VDMA Interrupt)
// INT_VICKY_A_4 0x05 --> 0x02, 0x10 (Tile Collision)
// INT_RESERVED_1 0x06 --> 0x02, 0x40 (External Expansion)
// INT_VICKY_A_DAC 0x07
// INT_SOF_B 0x08
// INT_SOL_B 0x09
// INT_VICKY_B_1 0x0A
// INT_VICKY_B_2 0x0B
// INT_VICKY_B_3 0x0C
// INT_VICKY_B_4 0x0D
// INT_RESERVED_2 0x0E
// INT_VICKY_B_DAC 0x0F
// INT_KBD_PS2 0x10 --> 0x01, 0x01 (PS/2 Keyboard)
// INT_KBD_A2560K 0x11
// INT_MOUSE 0x12 --> 0x00, 0x80 (PS/2 Mouse)
// INT_COM1 0x13 --> 0x01, 0x10 (Serial port 1)
// INT_COM2 0x14 --> 0x01, 0x08 (Serial port 2)
// INT_LPT1 0x15 --> 0x01, 0x40 (LPT)
// INT_FDC 0x16 --> 0x00, 0x40 (Floppy drive)
// INT_MIDI 0x17 --> 0x01, 0x20 (MIDI)
// INT_TIMER0 0x18 --> 0x00, 0x04 (Timer 0)
// INT_TIMER1 0x19 --> 0x00, 0x08 (Timer 1)
// INT_TIMER2 0x1A --> 0x00, 0x10 (Timer 2)
// INT_TIMER3 0x1B
// INT_TIMER4 0x1C
// INT_RESERVED_3 0x1D
// INT_RESERVED_4 0x1E
// INT_RTC 0x1F --> 0x00, 0x20 (Real time clock)
// INT_PATA 0x20 --> 0x03, 0x04 (IDE)
// INT_SDC_INS 0x21 --> 0x02, 0x80 (SDC inserted)
// INT_SDC 0x22 --> 0x01, 0x80 (SDC)
// INT_OPM_INT 0x23 --> 0x03, 0x02 (OPM)
// INT_OPN2_EXT 0x24 --> 0x03, 0x01 (OPN)
// INT_OPL3_EXT 0x25 --> 0x02, 0x01 (OPL3)
// INT_RESERVED_5 0x26
// INT_RESERVED_6 0x27
// INT_BEATRIX_0 0x28
// INT_BEATRIX_1 0x29
// INT_BEATRIX_2 0x2A
// INT_BEATRIX_3 0x2B
// INT_RESERVED_7 0x2C
// INT_DAC1_PB 0x2D /* DAC1 Playback Done (48K) */
// INT_RESERVED_8 0x2E /* Reserved */
// INT_DAC0_PB 0x2F /* DAC0 Playback Done (44.1K) */
//
// Interrupt Handler Vectors
//
p_int_handler int_handle_00;
p_int_handler int_handle_01;
p_int_handler int_handle_02;
p_int_handler int_handle_03;
p_int_handler int_handle_04;
p_int_handler int_handle_05;
p_int_handler int_handle_06;
p_int_handler int_handle_07;
p_int_handler int_handle_10;
p_int_handler int_handle_11;
p_int_handler int_handle_12;
p_int_handler int_handle_13;
p_int_handler int_handle_14;
p_int_handler int_handle_15;
p_int_handler int_handle_16;
p_int_handler int_handle_17;
p_int_handler int_handle_20;
p_int_handler int_handle_21;
p_int_handler int_handle_22;
p_int_handler int_handle_23;
p_int_handler int_handle_24;
p_int_handler int_handle_25;
p_int_handler int_handle_26;
p_int_handler int_handle_27;
p_int_handler int_handle_30;
p_int_handler int_handle_31;
p_int_handler int_handle_32;
p_int_handler int_handle_33;
p_int_handler int_handle_34;
p_int_handler int_handle_35;
p_int_handler int_handle_36;
p_int_handler int_handle_37;
/**
* @brief Mapping of FoenixMCP interrupt numbers to C256 GABE group numbers (0xff indicates an unassigned interrupt number)
*
*/
static unsigned short g_int_group[] = {
0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x01, 0xff, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
0x03, 0x02, 0x01, 0x03, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
/**
* @brief Mapping of FoenixMCP interrupt numbers to C256 GABE mask numbers (0xff indicates an unassigned interrupt number)
*
*/
static unsigned short g_int_mask[] = {
0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x01, 0xff, 0x80, 0x10, 0x08, 0x40, 0x40, 0x20, 0x04, 0x08, 0x10, 0xff, 0xff, 0xff, 0xff, 0x20,
0x04, 0x80, 0x80, 0x02, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
/*
* Return the group number for the interrupt number
*/
unsigned short int_group(unsigned short n) {
return g_int_group[n];
}
/*
* Return the mask bit for the interrupt number
*/
unsigned short int_mask(unsigned short n) {
return g_int_mask[n];
}
/*
* Initialize the interrupt registers
*/
void int_init() {
int i;
p_int_handler * int_handlers = &int_handle_00;
// Clear all the interrupt handlers
for (i = 0; i < 4 * 8; i++) {
int_handlers[i] = 0;
}
// At Reset, all of those already have those values
// the Pol are @ 0x0000 and normally pending are reseted, but it is not impossible that some might be triggered during init
*EDGE_GRP0 = 0xFF;
*EDGE_GRP1 = 0xFF;
*EDGE_GRP2 = 0xFF;
*EDGE_GRP3 = 0xFF;
*MASK_GRP0 = 0xFF;
*MASK_GRP1 = 0xFF;
*MASK_GRP2 = 0xFF;
*MASK_GRP3 = 0xFF;
// Clear all the pending flags
*PENDING_GRP0 = 0xFF;
*PENDING_GRP1 = 0xFF;
*PENDING_GRP2 = 0xFF;
*PENDING_GRP3 = 0xFF;
}
/*
* Enable all interrupts
*
* Returns:
* a machine dependent representation of the interrupt masking prior to enabling
*/
short int_enable_all() {
// NOTE: this code uses Calypsi specific intrinsic functions
// and does a cast that may not be valid
short status = (short)__get_interrupt_state();
__enable_interrupts();
return status;
}
/*
* Disable all interrupts
*
* Returns:
* a machine dependent representation of the interrupt masking prior to disabling
*/
short int_disable_all() {
// NOTE: this code uses Calypsi specific intrinsic functions
// and does a cast that may not be valid
short status = (short)__get_interrupt_state();
__disable_interrupts();
return status;
}
/*
* Disable an interrupt by masking it
*
* Interrupt number is made by the group number and number within the group.
* For instance, the RTC interrupt would be 0x1F and the Channel A SOF interrupt would be 0x00.
*
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*/
void int_disable(unsigned short n) {
/* Find the group (the relevant interrupt mask register) for the interrupt */
unsigned short group = int_group(n);
/* Find the mask for the interrupt */
unsigned short mask = int_mask(n);
if ((group != 0xff) && (mask != 0xff)) {
// Only set the mask if the mask and group numbers are valid
uint8_t new_mask = MASK_GRP0[group] | mask;
/* Set the mask bit for the interrupt in the correct MASK register */
MASK_GRP0[group] = new_mask;
}
}
/*
* Enable an interrupt
*
* Interrupt number is made by the group number and number within the group.
* For instance, the RTC interrupt would be 0x1F and the Channel A SOF interrupt would be 0x00.
* And interrupt number of 0xFF specifies that all interrupts should be disabled.
*
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*/
void int_enable(unsigned short n) {
/* Find the group (the relevant interrupt mask register) for the interrupt */
unsigned short group = int_group(n);
/* Find the mask for the interrupt */
unsigned short mask = int_mask(n);
printf("Enable interrupt %d => group: %d, mask: %d\n", n, group, mask);
if ((group != 0xff) && (mask != 0xff)) {
// Only set the mask if the mask and group numbers are valid
uint8_t new_mask = MASK_GRP0[group] & ~mask;
/* Clear the mask bit for the interrupt in the correct MASK register */
MASK_GRP0[group] = new_mask;
}
}
/**
* @brief Convert group and mask to an index into a "array" of interrupt handler pointers
*
* @param group the number of the interrupt's group
* @param mask the interupt's mask bit
* @return int the offset to the handler (-1 on error)
*/
static int int_group_mask_to_offset(unsigned short group, unsigned short mask) {
if ((group != 0xff) && (mask != 0xff)) {
unsigned short position = 0;
switch (mask) {
case 0x01:
position = 0;
break;
case 0x02:
position = 1;
break;
case 0x04:
position = 2;
break;
case 0x08:
position = 3;
break;
case 0x10:
position = 4;
break;
case 0x20:
position = 5;
break;
case 0x40:
position = 6;
break;
case 0x80:
position = 7;
break;
default:
break;
}
return group * 8 + position;
} else {
return -1;
}
}
/*
* Register a handler for a given interrupt.
*
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
* handler = pointer to the interrupt handler to register
*
* Returns:
* the pointer to the previous interrupt handler
*/
p_int_handler int_register(unsigned short n, p_int_handler handler) {
p_int_handler * handler_ref = 0;
p_int_handler old_handler = 0;
/* Find the group (the relevant interrupt mask register) for the interrupt */
unsigned short group = int_group(n);
/* Find the mask for the interrupt */
unsigned short mask = int_mask(n);
switch(group) {
case 0:
switch(mask) {
case 1:
handler_ref = &int_handle_00;
break;
case 2:
handler_ref = &int_handle_01;
break;
case 4:
handler_ref = &int_handle_02;
break;
case 8:
handler_ref = &int_handle_03;
break;
case 16:
handler_ref = &int_handle_04;
break;
case 32:
handler_ref = &int_handle_05;
break;
case 64:
handler_ref = &int_handle_06;
break;
case 128:
handler_ref = &int_handle_07;
break;
default:
return 0;
}
break;
case 1:
switch(mask) {
case 1:
handler_ref = &int_handle_10;
break;
case 2:
handler_ref = &int_handle_11;
break;
case 4:
handler_ref = &int_handle_12;
break;
case 8:
handler_ref = &int_handle_13;
break;
case 16:
handler_ref = &int_handle_14;
break;
case 32:
handler_ref = &int_handle_15;
break;
case 64:
handler_ref = &int_handle_16;
break;
case 128:
handler_ref = &int_handle_17;
break;
default:
return 0;
}
break;
case 2:
switch(mask) {
case 1:
handler_ref = &int_handle_20;
break;
case 2:
handler_ref = &int_handle_21;
break;
case 4:
handler_ref = &int_handle_22;
break;
case 8:
handler_ref = &int_handle_23;
break;
case 16:
handler_ref = &int_handle_24;
break;
case 32:
handler_ref = &int_handle_25;
break;
case 64:
handler_ref = &int_handle_26;
break;
case 128:
handler_ref = &int_handle_27;
break;
default:
return 0;
}
break;
case 3:
switch(mask) {
case 1:
handler_ref = &int_handle_30;
break;
case 2:
handler_ref = &int_handle_31;
break;
case 4:
handler_ref = &int_handle_32;
break;
case 8:
handler_ref = &int_handle_33;
break;
case 16:
handler_ref = &int_handle_34;
break;
case 32:
handler_ref = &int_handle_35;
break;
case 64:
handler_ref = &int_handle_36;
break;
case 128:
handler_ref = &int_handle_37;
break;
default:
return 0;
}
break;
default:
return 0;
}
old_handler = *handler_ref;
*handler_ref = handler;
return old_handler;
}
/*
* Return true (non-zero) if an interrupt is pending for the given interrupt
*
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*
* Returns:
* non-zero if interrupt n is pending, 0 if not
*/
short int_pending(unsigned short n) {
/* Find the group (the relevant interrupt mask register) for the interrupt */
unsigned short group = int_group(n);
/* Find the mask for the interrupt */
unsigned short mask = int_mask(n);
if ((group != 0xff) && (mask != 0xff)) {
// Only query the pending mask if the mask and group numbers are valid
return (PENDING_GRP0[group] & mask);
} else {
// If the mask or group number are invalid, just return false
return 0;
}
}
/*
* Acknowledge an interrupt (clear out its pending flag)
*
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*/
void int_clear(unsigned short n) {
/* Find the group (the relevant interrupt mask register) for the interrupt */
unsigned short group = int_group(n);
/* Find the mask for the interrupt */
unsigned short mask = int_mask(n);
if ((group != 0xff) && (mask != 0xff)) {
// Only set the mask if the mask and group numbers are valid
uint8_t new_mask = PENDING_GRP0[group] | mask;
/* Set the bit for the interrupt to mark it as cleared */
PENDING_GRP0[group] = new_mask;
}
}
/**
* @brief Handle incomming IRQ signal
*
* NOTE: this routine might not be fast enough in C and have to be replaced by hand written
* assembly code... but we will try it this way first.
*/
__attribute__((interrupt(0xffee))) void int_handle_irq() {
uint8_t mask_bits = 0;
// Process any pending interrupts in group 0
mask_bits = *PENDING_GRP0;
if (mask_bits) {
if ((mask_bits & 0x01) && int_handle_00) int_handle_00(); // Start of frame
if ((mask_bits & 0x02) && int_handle_01) int_handle_01(); // Start of line
if ((mask_bits & 0x04) && int_handle_02) int_handle_02(); // Timer 0
if ((mask_bits & 0x08) && int_handle_03) int_handle_03(); // Timer 1
if ((mask_bits & 0x10) && int_handle_04) int_handle_04(); // Timer 2
if ((mask_bits & 0x20) && int_handle_05) int_handle_05(); // Realtime Clock
if ((mask_bits & 0x40) && int_handle_06) int_handle_06(); // Floppy Disk Controller
if ((mask_bits & 0x80) && int_handle_07) int_handle_07(); // PS/2 Mouse
// Clear the pending bits for group 0
*PENDING_GRP0 = mask_bits;
}
// Process any pending interrupts in group 1
mask_bits = *PENDING_GRP1;
if (mask_bits) {
volatile __attribute__((far)) char * text = (char *)0xafa000;
*text = *text + 1;
if ((mask_bits & 0x01) && int_handle_10) {
volatile __attribute__((far)) char * text = (char *)0xafa001;
*text = *text + 1;
int_handle_10(); // PS/2 Keyboard
}
if ((mask_bits & 0x02) && int_handle_11) int_handle_11(); // VICKY II Sprite Collision
if ((mask_bits & 0x04) && int_handle_12) int_handle_12(); // VICKY II Bitmap Collision
if ((mask_bits & 0x08) && int_handle_13) int_handle_13(); // Serial Port #2
if ((mask_bits & 0x10) && int_handle_14) int_handle_14(); // Serial Port #1
if ((mask_bits & 0x20) && int_handle_15) int_handle_15(); // MIDI Controller
if ((mask_bits & 0x40) && int_handle_16) int_handle_16(); // Parallel Port
if ((mask_bits & 0x80) && int_handle_17) int_handle_17(); // SD Controller
// Clear the pending bits for group 1
*PENDING_GRP1 = mask_bits;
}
// Process any pending interrupts in group 2
mask_bits = *PENDING_GRP2;
if (mask_bits) {
if ((mask_bits & 0x01) && int_handle_20) int_handle_20(); // OPL3
// if (mask_bits & 0x02) int_handle_21(); // Currently unused
// if (mask_bits & 0x04) int_handle_22(); // Currently unused
if ((mask_bits & 0x08) && int_handle_23) int_handle_23(); // VICKY II VDMA
if ((mask_bits & 0x10) && int_handle_24) int_handle_24(); // VICKY II Tile Collision
// if (mask_bits & 0x20) int_handle_25(); // Currently unused
if ((mask_bits & 0x40) && int_handle_26) int_handle_26(); // External Expansion
if ((mask_bits & 0x80) && int_handle_27) int_handle_27(); // SD Insert
// Clear the pending bits for group 2
*PENDING_GRP2 = mask_bits;
}
// Process any pending interrupts in group 3
mask_bits = *PENDING_GRP3;
if (mask_bits) {
if ((mask_bits & 0x01) && int_handle_30) int_handle_30(); // OPN2
if ((mask_bits & 0x02) && int_handle_31) int_handle_31(); // OPM
if ((mask_bits & 0x04) && int_handle_32) int_handle_32(); // IDE
// // if (mask_bits & 0x08) int_handle_33(); // Currently unused
// // if (mask_bits & 0x10) int_handle_34(); // Currently unused
// // if (mask_bits & 0x20) int_handle_35(); // Currently unused
// // if (mask_bits & 0x40) int_handle_36(); // Currently unused
// // if (mask_bits & 0x80) int_handle_37(); // Currently unused
// Clear the pending bits for group 3
*PENDING_GRP3 = mask_bits;
}
}
/**
* @brief Handle incomming NMI signal
*/
__attribute__((interrupt(0xffea))) void int_handle_nmi() {
}

View file

@ -161,7 +161,7 @@ char g_buffer[512];
// 0 on success, any negative number is an error code
//
short pata_identity(p_drive_info drive_info) {
char * buffer;
char * buffer = 0;
unsigned short *wptr;
char * cptr;
short i;
@ -198,7 +198,6 @@ short pata_identity(p_drive_info drive_info) {
TRACE("data copied");
wptr = (unsigned short *)buffer;
drive_info->flags = g_buffer[1] << 16 | g_buffer[0];
drive_info->lba_enabled = g_buffer[99] << 16 | g_buffer[98];
drive_info->l.lbaw.lba_default_lo = g_buffer[121] << 8 | g_buffer[120];

View file

@ -5,6 +5,7 @@
#ifndef __PATA_H
#define __PATA_H
#include <stdint.h>
#include "types.h"
#define PATA_GET_SECTOR_COUNT 1
@ -22,17 +23,17 @@
//
typedef struct s_drive_info {
unsigned short flags;
uint16_t flags;
char serial_number[18];
char firmware_version[6];
char model_name[38];
unsigned short lba_enabled;
uint16_t lba_enabled;
union u1 {
struct s1 {
unsigned short lba_default_lo;
unsigned short lba_default_hi;
uint16_t lba_default_lo;
uint16_t lba_default_hi;
} lbaw;
unsigned long lba_default;
uint32_t lba_default;
} l;
} t_drive_info, *p_drive_info;

View file

@ -6,6 +6,8 @@
#include <stdlib.h>
#include <string.h>
#include "errors.h"
#include "log_level.h"
#define DEFAULT_LOG_LEVEL LOG_DEBUG
#include "log.h"
#include "types.h"
#include "ring_buffer.h"
@ -339,7 +341,7 @@ short ps2_wait_out() {
target_ticks = rtc_get_jiffies() + PS2_TIMEOUT_JF;
while ((*PS2_STATUS & PS2_STAT_OBF) == 0) {
if (rtc_get_jiffies() > target_ticks) {
return -1;
return -1;
}
}
@ -374,11 +376,34 @@ short ps2_wait_in() {
* The response from the PS/2 controller, -1 if there was a timeout
*/
short ps2_controller_cmd(unsigned char cmd) {
if (ps2_wait_in()) return -1;
if (ps2_wait_in()) {
INFO("ps2_controller_cmd: ps2_wait_in timeout");
return -1;
}
*PS2_CMD_BUF = cmd;
if (ps2_wait_out()) return -1;
return (short)*PS2_DATA_BUF;
if (ps2_wait_out()) {
INFO("ps2_controller_cmd: ps2_wait_out timeout");
return -1;
}
short result = (short)*PS2_DATA_BUF;
// DEBUG2("PS/2: ps2_controller_cmd(%02X) = %02X", cmd, result);
return result;
}
/*
* Send a command to the controller and wait for a response.
*
* Returns: 0 on success, -1 on timeout
*/
short ps2_controller_cmd_noreply(unsigned char cmd) {
if (ps2_wait_in()) {
INFO("ps2_controller_cmd_noreply: ps2_wait_in timeout");
return -1;
}
*PS2_CMD_BUF = cmd;
return 0;
}
/*
@ -388,10 +413,16 @@ short ps2_controller_cmd(unsigned char cmd) {
* The response from the PS/2 controller, -1 if there was a timeout
*/
short ps2_controller_cmd_param(unsigned char cmd, unsigned char parameter) {
if (ps2_wait_in()) return -1;
if (ps2_wait_in()) {
DEBUG("ps2_controller_cmd_param: ps2_wait_in #1 timeout.");
return -1;
}
*PS2_CMD_BUF = cmd;
if (ps2_wait_in()) return -1;
if (ps2_wait_in()) {
DEBUG("ps2_controller_cmd_param: ps2_wait_in #2 timeout.");
return -1;
}
*PS2_DATA_BUF = parameter;
return 0;
@ -404,12 +435,18 @@ short ps2_controller_cmd_param(unsigned char cmd, unsigned char parameter) {
* The response from the PS/2 controller, -1 if there was a timeout
*/
short ps2_kbd_cmd_p(unsigned char cmd, unsigned char parameter) {
if (ps2_wait_in()) return -1;
if (ps2_wait_in()) {
DEBUG("ps2_kbd_cmd_p: ps2_wait_in #1 timeout.");
return -1;
}
*PS2_DATA_BUF = cmd;
// May need a delay here
if (ps2_wait_in()) return -1;
if (ps2_wait_in()) {
DEBUG("ps2_kbd_cmd_p: ps2_wait_in #2 timeout.");
return -1;
}
*PS2_DATA_BUF = parameter;
// Return 0 by default... maybe read DATA?
@ -541,6 +578,11 @@ void kbd_handle_irq() {
/* Clear the pending flag */
int_clear(INT_KBD_PS2);
#if MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
volatile __attribute__((far)) char * text = (char *)0xafa002;
*text = *text + 1;
#endif
if (scan_code) {
// Make sure the scan code isn't 0 or 128, which are invalid make/break codes
if ((scan_code != 0) && (scan_code != 0x80)) {
@ -1143,6 +1185,47 @@ short kbd_layout(const char * tables) {
return 0;
}
/**
* @brief Attempt to identify the device on the given PS/2 port
*
* @param port 1 (keyboard port), or 2 (mouse port)
*/
void ps2_identify(short port) {
short res = 0;
short byte0 = 0;
short byte1 = 0;
switch(port) {
case 1:
res = ps2_kbd_cmd(KBD_CMD_DISABLE, 100);
res = ps2_kbd_cmd(KBD_CMD_ID, 100);
if (ps2_wait_in()) {
ERROR("PS/2: ps2_identify timeout #1.");
} else {
byte0 = (short)*PS2_DATA_BUF;
}
if (ps2_wait_in()) {
ERROR("PS/2: ps2_identify timeout #2.");
} else {
byte1 = (short)*PS2_DATA_BUF;
}
if (byte1 >= 0) {
INFO2("PS/2: ps2_identification: %02X %02X.", byte0, byte1);
} else {
INFO1("PS/2: ps2_identification: %02X.", byte0);
}
res = ps2_kbd_cmd(KBD_CMD_ENABLE, 0);
break;
default:
break;
}
}
/*
* Initialize the PS2 controller and any attached devices
* Enable keyboard and mouse interrupts as appropriate.
@ -1151,10 +1234,12 @@ short kbd_layout(const char * tables) {
* Status code indicating if either the mouse or the keyboard is missing.
*/
short ps2_init() {
unsigned char x;
short mouse_present;
short mouse_error;
short res;
unsigned char x = 0;
short mouse_present = 0;
short mouse_error = 0;
short res = 0;
DEBUG("PS/2: ps2_init entered.");
// Initialize the keyboard controller variables
@ -1178,55 +1263,66 @@ short ps2_init() {
int_disable(INT_MOUSE); /* Disable mouse interrupts */
int_disable(INT_KBD_PS2); /* Disable keyboar interrupts */
INFO("PS/2: Interrupts disabled.");
// Prevent the keyboard and mouse from sending events
ps2_controller_cmd(PS2_CTRL_DISABLE_1);
ps2_controller_cmd(PS2_CTRL_DISABLE_2);
ps2_controller_cmd_noreply(PS2_CTRL_DISABLE_1);
ps2_controller_cmd_noreply(PS2_CTRL_DISABLE_2);
// Read and clear out the controller's output buffer
ps2_flush_out();
// // Controller selftest...
if (ps2_controller_cmd(PS2_CTRL_SELFTEST) != PS2_RESP_OK) {
INFO("PS/2: FAILED controller self test.");
; // return PS2_FAIL_SELFTEST;
}
} else {
DEBUG("PS/2: PASSED controller self test.");
}
// Keyboard test
if (ps2_controller_cmd(PS2_CTRL_KBDTEST) != 0) {
INFO("PS/2: FAILED port #1 test.");
; // return PS2_FAIL_KBDTEST;
}
} else {
DEBUG("PS/2: PASSED port #1 test.");
}
/* Test if the mouse is working */
if (ps2_controller_cmd(PS2_CTRL_MOUSETEST) == 0) {
mouse_present = 1;
} else {
if (ps2_controller_cmd(PS2_CTRL_MOUSETEST) != 0) {
INFO("PS/2: FAILED port #2 test.");
mouse_present = 0;
} else {
DEBUG("PS/2: PASSED port #2 test.");
mouse_present = 1;
}
// Set scancode translation to set1, enable interrupts on mouse and keyboard
ps2_controller_cmd_param(PS2_CTRL_WRITECMD, 0x43); /* %01000011 */
// Enable the keyboard, don't check response
ps2_wait_in();
*PS2_CMD_BUF = PS2_CTRL_ENABLE_1;
// Enable the port #1, don't check response
ps2_controller_cmd_noreply(PS2_CTRL_ENABLE_1);
INFO("PS/2: port #1 enabled.");
// Reset the keyboard... waiting a bit before we check for a result
ps2_kbd_cmd(KBD_CMD_RESET, 1000);
INFO("PS/2: Keyboard reset.");
// Ideally, we would attempt a re-enable several times, but this doesn't work on the U/U+ for some keyboards
ps2_kbd_cmd(KBD_CMD_ENABLE, 0);
INFO("PS/2: Keyboard enabled.");
// TODO: set the keyboard LEDs
if (mouse_present) {
/* Initialize the mouse */
if (mouse_error = mouse_init()) {
log_num(LOG_INFO, "Unable to initialize mouse", res);
if ((mouse_error = mouse_init())) {
log_num(LOG_INFO, "Unable to initialize mouse", mouse_error);
}
}
ps2_wait_in();
*PS2_CMD_BUF = PS2_CTRL_ENABLE_2;
ps2_controller_cmd_noreply(PS2_CTRL_ENABLE_2);
INFO("PS/2: port #2 enabled.");
// Make sure everything is read
ps2_flush_out();
@ -1239,9 +1335,10 @@ short ps2_init() {
// Enable the keyboard interrupt
int_enable(INT_KBD_PS2);
INFO("PS/2: Keyboard interrupt enabled.");
if (mouse_present && (mouse_error == 0)) {
log(LOG_TRACE, "mouse enabled");
DEBUG("mouse enabled");
// Register the interrupt handler for the mouse
int_register(INT_MOUSE, mouse_handle_irq);

View file

@ -92,6 +92,7 @@ short rtc_register_periodic(short rate, FUNC_V_2_V handler) {
int_enable(INT_RTC);
}
return 0;
}
/*
@ -260,3 +261,4 @@ void rtc_get_time(p_time time) {
long rtc_get_jiffies() {
return timers_jiffies();
}

View file

@ -72,11 +72,7 @@ short sdc_protected() {
// is_on = if 0, turn the LED off, otherwise turn the LED on
//
void sdc_set_led(short is_on) {
if (is_on) {
*GABE_CTRL_REG = *GABE_CTRL_REG | SDCARD_LED;
} else {
*GABE_CTRL_REG = *GABE_CTRL_REG & ~SDCARD_LED;
}
ind_set(IND_SDC, is_on);
}
//
@ -87,7 +83,6 @@ void sdc_set_led(short is_on) {
//
short sdc_wait_busy() {
long timer_ticks;
int retry_count = MAX_TRIES_BUSY;
unsigned char status;
timer_ticks = rtc_get_jiffies() + SDC_TIMEOUT_JF;
@ -414,8 +409,10 @@ short sdc_ioctrl(short command, unsigned char * buffer, short size) {
break;
default:
return 0;
break;
}
return 0;
}
//

58
src/dev/timers_c256.c Normal file
View file

@ -0,0 +1,58 @@
#include <stdint.h>
#include "interrupt.h"
#include "timers.h"
#include "gabe_reg.h"
#include "timers_reg.h"
long jiffy_count;
/**
* @brief Interrupt handler for the timer 0 interrupt... counts jiffies since boot
*
*/
void timer_0_handler() {
jiffy_count++;
}
/*
* Initialize the timers and their interrupts
*/
void timers_init() {
// Number of system clock ticks per second
const uint32_t sys_clock = 14318180;
// Number of system clocks per jiffy
const uint32_t jiffy_target = sys_clock / (uint32_t)60;
jiffy_count = 0;
// Disable all timers
*TIMER_CTRL_0 = 0;
*TIMER_CTRL_1 = 0;
*TIMER_CTRL_2 = 0;
// Register our timer 0 interrupt handler
int_register(INT_SOF_A, timer_0_handler);
int_enable(INT_SOF_A);
// Set timer 0 to tick every jiffy
// *TIMER_CHG_L_0 = jiffy_target & 0xff;
// *TIMER_CHG_M_0 = (jiffy_target >> 8) & 0xff;
// *TIMER_CHG_H_0 = (jiffy_target >> 16) & 0xff;
// *TIMER_CMP_L_0 = 0;
// *TIMER_CMP_M_0 = 0;
// *TIMER_CMP_H_0 = 0;
// *TIMER_CMPC_0 = TIMER_CMP_RELOAD;
// *TIMER_CTRL_0 = TIMER_CTRL_EN | TIMER_CTRL_SLOAD;
}
/*
* Return the number of jiffies (1/60 of a second) since last reset time
*/
long timers_jiffies() {
return jiffy_count;
}

694
src/dev/txt_c256.c Normal file
View file

@ -0,0 +1,694 @@
/** @file txt_c256.c
*
* Text screen driver for c256
*/
#include <string.h>
#include <stdio.h>
#include "log.h"
#include "C256/vicky_ii.h"
#include "dev/txt_c256.h"
#include "dev/txt_screen.h"
extern const unsigned char MSX_CP437_8x8_bin[];
const t_color4 c256_clut[] = {
{0, 0, 0}, // 0: Black
{0, 0, 128}, // 1: Red
{0, 128, 0}, // 2: Green
{0, 128, 128}, // 3: Yellow
{128, 0, 0}, // 4: Blue
{128, 0, 128}, // 5: Magenta
{128, 128, 0}, // 6: Cyan
{192, 192, 192}, // 7: White
{128, 128, 128}, // 8: Bright Gray
{0, 0, 255}, // 9: Bright Red
{0, 255, 0}, // A: Bright Green
{0, 255, 255}, // B: Bright Yellow
{255, 0, 0}, // C: Bright Blue
{255, 0, 255}, // D: Bright Magenta
{255, 255, 0}, // E: Bright Cyan
{255, 255, 255} // F: Bright White
};
/*
* Driver level variables for the screen
*/
unsigned char c256_enable_set_sizes; /* Flag to enable set_sizes to actually do its computation */
t_txt_capabilities c256_caps; /* The capabilities of Channel A */
t_extent c256_resolutions[] = { /* The list of display resolutions */
{ 800, 600 },
{ 400, 300 },
{ 640, 480 },
{ 320, 240 }
};
t_extent c256_fonts[] = { /* The list of supported font resolutions */
{ 8, 8 }
};
t_rect c256_region; /* The current region */
t_point c256_cursor; /* The current cursor position */
t_extent c256_resolution; /* The current display resolution */
t_extent c256_font_size; /* The current font size */
t_extent c256_max_size; /* The size of the screen in characters (without border removed) */
t_extent c256_visible_size; /* The size of the visible screen in characters (with border removed) */
short c256_border_width; /* Width of the border on one side */
short c256_border_height; /* Height of the border on one side */
unsigned char c256_color; /* The current color */
unsigned long msr_shadow; /* A shadow register for the Master Control Register */
/**
* Gets the description of a screen's capabilities
*
* @return a pointer to the read-only description (0 on error)
*/
const p_txt_capabilities txt_c256_get_capabilities() {
return &c256_caps;
}
/**
* Calculate the size of the text screen in rows and columns so that
* the kernel printing routines can work correctly.
*
* NOTE: this should be called whenever the VKY3 registers are changed
*/
static void txt_c256_set_sizes() {
TRACE("txt_c256_set_sizes");
if (c256_enable_set_sizes) {
/* Only recalculate after initialization is mostly completed */
/*
* Calculate the maximum number of characters visible on the screen
* This controls text layout in memory
*/
c256_max_size.width = c256_resolution.width / c256_font_size.width;
c256_max_size.height = c256_resolution.height / c256_font_size.height;
/*
* Calculate the characters that are visible in whole or in part
*/
if ((c256_border_width != 0) && (c256_border_height != 0)) {
short border_width = (2 * c256_border_width) / c256_font_size.width;
short border_height = (2 * c256_border_height) / c256_font_size.height;
c256_visible_size.width = c256_max_size.width - border_width;
c256_visible_size.height = c256_max_size.height - border_height;
} else {
c256_visible_size.width = c256_max_size.width;
c256_visible_size.height = c256_max_size.height;
}
DEBUG4("txt_c256_set_sizes max:%d,%d, visible:%d,%d", c256_max_size.width, c256_max_size.height, c256_visible_size.width, c256_visible_size.height);
}
}
/**
* Get the display resolutions
*
* @param text_size the size of the screen in visible characters (may be null)
* @param pixel_size the size of the screen in pixels (may be null)
*/
static void txt_c256_get_sizes(p_extent text_size, p_extent pixel_size) {
if (text_size) {
text_size->width = c256_visible_size.width;
text_size->height = c256_visible_size.height;
}
if (pixel_size) {
pixel_size->width = c256_resolution.width;
pixel_size->height = c256_resolution.height;
}
}
/**
* Set the display mode for the screen
*
* @param mode a bitfield of desired display mode options
*
* @return 0 on success, any other number means the mode is invalid for the screen
*/
static short txt_c256_set_mode(short mode) {
/* Turn off anything not set */
msr_shadow &= ~(TXT_MODE_SLEEP | TXT_MODE_TEXT);
if (mode & TXT_MODE_SLEEP) {
/* Put the monitor to sleep */
msr_shadow |= VKY_MCR_DISABLE;
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
} else if (mode & TXT_MODE_TEXT) {
/* Put on text mode */
msr_shadow |= VKY_MCR_TEXT;
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
} else {
/* Unsupported mode */
return -1;
}
}
/**
* Set the display resolution of the screen
*
* @param width the desired horizontal resolution in pixels
* @param height the desired veritical resolution in pixels
*
* @return 0 on success, any other number means the resolution is unsupported
*/
static short txt_c256_set_resolution(short width, short height) {
// TODO: If no size specified, set it based on the DIP switch
/* Turn off resolution bits */
/* TODO: there gotta be a better way to do that */
msr_shadow &= ~(VKY_MCR_RES_MASK);
if ((width == 800) && (height == 600)) {
msr_shadow |= VKY_MCR_RES_800x600;
c256_resolution.width = width;
c256_resolution.height = height;
// Recalculate the size of the screen
txt_c256_set_sizes();
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
} else if ((width == 640) && (height == 480)) {
msr_shadow |= VKY_MCR_RES_640x480;
c256_resolution.width = width;
c256_resolution.height = height;
// Recalculate the size of the screen
txt_c256_set_sizes();
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
}
else if ((width == 320) && (height == 240)) {
msr_shadow |= VKY_MCR_RES_320x240;
c256_resolution.width = width;
c256_resolution.height = height;
// Recalculate the size of the screen
txt_c256_set_sizes();
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
}
else if ((width == 400) && (height == 300)) {
msr_shadow |= VKY_MCR_RES_400x300;
c256_resolution.width = width;
c256_resolution.height = height;
// Recalculate the size of the screen
txt_c256_set_sizes();
tvky_mstr_ctrl->raw = msr_shadow;
return 0;
}
else {
/* Unsupported resolution */
return -1;
}
}
/**
* Set the size of the border of the screen (if supported)
*
* @param width the horizontal size of one side of the border (0 - 32 pixels)
* @param height the vertical size of one side of the border (0 - 32 pixels)
*/
static void txt_c256_set_border(short width, short height) {
if ((width > 0) || (height > 0)) {
c256_border_width = width;
c256_border_height = height;
tvky_brdr_ctrl->control = 0x01;
tvky_brdr_ctrl->size_x = width;
tvky_brdr_ctrl->sizy_y = height;
} else {
tvky_brdr_ctrl->control = 0;
tvky_brdr_ctrl->size_x = 0;
tvky_brdr_ctrl->sizy_y = 0;
}
// Recalculate the size of the screen
txt_c256_set_sizes();
}
/**
* Set the size of the border of the screen (if supported)
*
* @param red the red component of the color (0 - 255)
* @param green the green component of the color (0 - 255)
* @param blue the blue component of the color (0 - 255)
*/
static void txt_c256_set_border_color(unsigned char red, unsigned char green, unsigned char blue) {
tvky_brdr_ctrl->color.red = red;
tvky_brdr_ctrl->color.green = green;
tvky_brdr_ctrl->color.blue = blue;
}
/**
* Load a font as the current font for the screen
*
* @param width width of a character in pixels
* @param height of a character in pixels
* @param data pointer to the raw font data to be loaded
*/
static short txt_c256_set_font(short width, short height, const unsigned char * data) {
if (width == 8 && height == 8) {
int i;
/* The size is valid... set the font */
c256_font_size.width = width;
c256_font_size.height = height;
/* Copy the font data... this assumes a width of one byte! */
/* TODO: generalize this for all possible font sizes */
for (i = 0; i < 256 * height; i++) {
tvky_font_set_0[i] = data[i];
}
// Recalculate the size of the screen
txt_c256_set_sizes();
return 0;
} else {
return -1;
}
}
/**
* Set the appearance of the cursor
*
* @param enable 0 to hide, any other number to make visible
* @param rate the blink rate for the cursor (0=1s, 1=0.5s, 2=0.25s, 3=1/5s)
* @param c the character in the current font to use as a cursor
*/
static void txt_c256_set_cursor(short enable, short rate, char c) {
tvky_crsr_ctrl->control = ((rate & 0x03) << 1) | ((enable) ? 1 : 0);
tvky_crsr_ctrl->character = c;
}
/**
* Set if the cursor is visible or not
*
* @param enable 0 to hide, any other number to make visible
*/
static void txt_c256_set_cursor_visible(short enable) {
if (enable) {
tvky_crsr_ctrl->control |= 0x01;
} else {
tvky_crsr_ctrl->control &= ~0x01;
}
}
/**
* get the current region
*
* @param region pointer to a t_rect describing the rectangular region (using character cells for size and size)
*
* @return 0 on success, any other number means the region was invalid
*/
static short txt_c256_get_region(p_rect region) {
region->origin.x = c256_region.origin.x;
region->origin.y = c256_region.origin.y;
region->size.width = c256_region.size.width;
region->size.height = c256_region.size.height;
{
char msg[80];
sprintf(msg,"txt_c256_get_region %p: x:%d, y:%d, w:%d, h:%d", region, region->origin.x, region->origin.y, region->size.width, region->size.height);
DEBUG(msg);
}
return 0;
}
/**
* Set a region to restrict further character display, scrolling, etc.
* Note that a region of zero size will reset the region to the full size of the screen.
*
* @param region pointer to a t_rect describing the rectangular region (using character cells for size and size)
*
* @return 0 on success, any other number means the region was invalid
*/
static short txt_c256_set_region(const p_rect region) {
// char msg[80];
// sprintf(msg,"SET REGION %p x:%d, y:%d, w:%d, h:%d (visible:%d,%d)",
// region, region->origin.x, region->origin.y, region->size.width, region->size.height, c256_visible_size.width, c256_visible_size.height);
// DEBUG(msg);
if ((region->size.width == 0) || (region->size.height == 0)) {
/* Set the region to the default (full screen) */
c256_region.origin.x = 0;
c256_region.origin.y = 0;
c256_region.size.width = c256_visible_size.width;
c256_region.size.height = c256_visible_size.height;
} else {
c256_region.origin.x = region->origin.x;
c256_region.origin.y = region->origin.y;
c256_region.size.width = region->size.width;
c256_region.size.height = region->size.height;
//sprintf(msg,"specific region %d %d %d %d", region->origin.x, region->origin.y, region->size.width, region->size.height);
//DEBUG(msg);
}
//sprintf(msg,"txt_c256_set_region: NEW REGION %p x:%d, y:%d, w:%d, h:%d (visible:%d,%d)",
//region, region->origin.x, region->origin.y, region->size.width, region->size.height, c256_visible_size.width, c256_visible_size.height);
//DEBUG(msg);
return 0;
}
/**
* Get the default foreground and background colors for printing
*
* @param pointer to the foreground the Text LUT index of the new current foreground color (0 - 15)
* @param pointer to the background the Text LUT index of the new current background color (0 - 15)
*/
static short txt_c256_get_color(unsigned char * foreground, unsigned char * background) {
*foreground = (c256_color & 0xf0) >> 4;
*background = c256_color & 0x0f;
return 0;
}
/**
* Set the default foreground and background colors for printing
*
* @param foreground the Text LUT index of the new current foreground color (0 - 15)
* @param background the Text LUT index of the new current background color (0 - 15)
*/
static short txt_c256_set_color(unsigned char foreground, unsigned char background) {
c256_color = ((foreground & 0x0f) << 4) + (background & 0x0f);
return 0;
}
/**
* Scroll the text in the current region
*
* @param screen the number of the text device
* @param horizontal the number of columns to scroll (negative is left, positive is right)
* @param vertical the number of rows to scroll (negative is down, positive is up)
*/
static void txt_c256_scroll(short horizontal, short vertical) {
short x, x0, x1, x2, x3, dx;
short y, y0, y1, y2, y3, dy;
/*
* Determine limits of rectangles to move and fill and directions of loops
* x0 and y0 are the positions of the first cell to be over-written
* x1 and y1 are the positions of the first cell to be copied... TEXT[x0,y0] := TEXT[x1,y1]
* x2 and y2 are the position of the last cell to be over-written
* x3 and y3 are the position of the last cell to be copied... TEXT[x2,y2] := TEXT[x3,y3]
*
* When blanking, the rectangles (x2,y0) - (x3,y3) and (x0,y2) - (x2,y3) are cleared
*/
// Determine the row limits
if (vertical >= 0) {
y0 = c256_region.origin.y;
y1 = y0 + vertical;
y3 = c256_region.origin.y + c256_region.size.height;
y2 = y3 - vertical;
dy = 1;
} else {
y0 = c256_region.origin.y + c256_region.size.height - 1;
y1 = y0 + vertical;
y3 = c256_region.origin.y - 1;
y2 = y3 - vertical;
dy = -1;
}
// Determine the column limits
if (horizontal >= 0) {
x0 = c256_region.origin.x;
x1 = x0 + horizontal;
x3 = c256_region.origin.x + c256_region.size.width;
x2 = x3 - horizontal;
dx = 1;
} else {
x0 = c256_region.origin.x + c256_region.size.width - 1;
x1 = x0 + horizontal;
x3 = c256_region.origin.x - 1;
x2 = x3 - horizontal;
dx = -1;
}
/* Copy the rectangle. */
int delta_y = dy * c256_max_size.width;
int row_dst = y0 * c256_max_size.width - delta_y;
int row_src = y0 * c256_max_size.width + vertical * c256_max_size.width - delta_y;
for (y = y0; y != y2; y += dy) {
row_dst += delta_y;
row_src += delta_y;
int offset_dst = row_dst + x0 - dx;
int offset_src = row_src + horizontal + x0 - dx;
for (x = x0; x != x2; x += dx) {
offset_dst += dx;
offset_src += dx;
tvky_text_matrix[offset_dst] = tvky_text_matrix[offset_src];
tvky_color_matrix[offset_dst] = tvky_color_matrix[offset_src];
}
}
/* Clear the rectangles */
if (horizontal != 0) {
row_dst = y0 * c256_max_size.width - delta_y;
for (y = y0; y != y3; y += dy) {
row_dst += delta_y;
for (x = x2; x != x3; x += dx) {
tvky_text_matrix[row_dst + x] = ' ';
tvky_color_matrix[row_dst + x] = c256_color;
}
}
}
if (vertical != 0) {
row_dst = y2 * c256_max_size.width - delta_y;
for (y = y2; y != y3; y += dy) {
row_dst += delta_y;
for (x = x0; x != x3; x += dx) {
tvky_text_matrix[row_dst + x] = ' ';
tvky_color_matrix[row_dst + x] = c256_color;
}
}
}
}
/**
* Fill the current region with a character in the current color
*
* @param screen the number of the text device
* @param c the character to fill the region with
*/
static void txt_c256_fill(char c) {
int x;
int y;
for (y = 0; y < c256_region.size.height; y++) {
int offset_row = (c256_region.origin.y + y) * c256_max_size.width;
for (x = 0; x < c256_region.size.width; x++) {
int offset = offset_row + c256_region.origin.x + x;
tvky_text_matrix[offset] = c;
tvky_color_matrix[offset] = c256_color;
}
}
}
/**
* Set the position of the cursor to (x, y) relative to the current region
* If the (x, y) coordinate is outside the region, it will be clipped to the region.
* If y is greater than the height of the region, the region will scroll until that relative
* position would be within view.
*
* @param x the column for the cursor
* @param y the row for the cursor
*/
static void txt_c256_set_xy(short x, short y) {
/* Make sure X is within range for the current region... "print" a newline if not */
if (x < 0) {
x = 0;
} else if (x >= c256_region.size.width) {
x = 0;
y++;
}
/* Make sure Y is within range for the current region... scroll if not */
if (y < 0) {
y = 0;
} else if (y >= c256_region.size.height) {
txt_c256_scroll(0, y - c256_region.size.height + 1);
y = c256_region.size.height - 1;
}
c256_cursor.x = x;
c256_cursor.y = y;
/* Set register */
tvky_crsr_ctrl->column = c256_region.origin.x + x;
tvky_crsr_ctrl->row = c256_region.origin.y + y;
}
/**
* Get the position of the cursor (x, y) relative to the current region
*
* @param screen the number of the text device
* @param position pointer to a t_point record to fill out
*/
static void txt_c256_get_xy(p_point position) {
position->x = c256_cursor.x;
position->y = c256_cursor.y;
}
/**
* Print a character to the current cursor position in the current color
*
* @param c the character to print
*/
static void txt_c256_put(char c) {
short x;
short y;
unsigned int offset;
x = c256_region.origin.x + c256_cursor.x;
y = c256_region.origin.y + c256_cursor.y;
offset = y * c256_max_size.width + x;
tvky_text_matrix[offset] = c;
tvky_color_matrix[offset] = c256_color;
txt_c256_set_xy(c256_cursor.x + 1, c256_cursor.y);
}
/**
* Initialize the screen
*/
static void txt_c256_init() {
char buffer[255];
t_rect region;
int i;
DEBUG("txt_c256_init");
c256_resolution.width = 0;
c256_resolution.height = 0;
c256_visible_size.width = 0;
c256_visible_size.height = 0;
c256_font_size.width = 0;
c256_font_size.height = 0;
/* Disable the set_sizes call for now, to avoid computing transcient unnecessary values */
c256_enable_set_sizes = 0;
/* Start with nothing on */
msr_shadow = 0;
/* Define the capabilities */
/* Specify the screen number. We have only one so... */
c256_caps.number = TXT_SCREEN_C256;
/* This screen can be text, bitmap or can be put to sleep */
c256_caps.supported_modes = TXT_MODE_TEXT | TXT_MODE_SPRITE | TXT_MODE_BITMAP | TXT_MODE_TILE | TXT_MODE_SLEEP;
/* Supported resolutions */
c256_caps.resolution_count = sizeof(c256_resolutions) / sizeof(t_extent);
c256_caps.resolutions = c256_resolutions;
/* Only 8x8 on the U */
c256_caps.font_size_count = sizeof(c256_fonts) / sizeof(t_extent);
c256_caps.font_sizes = c256_fonts;
/* Initialize the color lookup tables */
for (i = 0; i < sizeof(c256_clut)/sizeof(t_color4); i++) {
tvky_text_fg_color[i] = c256_clut[i];
tvky_text_bg_color[i] = c256_clut[i];
}
/* Set the mode to text */
txt_c256_set_mode(TXT_MODE_TEXT);
/* Set the resolution */
txt_c256_set_resolution(640, 480);
/* Set the default color: light grey on blue */
txt_c256_set_color(0x07, 0x04);
/* Set the font */
txt_c256_set_font(8, 8, MSX_CP437_8x8_bin); /* Use 8x8 font */
/* Set the cursor */
txt_c256_set_cursor(1, 0, 0xB1);
/* Set the border */
txt_c256_set_border(0, 0); /* Set up the border */
txt_c256_set_border_color(0, 0, 0x3f);
/*
* Enable set_sizes, now that everything is set up initially
* And calculate the size of the screen
*/
c256_enable_set_sizes = 1;
txt_c256_set_sizes();
/* Set region to default */
region.origin.x = 0;
region.origin.y = 0;
region.size.width = 0;
region.size.height = 0;
txt_c256_set_region(&region);
/* Home the cursor */
txt_c256_set_xy(0, 0);
/* Clear the screen */
txt_c256_fill(' ');
}
/**
* Initialize and install the driver
*
* @return 0 on success, any other number is an error
*/
short txt_c256_install() {
t_txt_device device;
device.number = TXT_SCREEN_C256;
device.name = "SCREEN";
device.init = txt_c256_init;
device.get_capabilities = txt_c256_get_capabilities;
device.set_mode = txt_c256_set_mode;
device.set_sizes = txt_c256_set_sizes;
device.set_resolution = txt_c256_set_resolution;
device.set_border = txt_c256_set_border;
device.set_border_color = txt_c256_set_border_color;
device.set_font = txt_c256_set_font;
device.set_cursor = txt_c256_set_cursor;
device.set_cursor_visible = txt_c256_set_cursor_visible;
device.get_region = txt_c256_get_region;
device.set_region = txt_c256_set_region;
device.get_color = txt_c256_get_color;
device.set_color = txt_c256_set_color;
device.set_xy = txt_c256_set_xy;
device.get_xy = txt_c256_get_xy;
device.put = txt_c256_put;
device.scroll = txt_c256_scroll;
device.fill = txt_c256_fill;
device.get_sizes = txt_c256_get_sizes;
return txt_register(&device);
}

19
src/dev/txt_c256.h Normal file
View file

@ -0,0 +1,19 @@
/** @file txt_c2560.h
*
* Text screen driver for the C256
*/
#ifndef __TXT_C256_H
#define __TXT_C256_H
/* We only have one screen */
#define TXT_SCREEN_C256 0
/**
* Initialize and install the driver
*
* @return 0 on success, any other number is an error
*/
extern short txt_c256_install();
#endif

709
src/dev/txt_evid.c Normal file
View file

@ -0,0 +1,709 @@
/**
* @file txt_evid.c
* @brief Low level FoenixMCP driver for the C200 EVID expansion card for the C256 computers
* @version 0.1
* @date 2023-08-09
*
*/
#include <stdlib.h>
#include <stdint.h>
#include "log.h"
#include "C256/exp_c256.h"
#include "C256/vicky_ii.h"
#include "dev/txt_evid.h"
#include "dev/txt_screen.h"
#define evid_font_set ((volatile __attribute__((far)) uint8_t *)0xae1000)
#define evid_fg_clut ((volatile __attribute__((far)) t_color4 *)0xae1b00)
#define evid_bg_clut ((volatile __attribute__((far)) t_color4 *)0xae1b40)
#define evid_mstr_ctrl ((volatile __attribute__((far)) uint16_t *)0xae1e00)
#define EVID_MCR_TEXT 0x0001
#define EVID_MCR_RES_800x600 0x0100
#define evid_brdr_ctrl ((volatile __attribute__((far)) uint8_t *)0xae1e04)
#define evid_brdr_color ((volatile __attribute__((far)) t_color4 *)0xae1e05)
#define evid_brdr_size_x ((volatile __attribute__((far)) uint16_t *)0xae1e08)
#define evid_brdr_size_y ((volatile __attribute__((far)) uint16_t *)0xae1e09)
#define evid_crsr_ctrl ((volatile __attribute__((far)) uint8_t *)0xae1e10)
#define evid_crsr_char ((volatile __attribute__((far)) uint8_t *)0xae1e12)
#define evid_crsr_color ((volatile __attribute__((far)) uint8_t *)0xae1e13)
#define evid_crsr_column ((volatile __attribute__((far)) uint16_t *)0xae1e14)
#define evid_crsr_row ((volatile __attribute__((far)) uint16_t *)0xae1e16)
#define evid_text_matrix ((volatile __attribute__((far)) uint8_t *)0xae2000)
#define evid_color_matrix ((volatile __attribute__((far)) uint8_t *)0xae4000)
extern const unsigned char MSX_CP437_8x8_bin[];
const t_color4 evid_clut[] = {
{0, 0, 0}, // 0: Black
{0, 0, 128}, // 1: Red
{0, 128, 0}, // 2: Green
{0, 128, 128}, // 3: Yellow
{128, 0, 0}, // 4: Blue
{128, 0, 128}, // 5: Magenta
{128, 128, 0}, // 6: Cyan
{192, 192, 192}, // 7: White
{128, 128, 128}, // 8: Bright Gray
{0, 0, 255}, // 9: Bright Red
{0, 255, 0}, // A: Bright Green
{0, 255, 255}, // B: Bright Yellow
{255, 0, 0}, // C: Bright Blue
{255, 0, 255}, // D: Bright Magenta
{255, 255, 0}, // E: Bright Cyan
{255, 255, 255} // F: Bright White
};
/*
* Driver level variables for the screen
*/
unsigned char evid_enable_set_sizes; /* Flag to enable set_sizes to actually do its computation */
t_txt_capabilities evid_caps; /* The capabilities of the EVID */
t_extent evid_resolutions[] = { /* The list of display resolutions */
{ 800, 600 },
{ 640, 480 }
};
t_extent evid_fonts[] = { /* The list of supported font resolutions */
{ 8, 8 }
};
t_rect evid_region; /* The current region */
t_point evid_cursor; /* The current cursor position */
t_extent evid_resolution; /* The current display resolution */
t_extent evid_font_size; /* The current font size */
t_extent evid_max_size; /* The size of the screen in characters (without border removed) */
t_extent evid_visible_size; /* The size of the visible screen in characters (with border removed) */
short evid_border_width; /* Width of the border on one side */
short evid_border_height; /* Height of the border on one side */
unsigned char evid_color; /* The current color */
unsigned long evid_msr_shadow; /* A shadow register for the Master Control Register */
/**
* @brief Return TRUE if the C200 EVID card is present
*
* @return short 0 if not present, any other value means the card is present
*/
short txt_evid_present() {
if ((EXP_CARD_INFO->vendor_id == EXP_VENDOR_FOENIX) && (EXP_CARD_INFO->card_id == EXP_CARD_C200_EVID)) {
return 1;
} else {
return 0;
}
}
/**
* Gets the description of a screen's capabilities
*
* @return a pointer to the read-only description (0 on error)
*/
const p_txt_capabilities txt_evid_get_capabilities() {
return &evid_caps;
}
/**
* Calculate the size of the text screen in rows and columns so that
* the kernel printing routines can work correctly.
*
* NOTE: this should be called whenever the VKY3 registers are changed
*/
static void txt_evid_set_sizes() {
TRACE("txt_evid_set_sizes");
if (evid_enable_set_sizes) {
/* Only recalculate after initialization is mostly completed */
/*
* Calculate the maximum number of characters visible on the screen
* This controls text layout in memory
*/
evid_max_size.width = evid_resolution.width / evid_font_size.width;
evid_max_size.height = evid_resolution.height / evid_font_size.height;
/*
* Calculate the characters that are visible in whole or in part
*/
if ((evid_border_width != 0) && (evid_border_height != 0)) {
short border_width = (2 * evid_border_width) / evid_font_size.width;
short border_height = (2 * evid_border_height) / evid_font_size.height;
evid_visible_size.width = evid_max_size.width - border_width;
evid_visible_size.height = evid_max_size.height - border_height;
} else {
evid_visible_size.width = evid_max_size.width;
evid_visible_size.height = evid_max_size.height;
}
DEBUG4("txt_evid_set_sizes max:%d,%d, visible:%d,%d", evid_max_size.width, evid_max_size.height, evid_visible_size.width, evid_visible_size.height);
}
}
/**
* Get the display resolutions
*
* @param text_size the size of the screen in visible characters (may be null)
* @param pixel_size the size of the screen in pixels (may be null)
*/
static void txt_evid_get_sizes(p_extent text_size, p_extent pixel_size) {
if (text_size) {
text_size->width = evid_visible_size.width;
text_size->height = evid_visible_size.height;
}
if (pixel_size) {
pixel_size->width = evid_resolution.width;
pixel_size->height = evid_resolution.height;
}
}
/**
* Set the display mode for the screen
*
* @param mode a bitfield of desired display mode options
*
* @return 0 on success, any other number means the mode is invalid for the screen
*/
static short txt_evid_set_mode(short mode) {
/* Turn off anything not set */
evid_msr_shadow &= ~(TXT_MODE_TEXT);
if (mode & TXT_MODE_TEXT) {
/* Put on text mode */
evid_msr_shadow |= EVID_MCR_TEXT;
*evid_mstr_ctrl = evid_msr_shadow;
return 0;
} else {
/* Unsupported mode */
return -1;
}
}
/**
* Set the display resolution of the screen
*
* @param width the desired horizontal resolution in pixels
* @param height the desired veritical resolution in pixels
*
* @return 0 on success, any other number means the resolution is unsupported
*/
static short txt_evid_set_resolution(short width, short height) {
// TODO: If no size specified, set it based on the DIP switch
/* Turn off resolution bits */
/* TODO: there gotta be a better way to do that */
evid_msr_shadow &= ~(EVID_MCR_RES_800x600);
if ((width == 800) && (height == 600)) {
evid_msr_shadow |= EVID_MCR_RES_800x600;
evid_resolution.width = width;
evid_resolution.height = height;
// Recalculate the size of the screen
txt_evid_set_sizes();
*evid_mstr_ctrl = evid_msr_shadow;
return 0;
} else if ((width == 640) && (height == 480)) {
evid_resolution.width = width;
evid_resolution.height = height;
// Recalculate the size of the screen
txt_evid_set_sizes();
*evid_mstr_ctrl = evid_msr_shadow;
return 0;
}
else {
/* Unsupported resolution */
return -1;
}
}
/**
* Set the size of the border of the screen (if supported)
*
* @param width the horizontal size of one side of the border (0 - 32 pixels)
* @param height the vertical size of one side of the border (0 - 32 pixels)
*/
static void txt_evid_set_border(short width, short height) {
if ((width > 0) || (height > 0)) {
evid_border_width = width;
evid_border_height = height;
*evid_brdr_ctrl = 0x01;
*evid_brdr_size_x = width;
*evid_brdr_size_y = height;
} else {
*evid_brdr_ctrl = 0;
*evid_brdr_size_x = 0;
*evid_brdr_size_y = 0;
}
// Recalculate the size of the screen
txt_evid_set_sizes();
}
/**
* Set the size of the border of the screen (if supported)
*
* @param red the red component of the color (0 - 255)
* @param green the green component of the color (0 - 255)
* @param blue the blue component of the color (0 - 255)
*/
static void txt_evid_set_border_color(unsigned char red, unsigned char green, unsigned char blue) {
evid_brdr_color->red = red;
evid_brdr_color->green = green;
evid_brdr_color->blue = blue;
}
/**
* Load a font as the current font for the screen
*
* @param width width of a character in pixels
* @param height of a character in pixels
* @param data pointer to the raw font data to be loaded
*/
static short txt_evid_set_font(short width, short height, const unsigned char * data) {
if (width == 8 && height == 8) {
int i;
/* The size is valid... set the font */
evid_font_size.width = width;
evid_font_size.height = height;
/* Copy the font data... this assumes a width of one byte! */
/* TODO: generalize this for all possible font sizes */
for (i = 0; i < 256 * height; i++) {
evid_font_set[i] = data[i];
}
// Recalculate the size of the screen
txt_evid_set_sizes();
return 0;
} else {
return -1;
}
}
/**
* Set the appearance of the cursor
*
* @param enable 0 to hide, any other number to make visible
* @param rate the blink rate for the cursor (0=1s, 1=0.5s, 2=0.25s, 3=1/5s)
* @param c the character in the current font to use as a cursor
*/
static void txt_evid_set_cursor(short enable, short rate, char c) {
*evid_crsr_ctrl = ((rate & 0x03) << 1) | ((enable) ? 1 : 0);
*evid_crsr_char = c;
}
/**
* Set if the cursor is visible or not
*
* @param enable 0 to hide, any other number to make visible
*/
static void txt_evid_set_cursor_visible(short enable) {
if (enable) {
*evid_crsr_ctrl|= 0x01;
} else {
*evid_crsr_ctrl &= ~0x01;
}
}
/**
* get the current region
*
* @param region pointer to a t_rect describing the rectangular region (using character cells for size and size)
*
* @return 0 on success, any other number means the region was invalid
*/
static short txt_evid_get_region(p_rect region) {
region->origin.x = evid_region.origin.x;
region->origin.y = evid_region.origin.y;
region->size.width = evid_region.size.width;
region->size.height = evid_region.size.height;
// {
// char msg[80];
// sprintf(msg,"txt_evid_get_region %p: x:%d, y:%d, w:%d, h:%d", region, region->origin.x, region->origin.y, region->size.width, region->size.height);
// DEBUG(msg);
// }
return 0;
}
/**
* Set a region to restrict further character display, scrolling, etc.
* Note that a region of zero size will reset the region to the full size of the screen.
*
* @param region pointer to a t_rect describing the rectangular region (using character cells for size and size)
*
* @return 0 on success, any other number means the region was invalid
*/
static short txt_evid_set_region(const p_rect region) {
// char msg[80];
// sprintf(msg,"SET REGION %p x:%d, y:%d, w:%d, h:%d (visible:%d,%d)",
// region, region->origin.x, region->origin.y, region->size.width, region->size.height, evid_visible_size.width, evid_visible_size.height);
// DEBUG(msg);
if ((region->size.width == 0) || (region->size.height == 0)) {
/* Set the region to the default (full screen) */
evid_region.origin.x = 0;
evid_region.origin.y = 0;
evid_region.size.width = evid_visible_size.width;
evid_region.size.height = evid_visible_size.height;
} else {
evid_region.origin.x = region->origin.x;
evid_region.origin.y = region->origin.y;
evid_region.size.width = region->size.width;
evid_region.size.height = region->size.height;
//sprintf(msg,"specific region %d %d %d %d", region->origin.x, region->origin.y, region->size.width, region->size.height);
//DEBUG(msg);
}
//sprintf(msg,"txt_evid_set_region: NEW REGION %p x:%d, y:%d, w:%d, h:%d (visible:%d,%d)",
//region, region->origin.x, region->origin.y, region->size.width, region->size.height, evid_visible_size.width, evid_visible_size.height);
//DEBUG(msg);
return 0;
}
/**
* Get the default foreground and background colors for printing
*
* @param pointer to the foreground the Text LUT index of the new current foreground color (0 - 15)
* @param pointer to the background the Text LUT index of the new current background color (0 - 15)
*/
static short txt_evid_get_color(unsigned char * foreground, unsigned char * background) {
*foreground = (evid_color & 0xf0) >> 4;
*background = evid_color & 0x0f;
return 0;
}
/**
* Set the default foreground and background colors for printing
*
* @param foreground the Text LUT index of the new current foreground color (0 - 15)
* @param background the Text LUT index of the new current background color (0 - 15)
*/
static short txt_evid_set_color(unsigned char foreground, unsigned char background) {
evid_color = ((foreground & 0x0f) << 4) + (background & 0x0f);
return 0;
}
/**
* Scroll the text in the current region
*
* @param screen the number of the text device
* @param horizontal the number of columns to scroll (negative is left, positive is right)
* @param vertical the number of rows to scroll (negative is down, positive is up)
*/
static void txt_evid_scroll(short horizontal, short vertical) {
short x, x0, x1, x2, x3, dx;
short y, y0, y1, y2, y3, dy;
/*
* Determine limits of rectangles to move and fill and directions of loops
* x0 and y0 are the positions of the first cell to be over-written
* x1 and y1 are the positions of the first cell to be copied... TEXT[x0,y0] := TEXT[x1,y1]
* x2 and y2 are the position of the last cell to be over-written
* x3 and y3 are the position of the last cell to be copied... TEXT[x2,y2] := TEXT[x3,y3]
*
* When blanking, the rectangles (x2,y0) - (x3,y3) and (x0,y2) - (x2,y3) are cleared
*/
// Determine the row limits
if (vertical >= 0) {
y0 = evid_region.origin.y;
y1 = y0 + vertical;
y3 = evid_region.origin.y + evid_region.size.height;
y2 = y3 - vertical;
dy = 1;
} else {
y0 = evid_region.origin.y + evid_region.size.height - 1;
y1 = y0 + vertical;
y3 = evid_region.origin.y - 1;
y2 = y3 - vertical;
dy = -1;
}
// Determine the column limits
if (horizontal >= 0) {
x0 = evid_region.origin.x;
x1 = x0 + horizontal;
x3 = evid_region.origin.x + evid_region.size.width;
x2 = x3 - horizontal;
dx = 1;
} else {
x0 = evid_region.origin.x + evid_region.size.width - 1;
x1 = x0 + horizontal;
x3 = evid_region.origin.x - 1;
x2 = x3 - horizontal;
dx = -1;
}
/* Copy the rectangle. */
int delta_y = dy * evid_max_size.width;
int row_dst = y0 * evid_max_size.width - delta_y;
int row_src = y0 * evid_max_size.width + vertical * evid_max_size.width - delta_y;
for (y = y0; y != y2; y += dy) {
row_dst += delta_y;
row_src += delta_y;
int offset_dst = row_dst + x0 - dx;
int offset_src = row_src + horizontal + x0 - dx;
for (x = x0; x != x2; x += dx) {
offset_dst += dx;
offset_src += dx;
evid_text_matrix[offset_dst] = evid_text_matrix[offset_src];
evid_color_matrix[offset_dst] = evid_color_matrix[offset_src];
}
}
/* Clear the rectangles */
if (horizontal != 0) {
row_dst = y0 * evid_max_size.width - delta_y;
for (y = y0; y != y3; y += dy) {
row_dst += delta_y;
for (x = x2; x != x3; x += dx) {
evid_text_matrix[row_dst + x] = ' ';
evid_color_matrix[row_dst + x] = evid_color;
}
}
}
if (vertical != 0) {
row_dst = y2 * evid_max_size.width - delta_y;
for (y = y2; y != y3; y += dy) {
row_dst += delta_y;
for (x = x0; x != x3; x += dx) {
evid_text_matrix[row_dst + x] = ' ';
evid_color_matrix[row_dst + x] = evid_color;
}
}
}
}
/**
* Fill the current region with a character in the current color
*
* @param screen the number of the text device
* @param c the character to fill the region with
*/
static void txt_evid_fill(char c) {
int x;
int y;
for (y = 0; y < evid_region.size.height; y++) {
int offset_row = (evid_region.origin.y + y) * evid_max_size.width;
for (x = 0; x < evid_region.size.width; x++) {
int offset = offset_row + evid_region.origin.x + x;
evid_text_matrix[offset] = c;
evid_color_matrix[offset] = evid_color;
}
}
}
/**
* Set the position of the cursor to (x, y) relative to the current region
* If the (x, y) coordinate is outside the region, it will be clipped to the region.
* If y is greater than the height of the region, the region will scroll until that relative
* position would be within view.
*
* @param x the column for the cursor
* @param y the row for the cursor
*/
static void txt_evid_set_xy(short x, short y) {
/* Make sure X is within range for the current region... "print" a newline if not */
if (x < 0) {
x = 0;
} else if (x >= evid_region.size.width) {
x = 0;
y++;
}
/* Make sure Y is within range for the current region... scroll if not */
if (y < 0) {
y = 0;
} else if (y >= evid_region.size.height) {
txt_evid_scroll(0, y - evid_region.size.height + 1);
y = evid_region.size.height - 1;
}
evid_cursor.x = x;
evid_cursor.y = y;
/* Set register */
*evid_crsr_column = evid_region.origin.x + x;
*evid_crsr_row = evid_region.origin.y + y;
}
/**
* Get the position of the cursor (x, y) relative to the current region
*
* @param screen the number of the text device
* @param position pointer to a t_point record to fill out
*/
static void txt_evid_get_xy(p_point position) {
position->x = evid_cursor.x;
position->y = evid_cursor.y;
}
/**
* Print a character to the current cursor position in the current color
*
* @param c the character to print
*/
static void txt_evid_put(char c) {
short x;
short y;
unsigned int offset;
x = evid_region.origin.x + evid_cursor.x;
y = evid_region.origin.y + evid_cursor.y;
offset = y * evid_max_size.width + x;
evid_text_matrix[offset] = c;
evid_color_matrix[offset] = evid_color;
txt_evid_set_xy(evid_cursor.x + 1, evid_cursor.y);
}
/**
* Initialize the screen
*/
static void txt_evid_init() {
char buffer[255];
t_rect region;
int i;
DEBUG("txt_evid_init");
evid_resolution.width = 0;
evid_resolution.height = 0;
evid_visible_size.width = 0;
evid_visible_size.height = 0;
evid_font_size.width = 0;
evid_font_size.height = 0;
/* Disable the set_sizes call for now, to avoid computing transcient unnecessary values */
evid_enable_set_sizes = 0;
/* Start with nothing on */
evid_msr_shadow = 0;
/* Define the capabilities */
/* Specify the screen number. We have only one so... */
evid_caps.number = TXT_SCREEN_EVID;
/* This screen can be text, bitmap or can be put to sleep */
evid_caps.supported_modes = TXT_MODE_TEXT;
/* Supported resolutions */
evid_caps.resolution_count = sizeof(evid_resolutions) / sizeof(t_extent);
evid_caps.resolutions = evid_resolutions;
/* Only 8x8 on the U */
evid_caps.font_size_count = sizeof(evid_fonts) / sizeof(t_extent);
evid_caps.font_sizes = evid_fonts;
/* Initialize the color lookup tables */
for (i = 0; i < sizeof(evid_clut)/sizeof(t_color4); i++) {
evid_fg_clut[i] = evid_clut[i];
evid_bg_clut[i] = evid_clut[i];
}
/* Set the mode to text */
txt_evid_set_mode(TXT_MODE_TEXT);
/* Set the resolution */
txt_evid_set_resolution(640, 480);
/* Set the default color: light grey on blue */
txt_evid_set_color(0x07, 0x04);
/* Set the font */
txt_evid_set_font(8, 8, MSX_CP437_8x8_bin); /* Use 8x8 font */
/* Set the cursor */
txt_evid_set_cursor(1, 0, 0xB1);
/* Set the border */
txt_evid_set_border(16, 16); /* Set up the border */
txt_evid_set_border_color(0, 0, 0x3f);
/*
* Enable set_sizes, now that everything is set up initially
* And calculate the size of the screen
*/
evid_enable_set_sizes = 1;
txt_evid_set_sizes();
/* Set region to default */
region.origin.x = 0;
region.origin.y = 0;
region.size.width = 0;
region.size.height = 0;
txt_evid_set_region(&region);
/* Home the cursor */
txt_evid_set_xy(0, 0);
/* Clear the screen */
txt_evid_fill(' ');
}
t_txt_device device;
/**
* Initialize and install the driver
*
* @return 0 on success, any other number is an error
*/
short txt_evid_install() {
if (txt_evid_present()) {
// Only register the EVID driver if the EVID is installed
device.number = TXT_SCREEN_EVID;
device.name = "EVID";
device.init = txt_evid_init;
device.get_capabilities = txt_evid_get_capabilities;
device.set_mode = txt_evid_set_mode;
device.set_sizes = txt_evid_set_sizes;
device.set_resolution = txt_evid_set_resolution;
device.set_border = txt_evid_set_border;
device.set_border_color = txt_evid_set_border_color;
device.set_font = txt_evid_set_font;
device.set_cursor = txt_evid_set_cursor;
device.set_cursor_visible = txt_evid_set_cursor_visible;
device.get_region = txt_evid_get_region;
device.set_region = txt_evid_set_region;
device.get_color = txt_evid_get_color;
device.set_color = txt_evid_set_color;
device.set_xy = txt_evid_set_xy;
device.get_xy = txt_evid_get_xy;
device.put = txt_evid_put;
device.scroll = txt_evid_scroll;
device.fill = txt_evid_fill;
device.get_sizes = txt_evid_get_sizes;
return txt_register(&device);
} else {
// Return an error if the EVID is not present
return -1;
}
}

22
src/dev/txt_evid.h Normal file
View file

@ -0,0 +1,22 @@
/**
* @file txt_evid.c
* @brief Low level FoenixMCP driver for the C200 EVID expansion card for the C256 computers
* @version 0.1
* @date 2023-08-09
*
*/
#ifndef __txt_evid_h__
#define __txt_evid_h__
/* If installed, the EVID is the second screen on the C256. */
#define TXT_SCREEN_EVID 1
/**
* Initialize and install the driver
*
* @return 0 on success, any other number is an error
*/
extern short txt_evid_install();
#endif

View file

@ -1,13 +1,60 @@
csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources))
.PHONY: all
all: $(cobjects)
UNIT := C256U_PLUS
# Define OS-dependent variables
ifeq ($(OS),Windows_NT)
RM = del /F/Q
else
RM = rm -f
endif
# Define model-specific variables, including tools, source files, compiler flags, etc.
ifeq ($(UNIT),C256U)
CPU=w65816
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=1 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_u.scm clib-lc-ld.a
else ifeq ($(UNIT),C256U_PLUS)
CPU=w65816
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=5 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_fmx.scm clib-lc-ld.a --rtattr printf=medium
else ifeq ($(UNIT),C256_FMX)
CPU=w65816
SRCS_FOR_UNIT=
CFLAGS_FOR_UNIT=-DMODEL=0 -DCPU=255 --target Foenix --code-model large --data-model large
LDFLAGS_FOR_UNIT=C256/ld_lc_c256_fmx.scm clib-lc-ld.a
endif
ifeq ($(CPU),w65816)
CC=cc65816
AS=as65816
LD=ln65816
AR=nlib
endif
INCLUDES=-I.. -I../include
CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l
ASFLAGS=$(INCLUDES)
SRCS = c256_diskio.c ff.c ffsystem.c ffunicode.c $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.c,%.o,$(SRCS))
OBJS4RM = $(subst /,\\,$(OBJS))
.PHONY: all clean
all: fatfs.a
# Build the devices library file for this model
fatfs.a: $(OBJS)
$(AR) $@ $^
# Build the object files from C
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONY: clean
$(CC) $(CFLAGS) -o $@ $^
# Clean up after a build
clean:
$(RM) $(aobjects) $(cobjects) *.asm
$(RM) $(OBJS4RM) fatfs.a *.lst

View file

@ -1,796 +0,0 @@
Thu May 20 2021 21:34 Page 1
***************************************
** WDC 65C816 Macro Assembler **
** **
** Version 3.49.1- Feb 6 2006 **
***************************************
1 ;:ts=8
2 00000001 R0 equ 1
3 00000005 R1 equ 5
4 00000009 R2 equ 9
5 0000000D R3 equ 13
6 ;/*-----------------------------------------------
------------------------*/
7 ;/* Low level disk I/O module SKELETON for FatFs
(C)ChaN, 2019 */
8 ;/*-----------------------------------------------
------------------------*/
9 ;/* If a working storage control module is availab
le, it should be */
10 ;/* attached to the FatFs via a glue function rath
er than modifying it. */
11 ;/* This is an example of glue functions to attach
various exsisting */
12 ;/* storage control modules to the FatFs module wi
th a defined API. */
13 ;/*-----------------------------------------------
------------------------*/
14 ;
15 ;#include "ff.h" /* Obtains integ
er types */
16 ;#include "diskio.h" /* Declarations
of disk functions */
17 ;
18 ;/* Definitions of physical drive number for each
drive */
19 ;#define DEV_SDC 0 /* Example: Map
Ramdisk to physical drive 0 */
20 ;
21 ;
22 ;/*-----------------------------------------------
------------------------*/
23 ;/* Get Drive Status
*/
24 ;/*-----------------------------------------------
------------------------*/
25 ;
26 ;DSTATUS disk_status (
27 ; BYTE pdrv /* Physical drive nmuber
to identify the drive */
28 ;)
29 ;{
30 code
31 xdef ~~disk_status
32 func
33 ~~disk_status:
34 longa on
35 longi on
36 00:0000: 3B tsc
Thu May 20 2021 21:34 Page 2
37 00:0001: 38 sec
38 00:0002: E9 03 00 sbc #L2
39 00:0005: 1B tcs
40 00:0006: 0B phd
41 00:0007: 5B tcd
42 00000004 pdrv_0 set 4
43 ; DSTATUS stat;
44 ; int result;
45 ;
46 ; k_prints("disk_status\r");
47 00000000 stat_1 set 0
48 00000001 result_1 set 1
49 00:0008: F4 xx xx pea #^L1
50 00:000B: F4 xx xx pea #<L1
51 00:000E: 22 xx xx xx jsl ~~k_prints
52 ;
53 ; switch (pdrv) {
54 00:0012: A5 07 lda <L2+pdrv_0
55 00:0014: 29 FF 00 and #$ff
56 00:0017: 82 15 00 brl L10001
57 ; case DEV_SDC:
58 L10003:
59 ;
60 ; // translate the reslut code here
61 ;
62 ; return 0;
63 00:001A: A9 00 00 lda #$0
64 L4:
65 00:001D: A8 tay
66 00:001E: A5 05 lda <L2+2
67 00:0020: 85 07 sta <L2+2+2
68 00:0022: A5 04 lda <L2+1
69 00:0024: 85 06 sta <L2+1+2
70 00:0026: 2B pld
71 00:0027: 3B tsc
72 00:0028: 18 clc
73 00:0029: 69 05 00 adc #L2+2
74 00:002C: 1B tcs
75 00:002D: 98 tya
76 00:002E: 6B rtl
77 ;
78 ; }
79 L10001:
80 xref ~~~swt
81 00:002F: 22 xx xx xx jsl ~~~swt
82 00:0033: 01 00 dw 1
83 00:0035: 00 00 dw 0
84 00:0037: xx xx dw L10003-1
85 00:0039: xx xx dw L10002-1
86 L10002:
87 ; return STA_NOINIT;
88 00:003B: A9 01 00 lda #$1
89 00:003E: 82 DC FF brl L4
90 ;}
91 00000003 L2 equ 3
92 00000001 L3 equ 1
93 ends
94 efunc
Thu May 20 2021 21:34 Page 3
95 data
96 L1:
97 00:0000: 64 69 73 6B db $64,$69,$73,$6B,$5F,$73,$74,$61,$74,$75,
$73,$0D,$00
00:0004: 5F 73 74 61
00:0008: 74 75 73 0D
00:000C: 00
98 00:000D: ends
99 ;
100 ;
101 ;
102 ;/*-----------------------------------------------
------------------------*/
103 ;/* Inidialize a Drive
*/
104 ;/*-----------------------------------------------
------------------------*/
105 ;
106 ;DSTATUS disk_initialize (
107 ; BYTE pdrv /* Physi
cal drive nmuber to identify the drive */
108 ;)
109 ;{
110 code
111 xdef ~~disk_initialize
112 func
113 ~~disk_initialize:
114 longa on
115 longi on
116 00:0041: 3B tsc
117 00:0042: 38 sec
118 00:0043: E9 03 00 sbc #L6
119 00:0046: 1B tcs
120 00:0047: 0B phd
121 00:0048: 5B tcd
122 00000004 pdrv_0 set 4
123 ; DSTATUS stat;
124 ; int result;
125 ;
126 ; k_prints("disk_initialize\r");
127 00000000 stat_1 set 0
128 00000001 result_1 set 1
129 00:0049: F4 xx xx pea #^L5
130 00:004C: F4 xx xx pea #<L5
131 00:004F: 22 xx xx xx jsl ~~k_prints
132 ;
133 ; switch (pdrv) {
134 00:0053: A5 07 lda <L6+pdrv_0
135 00:0055: 29 FF 00 and #$ff
136 00:0058: 82 28 00 brl L10004
137 ; case DEV_SDC :
138 L10006:
139 ; if (bios_mount(2)) {
140 00:005B: F4 02 00 pea #<$2
141 00:005E: 22 xx xx xx jsl ~~bios_mount
142 00:0062: AA tax
143 00:0063: D0 03 bne L8
144 00:0065: 82 15 00 brl L10007
Thu May 20 2021 21:34 Page 4
145 L8:
146 ; return STA_NOINIT;
147 00:0068: A9 01 00 lda #$1
148 L9:
149 00:006B: A8 tay
150 00:006C: A5 05 lda <L6+2
151 00:006E: 85 07 sta <L6+2+2
152 00:0070: A5 04 lda <L6+1
153 00:0072: 85 06 sta <L6+1+2
154 00:0074: 2B pld
155 00:0075: 3B tsc
156 00:0076: 18 clc
157 00:0077: 69 05 00 adc #L6+2
158 00:007A: 1B tcs
159 00:007B: 98 tya
160 00:007C: 6B rtl
161 ; } else {
162 L10007:
163 ; return 0;
164 00:007D: A9 00 00 lda #$0
165 00:0080: 82 E8 FF brl L9
166 ; }
167 ; }
168 L10004:
169 xref ~~~swt
170 00:0083: 22 xx xx xx jsl ~~~swt
171 00:0087: 01 00 dw 1
172 00:0089: 00 00 dw 0
173 00:008B: xx xx dw L10006-1
174 00:008D: xx xx dw L10005-1
175 L10005:
176 ; return STA_NOINIT;
177 00:008F: A9 01 00 lda #$1
178 00:0092: 82 D6 FF brl L9
179 ;}
180 00000003 L6 equ 3
181 00000001 L7 equ 1
182 ends
183 efunc
184 data
185 L5:
186 00:000D: 64 69 73 6B db $64,$69,$73,$6B,$5F,$69,$6E,$69,$74,$69,
$61,$6C,$69,$7A,$65
00:0011: 5F 69 6E 69
00:0015: 74 69 61 6C
00:0019: 69 7A 65
187 00:001C: 0D 00 db $0D,$00
188 00:001E: ends
189 ;
190 ;
191 ;
192 ;/*-----------------------------------------------
------------------------*/
193 ;/* Read Sector(s)
*/
194 ;/*-----------------------------------------------
------------------------*/
195 ;
Thu May 20 2021 21:34 Page 5
196 ;DRESULT disk_read (
197 ; BYTE pdrv, /* Physical drive nmuber
to identify the drive */
198 ; BYTE *buff, /* Data buffer to store
read data */
199 ; LBA_t sector, /* Start sector in LBA */
200 ; UINT count /* Number of sectors to
read */
201 ;)
202 ;{
203 code
204 xdef ~~disk_read
205 func
206 ~~disk_read:
207 longa on
208 longi on
209 00:0095: 3B tsc
210 00:0096: 38 sec
211 00:0097: E9 04 00 sbc #L11
212 00:009A: 1B tcs
213 00:009B: 0B phd
214 00:009C: 5B tcd
215 00000004 pdrv_0 set 4
216 00000006 buff_0 set 6
217 0000000A sector_0 set 10
218 0000000E count_0 set 14
219 ; DRESULT res;
220 ; int result;
221 ;
222 ; k_prints("disk_read\r");
223 00000000 res_1 set 0
224 00000002 result_1 set 2
225 00:009D: F4 xx xx pea #^L10
226 00:00A0: F4 xx xx pea #<L10
227 00:00A3: 22 xx xx xx jsl ~~k_prints
228 ;
229 ; switch (pdrv) {
230 00:00A7: A5 08 lda <L11+pdrv_0
231 00:00A9: 29 FF 00 and #$ff
232 00:00AC: 82 21 00 brl L10008
233 ; case DEV_SDC:
234 L10010:
235 ; // translate the arguments here
236 ;
237 ; return bios_getblock(2, sector, buff);
238 00:00AF: D4 0C pei <L11+buff_0+2
239 00:00B1: D4 0A pei <L11+buff_0
240 00:00B3: D4 10 pei <L11+sector_0+2
241 00:00B5: D4 0E pei <L11+sector_0
242 00:00B7: F4 02 00 pea #<$2
243 00:00BA: 22 xx xx xx jsl ~~bios_getblock
244 L13:
245 00:00BE: A8 tay
246 00:00BF: A5 06 lda <L11+2
247 00:00C1: 85 12 sta <L11+2+12
248 00:00C3: A5 05 lda <L11+1
249 00:00C5: 85 11 sta <L11+1+12
250 00:00C7: 2B pld
Thu May 20 2021 21:34 Page 6
251 00:00C8: 3B tsc
252 00:00C9: 18 clc
253 00:00CA: 69 10 00 adc #L11+12
254 00:00CD: 1B tcs
255 00:00CE: 98 tya
256 00:00CF: 6B rtl
257 ; }
258 L10008:
259 xref ~~~swt
260 00:00D0: 22 xx xx xx jsl ~~~swt
261 00:00D4: 01 00 dw 1
262 00:00D6: 00 00 dw 0
263 00:00D8: xx xx dw L10010-1
264 00:00DA: xx xx dw L10009-1
265 L10009:
266 ;
267 ; return RES_PARERR;
268 00:00DC: A9 04 00 lda #$4
269 00:00DF: 82 DC FF brl L13
270 ;}
271 00000004 L11 equ 4
272 00000001 L12 equ 1
273 ends
274 efunc
275 data
276 L10:
277 00:001E: 64 69 73 6B db $64,$69,$73,$6B,$5F,$72,$65,$61,$64,$0D,
$00
00:0022: 5F 72 65 61
00:0026: 64 0D 00
278 00:0029: ends
279 ;
280 ;
281 ;
282 ;/*-----------------------------------------------
------------------------*/
283 ;/* Write Sector(s)
*/
284 ;/*-----------------------------------------------
------------------------*/
285 ;
286 ;#if FF_FS_READONLY == 0
287 ;
288 ;DRESULT disk_write (
289 ; BYTE pdrv, /* Physical driv
e nmuber to identify the drive */
290 ; const BYTE *buff, /* Data to be written */
291 ; LBA_t sector, /* Start sector in LBA *
/
292 ; UINT count /* Number of sec
tors to write */
293 ;)
294 ;{
295 code
296 xdef ~~disk_write
297 func
298 ~~disk_write:
299 longa on
Thu May 20 2021 21:34 Page 7
300 longi on
301 00:00E2: 3B tsc
302 00:00E3: 38 sec
303 00:00E4: E9 04 00 sbc #L15
304 00:00E7: 1B tcs
305 00:00E8: 0B phd
306 00:00E9: 5B tcd
307 00000004 pdrv_0 set 4
308 00000006 buff_0 set 6
309 0000000A sector_0 set 10
310 0000000E count_0 set 14
311 ; DRESULT res;
312 ; int result;
313 ;
314 ; k_prints("disk_write\r");
315 00000000 res_1 set 0
316 00000002 result_1 set 2
317 00:00EA: F4 xx xx pea #^L14
318 00:00ED: F4 xx xx pea #<L14
319 00:00F0: 22 xx xx xx jsl ~~k_prints
320 ;
321 ; switch (pdrv) {
322 00:00F4: A5 08 lda <L15+pdrv_0
323 00:00F6: 29 FF 00 and #$ff
324 00:00F9: 82 15 00 brl L10011
325 ; case DEV_SDC:
326 L10013:
327 ; // translate the arguments here
328 ;
329 ;
330 ; // translate the reslut code here
331 ;
332 ; return 0;
333 00:00FC: A9 00 00 lda #$0
334 L17:
335 00:00FF: A8 tay
336 00:0100: A5 06 lda <L15+2
337 00:0102: 85 12 sta <L15+2+12
338 00:0104: A5 05 lda <L15+1
339 00:0106: 85 11 sta <L15+1+12
340 00:0108: 2B pld
341 00:0109: 3B tsc
342 00:010A: 18 clc
343 00:010B: 69 10 00 adc #L15+12
344 00:010E: 1B tcs
345 00:010F: 98 tya
346 00:0110: 6B rtl
347 ; }
348 L10011:
349 xref ~~~swt
350 00:0111: 22 xx xx xx jsl ~~~swt
351 00:0115: 01 00 dw 1
352 00:0117: 00 00 dw 0
353 00:0119: xx xx dw L10013-1
354 00:011B: xx xx dw L10012-1
355 L10012:
356 ;
357 ; return RES_PARERR;
Thu May 20 2021 21:34 Page 8
358 00:011D: A9 04 00 lda #$4
359 00:0120: 82 DC FF brl L17
360 ;}
361 00000004 L15 equ 4
362 00000001 L16 equ 1
363 ends
364 efunc
365 data
366 L14:
367 00:0029: 64 69 73 6B db $64,$69,$73,$6B,$5F,$77,$72,$69,$74,$65,
$0D,$00
00:002D: 5F 77 72 69
00:0031: 74 65 0D 00
368 00:0035: ends
369 ;
370 ;#endif
371 ;
372 ;
373 ;/*-----------------------------------------------
------------------------*/
374 ;/* Miscellaneous Functions
*/
375 ;/*-----------------------------------------------
------------------------*/
376 ;
377 ;DRESULT disk_ioctl (
378 ; BYTE pdrv, /* Physical drive nmuber
(0..) */
379 ; BYTE cmd, /* Control code */
380 ; void *buff /* Buffer to send/receiv
e control data */
381 ;)
382 ;{
383 code
384 xdef ~~disk_ioctl
385 func
386 ~~disk_ioctl:
387 longa on
388 longi on
389 00:0123: 3B tsc
390 00:0124: 38 sec
391 00:0125: E9 04 00 sbc #L19
392 00:0128: 1B tcs
393 00:0129: 0B phd
394 00:012A: 5B tcd
395 00000004 pdrv_0 set 4
396 00000006 cmd_0 set 6
397 00000008 buff_0 set 8
398 ; DRESULT res;
399 ; int result;
400 ;
401 ; k_prints("disk_ioctl\r");
402 00000000 res_1 set 0
403 00000002 result_1 set 2
404 00:012B: F4 xx xx pea #^L18
405 00:012E: F4 xx xx pea #<L18
406 00:0131: 22 xx xx xx jsl ~~k_prints
407 ;
Thu May 20 2021 21:34 Page 9
408 ; switch (pdrv) {
409 00:0135: A5 08 lda <L19+pdrv_0
410 00:0137: 29 FF 00 and #$ff
411 00:013A: 82 15 00 brl L10014
412 ; case DEV_SDC:
413 L10016:
414 ;
415 ; // Process of the command for the RAM dr
ive
416 ;
417 ; return 0;
418 00:013D: A9 00 00 lda #$0
419 L21:
420 00:0140: A8 tay
421 00:0141: A5 06 lda <L19+2
422 00:0143: 85 0E sta <L19+2+8
423 00:0145: A5 05 lda <L19+1
424 00:0147: 85 0D sta <L19+1+8
425 00:0149: 2B pld
426 00:014A: 3B tsc
427 00:014B: 18 clc
428 00:014C: 69 0C 00 adc #L19+8
429 00:014F: 1B tcs
430 00:0150: 98 tya
431 00:0151: 6B rtl
432 ; }
433 L10014:
434 xref ~~~swt
435 00:0152: 22 xx xx xx jsl ~~~swt
436 00:0156: 01 00 dw 1
437 00:0158: 00 00 dw 0
438 00:015A: xx xx dw L10016-1
439 00:015C: xx xx dw L10015-1
440 L10015:
441 ;
442 ; return RES_PARERR;
443 00:015E: A9 04 00 lda #$4
444 00:0161: 82 DC FF brl L21
445 ;}
446 00000004 L19 equ 4
447 00000001 L20 equ 1
448 ends
449 efunc
450 data
451 L18:
452 00:0035: 64 69 73 6B db $64,$69,$73,$6B,$5F,$69,$6F,$63,$74,$6C,
$0D,$00
00:0039: 5F 69 6F 63
00:003D: 74 6C 0D 00
453 00:0041: ends
454 ;
455 ;#define BIOS_STATUS ((volatile char *)0x000320)
456 ;#define BIOS_DEV ((volatile char *)0x000321)
457 ;#define BIOS_LBA ((volatile long *)0x000322)
458 ;#define BIOS_BUFFER ((volatile long *)0x000326)
459 ;
460 ;/**
461 ; * Call the C256 F_MOUNT kernel routine
Thu May 20 2021 21:34 Page 10
462 ; */
463 ;int bios_mount(char dev) {
464 code
465 xdef ~~bios_mount
466 func
467 ~~bios_mount:
468 longa on
469 longi on
470 00:0164: 3B tsc
471 00:0165: 38 sec
472 00:0166: E9 00 00 sbc #L23
473 00:0169: 1B tcs
474 00:016A: 0B phd
475 00:016B: 5B tcd
476 00000004 dev_0 set 4
477 ; asm {
478 ; LDA %%dev
479 ; jsl $001128
480 ; }
481 asmstart
482 00:016C: A5 04 LDA <L23+dev_0
483 00:016E: 22 28 11 00 jsl $001128
484 asmend
485 ;
486 ; if ((*BIOS_STATUS & 0x80) != 0) {
487 00:0172: E2 20 sep #$20
488 longa off
489 00:0174: AF 20 03 00 lda >800 ; volatile
490 00:0178: 29 80 and #<$80
491 00:017A: C2 20 rep #$20
492 longa on
493 00:017C: D0 03 bne L25
494 00:017E: 82 15 00 brl L10017
495 L25:
496 ; return RES_ERROR;
497 00:0181: A9 01 00 lda #$1
498 L26:
499 00:0184: A8 tay
500 00:0185: A5 02 lda <L23+2
501 00:0187: 85 04 sta <L23+2+2
502 00:0189: A5 01 lda <L23+1
503 00:018B: 85 03 sta <L23+1+2
504 00:018D: 2B pld
505 00:018E: 3B tsc
506 00:018F: 18 clc
507 00:0190: 69 02 00 adc #L23+2
508 00:0193: 1B tcs
509 00:0194: 98 tya
510 00:0195: 6B rtl
511 ; } else {
512 L10017:
513 ; return RES_OK;
514 00:0196: A9 00 00 lda #$0
515 00:0199: 82 E8 FF brl L26
516 ; }
517 ;}
518 00000000 L23 equ 0
519 00000001 L24 equ 1
Thu May 20 2021 21:34 Page 11
520 ends
521 efunc
522 ;
523 ;/**
524 ; * Call the C256 GETBLOCK kernel routine
525 ; */
526 ;int bios_getblock(char dev, long lba, char * buff
er) {
527 code
528 xdef ~~bios_getblock
529 func
530 ~~bios_getblock:
531 longa on
532 longi on
533 00:019C: 3B tsc
534 00:019D: 38 sec
535 00:019E: E9 04 00 sbc #L27
536 00:01A1: 1B tcs
537 00:01A2: 0B phd
538 00:01A3: 5B tcd
539 00000004 dev_0 set 4
540 00000006 lba_0 set 6
541 0000000A buffer_0 set 10
542 ; *BIOS_DEV = dev;
543 00:01A4: E2 20 sep #$20
544 longa off
545 00:01A6: A5 08 lda <L27+dev_0
546 00:01A8: 8F 21 03 00 sta >801 ; volatile
547 00:01AC: C2 20 rep #$20
548 longa on
549 ; *BIOS_LBA = lba;
550 00:01AE: A5 0A lda <L27+lba_0
551 00:01B0: 8F 22 03 00 sta >802 ; volatile
552 00:01B4: A5 0C lda <L27+lba_0+2
553 00:01B6: 8F 24 03 00 sta >802+2 ; volatile
554 ; *BIOS_BUFFER = (long)buffer;
555 00:01BA: A5 0E lda <L27+buffer_0
556 00:01BC: 8F 26 03 00 sta >806 ; volatile
557 00:01C0: A5 10 lda <L27+buffer_0+2
558 00:01C2: 8F 28 03 00 sta >806+2 ; volatile
559 ; k_prints("getblock: ");
560 00:01C6: F4 xx xx pea #^L22
561 00:01C9: F4 xx xx pea #<L22
562 00:01CC: 22 xx xx xx jsl ~~k_prints
563 ; k_printh(dev);
564 00:01D0: A5 08 lda <L27+dev_0
565 00:01D2: 29 FF 00 and #$ff
566 00:01D5: 48 pha
567 00:01D6: 22 xx xx xx jsl ~~k_printh
568 ; k_prints(" ");
569 00:01DA: F4 xx xx pea #^L22+11
570 00:01DD: F4 xx xx pea #<L22+11
571 00:01E0: 22 xx xx xx jsl ~~k_prints
572 ; k_printh(lba >> 16);
573 00:01E4: D4 0C pei <L27+lba_0+2
574 00:01E6: D4 0A pei <L27+lba_0
575 00:01E8: A9 10 00 lda #$10
576 xref ~~~lasr
Thu May 20 2021 21:34 Page 12
577 00:01EB: 22 xx xx xx jsl ~~~lasr
578 00:01EF: 85 01 sta <R0
579 00:01F1: 86 03 stx <R0+2
580 00:01F3: D4 03 pei <R0+2
581 00:01F5: D4 01 pei <R0
582 00:01F7: 22 xx xx xx jsl ~~k_printh
583 ; k_printh(lba & 0xffff);
584 00:01FB: A5 0A lda <L27+lba_0
585 00:01FD: 85 01 sta <R0
586 00:01FF: 64 03 stz <R0+2
587 00:0201: D4 03 pei <R0+2
588 00:0203: D4 01 pei <R0
589 00:0205: 22 xx xx xx jsl ~~k_printh
590 ; asm {
591 ; jsl $001044
592 ; };
593 asmstart
594 00:0209: 22 44 10 00 jsl $001044
595 asmend
596 ;
597 ; if ((*BIOS_STATUS & 0x80) != 0) {
598 00:020D: E2 20 sep #$20
599 longa off
600 00:020F: AF 20 03 00 lda >800 ; volatile
601 00:0213: 29 80 and #<$80
602 00:0215: C2 20 rep #$20
603 longa on
604 00:0217: D0 03 bne L29
605 00:0219: 82 36 00 brl L10018
606 L29:
607 ; k_prints(" Error: ");
608 00:021C: F4 xx xx pea #^L22+13
609 00:021F: F4 xx xx pea #<L22+13
610 00:0222: 22 xx xx xx jsl ~~k_prints
611 ; k_printh(*BIOS_STATUS);
612 00:0226: E2 20 sep #$20
613 longa off
614 00:0228: AF 20 03 00 lda >800 ; volatile
615 00:022C: C2 20 rep #$20
616 longa on
617 00:022E: 29 FF 00 and #$ff
618 00:0231: 48 pha
619 00:0232: 22 xx xx xx jsl ~~k_printh
620 ; k_putc('\r');
621 00:0236: F4 0D 00 pea #<$d
622 00:0239: 22 xx xx xx jsl ~~k_putc
623 ; return RES_ERROR;
624 00:023D: A9 01 00 lda #$1
625 L30:
626 00:0240: A8 tay
627 00:0241: A5 06 lda <L27+2
628 00:0243: 85 10 sta <L27+2+10
629 00:0245: A5 05 lda <L27+1
630 00:0247: 85 0F sta <L27+1+10
631 00:0249: 2B pld
632 00:024A: 3B tsc
633 00:024B: 18 clc
634 00:024C: 69 0E 00 adc #L27+10
Thu May 20 2021 21:34 Page 13
635 00:024F: 1B tcs
636 00:0250: 98 tya
637 00:0251: 6B rtl
638 ; } else {
639 L10018:
640 ; k_prints(" OK\r");
641 00:0252: F4 xx xx pea #^L22+22
642 00:0255: F4 xx xx pea #<L22+22
643 00:0258: 22 xx xx xx jsl ~~k_prints
644 ; return RES_OK;
645 00:025C: A9 00 00 lda #$0
646 00:025F: 82 DE FF brl L30
647 ; }
648 ;}
649 00000004 L27 equ 4
650 00000005 L28 equ 5
651 ends
652 efunc
653 data
654 L22:
655 00:0041: 67 65 74 62 db $67,$65,$74,$62,$6C,$6F,$63,$6B,$3A,$20,
$00,$20,$00,$20,$45
00:0045: 6C 6F 63 6B
00:0049: 3A 20 00 20
00:004D: 00 20 45
656 00:0050: 72 72 6F 72 db $72,$72,$6F,$72,$3A,$20,$00,$20,$4F,$4B,
$0D,$00
00:0054: 3A 20 00 20
00:0058: 4F 4B 0D 00
657 00:005C: ends
658 ;
659 ;/**
660 ; * Call the C256 PUTBLOCK kernel routine
661 ; */
662 ;// int bios_putblock(char dev, long lba, char * b
uffer) {
663 ;// *BIOS_DEV = dev;
664 ;// *BIOS_LBA = lba;
665 ;// *BIOS_BUFFER = (long)buffer;
666 ;// asm {
667 ;// jsl $001024
668 ;// };
669 ;
670 ;// if (*BIOS_STATUS != 0) {
671 ;// return RES_ERROR;
672 ;// } else {
673 ;// return RES_OK;
674 ;// }
675 ;// }
676 ;
677 xref ~~k_putc
678 xref ~~k_printh
679 xref ~~k_prints
680 end
Lines assembled: 680
Errors: 0
Thu May 20 2021 21:34 Page 14

View file

@ -7,7 +7,6 @@
#define DEFAULT_LOG_LEVEL LOG_TRACE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -31,11 +30,15 @@
#include "dev/txt_a2560k_b.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "dev/txt_a2560u.h"
#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
#include "dev/txt_c256.h"
#include "dev/txt_evid.h"
#endif
#include "syscalls.h"
#include "timers.h"
#include "boot.h"
#include "dev/bitmap.h"
#include "memory.h"
#include "dev/block.h"
#include "dev/channel.h"
@ -59,6 +62,7 @@
#include "fatfs/ff.h"
#include "cli/cli.h"
#include "rsrc/font/MSX_CP437_8x8.h"
#include "rsrc/bitmaps/image.h"
const char* VolumeStr[FF_VOLUMES] = { "sd", "fd", "hd" };
@ -296,6 +300,8 @@ void print_error(short channel, char * message, short code) {
print(channel, "\n");
}
t_sys_info info;
/*
* Initialize the kernel systems.
*/
@ -306,6 +312,11 @@ void initialize() {
/* Setup logging early */
log_init();
log_setlevel(DEFAULT_LOG_LEVEL);
/* Fill out the system information */
sys_get_information(&info);
#if 0
char msg[] = "This is some text to test that the debug to UART works ok\r\n";
{
@ -336,36 +347,60 @@ void initialize() {
log(LOG_INFO, "Initializing screens...");
txt_init_screen(TXT_SCREEN_A2560K_A);
txt_init_screen(TXT_SCREEN_A2560K_B);
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
txt_a2560u_install();
txt_init_screen(TXT_SCREEN_A2560U);
#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
// Install and initialize the main screen text driver
txt_c256_install();
txt_init_screen(TXT_SCREEN_C256);
// If the EVID card is plugged in, install and initialize the EVID driver
if (info.screens > 1) {
short result = txt_evid_install();
txt_init_screen(TXT_SCREEN_EVID);
}
#else
#error Cannot identify screen setup
#endif
log(LOG_INFO, "Text system initialized");
INFO("Text system initialized...");
#if MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
// Initialize the bitmap system
bm_init();
INFO("Bitmap system initialized...");
#endif
/* Initialize the indicators */
ind_init();
log(LOG_INFO, "Indicators initialized");
INFO("Indicators initialized");
/* Initialize the interrupt system */
int_init();
INFO("Interrupts initialized");
#if HAS_SUPERIO
/* Initialize the SuperIO chip */
init_SuperIO_config_zones(); // This Init used to be done by the FPGA.
init_superio();
INFO("SuperIO initialized");
#endif
/* Mute the PSG */
psg_mute_all();
INFO("PSGs muted");
/* Initialize and mute the SID chips */
sid_init_all();
INFO("SIDs initialized");
/* Initialize the Yamaha sound chips (well, turn their volume down at least) */
ym_init();
INFO("Yamaha soundchips initialized");
/* Initialize the CODEC */
init_codec();
@ -376,7 +411,7 @@ void initialize() {
bdev_init_system(); // Initialize the channel device system
INFO("Block device system ready.");
if (res = con_install()) {
if ((res = con_install())) {
log_num(LOG_ERROR, "FAILED: Console installation", res);
} else {
INFO("Console installed.");
@ -384,9 +419,11 @@ void initialize() {
/* Initialize the timers the MCP uses */
timers_init();
INFO("Timers initialized");
/* Initialize the real time clock */
rtc_init();
INFO("Real time clock initialized");
target_jiffies = sys_time_jiffies() + 300; /* 5 seconds minimum */
DEBUG1("target_jiffies assigned: %d", target_jiffies);
@ -397,21 +434,22 @@ void initialize() {
/* Play the SID test bong on the Gideon SID implementation */
sid_test_internal();
TRACE("Internal SID tested");
if (res = pata_install()) {
if ((res = pata_install())) {
log_num(LOG_ERROR, "FAILED: PATA driver installation", res);
} else {
INFO("PATA driver installed.");
}
if (res = sdc_install()) {
if ((res = sdc_install())) {
ERROR1("FAILED: SDC driver installation %d", res);
} else {
INFO("SDC driver installed.");
}
#if HAS_FLOPPY
if (res = fdc_install()) {
if ((res = fdc_install())) {
ERROR1("FAILED: Floppy drive initialization %d", res);
} else {
INFO("Floppy drive initialized.");
@ -420,14 +458,14 @@ void initialize() {
// At this point, we should be able to call into to console to print to the screens
if (res = ps2_init()) {
if ((res = ps2_init())) {
print_error(0, "FAILED: PS/2 keyboard initialization", res);
} else {
log(LOG_INFO, "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);
} else {
log(LOG_INFO, "A2560K built-in keyboard initialized.");
@ -435,7 +473,7 @@ void initialize() {
#endif
#if HAS_PARALLEL_PORT
if (res = lpt_install()) {
if ((res = lpt_install())) {
log_num(LOG_ERROR, "FAILED: LPT installation", res);
} else {
log(LOG_INFO, "LPT installed.");
@ -443,7 +481,7 @@ void initialize() {
#endif
#if HAS_MIDI_PORTS
if (res = midi_install()) {
if ((res = midi_install())) {
log_num(LOG_ERROR, "FAILED: MIDI installation", res);
} else {
log(LOG_INFO, "MIDI installed.");
@ -462,7 +500,7 @@ void initialize() {
INFO("CLI initialized.");
}
if (res = fsys_init()) {
if ((res = fsys_init())) {
log_num(LOG_ERROR, "FAILED: file system initialization", res);
} else {
INFO("File system initialized.");
@ -471,15 +509,14 @@ void initialize() {
#define BOOT_DEFAULT -1 // User chose default, or the time to over-ride has passed
t_file_info file;
int main(int argc, char * argv[]) {
short result;
short i;
//*((volatile uint32_t*const)0xfec80008) = 0xff99ff22L;
initialize();
//*((volatile uint32_t*const)0xfec00000) = 0x16;
#if MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
// Make sure the command path is set to the default before we get started
cli_command_set("");
@ -490,7 +527,36 @@ int main(int argc, char * argv[]) {
boot_from_bdev(boot_dev);
log(LOG_INFO, "Stopping.");
#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
printf("\n\nSDC directory:\n");
int directory = fsys_opendir("/sd/");
while (fsys_readdir(directory, &file) == 0) {
if (file.name[0] == 0) {
break;
}
printf("%s\n", file.name);
}
fsys_closedir(directory);
printf("\n\nHDC directory:\n");
directory = fsys_opendir("/hd/");
while (fsys_readdir(directory, &file) == 0) {
if (file.name[0] == 0) {
break;
}
printf("%s\n", file.name);
}
fsys_closedir(directory);
txt_clear(0, 2);
bm_fill((uint8_t *)0xb00000, 0, 640, 480);
bm_load_clut(0, splashscreen_lut);
bm_load_rle((uint8_t *)0xb00000, splashscreen_pix, 640, 480);
bm_set_data(0, (uint8_t *)0xb00000);
bm_set_visibility(0, 0, 1);
#endif
/* Infinite loop... */
while (1) {};
while (1) {
};
}

View file

@ -0,0 +1,36 @@
/**
* @file dma_c256.h
* @brief Definitions of the video and system DMA registers
* @version 0.1
* @date 2023-10-02
*
*/
#ifndef __DMA_C256_H_
#define __DMA_C256_H_
#define VDMA_CTRL ((volatile __attribute__((far)) uint8_t *)0xaf0400)
#define VDMA_CTRL_EN 0x01
#define VDMA_CTRL_2D 0x02
#define VDMA_CTRL_FILL 0x04
#define VDMA_CTRL_IEN 0x08 // Interrupt Enable
#define VDMA_CTRL_SRC_SRAM 0x10
#define VDMA_CTRL_DST_SRAM 0x20
#define VDMA_CTRL_TRF 0x80
#define VDMA_STAT ((volatile __attribute__((far)) uint8_t *)0xaf0401)
#define VDMA_STAT_ERR_SIZE 0x01
#define VDMA_STAT_ERR_DST 0x02
#define VDMA_STAT_ERR_SRC 0x04
#define VDMA_STAT_TFR_BUSY 0x80
#define VDMA_FILL_VALUE ((volatile __attribute__((far)) uint8_t *)0xaf0401)
#define VDMA_SRC_ADDR ((volatile __attribute__((far)) uint8_t *)0xaf0402)
#define VDMA_DST_ADDR ((volatile __attribute__((far)) uint8_t *)0xaf0405)
#define VDMA_SIZE ((volatile __attribute__((far)) uint8_t *)0xaf0408)
#define VDMA_SIZE_X ((volatile __attribute__((far)) uint16_t *)0xaf0408)
#define VDMA_SIZE_Y ((volatile __attribute__((far)) uint16_t *)0xaf040a)
#define VDMA_SRC_STRIDE ((volatile __attribute__((far)) uint16_t *)0xaf040c)
#define VDMA_DST_STRIDE ((volatile __attribute__((far)) uint16_t *)0xaf040e)
#endif

View file

@ -0,0 +1,47 @@
/**
* @file expansion.h
* @brief Register definitions for the C256 expansion card
* @version 0.1
* @date 2023-08-30
*
*/
#ifndef __EXPANSION_H_
#define __EXPANSION_H_
#include <stdint.h>
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
struct s_c256_exp_card {
char card_name[16]; // ASCII-Z name of card (max 15 characters)
uint16_t vendor_id; // ID of vendor
uint16_t card_id; // ID of card
uint16_t class_id; // TBD
uint16_t subclass_id; // TBD
uint16_t rsrv1; // Reserved
uint8_t hardware_revision; // 00 in hex
uint8_t fpga_rev; // 00 in hex
uint16_t rsrv2; // Reserved
uint16_t chksum; // Not implemented
};
#define EXP_CARD_INFO ((volatile __attribute__((far)) struct s_c256_exp_card *)0xae0000)
/**
* Card Vendor IDs (currently there is only an ID for Foenix Retro Systems)
*/
#define EXP_VENDOR_FOENIX 0xf0e1
/**
* Expansion Card IDs (currently only the EVID and ESID cards are supported)
*/
#define EXP_CARD_C100_ESID 0x9172
#define EXP_CARD_C200_EVID 0x00c8
#endif
#endif

View file

@ -0,0 +1,84 @@
/**
* @file gabe.h
* @brief Definitions for the GABE chip
* @version 0.1
* @date 2023-08-30
*
*/
#ifndef __GABE_H_
#define __GABE_H_
#include <stdint.h>
#include "types.h"
#define GABE_CTRL_REG ((volatile __attribute__((far)) uint8_t *)0xafe880)
#define GABE_CTRL_PWR_LED 0x01 // Controls the LED in the Front of the case (Next to the reset button)
#define GABE_CTRL_SDC_LED 0x02 // Controls the LED in the Front of the Case (Next to SDCard)
#define GABE_CTRL_STS_LED0 0x04 // Control Status LED0 (General Use) - C256 Foenix U Only
#define GABE_CTRL_STS_LED1 0x08 // Control Status LED0 (General Use) - C256 Foenix U Only
#define BUZZER_CONTROL 0x10 // Controls the Buzzer
#define GABE_CTRL_WRM_RST 0x80 // Warm Reset (needs to Setup other registers)
#define GABE_RST_AUTH ((volatile __attribute__((far)) uint16_t *)0xafe882) // Set to 0xDEAD to enable reset
#define GABE_LED_FLASH_CTRL ((volatile __attribute__((far)) uint8_t *)0xafe881) // Flashing LED Control
#define GABE_LED0_FLASH_CTRL 0x01 // 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control)
#define GABE_LED1_FLASH_CTRL 0x02 // 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED1 to manually control)
#define GABE_LD0_FLASH_FRQ_MASK 0x30
#define GABE_LD0_FLASH_FRQ_1HZ 0x00 // LD0 flashes at 1Hz
#define GABE_LD0_FLASH_FRQ_2HZ 0x10 // LD0 flashes at 2Hz
#define GABE_LD0_FLASH_FRQ_4HZ 0x20 // LD0 flashes at 4Hz
#define GABE_LD0_FLASH_FRQ_5HZ 0x30 // LD0 flashes at 5Hz
#define GABE_LD1_FLASH_FRQ_MASK 0xc0
#define GABE_LD1_FLASH_FRQ_1HZ 0x00 // LD1 flashes at 2Hz
#define GABE_LD1_FLASH_FRQ_2HZ 0x40 // LD1 flashes at 4Hz
#define GABE_LD1_FLASH_FRQ_4HZ 0x80 // LD1 flashes at 5Hz
#define GABE_LD1_FLASH_FRQ_5HZ 0xc0 // LD1 flashes at 1Hz
#define GABE_RNG_DATA ((volatile __attribute__((far)) uint16_t *)0xafe884) // Random Number Generator (read for data, write for seed)
#define GABE_RNG_SEED ((volatile __attribute__((far)) uint16_t *)0xafe884) // Random Number Generator (read for data, write for seed)
#define GABE_RNG_STAT ((volatile __attribute__((far)) uint16_t *)0xafe886) // Random Number Generator Status (read)
#define GABE_RNG_LFSR_DONE 0x80
#define GABE_RNG_CTRL ((volatile __attribute__((far)) uint16_t *)0xafe886) // Random Number Generator Control (write)
#define GABE_RNG_CTRL_EN 0x01 // Enable the LFSR block
#define GABE_RNG_CTRL_LD_SEED 0x02 // Toggle after setting seed to load seed
#define GABE_DIP_REG ((volatile __attribute__((far)) uint16_t *)0xafe80e) // User and boot mode DIP switches
#define HD_INSTALLED 0x0080
#define DIP_BOOT_IDE 0x0000
#define DIP_BOOT_SDCARD 0x0100
#define DIP_BOOT_FLOPPY 0x0200
/**
* @brief Structure to represent the machine ID and expansion card info
*
*/
union gabe_sys_stat_u {
struct {
uint8_t machine_id:3;
uint8_t rsrv:1;
uint8_t no_expansion:1;
};
uint8_t reg;
};
#define GABE_SYS_STAT ((volatile __attribute__((far)) union gabe_sys_stat_u *)0xafe887)
/**
* @brief Structure to respresent the version of the GABE chip
*
*/
struct gabe_version_s {
uint16_t subversion;
uint16_t version;
uint16_t model;
};
#define GABE_VERSION ((volatile __attribute__((far)) struct gabe_version_s *)0xafe88a)
#endif

View file

@ -0,0 +1,20 @@
/*
* Definitions to access the PATA port on the C256
*/
#ifndef __PATA_C256_H
#define __PATA_C256_H
#include <stdint.h>
#define PATA_DATA_16 ((volatile uint16_t *)0xAFE838)
#define PATA_DATA_8 ((volatile uint8_t *)0xAFE830)
#define PATA_ERROR ((volatile uint8_t *)0xAFE831)
#define PATA_SECT_CNT ((volatile uint8_t *)0xAFE832)
#define PATA_SECT_SRT ((volatile uint8_t *)0xAFE833)
#define PATA_CLDR_LO ((volatile uint8_t *)0xAFE834)
#define PATA_CLDR_HI ((volatile uint8_t *)0xAFE835)
#define PATA_HEAD ((volatile uint8_t *)0xAFE836)
#define PATA_CMD_STAT ((volatile uint8_t *)0xAFE837)
#endif

View file

@ -0,0 +1,26 @@
#ifndef __PS2_C256_H
#define __PS2_C256_H
/*
* Ports for the PS/2 keyboard and mouse on the C256
*/
#if MODEL == MODEL_FOENIX_FMX
#define PS2_STATUS ((volatile __attribute__((far)) char *)0xaf1064)
#define PS2_CMD_BUF ((volatile __attribute__((far)) char *)0xaf1064)
#define PS2_OUT_BUF ((volatile __attribute__((far)) char *)0xaf1060)
#define PS2_INPT_BUF ((volatile __attribute__((far)) char *)0xaf1060)
#define PS2_DATA_BUF ((volatile __attribute__((far)) char *)0xaf1060)
#else
#define PS2_STATUS ((volatile __attribute__((far)) char *)0xaf1807)
#define PS2_CMD_BUF ((volatile __attribute__((far)) char *)0xaf1807)
#define PS2_OUT_BUF ((volatile __attribute__((far)) char *)0xaf1803)
#define PS2_INPT_BUF ((volatile __attribute__((far)) char *)0xaf1803)
#define PS2_DATA_BUF ((volatile __attribute__((far)) char *)0xaf1803)
#endif
#endif

View file

@ -0,0 +1,37 @@
/*
* Definitions for access to the SDC controller
*/
#ifndef __SDC_C256_H
#define __SDC_C256_H
#include <stdint.h>
#define GABE_SDC_REG ((volatile uint8_t *)0xafe812)
#define GABE_SDC_PRESENT 0x01 /* Is an SD card present? --- 0:Yes, 1:No */
#define GABE_SDC_WPROT 0x02 /* Is the SD card write protected? --- 0:Yes, 1:No */
#define SDC_VERSION_REG ((volatile uint8_t *)0xafea00)
#define SDC_CONTROL_REG ((volatile uint8_t *)0xafea01)
#define SDC_TRANS_TYPE_REG ((volatile uint8_t *)0xafea02)
#define SDC_TRANS_CONTROL_REG ((volatile uint8_t *)0xafea03)
#define SDC_TRANS_STATUS_REG ((volatile uint8_t *)0xafea04)
#define SDC_TRANS_ERROR_REG ((volatile uint8_t *)0xafea05)
#define SDC_DIRECT_ACCESS_REG ((volatile uint8_t *)0xafea06)
#define SDC_SD_ADDR_7_0_REG ((volatile uint8_t *)0xafea07)
#define SDC_SD_ADDR_15_8_REG ((volatile uint8_t *)0xafea08)
#define SDC_SD_ADDR_23_16_REG ((volatile uint8_t *)0xafea09)
#define SDC_SD_ADDR_31_24_REG ((volatile uint8_t *)0xafea0A)
#define SDC_SPI_CLK_DEL_REG ((volatile uint8_t *)0xafea0B)
#define SDC_RX_FIFO_DATA_REG ((volatile uint8_t *)0xafea10)
#define SDC_RX_FIFO_DATA_CNT_HI ((volatile uint8_t *)0xafea12)
#define SDC_RX_FIFO_DATA_CNT_LO ((volatile uint8_t *)0xafea13)
#define SDC_RX_FIFO_CTRL_REG ((volatile uint8_t *)0xafea14)
#define SDC_TX_FIFO_DATA_REG ((volatile uint8_t *)0xafea20)
#define SDC_TX_FIFO_CTRL_REG ((volatile uint8_t *)0xafea24)
#endif

View file

@ -0,0 +1,49 @@
/*
* Sound device register definitions for the C256
*/
#ifndef __SOUND_C256_H
#define __SOUND_C256_H
#include <stdint.h>
struct s_sid_voice {
uint16_t frequency;
uint16_t pulse_width;
uint8_t control;
uint8_t attack_decay;
uint8_t sustain_release;
};
struct s_sid {
struct s_sid_voice v1;
struct s_sid_voice v2;
struct s_sid_voice v3;
uint16_t filter_frequency;
uint8_t resonance_filter;
uint8_t mode_volume;
uint8_t pot_x;
uint8_t pot_y;
uint8_t osc3;
uint8_t env3;
};
#define PSG_PORT ((volatile __attribute__((far)) uint8_t *)0xaff100) /* Control register for the SN76489 */
#define OPL3_PORT ((volatile unsigned char *)0xFEC20200) /* Access port for the OPL3 */
// #define OPM_EXT_BASE ((volatile unsigned char *)0xFEC20600) /* External OPM base address */
// #define OPN2_EXT_BASE ((volatile unsigned char *)0xFEC20400) /* External OPN2 base address */
// #define OPM_INT_BASE ((volatile unsigned char *)0xFEC20C00) /* Internal OPM base address */
// #define OPN2_INT_BASE ((volatile unsigned char *)0xFEC20A00) /* Internal OPN2 base address */
#define CODEC ((volatile __attribute__((far)) uint16_t *)0xafe900) /* Data register for the CODEC */
#define CODEC_WR_CTRL ((volatile __attribute__((far)) uint8_t *)0xafe902) /* Data register for the CODEC */
/*
* Internal SID
*/
#define SID_INT_N_V1_FREQ_LO ((volatile __attribute__((far)) uint8_t *)0xafe400)
#define SID_INT_N ((volatile __attribute__((far)) struct s_sid *)0xafe400)
#endif

View file

@ -0,0 +1,61 @@
/**
* @file timers_c256.h
*
* Define timer registers on the C256
*/
#ifndef __C256_TIMERS_H
#define __C256_TIMERS_H
//
// TIMER_CTRL_* flags
//
#define TIMER_CTRL_EN 0x01 // Set to enable timer
#define TIMER_CTRL_SCLR 0x02 // Set to clear the timer for counting up
#define TIMER_CTRL_SLOAD 0x04 // Set to load the timer for counting down
#define TIMER_CTRL_CNT_UP 0x08 // Set to count up, clear to count down
//
// TIMER_CMP_* flags
//
#define TIMER_CMP_RECLR 0x01 // Set to reclear the register on reaching the comparison value
#define TIMER_CMP_RELOAD 0x02 // Set to reload the charge value on reaching 0
//
// Timer 0 and 1 -- Based on system clock (14318180Hz)
//
#define TIMER_CTRL_0 ((volatile __attribute__((far)) uint8_t *)0x000160)
#define TIMER_CHG_L_0 ((volatile __attribute__((far)) uint8_t *)0x000161)
#define TIMER_CHG_M_0 ((volatile __attribute__((far)) uint8_t *)0x000162)
#define TIMER_CHG_H_0 ((volatile __attribute__((far)) uint8_t *)0x000163)
#define TIMER_CMPC_0 ((volatile __attribute__((far)) uint8_t *)0x000164)
#define TIMER_CMP_L_0 ((volatile __attribute__((far)) uint8_t *)0x000165)
#define TIMER_CMP_M_0 ((volatile __attribute__((far)) uint8_t *)0x000166)
#define TIMER_CMP_H_0 ((volatile __attribute__((far)) uint8_t *)0x000167)
#define TIMER_CTRL_1 ((volatile __attribute__((far)) uint8_t *)0x000168)
#define TIMER_CHG_L_1 ((volatile __attribute__((far)) uint8_t *)0x000169)
#define TIMER_CHG_M_1 ((volatile __attribute__((far)) uint8_t *)0x00016a)
#define TIMER_CHG_H_1 ((volatile __attribute__((far)) uint8_t *)0x00016b)
#define TIMER_CMPC_1 ((volatile __attribute__((far)) uint8_t *)0x00016c)
#define TIMER_CMP_L_1 ((volatile __attribute__((far)) uint8_t *)0x00016d)
#define TIMER_CMP_M_1 ((volatile __attribute__((far)) uint8_t *)0x00016e)
#define TIMER_CMP_H_1 ((volatile __attribute__((far)) uint8_t *)0x00016f)
//
// Timer 2 -- Based on start of frame clock (60/70 Hz)
//
#define TIMER_CTRL_2 ((volatile __attribute__((far)) uint8_t *)0x000170)
#define TIMER_CHG_L_2 ((volatile __attribute__((far)) uint8_t *)0x000171)
#define TIMER_CHG_M_2 ((volatile __attribute__((far)) uint8_t *)0x000172)
#define TIMER_CHG_H_2 ((volatile __attribute__((far)) uint8_t *)0x000173)
#define TIMER_CMPC_2 ((volatile __attribute__((far)) uint8_t *)0x000174)
#define TIMER_CMP_L_2 ((volatile __attribute__((far)) uint8_t *)0x000175)
#define TIMER_CMP_M_2 ((volatile __attribute__((far)) uint8_t *)0x000176)
#define TIMER_CMP_H_2 ((volatile __attribute__((far)) uint8_t *)0x000177)
#endif

143
src/include/C256/vicky_ii.h Normal file
View file

@ -0,0 +1,143 @@
/**
* @file c256_vicky_ii.h
* @author Peter Weingartner (pjw@tailrecursive.org)
* @brief Define the registers for Vicky II on the C256 computers.
* @version 0.1
* @date 2023-08-07
*
* @copyright Copyright (c) 2023
*
*/
#ifndef __c256_vicky_ii__
#define __c256_vicky_ii__
#include "types.h"
#include <stdint.h>
/**
* @brief Vicky II Master Control Register
*
*/
typedef struct tvky_mstr_ctrl_s {
union {
struct {
int text_enable:1;
int text_overlay:1;
int graphics_enable:1;
int bitmap_enable:1;
int tile_enable:1;
int sprite_enable:1;
int gamma_enable:1;
int disable:1;
int mode:2;
};
uint16_t raw;
};
} *tvky_mstr_ctrl_p;
#define VKY_MCR_TEXT 0x0001
#define VKY_MCR_TEXT_OVERLAY 0x0002
#define VKY_MCR_GRAPHICS 0x0004
#define VKY_MCR_BITMAP 0x0008
#define VKY_MCR_TILE 0x0010
#define VKY_MCR_SPRITE 0x0020
#define VKY_MCR_GAMMA 0x0040
#define VKY_MCR_DISABLE 0x0080
#define VKY_MCR_RES_MASK 0x0300
#define VKY_MCR_RES_320x240 0x0200
#define VKY_MCR_RES_640x480 0x0000
#define VKY_MCR_RES_400x300 0x0300
#define VKY_MCR_RES_800x600 0x0100
/**
* @brief Vicky II Border Control Registers
*
*/
typedef struct tvky_border_ctrl_s {
uint8_t control;
t_color3 color;
uint8_t size_x;
uint8_t sizy_y;
} *tvky_border_ctrl_p;
/**
* @brief Vicky II Cursor Control Registers
*
*/
typedef struct tvky_crsr_ctrl_s {
uint8_t control;
uint8_t start_address;
char character;
uint8_t color;
uint16_t column;
uint16_t row;
} *tvky_crsr_ctrl_p;
//
// Define the locations of the registers
//
#define tvky_mstr_ctrl ((volatile __attribute__((far)) tvky_mstr_ctrl_p)0xaf0000)
#define tvky_brdr_ctrl ((volatile __attribute__((far)) tvky_border_ctrl_p)0xaf0004)
#define tvky_bg_color ((volatile __attribute__((far)) t_color3 *)0xaf000d)
#define tvky_crsr_ctrl ((volatile __attribute__((far)) tvky_crsr_ctrl_p)0xaf0010)
//
// Text Color Lookup Tables
//
#define tvky_text_fg_color ((volatile __attribute__((far)) t_color4 *)0xaf1f40)
#define tvky_text_bg_color ((volatile __attribute__((far)) t_color4 *)0xaf1f80)
//
// Text Fonts Sets 0 and 1
//
#define tvky_font_set_0 ((volatile __attribute__((far)) uint8_t *)0xaf8000)
//
// Graphics Color Lookup Tables
//
#define VKY_GR_CLUT_0 ((volatile __attribute__((far)) uint8_t *)0xaf2000)
#define VKY_GR_CLUT_1 ((volatile __attribute__((far)) uint8_t *)0xaf2400)
#define VKY_GR_CLUT_2 ((volatile __attribute__((far)) uint8_t *)0xaf2800)
#define VKY_GR_CLUT_3 ((volatile __attribute__((far)) uint8_t *)0xaf2c00)
//
// Text mode text and color matrixes
//
#define tvky_text_matrix ((volatile __attribute__((far)) char *)0xafa000)
#define tvky_color_matrix ((volatile __attribute__((far)) char *)0xafc000)
//
// Bitmap graphics registers
//
typedef volatile __attribute__((far24)) uint8_t *p_far24;
#define bm0_control ((volatile __attribute__((far)) uint8_t *)0xaf0100)
#define bm0_address ((volatile __attribute__((far)) uint8_t *)0xaf0101)
#define bm0_offset_x ((volatile __attribute__((far)) uint16_t *)0xaf0104)
#define bm0_offset_y ((volatile __attribute__((far)) uint16_t *)0xaf0106)
#define bm1_control ((volatile __attribute__((far)) uint8_t *)0xaf0108)
#define bm1_address ((volatile __attribute__((far)) uint8_t *)0xaf0109)
#define bm1_offset_x ((volatile __attribute__((far)) uint16_t *)0xaf010c)
#define bm1_offset_y ((volatile __attribute__((far)) uint16_t *)0xaf010d)
#define MousePointer_Mem_A ((volatile uint8_t *)0xaf0500)
#define MousePtr_A_CTRL_Reg ((volatile uint16_t *)0xaf0700)
#define MousePtr_En 0x0001
#define MousePtr_A_X_Pos ((volatile uint16_t *)0xaf0702)
#define MousePtr_A_Y_Pos ((volatile uint16_t *)0xaf0704)
#define MousePtr_A_Mouse0 ((volatile uint8_t *)0xaf0706)
#define MousePtr_A_Mouse1 ((volatile uint8_t *)0xaf0707)
#define MousePtr_A_Mouse2 ((volatile uint8_t *)0xaf0708)
//
// Video RAM
//
#define vram_base ((volatile p_far24)0xb00000)
#endif

View file

@ -12,7 +12,6 @@
#define FSYS_SECTOR_SZ 512 /* Size of a sector */
#define MAX_PATH_LEN 256 /* Maximum length of a file path */
#define MAX_TRIES_BUSY 100000 /* The maximum number of times to check for an operation to complete (general purpose) */
/*
* Definitions of special characters

20
src/include/dma_reg.h Normal file
View file

@ -0,0 +1,20 @@
/*
* Master include file for all the DMA registers
*/
#ifndef __DMA_REG_H
#define __DMA_REG_H
#include "sys_general.h"
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/dma_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/dma_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/dma_c256.h"
#endif
#endif

16
src/include/exp_reg.h Normal file
View file

@ -0,0 +1,16 @@
/**
* @file exp_reg.h
* @brief Define the registers to access the expansion port
* @version 0.1
* @date 2023-08-30
*
*/
#ifndef __EXP_REG_H_
#define __EXP_REG_H_
#if MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/exp_c256.h"
#endif
#endif

View file

@ -27,6 +27,14 @@
#define HAS_OPL3 1
#elif MODEL == MODEL_FOENIX_A2560U
#define HAS_OPL3 1
#elif MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_C256U
#define HAS_OPL3 1
#elif MODEL == MODEL_FOENIX_C256U_FMX
#define HAS_SUPERIO 1
#define HAS_PARALLEL_PORT 1
#define HAS_MIDI_PORTS 1
#define HAS_EXTERNAL_SIDS 1
#define HAS_OPL3 1
#endif

View file

@ -14,4 +14,8 @@
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/gabe_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/gabe_c256.h"
#endif

View file

@ -10,8 +10,12 @@
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/pata_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/pata_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/pata_c256.h"
#endif
/*

View file

@ -10,8 +10,12 @@
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/ps2_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/ps2_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/ps2_c256.h"
#endif
/*
@ -48,8 +52,10 @@
#define PS2_CTRL_ENABLE_2 0xA9 /* Enable the second (mouse) port */
#define PS2_CTRL_DISABLE_2 0xA7 /* Disable the second (mouse) port */
#define KBD_CMD_ID 0xF2 /* Keyboard command: identify */
#define KBD_CMD_RESET 0xFF /* Keyboard command: reset the keyboard */
#define KBD_CMD_ENABLE 0xF4 /* Keyboard command: enable to keyboard */
#define KBD_CMD_DISABLE 0xF5 /* Keyboard command: disable scanning */
#define KBD_CMD_SET_LED 0xED /* Keyboard command: set the LEDs */
#define MOUSE_CMD_PREFIX 0xD4 /* Controller code to prefix all mouse commands */

View file

@ -47,6 +47,26 @@
#define RTC_CTRL ((volatile unsigned char *)0x00B0009C)
#define RTC_CENTURY ((volatile unsigned char *)0x00B0009E)
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#define RTC_BASE ((volatile unsigned char *)0xaf0800)
#define RTC_SEC ((volatile unsigned char *)0xaf0800)
#define RTC_ALRM_SEC ((volatile unsigned char *)0xaf0801)
#define RTC_MIN ((volatile unsigned char *)0xaf0802)
#define RTC_ALRM_MIN ((volatile unsigned char *)0xaf0803)
#define RTC_HOUR ((volatile unsigned char *)0xaf0804)
#define RTC_ALRM_HOUR ((volatile unsigned char *)0xaf0805)
#define RTC_DAY ((volatile unsigned char *)0xaf0806)
#define RTC_ALRM_DAY ((volatile unsigned char *)0xaf0807)
#define RTC_DAY_OF_WEEK ((volatile unsigned char *)0xaf0808)
#define RTC_MONTH ((volatile unsigned char *)0xaf0809)
#define RTC_YEAR ((volatile unsigned char *)0xaf080a)
#define RTC_RATES ((volatile unsigned char *)0xaf080b)
#define RTC_ENABLES ((volatile unsigned char *)0xaf080c)
#define RTC_FLAGS ((volatile unsigned char *)0xaf080d)
#define RTC_CTRL ((volatile unsigned char *)0xaf080e)
#define RTC_CENTURY ((volatile unsigned char *)0xaf080f)
#endif
/* Rate fields and settings */

View file

@ -10,10 +10,15 @@
#if MODEL == MODEL_FOENIX_A2560K
#include "A2560K/sdc_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560X || MODEL == MODEL_FOENIX_GENX
#include "A2560X/sdc_a2560x.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/sdc_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/sdc_c256.h"
#endif
/*

View file

@ -10,8 +10,11 @@
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/sound_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL_FOENIX_A2560U_PLUS
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/sound_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/sound_c256.h"
#endif
#endif

View file

@ -12,12 +12,23 @@
#include "types.h"
#include "interrupt.h"
#include "sys_general.h"
#include "dev/channel.h"
#include "dev/block.h"
#include "dev/fsys.h"
#include "dev/rtc.h"
#include "dev/txt_screen.h"
/*
* Define the machine-specific system call function prefix
*/
#if MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#define SYSTEMCALL __attribute__((simple_call))
#else
#define SYSTEMCALL
#endif
/*
* Syscall function numbers
*/
@ -141,21 +152,21 @@ extern int32_t syscall(int32_t function, ...);
* Inputs:
* result = the code to return to the kernel
*/
extern void sys_exit(short result);
extern SYSTEMCALL void sys_exit(short result);
/*
* Enable all interrupts
*
* NOTE: this is actually provided in the low level assembly
*/
extern void sys_int_enable_all();
extern SYSTEMCALL void sys_int_enable_all();
/*
* Disable all interrupts
*
* NOTE: this is actually provided in the low level assembly
*/
extern void sys_int_disable_all();
extern SYSTEMCALL void sys_int_disable_all();
/*
* Disable an interrupt by masking it
@ -163,7 +174,7 @@ extern void sys_int_disable_all();
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*/
extern void sys_int_disable(unsigned short n);
extern SYSTEMCALL void sys_int_disable(unsigned short n);
/*
* Enable an interrupt
@ -171,7 +182,7 @@ extern void sys_int_disable(unsigned short n);
* Inputs:
* n = the number of the interrupt
*/
extern void sys_int_enable(unsigned short n);
extern SYSTEMCALL void sys_int_enable(unsigned short n);
/*
* Register a handler for a given interrupt.
@ -183,7 +194,7 @@ extern void sys_int_enable(unsigned short n);
* Returns:
* the pointer to the previous interrupt handler
*/
extern p_int_handler sys_int_register(unsigned short n, p_int_handler handler);
extern SYSTEMCALL p_int_handler sys_int_register(unsigned short n, p_int_handler handler);
/*
* Return true (non-zero) if an interrupt is pending for the given interrupt
@ -194,7 +205,7 @@ extern p_int_handler sys_int_register(unsigned short n, p_int_handler handler);
* Returns:
* non-zero if interrupt n is pending, 0 if not
*/
extern short sys_int_pending(unsigned short n);
extern SYSTEMCALL short sys_int_pending(unsigned short n);
/*
* Fill out a s_sys_info structure with the information about the current system
@ -202,7 +213,7 @@ extern short sys_int_pending(unsigned short n);
* Inputs:
* info = pointer to a s_sys_info structure to fill out
*/
extern void sys_get_info(p_sys_info info);
extern SYSTEMCALL void sys_get_info(p_sys_info info);
/*
* Acknowledge an interrupt (clear out its pending flag)
@ -210,7 +221,7 @@ extern void sys_get_info(p_sys_info info);
* Inputs:
* n = the number of the interrupt: n[7..4] = group number, n[3..0] = individual number.
*/
extern void sys_int_clear(unsigned short n);
extern SYSTEMCALL void sys_int_clear(unsigned short n);
/***
*** Channel system calls
@ -225,7 +236,7 @@ extern void sys_int_clear(unsigned short n);
* Returns:
* the value read (if negative, error)
*/
extern short sys_chan_read_b(short channel);
extern SYSTEMCALL short sys_chan_read_b(short channel);
/*
* Read bytes from the channel
@ -238,7 +249,7 @@ extern short sys_chan_read_b(short channel);
* Returns:
* number of bytes read, any negative number is an error code
*/
extern short sys_chan_read(short channel, unsigned char * buffer, short size);
extern SYSTEMCALL short sys_chan_read(short channel, unsigned char * buffer, short size);
/*
* Read a line of text from the channel
@ -251,7 +262,7 @@ extern short sys_chan_read(short channel, unsigned char * buffer, short size);
* Returns:
* number of bytes read, any negative number is an error code
*/
extern short sys_chan_readline(short channel, unsigned char * buffer, short size);
extern SYSTEMCALL short sys_chan_readline(short channel, unsigned char * buffer, short size);
/*
* Write a single byte to the device
@ -263,7 +274,7 @@ extern short sys_chan_readline(short channel, unsigned char * buffer, short size
* Returns:
* 0 on success, a negative value on error
*/
extern short sys_chan_write_b(short channel, unsigned char b);
extern SYSTEMCALL short sys_chan_write_b(short channel, unsigned char b);
/*
* Write a byte to the channel
@ -275,7 +286,7 @@ extern short sys_chan_write_b(short channel, unsigned char b);
* Returns:
* number of bytes written, any negative number is an error code
*/
extern short sys_chan_write(short channel, const unsigned char * buffer, short size);
extern SYSTEMCALL short sys_chan_write(short channel, const unsigned char * buffer, short size);
/*
* Return the status of the channel device
@ -286,7 +297,7 @@ extern short sys_chan_write(short channel, const unsigned char * buffer, short s
* Returns:
* the status of the device
*/
extern short sys_chan_status(short channel);
extern SYSTEMCALL short sys_chan_status(short channel);
/*
* Ensure that any pending writes to teh device have been completed
@ -297,7 +308,7 @@ extern short sys_chan_status(short channel);
* Returns:
* 0 on success, any negative number is an error code
*/
extern short sys_chan_flush(short channel);
extern SYSTEMCALL short sys_chan_flush(short channel);
/*
* Attempt to set the position of the channel cursor (if supported)
@ -310,7 +321,7 @@ extern short sys_chan_flush(short channel);
* Returns:
* 0 = success, a negative number is an error.
*/
extern short sys_chan_seek(short channel, long position, short base);
extern SYSTEMCALL short sys_chan_seek(short channel, long position, short base);
/*
* Issue a control command to the device
@ -324,7 +335,7 @@ extern short sys_chan_seek(short channel, long position, short base);
* Returns:
* 0 on success, any negative number is an error code
*/
extern short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size);
extern SYSTEMCALL short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size);
/*
* Open a channel
@ -337,7 +348,7 @@ extern short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, sho
* Returns:
* the number of the channel opened, negative number on error
*/
extern short sys_chan_open(short dev, const uint8_t * path, short mode);
extern SYSTEMCALL short sys_chan_open(short dev, const uint8_t * path, short mode);
/*
* Close a channel
@ -348,7 +359,7 @@ extern short sys_chan_open(short dev, const uint8_t * path, short mode);
* Returns:
* nothing useful
*/
extern short sys_chan_close(short chan);
extern SYSTEMCALL short sys_chan_close(short chan);
/**
* Swap the channel ID assignments for two channels
@ -360,7 +371,7 @@ extern short sys_chan_close(short chan);
* @param channel2 the ID of the other channel
* @return 0 on success, any other number is an error
*/
extern short sys_chan_swap(short channel1, short channel2);
extern SYSTEMCALL short sys_chan_swap(short channel1, short channel2);
/**
* Return the device associated with the channel
@ -368,7 +379,7 @@ extern short sys_chan_swap(short channel1, short channel2);
* @param channel the ID of the channel to query
* @return the ID of the device associated with the channel, negative number for error
*/
extern short sys_chan_device(short channel);
extern SYSTEMCALL short sys_chan_device(short channel);
/*
* Compute the size information for the text screen based on the current settings in VICKY
@ -377,7 +388,7 @@ extern short sys_chan_device(short channel);
* Inputs:
* screen = the screen number 0 for channel A, 1 for channel B
*/
extern void sys_text_setsizes(short chan);
extern SYSTEMCALL void sys_text_setsizes(short chan);
/***
*** Block device system calls
@ -386,7 +397,7 @@ extern void sys_text_setsizes(short chan);
//
// Register a block device driver
//
extern short sys_bdev_register(p_dev_block device);
extern SYSTEMCALL short sys_bdev_register(p_dev_block device);
//
// Read a block from the device
@ -400,7 +411,7 @@ extern short sys_bdev_register(p_dev_block device);
// Returns:
// number of bytes read, any negative number is an error code
//
extern short sys_bdev_read(short dev, long lba, unsigned char * buffer, short size);
extern SYSTEMCALL short sys_bdev_read(short dev, long lba, unsigned char * buffer, short size);
//
// Write a block from the device
@ -414,7 +425,7 @@ extern short sys_bdev_read(short dev, long lba, unsigned char * buffer, short si
// Returns:
// number of bytes written, any negative number is an error code
//
extern short sys_bdev_write(short dev, long lba, const unsigned char * buffer, short size);
extern SYSTEMCALL short sys_bdev_write(short dev, long lba, const unsigned char * buffer, short size);
//
// Return the status of the block device
@ -425,7 +436,7 @@ extern short sys_bdev_write(short dev, long lba, const unsigned char * buffer, s
// Returns:
// the status of the device
//
extern short sys_bdev_status(short dev);
extern SYSTEMCALL short sys_bdev_status(short dev);
//
// Ensure that any pending writes to teh device have been completed
@ -436,7 +447,7 @@ extern short sys_bdev_status(short dev);
// Returns:
// 0 on success, any negative number is an error code
//
extern short sys_bdev_flush(short dev);
extern SYSTEMCALL short sys_bdev_flush(short dev);
//
// Issue a control command to the device
@ -450,7 +461,7 @@ extern short sys_bdev_flush(short dev);
// Returns:
// 0 on success, any negative number is an error code
//
extern short sys_bdev_ioctrl(short dev, short command, unsigned char * buffer, short size);
extern SYSTEMCALL short sys_bdev_ioctrl(short dev, short command, unsigned char * buffer, short size);
/*
@ -467,7 +478,7 @@ extern short sys_bdev_ioctrl(short dev, short command, unsigned char * buffer, s
* Returns:
* the channel ID for the open file (negative if error)
*/
extern short sys_fsys_open(const char * path, short mode);
extern SYSTEMCALL short sys_fsys_open(const char * path, short mode);
/**
* Close access to a previously open file.
@ -478,7 +489,7 @@ extern short sys_fsys_open(const char * path, short mode);
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_close(short fd);
extern SYSTEMCALL short sys_fsys_close(short fd);
/**
* Attempt to open a directory for scanning
@ -489,7 +500,7 @@ extern short sys_fsys_close(short fd);
* Returns:
* the handle to the directory if >= 0. An error if < 0
*/
extern short sys_fsys_opendir(const char * path);
extern SYSTEMCALL short sys_fsys_opendir(const char * path);
/**
* Close access to a previously open file.
@ -500,7 +511,7 @@ extern short sys_fsys_opendir(const char * path);
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_close(short fd);
extern SYSTEMCALL short sys_fsys_close(short fd);
/**
* Attempt to open a directory for scanning
@ -511,7 +522,7 @@ extern short sys_fsys_close(short fd);
* Returns:
* the handle to the directory if >= 0. An error if < 0
*/
extern short sys_fsys_opendir(const char * path);
extern SYSTEMCALL short sys_fsys_opendir(const char * path);
/**
* Close a previously open directory
@ -522,7 +533,7 @@ extern short sys_fsys_opendir(const char * path);
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_closedir(short dir);
extern SYSTEMCALL short sys_fsys_closedir(short dir);
/**
* Attempt to read an entry from an open directory
@ -534,7 +545,7 @@ extern short sys_fsys_closedir(short dir);
* Returns:
* 0 on success, negative number on failure
*/
extern short sys_fsys_readdir(short dir, p_file_info file);
extern SYSTEMCALL 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.
@ -547,7 +558,7 @@ extern short sys_fsys_readdir(short dir, p_file_info file);
* 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);
extern SYSTEMCALL 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.
@ -559,7 +570,7 @@ extern short sys_fsys_findfirst(const char * path, const char * pattern, p_file_
* Returns:
* 0 on success, error if negative
*/
extern short sys_fsys_findnext(short dir, p_file_info file);
extern SYSTEMCALL short sys_fsys_findnext(short dir, p_file_info file);
/*
* Get the label for the drive holding the path
@ -568,7 +579,7 @@ extern short sys_fsys_findnext(short dir, p_file_info file);
* 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);
extern SYSTEMCALL short sys_fsys_get_label(const char * path, char * label);
/*
* Set the label for the drive holding the path
@ -577,7 +588,7 @@ extern short sys_fsys_get_label(const char * path, char * label);
* drive = drive number
* label = buffer that holds the label
*/
extern short sys_fsys_set_label(short drive, const char * label);
extern SYSTEMCALL short sys_fsys_set_label(short drive, const char * label);
/**
* Create a directory
@ -588,7 +599,7 @@ extern short sys_fsys_set_label(short drive, const char * label);
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_mkdir(const char * path);
extern SYSTEMCALL short sys_fsys_mkdir(const char * path);
/**
* Delete a file or directory
@ -599,7 +610,7 @@ extern short sys_fsys_mkdir(const char * path);
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_delete(const char * path);
extern SYSTEMCALL short sys_fsys_delete(const char * path);
/**
* Rename a file or directory
@ -611,7 +622,7 @@ extern short sys_fsys_delete(const char * path);
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_rename(const char * old_path, const char * new_path);
extern SYSTEMCALL short sys_fsys_rename(const char * old_path, const char * new_path);
/**
* Change the current working directory (and drive)
@ -622,7 +633,7 @@ extern short sys_fsys_rename(const char * old_path, const char * new_path);
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_set_cwd(const char * path);
extern SYSTEMCALL short sys_fsys_set_cwd(const char * path);
/**
* Get the current working drive and directory
@ -634,7 +645,7 @@ extern short sys_fsys_set_cwd(const char * path);
* Returns:
* 0 on success, negative number on failure.
*/
extern short sys_fsys_get_cwd(char * path, short size);
extern SYSTEMCALL short sys_fsys_get_cwd(char * path, short size);
/*
* Load a file into memory at the designated destination address.
@ -652,7 +663,7 @@ extern short sys_fsys_get_cwd(char * path, short size);
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_load(const char * path, long destination, long * start);
extern SYSTEMCALL short sys_fsys_load(const char * path, long destination, long * start);
/*
* Register a file loading routine
@ -667,7 +678,7 @@ extern short sys_fsys_load(const char * path, long destination, long * start);
* Returns:
* 0 on success, negative number on error
*/
extern short sys_fsys_register_loader(const char * extension, p_file_loader loader);
extern SYSTEMCALL short sys_fsys_register_loader(const char * extension, p_file_loader loader);
/**
* Check to see if the file is present.
@ -678,7 +689,7 @@ extern short sys_fsys_register_loader(const char * extension, p_file_loader load
* @param file pointer to a file info record to fill in, if the file is found.
* @return 0 on success, negative number on error
*/
extern short sys_fsys_stat(const char * path, p_file_info file);
extern SYSTEMCALL short sys_fsys_stat(const char * path, p_file_info file);
/**
* Memory
@ -690,7 +701,7 @@ extern short sys_fsys_stat(const char * path, p_file_info file);
*
* @return the address of the first byte of reserved system RAM (one above the last byte the user program can use)
*/
extern unsigned long sys_mem_get_ramtop();
extern SYSTEMCALL unsigned long sys_mem_get_ramtop();
/**
* Reserve a block of memory at the top of system RAM.
@ -698,7 +709,7 @@ extern unsigned long sys_mem_get_ramtop();
* @param bytes the number of bytes to reserve
* @return address of the first byte of the reserved block
*/
extern unsigned long sys_mem_reserve(unsigned long bytes);
extern SYSTEMCALL unsigned long sys_mem_reserve(unsigned long bytes);
/*
* Miscellaneous
@ -714,7 +725,7 @@ extern unsigned long sys_mem_reserve(unsigned long bytes);
* Returns:
* the number of jiffies since the last reset
*/
extern long sys_time_jiffies();
extern SYSTEMCALL long sys_time_jiffies();
/*
* Set the time on the RTC
@ -722,7 +733,7 @@ extern long sys_time_jiffies();
* Inputs:
* time = pointer to a t_time record containing the correct time
*/
extern void sys_rtc_set_time(p_time time);
extern SYSTEMCALL void sys_rtc_set_time(p_time time);
/*
* Get the time on the RTC
@ -730,17 +741,17 @@ extern void sys_rtc_set_time(p_time time);
* Inputs:
* time = pointer to a t_time record in which to put the current time
*/
extern void sys_rtc_get_time(p_time time);
extern SYSTEMCALL 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();
extern SYSTEMCALL unsigned short sys_kbd_scancode();
/*
* Return an error message given an error number
*/
extern const char * sys_err_message(short err_number);
extern SYSTEMCALL const char * sys_err_message(short err_number);
/*
* Set the keyboard translation tables
@ -763,7 +774,7 @@ extern const char * sys_err_message(short err_number);
* Inputs:
* tables = pointer to the keyboard translation tables
*/
extern short sys_kbd_layout(const char * tables);
extern SYSTEMCALL short sys_kbd_layout(const char * tables);
/**
* Load and execute an executable file
@ -773,7 +784,7 @@ extern short sys_kbd_layout(const char * tables);
* @param argv the array of string arguments
* @return the return result of the program
*/
extern short sys_proc_run(const char * path, int argc, char * argv[]);
extern SYSTEMCALL short sys_proc_run(const char * path, int argc, char * argv[]);
/**
* Set the value of a variable
@ -782,7 +793,7 @@ extern short sys_proc_run(const char * path, int argc, char * argv[]);
* @param value the value the variable should have
* @return 0 on success, negative number on error
*/
extern short sys_var_set(const char *name, const char *value);
extern SYSTEMCALL short sys_var_set(const char *name, const char *value);
/**
* Get the value of a variable
@ -790,7 +801,7 @@ extern short sys_var_set(const char *name, const char *value);
* @param name the name of the variable to set
* @return pointer to the string on success, 0 if not found
*/
extern const char * sys_var_get(const char *name);
extern SYSTEMCALL const char * sys_var_get(const char *name);
//
// Text screen calls
@ -803,7 +814,7 @@ extern const char * sys_var_get(const char *name);
*
* @return a pointer to the read-only description (0 on error)
*/
extern const p_txt_capabilities sys_txt_get_capabilities(short screen);
extern SYSTEMCALL const p_txt_capabilities sys_txt_get_capabilities(short screen);
/**
* Set the display mode for the screen
@ -813,7 +824,7 @@ extern const p_txt_capabilities sys_txt_get_capabilities(short screen);
*
* @return 0 on success, any other number means the mode is invalid for the screen
*/
extern short sys_txt_set_mode(short screen, short mode);
extern SYSTEMCALL short sys_txt_set_mode(short screen, short mode);
/**
* Set the position of the cursor to (x, y) relative to the current region
@ -825,7 +836,7 @@ extern short sys_txt_set_mode(short screen, short mode);
* @param x the column for the cursor
* @param y the row for the cursor
*/
extern void sys_txt_set_xy(short screen, short x, short y);
extern SYSTEMCALL void sys_txt_set_xy(short screen, short x, short y);
/**
* Get the position of the cursor (x, y) relative to the current region
@ -833,7 +844,7 @@ extern void sys_txt_set_xy(short screen, short x, short y);
* @param screen the number of the text device
* @param position pointer to a t_point record to fill out
*/
extern void sys_txt_get_xy(short screen, p_point position);
extern SYSTEMCALL void sys_txt_get_xy(short screen, p_point position);
/**
* Get the current region.
@ -843,7 +854,7 @@ extern void sys_txt_get_xy(short screen, p_point position);
*
* @return 0 on success, any other number means the region was invalid
*/
extern short sys_txt_get_region(short screen, p_rect region);
extern SYSTEMCALL short sys_txt_get_region(short screen, p_rect region);
/**
* Set a region to restrict further character display, scrolling, etc.
@ -854,7 +865,7 @@ extern short sys_txt_get_region(short screen, p_rect region);
*
* @return 0 on success, any other number means the region was invalid
*/
extern short sys_txt_set_region(short screen, p_rect region);
extern SYSTEMCALL short sys_txt_set_region(short screen, p_rect region);
/**
* Set the default foreground and background colors for printing
@ -863,7 +874,7 @@ extern short sys_txt_set_region(short screen, p_rect region);
* @param foreground the Text LUT index of the new current foreground color (0 - 15)
* @param background the Text LUT index of the new current background color (0 - 15)
*/
extern void sys_txt_set_color(short screen, unsigned char foreground, unsigned char background);
extern SYSTEMCALL void sys_txt_set_color(short screen, unsigned char foreground, unsigned char background);
/*
* Get the foreground and background color for printing
@ -873,7 +884,7 @@ extern void sys_txt_set_color(short screen, unsigned char foreground, unsigned c
* foreground = pointer to the foreground color number
* background = pointer to the background color number
*/
extern void sys_txt_get_color(short screen, unsigned char * foreground, unsigned char * background);
extern SYSTEMCALL void sys_txt_get_color(short screen, unsigned char * foreground, unsigned char * background);
/**
* Set if the cursor is visible or not
@ -881,7 +892,7 @@ extern void sys_txt_get_color(short screen, unsigned char * foreground, unsigned
* @param screen the screen number 0 for channel A, 1 for channel B
* @param is_visible TRUE if the cursor should be visible, FALSE (0) otherwise
*/
extern void sys_txt_set_cursor_visible(short screen, short is_visible);
extern SYSTEMCALL void sys_txt_set_cursor_visible(short screen, short is_visible);
/**
* Load a font as the current font for the screen
@ -891,7 +902,7 @@ extern void sys_txt_set_cursor_visible(short screen, short is_visible);
* @param height of a character in pixels
* @param data pointer to the raw font data to be loaded
*/
extern short sys_txt_set_font(short screen, short width, short height, unsigned char * data);
extern SYSTEMCALL short sys_txt_set_font(short screen, short width, short height, unsigned char * data);
/**
* Get the display resolutions
@ -900,7 +911,7 @@ extern short sys_txt_set_font(short screen, short width, short height, unsigned
* @param text_size the size of the screen in visible characters (may be null)
* @param pixel_size the size of the screen in pixels (may be null)
*/
extern void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_size);
extern SYSTEMCALL void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_size);
/**
* Set the size of the border of the screen (if supported)
@ -909,7 +920,7 @@ extern void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_s
* @param width the horizontal size of one side of the border (0 - 32 pixels)
* @param height the vertical size of one side of the border (0 - 32 pixels)
*/
extern void sys_txt_set_border(short screen, short width, short height);
extern SYSTEMCALL void sys_txt_set_border(short screen, short width, short height);
/**
* Set the size of the border of the screen (if supported)
@ -919,6 +930,31 @@ extern void sys_txt_set_border(short screen, short width, short height);
* @param green the green component of the color (0 - 255)
* @param blue the blue component of the color (0 - 255)
*/
extern void sys_txt_set_border_color(short screen, unsigned char red, unsigned char green, unsigned char blue);
extern SYSTEMCALL void sys_txt_set_border_color(short screen, unsigned char red, unsigned char green, unsigned char blue);
/**
* Print a character to the current cursor position in the current color
*
* Most character codes will result in a glyph being displayed at the current
* cursor position, advancing the cursor one spot. There are some exceptions that
* will be treated as control codes:
*
* 0x08 - BS - Move the cursor back one position, erasing the character underneath
* 0x09 - HT - Move forward to the next TAB stop
* 0x0A - LF - Move the cursor down one line (line feed)
* 0x0D - CR - Move the cursor to column 0 (carriage return)
*
* @param screen the number of the text device
* @param c the character to print
*/
extern SYSTEMCALL void sys_txt_put(short screen, char c);
/**
* Print an ASCII Z string to the screen
*
* @param screen the number of the text device
* @param c the ASCII Z string to print
*/
extern SYSTEMCALL void sys_txt_print(short screen, const char * message);
#endif

View file

@ -9,8 +9,12 @@
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/timers_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/timers_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/timers_c256.h"
#endif
#endif

View file

@ -10,8 +10,12 @@
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
#include "A2560K/VICKYIII_a2560k.h"
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
#include "A2560U/VICKYIII_a2560u.h"
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#include "C256/vicky_ii.h"
#endif

View file

@ -6,6 +6,7 @@
#define __INTERRUPT_H
#include "sys_general.h"
#include "types.h"
/* Type declaration for an interrupt handler */
typedef void (*p_int_handler)();
@ -50,6 +51,28 @@ typedef void (*p_int_handler)();
#define MASK_GRP1 ((volatile unsigned short *)0x00B0011A)
#define MASK_GRP2 ((volatile unsigned short *)0x00B0011C)
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
#define PENDING_GRP0 ((volatile uint8_t *)0x000140)
#define PENDING_GRP1 ((volatile uint8_t *)0x000141)
#define PENDING_GRP2 ((volatile uint8_t *)0x000142)
#define PENDING_GRP3 ((volatile uint8_t *)0x000143)
#define POL_GRP0 ((volatile uint8_t *)0x000144)
#define POL_GRP1 ((volatile uint8_t *)0x000145)
#define POL_GRP2 ((volatile uint8_t *)0x000146)
#define POL_GRP3 ((volatile uint8_t *)0x000147)
#define EDGE_GRP0 ((volatile uint8_t *)0x000148)
#define EDGE_GRP1 ((volatile uint8_t *)0x000149)
#define EDGE_GRP2 ((volatile uint8_t *)0x00014a)
#define EDGE_GRP3 ((volatile uint8_t *)0x00014b)
#define MASK_GRP0 ((volatile uint8_t *)0x00014c)
#define MASK_GRP1 ((volatile uint8_t *)0x00014d)
#define MASK_GRP2 ((volatile uint8_t *)0x00014e)
#define MASK_GRP3 ((volatile uint8_t *)0x00014f)
#endif

View file

@ -19,6 +19,8 @@
#include "A2560U/gabe_a2560u.h"
#elif (MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X)
#include "A2560K/gabe_a2560k.h"
#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX
#include "C256/gabe_c256.h"
#endif
/* Channel to which the logging output should go.
@ -159,7 +161,7 @@ void panic(void) {
t_rect region;
TRACE("PANIC------------------------------------------");
/* Shut off all interrupts */
int_disable_all();
// TODO: int_disable_all();
/* Re-initialize the text screen */
txt_init_screen(0);
@ -255,11 +257,12 @@ void log_setlevel(short level) {
static void log_to_uart(const char *message) {
char *c = (char*)message;
while (*c)
uart_put(UART_COM1, *c++);
uart_put(UART_COM1,'\r');
uart_put(UART_COM1,'\n');
// TODO: bring back
// char *c = (char*)message;
// while (*c)
// uart_put(UART_COM1, *c++);
// uart_put(UART_COM1,'\r');
// uart_put(UART_COM1,'\n');
}
static void log_to_screen(const char *message) {
@ -295,7 +298,8 @@ void log(short level, const char * message, ...) {
vsprintf(buf, message, args);
va_end(args);
(*do_log)(buf);
txt_print(0, buf);
txt_print(0, "\n");
}
void trace(const char * message, ...) {

View file

@ -129,12 +129,12 @@ extern void log_c(short log_level, char c);
#if DEFAULT_LOG_LEVEL >= LOG_INFO
# define INFO(m) log(LOG_INFO, m)
# define INFO1(a,b) log(LOG_INFO, a, b)
# define INFO2(a,b,c) log(LOG_INFO, a, b, c)
# define INFO3(a,b,c,d) log(LOG_INFO, a, b, c, d)
# define INFO4(a,b,c,d,e) log(LOG_INFO, a, b, c, d, e)
# define INFO5(a,b,c,d,e,f) log(LOG_INFO, a, b, c, d, e, f)
# define INFO(m) log(LOG_INFO, m);
# define INFO1(a,b) log(LOG_INFO, a, b);
# define INFO2(a,b,c) log(LOG_INFO, a, b, c);
# define INFO3(a,b,c,d) log(LOG_INFO, a, b, c, d);
# define INFO4(a,b,c,d,e) log(LOG_INFO, a, b, c, d, e);
# define INFO5(a,b,c,d,e,f) log(LOG_INFO, a, b, c, d, e, f);
#else
# define INFO(m)
# define INFO1(a,b)

View file

@ -16,7 +16,7 @@ def emit(output, count, 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.")
parser.add_option("-o", "--output", dest="output", default="image.c", help="Destination for image and color data.")
(options, args) = parser.parse_args()

827
src/rsrc/bitmaps/image.c 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

@ -1,827 +1,9 @@
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,
}
#ifndef _IMAGE_H
#define _IMAGE_H_
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
}
/* Definitions for what's produced by bmp2c, the small utility that converts a picture into C with RLE compression. */
extern unsigned char splashscreen_lut[];
extern unsigned char splashscreen_pix[];
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

View file

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

View file

@ -38,7 +38,7 @@ void print_c(short channel, char c) {
void print(short channel, const char * message) {
TRACE1("print(%d,..)", channel);
short ret = sys_chan_write(channel, message, strlen(message));
short ret = sys_chan_write(channel, (const unsigned char *)message, strlen(message));
if (ret < 0)
ERROR1("Error while printing: %d", ret);
}
@ -270,9 +270,7 @@ void dump_buffer(short channel, const unsigned char * buffer, short size, short
c = buffer[i];
if (i % 16 == 0) {
print(channel, " ");
print(channel, ascii_buffer);
print(channel, "\n");
printf(" %s\n", ascii_buffer);
for (j = 0; j < 17; j++) {
ascii_buffer[j] = 0;
@ -281,11 +279,9 @@ void dump_buffer(short channel, const unsigned char * buffer, short size, short
ascii_idx = 0;
if (labels == 1) {
print_hex_16(channel, i);
print(channel, ":");
printf("%04X:", i);
} else if (labels == 2) {
print_hex_32(channel, (unsigned long)buffer + i);
print(channel, ":");
printf("%024lX:", (unsigned long)buffer + 1);
}
}
@ -296,15 +292,13 @@ void dump_buffer(short channel, const unsigned char * buffer, short size, short
}
if ((i % 8) == 0) {
print(channel, " ");
printf(" ");
}
print_hex_8(channel, c);
printf("%02X", c);
}
print(channel, " ");
print(channel, ascii_buffer);
print(channel, "\n");
printf(" %s\n", ascii_buffer);
}
/**

View file

@ -1,13 +1,60 @@
csources = $(wildcard *.c)
cobjects = $(subst .c,.o,$(csources))
.PHONY: all
all: $(cobjects)
UNIT := C256U_PLUS
# Define OS-dependent variables
ifeq ($(OS),Windows_NT)
RM = del /F/Q
else
RM = rm -f
endif
# Define model-specific variables, including tools, source files, compiler flags, etc.
ifeq ($(UNIT),C256U)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=psg.c sid.c codec_c256.c
CFLAGS_FOR_UNIT=-DMODEL=1 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256U_PLUS)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=psg.c sid.c codec_c256.c
CFLAGS_FOR_UNIT=-DMODEL=5 -DCPU=255 --target Foenix --code-model large --data-model large
else ifeq ($(UNIT),C256_FMX)
CC=cc65816
AS=as65816
AR=nlib
SRCS_FOR_UNIT=psg.c sid.c codec_c256.c
CFLAGS_FOR_UNIT=-DMODEL=0 -DCPU=255 --target Foenix --code-model large --data-model large
endif
INCLUDES=-I.. -I../include
CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l
ASFLAGS=$(INCLUDES)
SRCS = $(SRCS_FOR_UNIT)
OBJS = $(patsubst %.c,%.o,$(SRCS))
OBJS4RM = $(subst /,\\,$(OBJS))
.PHONY: all clean
all: sound.a
# Build the devices library file for this model
sound.a: $(OBJS)
@echo $(OBJS)
$(AR) $@ $^
# Build the object files from C
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(DEFINES)
.PHONY: clean
$(CC) $(CFLAGS) -o $@ $^
# Clean up after a build
clean:
$(RM) $(aobjects) $(cobjects)
$(RM) $(OBJS4RM) sound.a *.lst

57
src/snd/codec_c256.c Normal file
View file

@ -0,0 +1,57 @@
/*
* Definitions of functions to support the CODEC
*/
#include "stdint.h"
#include "sound_reg.h"
#include "snd/codec.h"
static unsigned char volume = 0xff;
/**
* @brief Send a value to a CODEC register
*
* @param data the register ID and data to write
*/
static void codec_write(uint16_t data) {
*CODEC = data;
*CODEC_WR_CTRL = 0x01;
while (*CODEC_WR_CTRL)
;
}
/*
* Set the master digital volume
*
* Inputs:
* vol = level of attenuation (0xff = full volume, 0x00 = mute)
*/
void codec_set_volume(unsigned char vol) {
volume = vol;
codec_write(0x0A00 | (0xFF - vol));
codec_write(0x0400 | (vol >> 1));
}
/*
* Return the current volume
*/
unsigned char codec_get_volume() {
return volume;
}
/*
* Initialize the CODEC registers
*/
void init_codec() {
codec_write(0x1A00); // R13 - Turn On Headphones
codec_write(0x2A1F); // R21 - Enable All the Analog In
codec_write(0x2301); // R17
codec_write(0x2C07); // R22 - Enable all output sources
codec_write(0x1402); // R10
codec_write(0x1602); // R11
codec_write(0x1845); // R12
codec_set_volume(0xff);
}

View file

@ -4,6 +4,7 @@
#include "psg.h"
#include "sound_reg.h"
#include "log.h"
/*
* Mute all voices on the PSG
@ -28,7 +29,7 @@ void psg_mute_all() {
* voice = the number of the voice (0 - 3)
* frequency = the frequency
*/
void psg_tone(short chip, unsigned short voice, int frequency) {
void psg_tone(short chip, unsigned short voice, unsigned long frequency) {
volatile unsigned char * port = PSG_PORT; /* By default: external */
if (voice < 3) {

View file

@ -18,7 +18,7 @@ extern void psg_mute_all();
* voice = the number of the voice (0 - 3)
* frequency = the frequency
*/
extern void psg_tone(short chip, unsigned short voice, int frequency);
extern void psg_tone(short chip, unsigned short voice, unsigned long frequency);
/*
* Set the attenuation of a voice

View file

@ -26,10 +26,12 @@ volatile unsigned char * sid_get_base(short sid) {
switch (sid) {
case 0:
return SID_INT_N_V1_FREQ_LO;
#if MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
case 1:
return SID_INT_L_V1_FREQ_LO;
case 2:
return SID_INT_R_V1_FREQ_LO;
#endif
#if MODEL == MODEL_FOENIX_A2560K || MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X
case 3:
return SID_EXT_L_V1_FREQ_LO;
@ -73,6 +75,58 @@ void sid_init_all() {
}
#if MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
/*
* Test the internal SID implementation
*/
void sid_test_internal() {
volatile struct s_sid * sid = 0;
sid = (struct s_sid *)sid_get_base(0);
if (sid) {
sid->v1.attack_decay = 0x29;
sid->v2.attack_decay = 0x29;
sid->v2.attack_decay = 0x29;
sid->v1.sustain_release = 0x1f;
sid->v2.sustain_release = 0x1f;
sid->v3.sustain_release = 0x1f;
sid->mode_volume = 0x0f;
sid->v1.frequency = 0x1660;
sid->v1.control = 0x11;
// jiffies = rtc_get_jiffies() + 3;
// while (jiffies > rtc_get_jiffies());
// sid->v2.frequency = 0x0831;
// sid->v2.control = 0x11;
// jiffies = rtc_get_jiffies() + 3;
// while (jiffies > rtc_get_jiffies());
// sid->v3.frequency = 0x2187;
// sid->v3.control = 0x11;
// jiffies = rtc_get_jiffies() + 25;
// while (jiffies > rtc_get_jiffies());
// sid->v1.control = 0x10;
// jiffies = rtc_get_jiffies() + 3;
// while (jiffies > rtc_get_jiffies());
// sid->v2.control = 0x10;
// jiffies = rtc_get_jiffies() + 3;
// while (jiffies > rtc_get_jiffies());
// sid->v3.control = 0x10;
// sid->mode_volume = 0;
}
}
#else
/*
* Test the internal SID implementation
*/
@ -161,6 +215,7 @@ void sid_test_internal() {
*SID_INT_L_MODE_VOL = 0;
*SID_INT_R_MODE_VOL = 0;
}
#endif
#if HAS_EXTERNAL_SIDS
void sid_test_external() {

View file

@ -1,5 +1,6 @@
#include "sys_general.h"
#include "gabe_reg.h"
#include "exp_reg.h"
/*
* Fill out a s_MODEL_info structure with the information about the current system
@ -85,6 +86,58 @@ void sys_get_information(p_sys_info info) {
info->fpga_version = *FPGA_VER;
info->fpga_subver = *FPGA_SUBVER;
#elif MODEL == MODEL_FOENIX_FMX || MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS
machine_id = GABE_SYS_STAT->machine_id;
cpu = CPU_WDC65816;
clock_speed = SYSCLK_14MHZ;
info->has_expansion_card = (GABE_SYS_STAT->no_expansion) ? 1 : 0;
info->has_hard_drive = (*GABE_DIP_REG & HD_INSTALLED) ? 0 : 1;
info->has_ethernet = 0;
info->screens = 1;
if (info->has_expansion_card) {
// If an expansion card is present, find out what it is
if (EXP_CARD_INFO->vendor_id == EXP_VENDOR_FOENIX) {
switch (EXP_CARD_INFO->card_id) {
case EXP_CARD_C100_ESID:
// The ESID is plugged in, we add the SIDs and the ethernet port
info->has_ethernet = 1;
break;
case EXP_CARD_C200_EVID:
// The EVID is plugged in, we add the second screen and the ethernet port
info->has_ethernet = 1;
info->screens = 2;
break;
default:
break;
}
}
}
info->fpga_model = GABE_VERSION->model;
info->fpga_version = GABE_VERSION->version;
info->fpga_subver = GABE_VERSION->subversion;
switch (machine_id) {
case MODEL_FOENIX_FMX:
info->has_floppy = 1;
info->system_ram_size = 4l * 1024l * 1024l;
break;
case MODEL_FOENIX_C256U_PLUS:
info->has_floppy = 0;
info->system_ram_size = 4l * 1024l * 1024l;
break;
default:
info->has_floppy = 0;
info->system_ram_size = 2l * 1024l * 1024l;
break;
}
#else
machine_id = 0xFF;
cpu = CPU_M68000;
@ -193,7 +246,7 @@ void sys_get_information(p_sys_info info) {
break;
case CPU_MC68060:
info->cpu_name = "MC68xx060"
info->cpu_name = "MC68xx060";
break;
default:

View file

@ -51,25 +51,25 @@
* Structure to describe the hardware
*/
typedef struct s_sys_info {
unsigned short mcp_version; /* Current version of the MCP kernel */
unsigned short mcp_rev; /* Current revision, or sub-version of the MCP kernel */
unsigned short mcp_build; /* Current vuild # of the MCP kernel */
unsigned short model; /* Code to say what model of machine this is */
unsigned short sub_model; /* 0x00 = PB, 0x01 = LB, 0x02 = CUBE */
uint16_t mcp_version; /* Current version of the MCP kernel */
uint16_t mcp_rev; /* Current revision, or sub-version of the MCP kernel */
uint16_t mcp_build; /* Current vuild # of the MCP kernel */
uint16_t model; /* Code to say what model of machine this is */
uint16_t sub_model; /* 0x00 = PB, 0x01 = LB, 0x02 = CUBE */
const char * model_name; /* Human readable name of the model of the computer */
unsigned short cpu; /* Code to say which CPU is running */
uint16_t cpu; /* Code to say which CPU is running */
const char * cpu_name; /* Human readable name for the CPU */
unsigned int cpu_clock_khz; /* Speed of the CPU clock in KHz */
unsigned long fpga_date; /* YYYYMMDD */
unsigned long fpga_model; /* FPGA model number */
unsigned short fpga_version; /* FPGA version */
unsigned short fpga_subver; /* FPGA sub-version */
long system_ram_size; /* The number of bytes of system RAM on the board */
uint32_t cpu_clock_khz; /* Speed of the CPU clock in KHz */
uint32_t fpga_date; /* YYYYMMDD */
uint16_t fpga_model; /* FPGA model number */
uint16_t fpga_version; /* FPGA version */
uint16_t fpga_subver; /* FPGA sub-version */
uint32_t system_ram_size; /* The number of bytes of system RAM on the board */
bool has_floppy; /* TRUE if the board has a floppy drive installed */
bool has_hard_drive; /* TRUE if the board has a PATA device installed */
bool has_expansion_card; /* TRUE if an expansion card is installed on the device */
bool has_ethernet; /* TRUE if an ethernet port is present */
unsigned short screens; /* How many screens are on this computer */
uint16_t screens; /* How many screens are on this computer */
} t_sys_info, *p_sys_info;
/*

View file

@ -1,8 +0,0 @@
@echo off
REM Upload a binary file to the C256 Foenix
if [%2%]==[] (
python C256Mgr\c256mgr.py --binary %1
) ELSE (
python C256Mgr\c256mgr.py --binary %1 --address %2
)

View file

@ -1,4 +0,0 @@
@echo off
REM Upload an SREC file to the C256 Foenix
python C256Mgr\c256mgr.py --upload-srec %1