diff --git a/ORAO_MiST/Orao_MiST.qpf b/ORAO_MiST/Orao_MiST.qpf new file mode 100644 index 00000000..8da7b752 --- /dev/null +++ b/ORAO_MiST/Orao_MiST.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2016 Intel Corporation. All rights reserved. +# Your use of Intel Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Intel Program License +# Subscription Agreement, the Intel Quartus Prime License Agreement, +# the Intel MegaCore Function License Agreement, or other +# applicable license agreement, including, without limitation, +# that your use is for the sole purpose of programming logic +# devices manufactured by Intel and sold by Intel or its +# authorized distributors. Please refer to the applicable +# agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus Prime +# Version 16.1.0 Build 196 10/24/2016 SJ Lite Edition +# Date created = 08:04:28 December 31, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "08:04:28 December 31, 2017" + +# Revisions + +PROJECT_REVISION = "Orao_MiST" diff --git a/ORAO_MiST/Orao_MiST.qsf b/ORAO_MiST/Orao_MiST.qsf new file mode 100644 index 00000000..96fe388b --- /dev/null +++ b/ORAO_MiST/Orao_MiST.qsf @@ -0,0 +1,227 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 06:03:35 February 11, 2018 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# cobra_MiST_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 15.1.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:45:13 JUNE 17,2016" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY orao_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== +set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT NONE -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# -------------------------- +# start ENTITY(cobra_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(cobra_mist) +# ------------------------ +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE AREA +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VHDL_FILE rtl/ps2_intf.vhd +set_global_assignment -name VHDL_FILE rtl/ProgSRam.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VHDL_FILE rtl/OraoGraphDisplay8K.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/orao_mist.sv +set_global_assignment -name VHDL_FILE rtl/orao_keyboard_buttons.vhd +set_global_assignment -name VHDL_FILE rtl/orao.vhd +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name VERILOG_FILE rtl/keyboard.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/bufferedUART.vhd +set_global_assignment -name VHDL_FILE rtl/bram_2port.vhd +set_global_assignment -name VHDL_FILE rtl/bram_1port.vhd +set_global_assignment -name VHDL_FILE rtl/rom/rom_crt103.vhd +set_global_assignment -name VHDL_FILE rtl/rom/rom_bas103.vhd +set_global_assignment -name VHDL_FILE rtl/T65/T65_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T65/T65_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T65/T65_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T65/T65.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/ORAO_MiST/clean.bat b/ORAO_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/ORAO_MiST/clean.bat @@ -0,0 +1,37 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +del /s *~ +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +rmdir /s /q hc_output +rmdir /s /q .qsys_edit +rmdir /s /q hps_isw_handoff +rmdir /s /q sys\.qsys_edit +rmdir /s /q sys\vip +cd sys +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +cd .. +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +del build_id.v +del c5_pin_model_dump.txt +del PLLJ_PLLSPE_INFO.txt +del /s *.qws +del /s *.ppf +del /s *.ddb +del /s *.csv +del /s *.cmp +del /s *.sip +del /s *.spd +del /s *.bsf +del /s *.f +del /s *.sopcinfo +del /s *.xml +del /s new_rtl_netlist +del /s old_rtl_netlist + +pause diff --git a/ORAO_MiST/rtl/OraoGraphDisplay8K.vhd b/ORAO_MiST/rtl/OraoGraphDisplay8K.vhd new file mode 100644 index 00000000..bdae883e --- /dev/null +++ b/ORAO_MiST/rtl/OraoGraphDisplay8K.vhd @@ -0,0 +1,121 @@ +-- 8K 256x256 graphics by Emard 2015 +-- License=GPL + +-- Modified Grant Searle's text display to show bitmap graphics +-- Acknowledgement to his great work! +-- main web site http://searle.hostei.com/grant/ +-- UK101 page at http://searle.hostei.com/grant/uk101FPGA/index.html + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity OraoGraphDisplay8K is + port ( + dispAddr : out std_LOGIC_VECTOR(12 downto 0); + dispData : in std_LOGIC_VECTOR(7 downto 0); + clk : in std_logic; + video : out std_logic; + h_sync : out std_logic; + v_sync : out std_logic; + sync : out std_logic + ); + +end OraoGraphDisplay8K; + +architecture rtl of OraoGraphDisplay8K is + + signal hSync : std_logic := '1'; + signal vSync : std_logic := '1'; + + signal vActive : std_logic := '0'; + signal hActive : std_logic := '0'; + + signal pixelClockCount: STD_LOGIC_VECTOR(3 DOWNTO 0); + signal pixelCount: STD_LOGIC_VECTOR(2 DOWNTO 0); + + signal horizCount: STD_LOGIC_VECTOR(11 DOWNTO 0); + signal vertLineCount: STD_LOGIC_VECTOR(8 DOWNTO 0); + + signal charHoriz: STD_LOGIC_VECTOR(12 DOWNTO 0); + signal charBit: STD_LOGIC_VECTOR(3 DOWNTO 0); + + signal charData: std_LOGIC_VECTOR(7 downto 0); + +begin + + sync <= hSync and vSync; + h_sync <= hSync; + v_sync <= vSync; + + dispAddr <= charHoriz; + charData <= dispData; + + PROCESS (clk) + BEGIN + +-- Orao display 256x256 bitmap 8K + +-- 5 lines vsync +-- 30 lines to start of display +-- 313 lines per frame +-- 64uS per horiz line (3200 clocks) +-- 4.7us horiz sync (235 clocks) + if rising_edge(clk) then + IF horizCount < 3200 THEN + horizCount <= horizCount + 1; + -- horizontal position of the screen + if (horizCount < 780) or (horizCount > 2830) then + hActive <= '0'; + pixelClockCount <= (others => '0'); + else + hActive <= '1'; + end if; + + else + horizCount<= (others => '0'); + pixelCount<= (others => '0'); + if vertLineCount > 312 then + vertLineCount <= (others => '0'); + else + if vertLineCount < 38 or vertLineCount > 293 then + vActive <= '0'; + charHoriz <= (others => '0'); + else + vActive <= '1'; + end if; + + vertLineCount <=vertLineCount+1; + end if; + + END IF; + if horizCount < 235 then + hSync <= '0'; + else + hSync <= '1'; + end if; + if vertLineCount < 5 then + vSync <= '0'; + else + vSync <= '1'; + end if; + + if hActive='1' and vActive = '1' then + if pixelClockCount < 7 then + pixelClockCount <= pixelClockCount+1; + else + video <= charData(conv_integer(pixelCount)); + pixelClockCount <= (others => '0'); + if pixelCount = 7 then + charHoriz <= charHoriz+1; + end if; + pixelCount <= pixelCount+1; + end if; + else + video <= '0'; + end if; + end if; + END PROCESS; + +end rtl; diff --git a/ORAO_MiST/rtl/ProgSRam.vhd b/ORAO_MiST/rtl/ProgSRam.vhd new file mode 100644 index 00000000..280255a8 --- /dev/null +++ b/ORAO_MiST/rtl/ProgSRam.vhd @@ -0,0 +1,29 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity ProgSRam is + port + ( + address : in std_logic_vector(15 downto 0); + n_write : in std_logic; -- inverted write + n_enable : in std_logic; -- inverted enable for read or write + data : in std_logic_vector(7 downto 0); -- input to RAM (for write) + q : out std_logic_vector(7 downto 0); -- output from RAM (for read) + -- external SRAM interface + sram_lbl, sram_ubl, sram_wel: out std_logic; -- inverted logic signals + sram_a : out std_logic_vector(18 downto 0); + sram_d : inout std_logic_vector(15 downto 0) + ); +end ProgSRam; + +architecture struct of ProgSRam is +begin + -- this module will address lower 64K, set 3 high address bits to 0 + sram_a <= "000" & address; + sram_ubl <= '1'; -- upper 8 bits disabled + sram_lbl <= n_enable; -- lower 8 bits to enable signal + sram_wel <= n_write; -- write signal + sram_d(15 downto 8) <= (others => 'Z'); -- upper bits high impedance + sram_d(7 downto 0) <= data when n_write='0' else (others => 'Z'); + q <= sram_d(7 downto 0); +end struct; diff --git a/ORAO_MiST/rtl/T65/T65.vhd b/ORAO_MiST/rtl/T65/T65.vhd new file mode 100644 index 00000000..09253fe0 --- /dev/null +++ b/ORAO_MiST/rtl/T65/T65.vhd @@ -0,0 +1,564 @@ +-- **** +-- T65(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 more merging +-- Ver 300 Bugfixes by ehenciak added, started tidyup *bust* +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 65xx compatible microprocessor core +-- +-- Version : 0246 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t65/ +-- +-- Limitations : +-- +-- 65C02 and 65C816 modes are incomplete +-- Undocumented instructions are not supported +-- Some interface signals behaves incorrect +-- +-- File history : +-- +-- 0246 : First release +-- + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + use work.T65_Pack.all; + +-- ehenciak 2-23-2005 : Added the enable signal so that one doesn't have to use +-- the ready signal to limit the CPU. +entity T65 is + port( + Mode : in std_logic_vector(1 downto 0); -- "00" => 6502, "01" => 65C02, "10" => 65C816 + Res_n : in std_logic; + Enable : in std_logic; + Clk : in std_logic; + Rdy : in std_logic; + Abort_n : in std_logic; + IRQ_n : in std_logic; + NMI_n : in std_logic; + SO_n : in std_logic; + R_W_n : out std_logic; + Sync : out std_logic; + EF : out std_logic; + MF : out std_logic; + XF : out std_logic; + ML_n : out std_logic; + VP_n : out std_logic; + VDA : out std_logic; + VPA : out std_logic; + A : out std_logic_vector(23 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T65; + +architecture rtl of T65 is + + -- Registers + signal ABC, X, Y, D : std_logic_vector(15 downto 0); + signal P, AD, DL : std_logic_vector(7 downto 0) := x"00"; + signal BAH : std_logic_vector(7 downto 0); + signal BAL : std_logic_vector(8 downto 0); + signal PBR : std_logic_vector(7 downto 0); + signal DBR : std_logic_vector(7 downto 0); + signal PC : unsigned(15 downto 0); + signal S : unsigned(15 downto 0); + signal EF_i : std_logic; + signal MF_i : std_logic; + signal XF_i : std_logic; + + signal IR : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + + signal Mode_r : std_logic_vector(1 downto 0); + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Write_Data_r : std_logic_vector(2 downto 0); + signal Set_Addr_To_r : std_logic_vector(1 downto 0); + signal PCAdder : unsigned(8 downto 0); + + signal RstCycle : std_logic; + signal IRQCycle : std_logic; + signal NMICycle : std_logic; + + signal B_o : std_logic; + signal SO_n_o : std_logic; + signal IRQ_n_o : std_logic; + signal NMI_n_o : std_logic; + signal NMIAct : std_logic; + + signal Break : std_logic; + + -- ALU signals + signal BusA : std_logic_vector(7 downto 0); + signal BusA_r : std_logic_vector(7 downto 0); + signal BusB : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal P_Out : std_logic_vector(7 downto 0); + + -- Micro code outputs + signal LCycle : std_logic_vector(2 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(2 downto 0); + signal Set_Addr_To : std_logic_vector(1 downto 0); + signal Write_Data : std_logic_vector(2 downto 0); + signal Jump : std_logic_vector(1 downto 0); + signal BAAdd : std_logic_vector(1 downto 0); + signal BreakAtNA : std_logic; + signal ADAdd : std_logic; + signal AddY : std_logic; + signal PCAdd : std_logic; + signal Inc_S : std_logic; + signal Dec_S : std_logic; + signal LDA : std_logic; + signal LDP : std_logic; + signal LDX : std_logic; + signal LDY : std_logic; + signal LDS : std_logic; + signal LDDI : std_logic; + signal LDALU : std_logic; + signal LDAD : std_logic; + signal LDBAL : std_logic; + signal LDBAH : std_logic; + signal SaveP : std_logic; + signal Write : std_logic; + + signal really_rdy : std_logic; + signal R_W_n_i : std_logic; + +begin + -- ehenciak : gate Rdy with read/write to make an "OK, it's + -- really OK to stop the processor now if Rdy is + -- deasserted" signal + really_rdy <= Rdy or not(R_W_n_i); + + -- ehenciak : Drive R_W_n_i off chip. + R_W_n <= R_W_n_i; + + Sync <= '1' when MCycle = "000" else '0'; + EF <= EF_i; + MF <= MF_i; + XF <= XF_i; + ML_n <= '0' when IR(7 downto 6) /= "10" and IR(2 downto 1) = "11" and MCycle(2 downto 1) /= "00" else '1'; + VP_n <= '0' when IRQCycle = '1' and (MCycle = "101" or MCycle = "110") else '1'; + VDA <= '1' when Set_Addr_To_r /= "00" else '0'; -- Incorrect !!!!!!!!!!!! + VPA <= '1' when Jump(1) = '0' else '0'; -- Incorrect !!!!!!!!!!!! + + mcode : T65_MCode + port map( + Mode => Mode_r, + IR => IR, + MCycle => MCycle, + P => P, + LCycle => LCycle, + ALU_Op => ALU_Op, + Set_BusA_To => Set_BusA_To, + Set_Addr_To => Set_Addr_To, + Write_Data => Write_Data, + Jump => Jump, + BAAdd => BAAdd, + BreakAtNA => BreakAtNA, + ADAdd => ADAdd, + AddY => AddY, + PCAdd => PCAdd, + Inc_S => Inc_S, + Dec_S => Dec_S, + LDA => LDA, + LDP => LDP, + LDX => LDX, + LDY => LDY, + LDS => LDS, + LDDI => LDDI, + LDALU => LDALU, + LDAD => LDAD, + LDBAL => LDBAL, + LDBAH => LDBAH, + SaveP => SaveP, + Write => Write + ); + + alu : T65_ALU + port map( + Mode => Mode_r, + Op => ALU_Op_r, + BusA => BusA_r, + BusB => BusB, + P_In => P, + P_Out => P_Out, + Q => ALU_Q + ); + + process (Res_n, Clk) + begin + if Res_n = '0' then + PC <= (others => '0'); -- Program Counter + IR <= "00000000"; + S <= (others => '0'); -- Dummy !!!!!!!!!!!!!!!!!!!!! + D <= (others => '0'); + PBR <= (others => '0'); + DBR <= (others => '0'); + + Mode_r <= (others => '0'); + ALU_Op_r <= "1100"; + Write_Data_r <= "000"; + Set_Addr_To_r <= "00"; + + R_W_n_i <= '1'; + EF_i <= '1'; + MF_i <= '1'; + XF_i <= '1'; + + elsif Clk'event and Clk = '1' then + if (Enable = '1') then + if (really_rdy = '1') then + R_W_n_i <= not Write or RstCycle; + + D <= (others => '1'); -- Dummy + PBR <= (others => '1'); -- Dummy + DBR <= (others => '1'); -- Dummy + EF_i <= '0'; -- Dummy + MF_i <= '0'; -- Dummy + XF_i <= '0'; -- Dummy + + if MCycle = "000" then + Mode_r <= Mode; + + if IRQCycle = '0' and NMICycle = '0' then + PC <= PC + 1; + end if; + + if IRQCycle = '1' or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DI; + end if; + end if; + + ALU_Op_r <= ALU_Op; + Write_Data_r <= Write_Data; + if Break = '1' then + Set_Addr_To_r <= "00"; + else + Set_Addr_To_r <= Set_Addr_To; + end if; + + if Inc_S = '1' then + S <= S + 1; + end if; + if Dec_S = '1' and RstCycle = '0' then + S <= S - 1; + end if; + if LDS = '1' then + S(7 downto 0) <= unsigned(ALU_Q); + end if; + + if IR = "00000000" and MCycle = "001" and IRQCycle = '0' and NMICycle = '0' then + PC <= PC + 1; + end if; + -- + -- jump control logic + -- + case Jump is + when "01" => + PC <= PC + 1; + + when "10" => + PC <= unsigned(DI & DL); + + when "11" => + if PCAdder(8) = '1' then + if DL(7) = '0' then + PC(15 downto 8) <= PC(15 downto 8) + 1; + else + PC(15 downto 8) <= PC(15 downto 8) - 1; + end if; + end if; + PC(7 downto 0) <= PCAdder(7 downto 0); + + when others => null; + end case; + end if; + end if; + end if; + end process; + + PCAdder <= resize(PC(7 downto 0),9) + resize(unsigned(DL(7) & DL),9) when PCAdd = '1' + else "0" & PC(7 downto 0); + + process (Clk) + begin + if Clk'event and Clk = '1' then + if (Enable = '1') then + if (really_rdy = '1') then + if MCycle = "000" then + if LDA = '1' then + ABC(7 downto 0) <= ALU_Q; + end if; + if LDX = '1' then + X(7 downto 0) <= ALU_Q; + end if; + if LDY = '1' then + Y(7 downto 0) <= ALU_Q; + end if; + if (LDA or LDX or LDY) = '1' then + P <= P_Out; + end if; + end if; + if SaveP = '1' then + P <= P_Out; + end if; + if LDP = '1' then + P <= ALU_Q; + end if; + if IR(4 downto 0) = "11000" then + case IR(7 downto 5) is + when "000" => + P(Flag_C) <= '0'; + when "001" => + P(Flag_C) <= '1'; + when "010" => + P(Flag_I) <= '0'; + when "011" => + P(Flag_I) <= '1'; + when "101" => + P(Flag_V) <= '0'; + when "110" => + P(Flag_D) <= '0'; + when "111" => + P(Flag_D) <= '1'; + when others => + end case; + end if; + + --if IR = "00000000" and MCycle = "011" and RstCycle = '0' and NMICycle = '0' and IRQCycle = '0' then + -- P(Flag_B) <= '1'; + --end if; + --if IR = "00000000" and MCycle = "100" and RstCycle = '0' and (NMICycle = '1' or IRQCycle = '1') then + -- P(Flag_I) <= '1'; + -- P(Flag_B) <= B_o; + --end if; + + -- B=1 always on the 6502 + P(Flag_B) <= '1'; + if IR = "00000000" and RstCycle = '0' and (NMICycle = '1' or IRQCycle = '1') then + if MCycle = "011" then + -- B=0 in *copy* of P pushed onto the stack + P(Flag_B) <= '0'; + elsif MCycle = "100" then + P(Flag_I) <= '1'; + end if; + end if; + + if SO_n_o = '1' and SO_n = '0' then + P(Flag_V) <= '1'; + end if; + if RstCycle = '1' and Mode_r /= "00" then + P(Flag_1) <= '1'; + P(Flag_D) <= '0'; + P(Flag_I) <= '1'; + end if; + P(Flag_1) <= '1'; + + B_o <= P(Flag_B); + SO_n_o <= SO_n; + IRQ_n_o <= IRQ_n; + NMI_n_o <= NMI_n; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + + process (Res_n, Clk) + begin + if Res_n = '0' then + BusA_r <= (others => '0'); + BusB <= (others => '0'); + AD <= (others => '0'); + BAL <= (others => '0'); + BAH <= (others => '0'); + DL <= (others => '0'); + elsif Clk'event and Clk = '1' then + if (Enable = '1') then + if (Rdy = '1') then + BusA_r <= BusA; + BusB <= DI; + + case BAAdd is + when "01" => + -- BA Inc + AD <= std_logic_vector(unsigned(AD) + 1); + BAL <= std_logic_vector(unsigned(BAL) + 1); + when "10" => + -- BA Add + BAL <= std_logic_vector(resize(unsigned(BAL(7 downto 0)),9) + resize(unsigned(BusA),9)); + when "11" => + -- BA Adj + if BAL(8) = '1' then + BAH <= std_logic_vector(unsigned(BAH) + 1); + end if; + when others => + end case; + + -- ehenciak : modified to use Y register as well (bugfix) + if ADAdd = '1' then + if (AddY = '1') then + AD <= std_logic_vector(unsigned(AD) + unsigned(Y(7 downto 0))); + else + AD <= std_logic_vector(unsigned(AD) + unsigned(X(7 downto 0))); + end if; + end if; + + if IR = "00000000" then + BAL <= (others => '1'); + BAH <= (others => '1'); + if RstCycle = '1' then + BAL(2 downto 0) <= "100"; + elsif NMICycle = '1' then + BAL(2 downto 0) <= "010"; + else + BAL(2 downto 0) <= "110"; + end if; + if Set_addr_To_r = "11" then + BAL(0) <= '1'; + end if; + end if; + + + if LDDI = '1' then + DL <= DI; + end if; + if LDALU = '1' then + DL <= ALU_Q; + end if; + if LDAD = '1' then + AD <= DI; + end if; + if LDBAL = '1' then + BAL(7 downto 0) <= DI; + end if; + if LDBAH = '1' then + BAH <= DI; + end if; + end if; + end if; + end if; + end process; + + Break <= (BreakAtNA and not BAL(8)) or (PCAdd and not PCAdder(8)); + + + with Set_BusA_To select + BusA <= DI when "000", + ABC(7 downto 0) when "001", + X(7 downto 0) when "010", + Y(7 downto 0) when "011", + std_logic_vector(S(7 downto 0)) when "100", + P when "101", + (others => '-') when others; + + with Set_Addr_To_r select + A <= "0000000000000001" & std_logic_vector(S(7 downto 0)) when "01", + DBR & "00000000" & AD when "10", + "00000000" & BAH & BAL(7 downto 0) when "11", + PBR & std_logic_vector(PC(15 downto 8)) & std_logic_vector(PCAdder(7 downto 0)) when others; + + with Write_Data_r select + DO <= DL when "000", + ABC(7 downto 0) when "001", + X(7 downto 0) when "010", + Y(7 downto 0) when "011", + std_logic_vector(S(7 downto 0)) when "100", + P when "101", + std_logic_vector(PC(7 downto 0)) when "110", + std_logic_vector(PC(15 downto 8)) when others; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + + process (Res_n, Clk) + begin + if Res_n = '0' then + MCycle <= "001"; + RstCycle <= '1'; + IRQCycle <= '0'; + NMICycle <= '0'; + NMIAct <= '0'; + elsif Clk'event and Clk = '1' then + if (Enable = '1') then + if (really_rdy = '1') then + if MCycle = LCycle or Break = '1' then + MCycle <= "000"; + RstCycle <= '0'; + IRQCycle <= '0'; + NMICycle <= '0'; + if NMIAct = '1' then + NMICycle <= '1'; + elsif IRQ_n_o = '0' and P(Flag_I) = '0' then + IRQCycle <= '1'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + + if NMICycle = '1' then + NMIAct <= '0'; + end if; + if NMI_n_o = '1' and NMI_n = '0' then + NMIAct <= '1'; + end if; + end if; + end if; + end if; + end process; + +end; diff --git a/ORAO_MiST/rtl/T65/T65_ALU.vhd b/ORAO_MiST/rtl/T65/T65_ALU.vhd new file mode 100644 index 00000000..b1f6d632 --- /dev/null +++ b/ORAO_MiST/rtl/T65/T65_ALU.vhd @@ -0,0 +1,260 @@ +-- **** +-- T65(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 Bugfixes by ehenciak added +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 6502 compatible microprocessor core +-- +-- Version : 0245 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t65/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0245 : First version +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T65_Pack.all; + +entity T65_ALU is + port( + Mode : in std_logic_vector(1 downto 0); -- "00" => 6502, "01" => 65C02, "10" => 65816 + Op : in std_logic_vector(3 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + P_In : in std_logic_vector(7 downto 0); + P_Out : out std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0) + ); +end T65_ALU; + +architecture rtl of T65_ALU is + + -- AddSub variables (temporary signals) + signal ADC_Z : std_logic; + signal ADC_C : std_logic; + signal ADC_V : std_logic; + signal ADC_N : std_logic; + signal ADC_Q : std_logic_vector(7 downto 0); + signal SBC_Z : std_logic; + signal SBC_C : std_logic; + signal SBC_V : std_logic; + signal SBC_N : std_logic; + signal SBC_Q : std_logic_vector(7 downto 0); + +begin + + process (P_In, BusA, BusB) + variable AL : unsigned(6 downto 0); + variable AH : unsigned(6 downto 0); + variable C : std_logic; + begin + AL := resize(unsigned(BusA(3 downto 0) & P_In(Flag_C)), 7) + resize(unsigned(BusB(3 downto 0) & "1"), 7); + AH := resize(unsigned(BusA(7 downto 4) & AL(5)), 7) + resize(unsigned(BusB(7 downto 4) & "1"), 7); + +-- pragma translate_off + if is_x(std_logic_vector(AL)) then AL := "0000000"; end if; + if is_x(std_logic_vector(AH)) then AH := "0000000"; end if; +-- pragma translate_on + + if AL(4 downto 1) = 0 and AH(4 downto 1) = 0 then + ADC_Z <= '1'; + else + ADC_Z <= '0'; + end if; + + if AL(5 downto 1) > 9 and P_In(Flag_D) = '1' then + AL(6 downto 1) := AL(6 downto 1) + 6; + end if; + + C := AL(6) or AL(5); + AH := resize(unsigned(BusA(7 downto 4) & C), 7) + resize(unsigned(BusB(7 downto 4) & "1"), 7); + + ADC_N <= AH(4); + ADC_V <= (AH(4) xor BusA(7)) and not (BusA(7) xor BusB(7)); + +-- pragma translate_off + if is_x(std_logic_vector(AH)) then AH := "0000000"; end if; +-- pragma translate_on + + if AH(5 downto 1) > 9 and P_In(Flag_D) = '1' then + AH(6 downto 1) := AH(6 downto 1) + 6; + end if; + + ADC_C <= AH(6) or AH(5); + + ADC_Q <= std_logic_vector(AH(4 downto 1) & AL(4 downto 1)); + end process; + + process (Op, P_In, BusA, BusB) + variable AL : unsigned(6 downto 0); + variable AH : unsigned(5 downto 0); + variable C : std_logic; + begin + C := P_In(Flag_C) or not Op(0); + AL := resize(unsigned(BusA(3 downto 0) & C), 7) - resize(unsigned(BusB(3 downto 0) & "1"), 6); + AH := resize(unsigned(BusA(7 downto 4) & "0"), 6) - resize(unsigned(BusB(7 downto 4) & AL(5)), 6); + +-- pragma translate_off + if is_x(std_logic_vector(AL)) then AL := "0000000"; end if; + if is_x(std_logic_vector(AH)) then AH := "000000"; end if; +-- pragma translate_on + + if AL(4 downto 1) = 0 and AH(4 downto 1) = 0 then + SBC_Z <= '1'; + else + SBC_Z <= '0'; + end if; + + SBC_C <= not AH(5); + SBC_V <= (AH(4) xor BusA(7)) and (BusA(7) xor BusB(7)); + SBC_N <= AH(4); + + if P_In(Flag_D) = '1' then + if AL(5) = '1' then + AL(5 downto 1) := AL(5 downto 1) - 6; + end if; + AH := resize(unsigned(BusA(7 downto 4) & "0"), 6) - resize(unsigned(BusB(7 downto 4) & AL(6)), 6); + if AH(5) = '1' then + AH(5 downto 1) := AH(5 downto 1) - 6; + end if; + end if; + + SBC_Q <= std_logic_vector(AH(4 downto 1) & AL(4 downto 1)); + end process; + + process (Op, P_In, BusA, BusB, + ADC_Z, ADC_C, ADC_V, ADC_N, ADC_Q, + SBC_Z, SBC_C, SBC_V, SBC_N, SBC_Q) + variable Q_t : std_logic_vector(7 downto 0); + begin + -- ORA, AND, EOR, ADC, NOP, LD, CMP, SBC + -- ASL, ROL, LSR, ROR, BIT, LD, DEC, INC + P_Out <= P_In; + Q_t := BusA; + case Op(3 downto 0) is + when "0000" => + -- ORA + Q_t := BusA or BusB; + when "0001" => + -- AND + Q_t := BusA and BusB; + when "0010" => + -- EOR + Q_t := BusA xor BusB; + when "0011" => + -- ADC + P_Out(Flag_V) <= ADC_V; + P_Out(Flag_C) <= ADC_C; + Q_t := ADC_Q; + when "0101" | "1101" => + -- LDA + when "0110" => + -- CMP + P_Out(Flag_C) <= SBC_C; + when "0111" => + -- SBC + P_Out(Flag_V) <= SBC_V; + P_Out(Flag_C) <= SBC_C; + Q_t := SBC_Q; + when "1000" => + -- ASL + Q_t := BusA(6 downto 0) & "0"; + P_Out(Flag_C) <= BusA(7); + when "1001" => + -- ROL + Q_t := BusA(6 downto 0) & P_In(Flag_C); + P_Out(Flag_C) <= BusA(7); + when "1010" => + -- LSR + Q_t := "0" & BusA(7 downto 1); + P_Out(Flag_C) <= BusA(0); + when "1011" => + -- ROR + Q_t := P_In(Flag_C) & BusA(7 downto 1); + P_Out(Flag_C) <= BusA(0); + when "1100" => + -- BIT + P_Out(Flag_V) <= BusB(6); + when "1110" => + -- DEC + Q_t := std_logic_vector(unsigned(BusA) - 1); + when "1111" => + -- INC + Q_t := std_logic_vector(unsigned(BusA) + 1); + when others => + end case; + + case Op(3 downto 0) is + when "0011" => + P_Out(Flag_N) <= ADC_N; + P_Out(Flag_Z) <= ADC_Z; + when "0110" | "0111" => + P_Out(Flag_N) <= SBC_N; + P_Out(Flag_Z) <= SBC_Z; + when "0100" => + when "1100" => + P_Out(Flag_N) <= BusB(7); + if (BusA and BusB) = "00000000" then + P_Out(Flag_Z) <= '1'; + else + P_Out(Flag_Z) <= '0'; + end if; + when others => + P_Out(Flag_N) <= Q_t(7); + if Q_t = "00000000" then + P_Out(Flag_Z) <= '1'; + else + P_Out(Flag_Z) <= '0'; + end if; + end case; + + Q <= Q_t; + end process; + +end; diff --git a/ORAO_MiST/rtl/T65/T65_MCode.vhd b/ORAO_MiST/rtl/T65/T65_MCode.vhd new file mode 100644 index 00000000..6c6c864a --- /dev/null +++ b/ORAO_MiST/rtl/T65/T65_MCode.vhd @@ -0,0 +1,1052 @@ +-- **** +-- T65(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 302 minor timing fixes +-- Ver 301 Jump timing fixed +-- Ver 300 Bugfixes by ehenciak added +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 65xx compatible microprocessor core +-- +-- Version : 0246 + fix +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t65/ +-- +-- Limitations : +-- +-- 65C02 +-- supported : inc, dec, phx, plx, phy, ply +-- missing : bra, ora, lda, cmp, sbc, tsb*2, trb*2, stz*2, bit*2, wai, stp, jmp, bbr*8, bbs*8 +-- +-- File history : +-- +-- 0246 : First release +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T65_Pack.all; + +entity T65_MCode is + port( + Mode : in std_logic_vector(1 downto 0); -- "00" => 6502, "01" => 65C02, "10" => 65816 + IR : in std_logic_vector(7 downto 0); + MCycle : in std_logic_vector(2 downto 0); + P : in std_logic_vector(7 downto 0); + LCycle : out std_logic_vector(2 downto 0); + ALU_Op : out std_logic_vector(3 downto 0); + Set_BusA_To : out std_logic_vector(2 downto 0); -- DI,A,X,Y,S,P + Set_Addr_To : out std_logic_vector(1 downto 0); -- PC Adder,S,AD,BA + Write_Data : out std_logic_vector(2 downto 0); -- DL,A,X,Y,S,P,PCL,PCH + Jump : out std_logic_vector(1 downto 0); -- PC,++,DIDL,Rel + BAAdd : out std_logic_vector(1 downto 0); -- None,DB Inc,BA Add,BA Adj + BreakAtNA : out std_logic; + ADAdd : out std_logic; + AddY : out std_logic; + PCAdd : out std_logic; + Inc_S : out std_logic; + Dec_S : out std_logic; + LDA : out std_logic; + LDP : out std_logic; + LDX : out std_logic; + LDY : out std_logic; + LDS : out std_logic; + LDDI : out std_logic; + LDALU : out std_logic; + LDAD : out std_logic; + LDBAL : out std_logic; + LDBAH : out std_logic; + SaveP : out std_logic; + Write : out std_logic + ); +end T65_MCode; + +architecture rtl of T65_MCode is + + signal Branch : std_logic; + +begin + + with IR(7 downto 5) select + Branch <= not P(Flag_N) when "000", + P(Flag_N) when "001", + not P(Flag_V) when "010", + P(Flag_V) when "011", + not P(Flag_C) when "100", + P(Flag_C) when "101", + not P(Flag_Z) when "110", + P(Flag_Z) when others; + + process (IR, MCycle, P, Branch, Mode) + begin + LCycle <= "001"; + Set_BusA_To <= "001"; -- A + Set_Addr_To <= (others => '0'); + Write_Data <= (others => '0'); + Jump <= (others => '0'); + BAAdd <= "00"; + BreakAtNA <= '0'; + ADAdd <= '0'; + PCAdd <= '0'; + Inc_S <= '0'; + Dec_S <= '0'; + LDA <= '0'; + LDP <= '0'; + LDX <= '0'; + LDY <= '0'; + LDS <= '0'; + LDDI <= '0'; + LDALU <= '0'; + LDAD <= '0'; + LDBAL <= '0'; + LDBAH <= '0'; + SaveP <= '0'; + Write <= '0'; + AddY <= '0'; + + case IR(7 downto 5) is + when "100" => + --{{{ + case IR(1 downto 0) is + when "00" => + Set_BusA_To <= "011"; -- Y + Write_Data <= "011"; -- Y + when "10" => + Set_BusA_To <= "010"; -- X + Write_Data <= "010"; -- X + when others => + Write_Data <= "001"; -- A + end case; + --}}} + when "101" => + --{{{ + case IR(1 downto 0) is + when "00" => + if IR(4) /= '1' or IR(2) /= '0' then + LDY <= '1'; + end if; + when "10" => + LDX <= '1'; + when others => + LDA <= '1'; + end case; + Set_BusA_To <= "000"; -- DI + --}}} + when "110" => + --{{{ + case IR(1 downto 0) is + when "00" => + if IR(4) = '0' then + LDY <= '1'; + end if; + Set_BusA_To <= "011"; -- Y + when others => + Set_BusA_To <= "001"; -- A + end case; + --}}} + when "111" => + --{{{ + case IR(1 downto 0) is + when "00" => + if IR(4) = '0' then + LDX <= '1'; + end if; + Set_BusA_To <= "010"; -- X + when others => + Set_BusA_To <= "001"; -- A + end case; + --}}} + when others => + end case; + + if IR(7 downto 6) /= "10" and IR(1 downto 0) = "10" then + Set_BusA_To <= "000"; -- DI + end if; + + case IR(4 downto 0) is + when "00000" | "01000" | "01010" | "11000" | "11010" => + --{{{ + -- Implied + case IR is + when "00000000" => + -- BRK + LCycle <= "110"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= "01"; -- S + Write_Data <= "111"; -- PCH + Write <= '1'; + when 2 => + Dec_S <= '1'; + Set_Addr_To <= "01"; -- S + Write_Data <= "110"; -- PCL + Write <= '1'; + when 3 => + Dec_S <= '1'; + Set_Addr_To <= "01"; -- S + Write_Data <= "101"; -- P + Write <= '1'; + when 4 => + Dec_S <= '1'; + Set_Addr_To <= "11"; -- BA + when 5 => + LDDI <= '1'; + Set_Addr_To <= "11"; -- BA + when 6 => + Jump <= "10"; -- DIDL + when others => + end case; + when "00100000" => + -- JSR + LCycle <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDDI <= '1'; + Set_Addr_To <= "01"; -- S + when 2 => + Set_Addr_To <= "01"; -- S + Write_Data <= "111"; -- PCH + Write <= '1'; + when 3 => + Dec_S <= '1'; + Set_Addr_To <= "01"; -- S + Write_Data <= "110"; -- PCL + Write <= '1'; + when 4 => + Dec_S <= '1'; + when 5 => + Jump <= "10"; -- DIDL + when others => + end case; + when "01000000" => + -- RTI + LCycle <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= "01"; -- S + when 2 => + Inc_S <= '1'; + Set_Addr_To <= "01"; -- S + when 3 => + Inc_S <= '1'; + Set_Addr_To <= "01"; -- S + Set_BusA_To <= "000"; -- DI + when 4 => + LDP <= '1'; + Inc_S <= '1'; + LDDI <= '1'; + Set_Addr_To <= "01"; -- S + when 5 => + Jump <= "10"; -- DIDL + when others => + end case; + when "01100000" => + -- RTS + LCycle <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= "01"; -- S + when 2 => + Inc_S <= '1'; + Set_Addr_To <= "01"; -- S + when 3 => + Inc_S <= '1'; + LDDI <= '1'; + Set_Addr_To <= "01"; -- S + when 4 => + Jump <= "10"; -- DIDL + when 5 => + Jump <= "01"; + when others => + end case; + when "00001000" | "01001000" | "01011010" | "11011010" => + -- PHP, PHA, PHY*, PHX* + LCycle <= "010"; + if Mode = "00" and IR(1) = '1' then + LCycle <= "001"; + end if; + case to_integer(unsigned(MCycle)) is + when 1 => + case IR(7 downto 4) is + when "0000" => + Write_Data <= "101"; -- P + when "0100" => + Write_Data <= "001"; -- A + when "0101" => + Write_Data <= "011"; -- Y + when "1101" => + Write_Data <= "010"; -- X + when others => + end case; + Write <= '1'; + Set_Addr_To <= "01"; -- S + when 2 => + Dec_S <= '1'; + when others => + end case; + when "00101000" | "01101000" | "01111010" | "11111010" => + -- PLP, PLA, PLY*, PLX* + LCycle <= "011"; + if Mode = "00" and IR(1) = '1' then + LCycle <= "001"; + end if; + case IR(7 downto 4) is + when "0010" => + LDP <= '1'; + when "0110" => + LDA <= '1'; + when "0111" => + if Mode /= "00" then + LDY <= '1'; + end if; + when "1111" => + if Mode /= "00" then + LDX <= '1'; + end if; + when others => + end case; + case to_integer(unsigned(MCycle)) is + when 0 => + SaveP <= '1'; + when 1 => + Set_Addr_To <= "01"; -- S + when 2 => + Inc_S <= '1'; + Set_Addr_To <= "01"; -- S + when 3 => + Set_BusA_To <= "000"; -- DI + when others => + end case; + when "10100000" | "11000000" | "11100000" => + -- LDY, CPY, CPX + -- Immediate + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + when others => + end case; + when "10001000" => + -- DEY + LDY <= '1'; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Set_BusA_To <= "011"; -- Y + when others => + end case; + when "11001010" => + -- DEX + LDX <= '1'; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Set_BusA_To <= "010"; -- X + when others => + end case; + when "00011010" | "00111010" => + -- INC*, DEC* + if Mode /= "00" then + LDA <= '1'; -- A + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Set_BusA_To <= "100"; -- S + when others => + end case; + when "00001010" | "00101010" | "01001010" | "01101010" => + -- ASL, ROL, LSR, ROR + LDA <= '1'; -- A + Set_BusA_To <= "001"; -- A + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + when others => + end case; + when "10001010" | "10011000" => + -- TYA, TXA + LDA <= '1'; -- A + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + when others => + end case; + when "10101010" | "10101000" => + -- TAX, TAY + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Set_BusA_To <= "001"; -- A + when others => + end case; + when "10011010" => + -- TXS + case to_integer(unsigned(MCycle)) is + when 0 => + LDS <= '1'; + when 1 => + when others => + end case; + when "10111010" => + -- TSX + LDX <= '1'; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Set_BusA_To <= "100"; -- S + when others => + end case; + + -- when "00011000" | "00111000" | "01011000" | "01111000" | "10111000" | "11011000" | "11111000" | "11001000" | "11101000" => + -- -- CLC, SEC, CLI, SEI, CLV, CLD, SED, INY, INX + -- case to_integer(unsigned(MCycle)) is + -- when 1 => + -- when others => + -- end case; + when others => + case to_integer(unsigned(MCycle)) is + when 0 => + when others => + end case; + end case; + --}}} + + when "00001" | "00011" => + --{{{ + -- Zero Page Indexed Indirect (d,x) + LCycle <= "101"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDAD <= '1'; + Set_Addr_To <= "10"; -- AD + when 2 => + ADAdd <= '1'; + Set_Addr_To <= "10"; -- AD + when 3 => + BAAdd <= "01"; -- DB Inc + LDBAL <= '1'; + Set_Addr_To <= "10"; -- AD + when 4 => + LDBAH <= '1'; + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 5 => + when others => + end case; + --}}} + + when "01001" | "01011" => + --{{{ + -- Immediate + LDA <= '1'; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + when others => + end case; + + --}}} + + when "00010" | "10010" => + --{{{ + -- Immediate, KIL + LDX <= '1'; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + if IR = "10100010" then + -- LDX + Jump <= "01"; + else + -- KIL !!!!!!!!!!!!!!!!!!!!!!!!!!!!! + end if; + when others => + end case; + --}}} + + when "00100" => + --{{{ + -- Zero Page + LCycle <= "010"; + case to_integer(unsigned(MCycle)) is + when 0 => + if IR(7 downto 5) = "001" then + SaveP <= '1'; + end if; + when 1 => + Jump <= "01"; + LDAD <= '1'; + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "10"; -- AD + when 2 => + when others => + end case; + --}}} + + when "00101" | "00110" | "00111" => + --{{{ + -- Zero Page + if IR(7 downto 6) /= "10" and IR(1 downto 0) = "10" then + -- Read-Modify-Write + LCycle <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDAD <= '1'; + Set_Addr_To <= "10"; -- AD + when 2 => + LDDI <= '1'; + Write <= '1'; + Set_Addr_To <= "10"; -- AD + when 3 => + LDALU <= '1'; + SaveP <= '1'; + Write <= '1'; + Set_Addr_To <= "10"; -- AD + when 4 => + when others => + end case; + else + LCycle <= "010"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDAD <= '1'; + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "10"; -- AD + when 2 => + when others => + end case; + end if; + --}}} + + when "01100" => + --{{{ + -- Absolute + if IR(7 downto 6) = "01" and IR(4 downto 0) = "01100" then + -- JMP + if IR(5) = '0' then + --LCycle <= "011"; + LCycle <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDDI <= '1'; + when 2 => + Jump <= "10"; -- DIDL + when others => + end case; + else + --LCycle <= "101"; + LCycle <= "100"; -- mikej + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDDI <= '1'; + LDBAL <= '1'; + when 2 => + LDBAH <= '1'; + if Mode /= "00" then + Jump <= "10"; -- DIDL + end if; + if Mode = "00" then + Set_Addr_To <= "11"; -- BA + end if; + when 3 => + LDDI <= '1'; + if Mode = "00" then + Set_Addr_To <= "11"; -- BA + BAAdd <= "01"; -- DB Inc + else + Jump <= "01"; + end if; + when 4 => + Jump <= "10"; -- DIDL + when others => + end case; + end if; + else + LCycle <= "011"; + case to_integer(unsigned(MCycle)) is + when 0 => + if IR(7 downto 5) = "001" then + SaveP <= '1'; + end if; + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + LDBAH <= '1'; + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 3 => + when others => + end case; + end if; + --}}} + + when "01101" | "01110" | "01111" => + --{{{ + -- Absolute + if IR(7 downto 6) /= "10" and IR(1 downto 0) = "10" then + -- Read-Modify-Write + LCycle <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + LDBAH <= '1'; + Set_Addr_To <= "11"; -- BA + when 3 => + LDDI <= '1'; + Write <= '1'; + Set_Addr_To <= "11"; -- BA + when 4 => + Write <= '1'; + LDALU <= '1'; + SaveP <= '1'; + Set_Addr_To <= "11"; -- BA + when 5 => + SaveP <= '0'; -- MIKEJ was 1 + when others => + end case; + else + LCycle <= "011"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + LDBAH <= '1'; + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 3 => + when others => + end case; + end if; + --}}} + + when "10000" => + --{{{ + -- Relative + + -- This circuit dictates when the last + -- microcycle occurs for the branch depending on + -- whether or not the branch is taken and if a page + -- is crossed... + if (Branch = '1') then + + LCycle <= "011"; -- We're done @ T3 if branching...upper + -- level logic will stop at T2 if no page cross + -- (See the Break signal) + else + + LCycle <= "001"; + + end if; + + -- This decodes the current microcycle and takes the + -- proper course of action... + case to_integer(unsigned(MCycle)) is + + -- On the T1 microcycle, increment the program counter + -- and instruct the upper level logic to fetch the offset + -- from the Din bus and store it in the data latches. This + -- will be the last microcycle if the branch isn't taken. + when 1 => + + Jump <= "01"; -- Increments the PC by one (PC will now be PC+2) + -- from microcycle T0. + + LDDI <= '1'; -- Tells logic in top level (T65.vhd) to route + -- the Din bus to the memory data latch (DL) + -- so that the branch offset is fetched. + + -- In microcycle T2, tell the logic in the top level to + -- add the offset. If the most significant byte of the + -- program counter (i.e. the current "page") does not need + -- updating, we are done here...the Break signal at the + -- T65.vhd level takes care of that... + when 2 => + + Jump <= "11"; -- Tell the PC Jump logic to use relative mode. + + PCAdd <= '1'; -- This tells the PC adder to update itself with + -- the current offset recently fetched from + -- memory. + + -- The following is microcycle T3 : + -- The program counter should be completely updated + -- on this cycle after the page cross is detected. + -- We don't need to do anything here... + when 3 => + + + when others => null; -- Do nothing. + + end case; + --}}} + + when "10001" | "10011" => + --{{{ + -- Zero Page Indirect Indexed (d),y + LCycle <= "101"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDAD <= '1'; + Set_Addr_To <= "10"; -- AD + when 2 => + LDBAL <= '1'; + BAAdd <= "01"; -- DB Inc + Set_Addr_To <= "10"; -- AD + when 3 => + Set_BusA_To <= "011"; -- Y + BAAdd <= "10"; -- BA Add + LDBAH <= '1'; + Set_Addr_To <= "11"; -- BA + when 4 => + BAAdd <= "11"; -- BA Adj + if IR(7 downto 5) = "100" then + Write <= '1'; + else + BreakAtNA <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 5 => + when others => + end case; + --}}} + + when "10100" | "10101" | "10110" | "10111" => + --{{{ + -- Zero Page, X + if IR(7 downto 6) /= "10" and IR(1 downto 0) = "10" then + -- Read-Modify-Write + LCycle <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDAD <= '1'; + Set_Addr_To <= "10"; -- AD + when 2 => + ADAdd <= '1'; + Set_Addr_To <= "10"; -- AD + when 3 => + LDDI <= '1'; + Write <= '1'; + Set_Addr_To <= "10"; -- AD + when 4 => + LDALU <= '1'; + SaveP <= '1'; + Write <= '1'; + Set_Addr_To <= "10"; -- AD + when 5 => + when others => + end case; + else + LCycle <= "011"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDAD <= '1'; + Set_Addr_To <= "10"; -- AD + when 2 => + ADAdd <= '1'; + -- Added this check for Y reg. use... + if (IR(3 downto 0) = "0110") then + AddY <= '1'; + end if; + + if IR(7 downto 5) = "100" then + Write <= '1'; + end if; + Set_Addr_To <= "10"; -- AD + when 3 => null; + when others => + end case; + end if; + --}}} + + when "11001" | "11011" => + --{{{ + -- Absolute Y + LCycle <= "100"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + Set_BusA_To <= "011"; -- Y + BAAdd <= "10"; -- BA Add + LDBAH <= '1'; + Set_Addr_To <= "11"; -- BA + when 3 => + BAAdd <= "11"; -- BA adj + if IR(7 downto 5) = "100" then + Write <= '1'; + else + BreakAtNA <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 4 => + when others => + end case; + --}}} + + when "11100" | "11101" | "11110" | "11111" => + --{{{ + -- Absolute X + + if IR(7 downto 6) /= "10" and IR(1 downto 0) = "10" then + -- Read-Modify-Write + LCycle <= "110"; + case to_integer(unsigned(MCycle)) is + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + Set_BusA_To <= "010"; -- X + BAAdd <= "10"; -- BA Add + LDBAH <= '1'; + Set_Addr_To <= "11"; -- BA + when 3 => + BAAdd <= "11"; -- BA adj + Set_Addr_To <= "11"; -- BA + when 4 => + LDDI <= '1'; + Write <= '1'; + Set_Addr_To <= "11"; -- BA + when 5 => + LDALU <= '1'; + SaveP <= '1'; + Write <= '1'; + Set_Addr_To <= "11"; -- BA + when 6 => + when others => + end case; + else + LCycle <= "100"; + if IR(7 downto 6) /= "10" then + LDA <= '1'; + end if; + case to_integer(unsigned(MCycle)) is + when 0 => + when 1 => + Jump <= "01"; + LDBAL <= '1'; + when 2 => + Jump <= "01"; + -- mikej + -- special case 0xBE which uses Y reg as index!! + if (IR = "10111110") then + Set_BusA_To <= "011"; -- Y + else + Set_BusA_To <= "010"; -- X + end if; + BAAdd <= "10"; -- BA Add + LDBAH <= '1'; + Set_Addr_To <= "11"; -- BA + when 3 => + BAAdd <= "11"; -- BA adj + if IR(7 downto 5) = "100" then + Write <= '1'; + else + BreakAtNA <= '1'; + end if; + Set_Addr_To <= "11"; -- BA + when 4 => + when others => + end case; + end if; + --}}} + when others => + end case; + end process; + + process (IR, MCycle) + begin + -- ORA, AND, EOR, ADC, NOP, LD, CMP, SBC + -- ASL, ROL, LSR, ROR, BIT, LD, DEC, INC + case IR(1 downto 0) is + when "00" => + --{{{ + case IR(4 downto 2) is + when "000" | "001" | "011" => + case IR(7 downto 5) is + when "110" | "111" => + -- CP + ALU_Op <= "0110"; + when "101" => + -- LD + ALU_Op <= "0101"; + when "001" => + -- BIT + ALU_Op <= "1100"; + when others => + -- NOP/ST + ALU_Op <= "0100"; + end case; + when "010" => + case IR(7 downto 5) is + when "111" | "110" => + -- IN + ALU_Op <= "1111"; + when "100" => + -- DEY + ALU_Op <= "1110"; + when others => + -- LD + ALU_Op <= "1101"; + end case; + when "110" => + case IR(7 downto 5) is + when "100" => + -- TYA + ALU_Op <= "1101"; + when others => + ALU_Op <= "----"; + end case; + when others => + case IR(7 downto 5) is + when "101" => + -- LD + ALU_Op <= "1101"; + when others => + ALU_Op <= "0100"; + end case; + end case; + --}}} + when "01" => -- OR + --{{{ + ALU_Op(3) <= '0'; + ALU_Op(2 downto 0) <= IR(7 downto 5); + --}}} + when "10" => + --{{{ + ALU_Op(3) <= '1'; + ALU_Op(2 downto 0) <= IR(7 downto 5); + case IR(7 downto 5) is + when "000" => + if IR(4 downto 2) = "110" then + -- INC + ALU_Op <= "1111"; + end if; + when "001" => + if IR(4 downto 2) = "110" then + -- DEC + ALU_Op <= "1110"; + end if; + when "100" => + if IR(4 downto 2) = "010" then + -- TXA + ALU_Op <= "0101"; + else + ALU_Op <= "0100"; + end if; + when others => + end case; + --}}} + when others => + --{{{ + case IR(7 downto 5) is + when "100" => + ALU_Op <= "0100"; + when others => + if MCycle = "000" then + ALU_Op(3) <= '0'; + ALU_Op(2 downto 0) <= IR(7 downto 5); + else + ALU_Op(3) <= '1'; + ALU_Op(2 downto 0) <= IR(7 downto 5); + end if; + end case; + --}}} + end case; + end process; + +end; diff --git a/ORAO_MiST/rtl/T65/T65_Pack.vhd b/ORAO_MiST/rtl/T65/T65_Pack.vhd new file mode 100644 index 00000000..e025e1bf --- /dev/null +++ b/ORAO_MiST/rtl/T65/T65_Pack.vhd @@ -0,0 +1,117 @@ +-- **** +-- T65(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 Bugfixes by ehenciak added +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 65xx compatible microprocessor core +-- +-- Version : 0246 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t65/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T65_Pack is + + constant Flag_C : integer := 0; + constant Flag_Z : integer := 1; + constant Flag_I : integer := 2; + constant Flag_D : integer := 3; + constant Flag_B : integer := 4; + constant Flag_1 : integer := 5; + constant Flag_V : integer := 6; + constant Flag_N : integer := 7; + + component T65_MCode + port( + Mode : in std_logic_vector(1 downto 0); -- "00" => 6502, "01" => 65C02, "10" => 65816 + IR : in std_logic_vector(7 downto 0); + MCycle : in std_logic_vector(2 downto 0); + P : in std_logic_vector(7 downto 0); + LCycle : out std_logic_vector(2 downto 0); + ALU_Op : out std_logic_vector(3 downto 0); + Set_BusA_To : out std_logic_vector(2 downto 0); -- DI,A,X,Y,S,P + Set_Addr_To : out std_logic_vector(1 downto 0); -- PC Adder,S,AD,BA + Write_Data : out std_logic_vector(2 downto 0); -- DL,A,X,Y,S,P,PCL,PCH + Jump : out std_logic_vector(1 downto 0); -- PC,++,DIDL,Rel + BAAdd : out std_logic_vector(1 downto 0); -- None,DB Inc,BA Add,BA Adj + BreakAtNA : out std_logic; + ADAdd : out std_logic; + AddY : out std_logic; + PCAdd : out std_logic; + Inc_S : out std_logic; + Dec_S : out std_logic; + LDA : out std_logic; + LDP : out std_logic; + LDX : out std_logic; + LDY : out std_logic; + LDS : out std_logic; + LDDI : out std_logic; + LDALU : out std_logic; + LDAD : out std_logic; + LDBAL : out std_logic; + LDBAH : out std_logic; + SaveP : out std_logic; + Write : out std_logic + ); + end component; + + component T65_ALU + port( + Mode : in std_logic_vector(1 downto 0); -- "00" => 6502, "01" => 65C02, "10" => 65C816 + Op : in std_logic_vector(3 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + P_In : in std_logic_vector(7 downto 0); + P_Out : out std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/ORAO_MiST/rtl/bram_1port.vhd b/ORAO_MiST/rtl/bram_1port.vhd new file mode 100644 index 00000000..2e6d12f6 --- /dev/null +++ b/ORAO_MiST/rtl/bram_1port.vhd @@ -0,0 +1,45 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +-- synthesis tool should recognize this as 8-bit RAM +-- and optimally synthesize it using FPGA on-chip +-- single port block RAM (BRAM) + +entity bram_1port is + generic( + C_mem_size: integer := 8 -- size in KB + ); + port( + clock: in std_logic; + -- read-write port + rw_port_write: in std_logic; + rw_port_addr: in std_logic_vector(15 downto 0); + rw_port_data_in: in std_logic_vector(7 downto 0); + rw_port_data_out: out std_logic_vector(7 downto 0) + ); +end bram_1port; + +architecture x of bram_1port is + type bram_type is array(0 to (C_mem_size * 1024 - 1)) + of std_logic_vector(7 downto 0); + + signal bram: bram_type; + + attribute ramstyle: string; + attribute ramstyle of bram: signal is "no_rw_check"; + +begin + + process(clock) + begin + if falling_edge(clock) then + if rw_port_write = '1' then + bram(conv_integer(rw_port_addr)) <= rw_port_data_in; + end if; + rw_port_data_out <= bram(conv_integer(rw_port_addr)); + end if; + end process; + +end x; diff --git a/ORAO_MiST/rtl/bram_2port.vhd b/ORAO_MiST/rtl/bram_2port.vhd new file mode 100644 index 00000000..c2096501 --- /dev/null +++ b/ORAO_MiST/rtl/bram_2port.vhd @@ -0,0 +1,57 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +-- synthesis tool should recngnize this as 8-bit RAM +-- and optimally synthesize it using FPGA on-chip +-- dual port block RAM (BRAM) + +entity bram_2port is + generic( + C_mem_size: integer := 8 -- size in KB + ); + port( + clock: in std_logic; + -- read-only port + ro_port_addr: in std_logic_vector(15 downto 0); + ro_port_data_out: out std_logic_vector(7 downto 0); + -- read-write port + rw_port_write: in std_logic; + rw_port_addr: in std_logic_vector(15 downto 0); + rw_port_data_in: in std_logic_vector(7 downto 0); + rw_port_data_out: out std_logic_vector(7 downto 0) + ); +end bram_2port; + +architecture x of bram_2port is + type bram_type is array(0 to (C_mem_size * 1024 - 1)) + of std_logic_vector(7 downto 0); + + signal bram: bram_type; + + + -- Altera Quartus attributes + attribute ramstyle: string; + attribute ramstyle of bram: signal is "no_rw_check"; + + signal ro_data: std_logic_vector(7 downto 0); + signal rw_data: std_logic_vector(7 downto 0); + +begin + + rw_port_data_out <= rw_data; + ro_port_data_out <= ro_data; + + process(clock) + begin + if falling_edge(clock) then + if rw_port_write = '1' then + bram(conv_integer(rw_port_addr)) <= rw_port_data_in(7 downto 0); + end if; + rw_data <= bram(conv_integer(rw_port_addr)); + ro_data <= bram(conv_integer(ro_port_addr)); + end if; + end process; + +end x; diff --git a/ORAO_MiST/rtl/bufferedUART.vhd b/ORAO_MiST/rtl/bufferedUART.vhd new file mode 100644 index 00000000..3a6d3a4b --- /dev/null +++ b/ORAO_MiST/rtl/bufferedUART.vhd @@ -0,0 +1,238 @@ +-- 6850 ACIA COMPATIBLE UART WITH HARDWARE INPUT BUFFER AND HANDSHAKE +-- This file is copyright by Grant Searle 2014 + +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the UK101 page at http://searle.hostei.com/grant/uk101FPGA/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + use ieee.std_logic_unsigned.all; + +entity bufferedUART is + port ( + n_wr : in std_logic; + n_rd : in std_logic; + regSel : in std_logic; + dataIn : in std_logic_vector(7 downto 0); + dataOut : out std_logic_vector(7 downto 0); + n_int : out std_logic; + rxClock : in std_logic; -- 16 x baud rate + txClock : in std_logic; -- 16 x baud rate + rxd : in std_logic; + txd : out std_logic; + n_rts : out std_logic :='0'; + n_cts : in std_logic; + n_dcd : in std_logic + ); +end bufferedUART; + +architecture rtl of bufferedUART is + +signal n_int_internal : std_logic := '1'; +signal statusReg : std_logic_vector(7 downto 0) := (others => '0'); +signal controlReg : std_logic_vector(7 downto 0) := "00000000"; + +signal rxBitCount: std_logic_vector(3 DOWNTO 0); +signal txBitCount: std_logic_vector(3 DOWNTO 0); + +signal rxClockCount: std_logic_vector(5 DOWNTO 0); +signal txClockCount: std_logic_vector(5 DOWNTO 0); + +signal rxCurrentByteBuffer: std_logic_vector(7 DOWNTO 0); +signal txBuffer: std_logic_vector(7 DOWNTO 0); + +signal txByteLatch: std_logic_vector(7 DOWNTO 0); + +-- Use bit toggling to determine change of state +-- If byte sent over serial, change "txByteSent" flag from 0-->1, or from 1-->0 +-- If byte written to tx buffer, change "txByteWritten" flag from 0-->1, or from 1-->0 +-- So, if "txByteSent" = "txByteWritten" then no new data to be sent +-- otherwise (if "txByteSent" /= "txByteWritten") then new data available ready to be sent +signal txByteWritten : std_logic := '0'; +signal txByteSent : std_logic := '0'; + +type serialStateType is ( idle, dataBit, stopBit ); +signal rxState : serialStateType; +signal txState : serialStateType; + +signal reset : std_logic := '0'; + +type rxBuffArray is array (0 to 31) of std_logic_vector(7 downto 0); +signal rxBuffer : rxBuffArray; + +signal rxInPointer: integer range 0 to 63 :=0; +signal rxReadPointer: integer range 0 to 63 :=0; +signal rxBuffCount: integer range 0 to 63 :=0; + +begin + -- minimal 6850 compatibility + statusReg(0) <= '0' when rxInPointer=rxReadPointer else '1'; + statusReg(1) <= '1' when txByteWritten=txByteSent else '0'; + statusReg(2) <= n_dcd; + statusReg(3) <= n_cts; + statusReg(7) <= not(n_int_internal); + + -- interrupt mask + n_int <= n_int_internal; + n_int_internal <= '0' when (rxInPointer /= rxReadPointer) and controlReg(7)='1' + else '0' when (txByteWritten=txByteSent) and controlReg(6)='0' and controlReg(5)='1' + else '1'; + +-- raise (inhibit) n_rts when buffer over half-full +-- 6850 implementatit = n_rts <= '1' when controlReg(6)='1' and controlReg(5)='0' else '0'; + + rxBuffCount <= 0 + rxInPointer - rxReadPointer when rxInPointer >= rxReadPointer + else 32 + rxInPointer - rxReadPointer; + n_rts <= '1' when rxBuffCount > 24 else '0'; + + -- control reg + -- 7 6 5 4 3 2 1 0 + -- Rx int en | Tx control (INT/RTS) | Tx control (RTS) | ignored | ignored | ignored | reset A | reset B + -- [ 0 1 ] = RTS LOW + -- RESET = [ 1 1 ] + + -- status reg + -- 7 6 5 4 3 2 1 0 + -- irq | parity error | overrun | frame err | n_cts | n_dcd | tx empty | rx full + -- always 0 (no parity) n/a n/a + + -- write of xxxxxx11 to control reg will reset + reset <= '1' when n_wr = '0' and dataIn(1 downto 0) = "11" and regSel = '0' else '0'; + + process( n_rd ) + begin + if falling_edge(n_rd) then -- Standard CPU - present data on leading edge of rd + if regSel='1' then + dataOut <= rxBuffer(rxReadPointer); + if rxInPointer /= rxReadPointer then + if rxReadPointer < 31 then + rxReadPointer <= rxReadPointer+1; + else + rxReadPointer <= 0; + end if; + end if; + else + dataOut <= statusReg; + end if; + end if; + end process; + + process( n_wr ) + begin + if rising_edge(n_wr) then -- Standard CPU - capture data on trailing edge of wr + if regSel='1' then + if txByteWritten=txByteSent then + txByteWritten <= not txByteWritten; + end if; + txByteLatch <= dataIn; + else + controlReg <= dataIn; + end if; + end if; + end process; + + process( rxClock , reset ) + begin + if reset='1' then + rxState <= idle; + rxBitCount<="0000"; + rxClockCount<="000000"; + + elsif falling_edge(rxClock) then + case rxState is + when idle => + if rxd='1' then -- high so idle + rxBitCount<="0000"; + rxClockCount<="000000"; + else -- low so in start bit + if rxClockCount= 7 then -- wait to half way through bit + rxClockCount<="000000"; + rxState <=dataBit; + else + rxClockCount<=rxClockCount+1; + end if; + end if; + when dataBit => + if rxClockCount= 15 then -- 1 bit later - sample + rxClockCount<="000000"; + rxBitCount <=rxBitCount+1; + rxCurrentByteBuffer <= rxd & rxCurrentByteBuffer(7 downto 1); + if rxBitCount= 7 then -- 8 bits read - handle stop bit + rxState<=stopBit; + end if; + else + rxClockCount<=rxClockCount+1; + end if; + when stopBit => + if rxClockCount= 15 then + rxBuffer(rxInPointer) <= rxCurrentByteBuffer; + if rxInPointer < 31 then + rxInPointer <= rxInPointer+1; + else + rxInPointer <= 0; + end if; + rxClockCount<="000000"; + rxState <=idle; + else + rxClockCount<=rxClockCount+1; + end if; + end case; + end if; + end process; + + process( txClock , reset ) + begin + if reset='1' then + txState <= idle; + txBitCount<="0000"; + txClockCount<="000000"; + txByteSent <= '0'; + + elsif falling_edge(txClock) then + case txState is + when idle => + txd <= '1'; + if (txByteWritten /= txByteSent) and n_cts='0' and n_dcd='0' then + txBuffer <= txByteLatch; + txByteSent <= not txByteSent; + txState <=dataBit; + txd <= '0'; -- start bit + txBitCount<="0000"; + txClockCount<="000000"; + end if; + when dataBit => + if txClockCount= 15 then -- 1 bit later + txClockCount<="000000"; + if txBitCount= 8 then -- 8 bits read - handle stop bit + txd <= '1'; + txState<=stopBit; + else + txd <= txBuffer(0); + txBuffer <= '0' & txBuffer(7 downto 1); + txBitCount <=txBitCount+1; + end if; + else + txClockCount<=txClockCount+1; + end if; + when stopBit => + if txClockCount= 15 then + txState <=idle; + else + txClockCount<=txClockCount+1; + end if; + end case; + end if; + end process; + end rtl; diff --git a/ORAO_MiST/rtl/build_id.tcl b/ORAO_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/ORAO_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/ORAO_MiST/rtl/build_id.v b/ORAO_MiST/rtl/build_id.v new file mode 100644 index 00000000..ffb52837 --- /dev/null +++ b/ORAO_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180430" +`define BUILD_TIME "162546" diff --git a/ORAO_MiST/rtl/dac.vhd b/ORAO_MiST/rtl/dac.vhd new file mode 100644 index 00000000..83d1861e --- /dev/null +++ b/ORAO_MiST/rtl/dac.vhd @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- $Id: dac.vhd,v 1.1 2005/10/25 21:09:42 arnim Exp $ +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dac is + + generic ( + msbi_g : integer := 9 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(msbi_g downto 0); + dac_o : out std_logic + ); + +end dac; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dac is + + signal DACout_q : std_logic; + signal DeltaAdder_s, + SigmaAdder_s, + SigmaLatch_q, + DeltaB_s : unsigned(msbi_g+2 downto 0); + +begin + + DeltaB_s(msbi_g+2 downto msbi_g+1) <= SigmaLatch_q(msbi_g+2) & + SigmaLatch_q(msbi_g+2); + DeltaB_s(msbi_g downto 0) <= (others => '0'); + + DeltaAdder_s <= unsigned('0' & '0' & dac_i) + DeltaB_s; + + SigmaAdder_s <= DeltaAdder_s + SigmaLatch_q; + + seq: process (clk_i, res_n_i) + begin + if res_n_i = '0' then + SigmaLatch_q <= to_unsigned(2**(msbi_g+1), SigmaLatch_q'length); + DACout_q <= '0'; + + elsif clk_i'event and clk_i = '1' then + SigmaLatch_q <= SigmaAdder_s; + DACout_q <= SigmaLatch_q(msbi_g+2); + end if; + end process seq; + + dac_o <= DACout_q; + +end rtl; diff --git a/ORAO_MiST/rtl/hq2x.sv b/ORAO_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/ORAO_MiST/rtl/hq2x.sv @@ -0,0 +1,454 @@ +// +// +// Copyright (c) 2012-2013 Ludvig Strigeus +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +module hq2x_in #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH); + wire [DWIDTH:0] out[2]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); +endmodule + + +module hq2x_out #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input [1:0] rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input [1:0] wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH*2); + wire [DWIDTH:0] out[4]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf2(clk,data,rdaddr,wraddr,wren && (wrbuf == 2),out[2]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf3(clk,data,rdaddr,wraddr,wren && (wrbuf == 3),out[3]); +endmodule + + +module hq2x_buf #(parameter NUMWORDS, parameter AWIDTH, parameter DWIDTH) +( + input clock, + input [DWIDTH:0] data, + input [AWIDTH:0] rdaddress, + input [AWIDTH:0] wraddress, + input wren, + output [DWIDTH:0] q +); + + altsyncram altsyncram_component ( + .address_a (wraddress), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .address_b (rdaddress), + .q_b(q), + .aclr0 (1'b0), + .aclr1 (1'b0), + .addressstall_a (1'b0), + .addressstall_b (1'b0), + .byteena_a (1'b1), + .byteena_b (1'b1), + .clock1 (1'b1), + .clocken0 (1'b1), + .clocken1 (1'b1), + .clocken2 (1'b1), + .clocken3 (1'b1), + .data_b ({(DWIDTH+1){1'b1}}), + .eccstatus (), + .q_a (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_b = "NONE", + altsyncram_component.address_reg_b = "CLOCK0", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_input_b = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = NUMWORDS, + altsyncram_component.numwords_b = NUMWORDS, + altsyncram_component.operation_mode = "DUAL_PORT", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.widthad_a = AWIDTH+1, + altsyncram_component.widthad_b = AWIDTH+1, + altsyncram_component.width_a = DWIDTH+1, + altsyncram_component.width_b = DWIDTH+1, + altsyncram_component.width_byteena_a = 1; + +endmodule + +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +module DiffCheck +( + input [17:0] rgb1, + input [17:0] rgb2, + output result +); + + wire [5:0] r = rgb1[5:1] - rgb2[5:1]; + wire [5:0] g = rgb1[11:7] - rgb2[11:7]; + wire [5:0] b = rgb1[17:13] - rgb2[17:13]; + wire [6:0] t = $signed(r) + $signed(b); + wire [6:0] gx = {g[5], g}; + wire [7:0] y = $signed(t) + $signed(gx); + wire [6:0] u = $signed(r) - $signed(b); + wire [7:0] v = $signed({g, 1'b0}) - $signed(t); + + // if y is inside (-24..24) + wire y_inside = (y < 8'h18 || y >= 8'he8); + + // if u is inside (-4, 4) + wire u_inside = (u < 7'h4 || u >= 7'h7c); + + // if v is inside (-6, 6) + wire v_inside = (v < 8'h6 || v >= 8'hfA); + assign result = !(y_inside && u_inside && v_inside); +endmodule + +module InnerBlend +( + input [8:0] Op, + input [5:0] A, + input [5:0] B, + input [5:0] C, + output [5:0] O +); + + function [8:0] mul6x3; + input [5:0] op1; + input [2:0] op2; + begin + mul6x3 = 9'd0; + if(op2[0]) mul6x3 = mul6x3 + op1; + if(op2[1]) mul6x3 = mul6x3 + {op1, 1'b0}; + if(op2[2]) mul6x3 = mul6x3 + {op1, 2'b00}; + end + endfunction + + wire OpOnes = Op[4]; + wire [8:0] Amul = mul6x3(A, Op[7:5]); + wire [8:0] Bmul = mul6x3(B, {Op[3:2], 1'b0}); + wire [8:0] Cmul = mul6x3(C, {Op[1:0], 1'b0}); + wire [8:0] At = Amul; + wire [8:0] Bt = (OpOnes == 0) ? Bmul : {3'b0, B}; + wire [8:0] Ct = (OpOnes == 0) ? Cmul : {3'b0, C}; + wire [9:0] Res = {At, 1'b0} + Bt + Ct; + assign O = Op[8] ? A : Res[9:4]; +endmodule + +module Blend +( + input [5:0] rule, + input disable_hq2x, + input [17:0] E, + input [17:0] A, + input [17:0] B, + input [17:0] D, + input [17:0] F, + input [17:0] H, + output [17:0] Result +); + + reg [1:0] input_ctrl; + reg [8:0] op; + localparam BLEND0 = 9'b1_xxx_x_xx_xx; // 0: A + localparam BLEND1 = 9'b0_110_0_10_00; // 1: (A * 12 + B * 4) >> 4 + localparam BLEND2 = 9'b0_100_0_10_10; // 2: (A * 8 + B * 4 + C * 4) >> 4 + localparam BLEND3 = 9'b0_101_0_10_01; // 3: (A * 10 + B * 4 + C * 2) >> 4 + localparam BLEND4 = 9'b0_110_0_01_01; // 4: (A * 12 + B * 2 + C * 2) >> 4 + localparam BLEND5 = 9'b0_010_0_11_11; // 5: (A * 4 + (B + C) * 6) >> 4 + localparam BLEND6 = 9'b0_111_1_xx_xx; // 6: (A * 14 + B + C) >> 4 + localparam AB = 2'b00; + localparam AD = 2'b01; + localparam DB = 2'b10; + localparam BD = 2'b11; + wire is_diff; + DiffCheck diff_checker(rule[1] ? B : H, rule[0] ? D : F, is_diff); + + always @* begin + case({!is_diff, rule[5:2]}) + 1,17: {op, input_ctrl} = {BLEND1, AB}; + 2,18: {op, input_ctrl} = {BLEND1, DB}; + 3,19: {op, input_ctrl} = {BLEND1, BD}; + 4,20: {op, input_ctrl} = {BLEND2, DB}; + 5,21: {op, input_ctrl} = {BLEND2, AB}; + 6,22: {op, input_ctrl} = {BLEND2, AD}; + + 8: {op, input_ctrl} = {BLEND0, 2'bxx}; + 9: {op, input_ctrl} = {BLEND0, 2'bxx}; + 10: {op, input_ctrl} = {BLEND0, 2'bxx}; + 11: {op, input_ctrl} = {BLEND1, AB}; + 12: {op, input_ctrl} = {BLEND1, AB}; + 13: {op, input_ctrl} = {BLEND1, AB}; + 14: {op, input_ctrl} = {BLEND1, DB}; + 15: {op, input_ctrl} = {BLEND1, BD}; + + 24: {op, input_ctrl} = {BLEND2, DB}; + 25: {op, input_ctrl} = {BLEND5, DB}; + 26: {op, input_ctrl} = {BLEND6, DB}; + 27: {op, input_ctrl} = {BLEND2, DB}; + 28: {op, input_ctrl} = {BLEND4, DB}; + 29: {op, input_ctrl} = {BLEND5, DB}; + 30: {op, input_ctrl} = {BLEND3, BD}; + 31: {op, input_ctrl} = {BLEND3, DB}; + default: {op, input_ctrl} = 11'bx; + endcase + + // Setting op[8] effectively disables HQ2X because blend will always return E. + if (disable_hq2x) op[8] = 1; + end + + // Generate inputs to the inner blender. Valid combinations. + // 00: E A B + // 01: E A D + // 10: E D B + // 11: E B D + wire [17:0] Input1 = E; + wire [17:0] Input2 = !input_ctrl[1] ? A : + !input_ctrl[0] ? D : B; + + wire [17:0] Input3 = !input_ctrl[0] ? B : D; + InnerBlend inner_blend1(op, Input1[5:0], Input2[5:0], Input3[5:0], Result[5:0]); + InnerBlend inner_blend2(op, Input1[11:6], Input2[11:6], Input3[11:6], Result[11:6]); + InnerBlend inner_blend3(op, Input1[17:12], Input2[17:12], Input3[17:12], Result[17:12]); +endmodule + + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +module Hq2x #(parameter LENGTH, parameter HALF_DEPTH) +( + input clk, + input ce_x4, + input [DWIDTH:0] inputpixel, + input mono, + input disable_hq2x, + input reset_frame, + input reset_line, + input [1:0] read_y, + input [AWIDTH+1:0] read_x, + output [DWIDTH:0] outpixel +); + + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +localparam DWIDTH = HALF_DEPTH ? 8 : 17; + +wire [5:0] hqTable[256] = '{ + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 35, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 35, 35, 23, 61, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 7, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 58, 23, 15, 51, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 39, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 7, 35, 23, 15, 7, 43 +}; + +reg [17:0] Prev0, Prev1, Prev2, Curr0, Curr1, Next0, Next1, Next2; +reg [17:0] A, B, D, F, G, H; +reg [7:0] pattern, nextpatt; +reg [1:0] i; +reg [7:0] y; + +wire curbuf = y[0]; +reg prevbuf = 0; +wire iobuf = !curbuf; + +wire diff0, diff1; +DiffCheck diffcheck0(Curr1, (i == 0) ? Prev0 : (i == 1) ? Curr0 : (i == 2) ? Prev2 : Next1, diff0); +DiffCheck diffcheck1(Curr1, (i == 0) ? Prev1 : (i == 1) ? Next0 : (i == 2) ? Curr2 : Next2, diff1); + +wire [7:0] new_pattern = {diff1, diff0, pattern[7:2]}; + +wire [17:0] X = (i == 0) ? A : (i == 1) ? Prev1 : (i == 2) ? Next1 : G; +wire [17:0] blend_result; +Blend blender(hqTable[nextpatt], disable_hq2x, Curr0, X, B, D, F, H, blend_result); + +reg Curr2_addr1; +reg [AWIDTH:0] Curr2_addr2; +wire [17:0] Curr2 = HALF_DEPTH ? h2rgb(Curr2tmp) : Curr2tmp; +wire [DWIDTH:0] Curr2tmp; + +reg [AWIDTH:0] wrin_addr2; +reg [DWIDTH:0] wrpix; +reg wrin_en; + +function [17:0] h2rgb; + input [8:0] v; +begin + h2rgb = mono ? {v[5:3],v[2:0], v[5:3],v[2:0], v[5:3],v[2:0]} : {v[8:6],v[8:6],v[5:3],v[5:3],v[2:0],v[2:0]}; +end +endfunction + +function [8:0] rgb2h; + input [17:0] v; +begin + rgb2h = mono ? {3'b000, v[17:15], v[14:12]} : {v[17:15], v[11:9], v[5:3]}; +end +endfunction + +hq2x_in #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_in +( + .clk(clk), + + .rdaddr(Curr2_addr2), + .rdbuf(Curr2_addr1), + .q(Curr2tmp), + + .wraddr(wrin_addr2), + .wrbuf(iobuf), + .data(wrpix), + .wren(wrin_en) +); + +reg [1:0] wrout_addr1; +reg [AWIDTH+1:0] wrout_addr2; +reg wrout_en; +reg [DWIDTH:0] wrdata; + +hq2x_out #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_out +( + .clk(clk), + + .rdaddr(read_x), + .rdbuf(read_y), + .q(outpixel), + + .wraddr(wrout_addr2), + .wrbuf(wrout_addr1), + .data(wrdata), + .wren(wrout_en) +); + +always @(posedge clk) begin + reg [AWIDTH:0] offs; + reg old_reset_line; + reg old_reset_frame; + + wrout_en <= 0; + wrin_en <= 0; + + if(ce_x4) begin + + pattern <= new_pattern; + + if(~&offs) begin + if (i == 0) begin + Curr2_addr1 <= prevbuf; + Curr2_addr2 <= offs; + end + if (i == 1) begin + Prev2 <= Curr2; + Curr2_addr1 <= curbuf; + Curr2_addr2 <= offs; + end + if (i == 2) begin + Next2 <= HALF_DEPTH ? h2rgb(inputpixel) : inputpixel; + wrpix <= inputpixel; + wrin_addr2 <= offs; + wrin_en <= 1; + end + if (i == 3) begin + offs <= offs + 1'd1; + end + + if(HALF_DEPTH) wrdata <= rgb2h(blend_result); + else wrdata <= blend_result; + + wrout_addr1 <= {curbuf, i[1]}; + wrout_addr2 <= {offs, i[1]^i[0]}; + wrout_en <= 1; + end + + if(i==3) begin + nextpatt <= {new_pattern[7:6], new_pattern[3], new_pattern[5], new_pattern[2], new_pattern[4], new_pattern[1:0]}; + {A, G} <= {Prev0, Next0}; + {B, F, H, D} <= {Prev1, Curr2, Next1, Curr0}; + {Prev0, Prev1} <= {Prev1, Prev2}; + {Curr0, Curr1} <= {Curr1, Curr2}; + {Next0, Next1} <= {Next1, Next2}; + end else begin + nextpatt <= {nextpatt[5], nextpatt[3], nextpatt[0], nextpatt[6], nextpatt[1], nextpatt[7], nextpatt[4], nextpatt[2]}; + {B, F, H, D} <= {F, H, D, B}; + end + + i <= i + 1'b1; + if(old_reset_line && ~reset_line) begin + old_reset_frame <= reset_frame; + offs <= 0; + i <= 0; + y <= y + 1'd1; + prevbuf <= curbuf; + if(old_reset_frame & ~reset_frame) begin + y <= 0; + prevbuf <= 0; + end + end + + old_reset_line <= reset_line; + end +end + +endmodule // Hq2x diff --git a/ORAO_MiST/rtl/keyboard.v b/ORAO_MiST/rtl/keyboard.v new file mode 100644 index 00000000..8dde73d6 --- /dev/null +++ b/ORAO_MiST/rtl/keyboard.v @@ -0,0 +1,79 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[7:0] joystick +); + +reg [11:0] shift_reg = 12'hFFF; +wire[11:0] kdata = {ps2_kbd_data,shift_reg[11:1]}; +wire [7:0] kcode = kdata[9:2]; +reg release_btn = 0; + +reg [7:0] code; +reg input_strobe = 0; + +always @(negedge clk) begin + reg old_reset = 0; + + old_reset <= reset; + + if(~old_reset & reset)begin + joystick <= 0; + end + + if(input_strobe) begin + case(code) + 'h16: joystick[4] <= ~release_btn; // 1 + 'h1E: joystick[5] <= ~release_btn; // 2 + 'h26: joystick[6] <= ~release_btn; // 3 + 'h25: joystick[7] <= ~release_btn; // 4 + + 'h75: joystick[3] <= ~release_btn; // arrow up + 'h72: joystick[2] <= ~release_btn; // arrow down + 'h6B: joystick[1] <= ~release_btn; // arrow left + 'h74: joystick[0] <= ~release_btn; // arrow right + endcase + end +end + +always @(posedge clk) begin + reg [3:0] prev_clk = 0; + reg old_reset = 0; + reg action = 0; + + old_reset <= reset; + input_strobe <= 0; + + if(~old_reset & reset)begin + prev_clk <= 0; + shift_reg <= 12'hFFF; + end else begin + prev_clk <= {ps2_kbd_clk,prev_clk[3:1]}; + if(prev_clk == 1) begin + if (kdata[11] & ^kdata[10:2] & ~kdata[1] & kdata[0]) begin + shift_reg <= 12'hFFF; + if (kcode == 8'he0) ; + // Extended key code follows + else if (kcode == 8'hf0) + // Release code follows + action <= 1; + else begin + // Cancel extended/release flags for next time + action <= 0; + release_btn <= action; + code <= kcode; + input_strobe <= 1; + end + end else begin + shift_reg <= kdata; + end + end + end +end +endmodule diff --git a/ORAO_MiST/rtl/mist_io.v b/ORAO_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/ORAO_MiST/rtl/mist_io.v @@ -0,0 +1,491 @@ +// +// mist_io.v +// +// mist_io for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2014 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +/////////////////////////////////////////////////////////////////////// + +// +// Use buffer to access SD card. It's time-critical part. +// Made module synchroneous with 2 clock domains: clk_sys and SPI_SCK +// (Sorgelig) +// +// for synchronous projects default value for PS2DIV is fine for any frequency of system clock. +// clk_ps2 = clk_sys/(PS2DIV*2) +// + +module mist_io #(parameter STRLEN=0, parameter PS2DIV=100) +( + + // parameter STRLEN and the actual length of conf_str have to match + input [(8*STRLEN)-1:0] conf_str, + + // Global clock. It should be around 100MHz (higher is better). + input clk_sys, + + // Global SPI clock from ARM. 24MHz + input SPI_SCK, + + input CONF_DATA0, + input SPI_SS2, + output SPI_DO, + input SPI_DI, + + output reg [7:0] joystick_0, + output reg [7:0] joystick_1, + output reg [15:0] joystick_analog_0, + output reg [15:0] joystick_analog_1, + output [1:0] buttons, + output [1:0] switches, + output scandoubler_disable, + output ypbpr, + + output reg [31:0] status, + + // SD config + input sd_conf, + input sd_sdhc, + output img_mounted, // signaling that new image has been mounted + output reg [31:0] img_size, // size of image in bytes + + // SD block level access + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + output reg sd_ack_conf, + + // SD byte level access. Signals for 2-PORT altsyncram. + output reg [8:0] sd_buff_addr, + output reg [7:0] sd_buff_dout, + input [7:0] sd_buff_din, + output reg sd_buff_wr, + + // ps2 keyboard emulation + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + input ps2_caps_led, + + // ARM -> FPGA download + output reg ioctl_download = 0, // signal indicating an active download + output reg [7:0] ioctl_index, // menu index used to upload the file + output ioctl_wr, + output reg [24:0] ioctl_addr, + output reg [7:0] ioctl_dout +); + +reg [7:0] b_data; +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [9:0] byte_cnt; // counts bytes +reg [7:0] but_sw; +reg [2:0] stick_idx; + +reg mount_strobe = 0; +assign img_mounted = mount_strobe; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; +assign ypbpr = but_sw[5]; + +wire [7:0] spi_dout = { sbuf, SPI_DI}; + +// this variant of user_io is for 8 bit cores (type == a4) only +wire [7:0] core_type = 8'ha4; + +// command byte read by the io controller +wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; + +reg spi_do; +assign SPI_DO = CONF_DATA0 ? 1'bZ : spi_do; + +wire [7:0] kbd_led = { 2'b01, 4'b0000, ps2_caps_led, 1'b1}; + +// drive MISO only when transmitting core id +always@(negedge SPI_SCK) begin + if(!CONF_DATA0) begin + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + spi_do <= core_type[~bit_cnt]; + + end else begin + case(cmd) + // reading config string + 8'h14: begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) spi_do <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card status + 8'h16: begin + if(byte_cnt == 1) spi_do <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) spi_do <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card write data + 8'h18: + spi_do <= b_data[~bit_cnt]; + + // reading keyboard LED status + 8'h1f: + spi_do <= kbd_led[~bit_cnt]; + + default: + spi_do <= 0; + endcase + end + end +end + +reg b_wr2,b_wr3; +always @(negedge clk_sys) begin + b_wr3 <= b_wr2; + sd_buff_wr <= b_wr3; +end + +// SPI receiver +always@(posedge SPI_SCK or posedge CONF_DATA0) begin + + if(CONF_DATA0) begin + b_wr2 <= 0; + bit_cnt <= 0; + byte_cnt <= 0; + sd_ack <= 0; + sd_ack_conf <= 0; + end else begin + b_wr2 <= 0; + + sbuf <= spi_dout[6:0]; + bit_cnt <= bit_cnt + 1'd1; + if(bit_cnt == 5) begin + if (byte_cnt == 0) sd_buff_addr <= 0; + if((byte_cnt != 0) & (sd_buff_addr != 511)) sd_buff_addr <= sd_buff_addr + 1'b1; + if((byte_cnt == 1) & ((cmd == 8'h17) | (cmd == 8'h19))) sd_buff_addr <= 0; + end + + // finished reading command byte + if(bit_cnt == 7) begin + if(~&byte_cnt) byte_cnt <= byte_cnt + 8'd1; + if(byte_cnt == 0) begin + cmd <= spi_dout; + + if(spi_dout == 8'h19) begin + sd_ack_conf <= 1; + sd_buff_addr <= 0; + end + if((spi_dout == 8'h17) || (spi_dout == 8'h18)) begin + sd_ack <= 1; + sd_buff_addr <= 0; + end + if(spi_dout == 8'h18) b_data <= sd_buff_din; + + mount_strobe <= 0; + + end else begin + + case(cmd) + // buttons and switches + 8'h01: but_sw <= spi_dout; + 8'h02: joystick_0 <= spi_dout; + 8'h03: joystick_1 <= spi_dout; + + // store incoming ps2 mouse bytes + 8'h04: begin + ps2_mouse_fifo[ps2_mouse_wptr] <= spi_dout; + ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1; + end + + // store incoming ps2 keyboard bytes + 8'h05: begin + ps2_kbd_fifo[ps2_kbd_wptr] <= spi_dout; + ps2_kbd_wptr <= ps2_kbd_wptr + 1'd1; + end + + 8'h15: status[7:0] <= spi_dout; + + // send SD config IO -> FPGA + // flag that download begins + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + 8'h19, + // send sector IO -> FPGA + // flag that download begins + 8'h17: begin + sd_buff_dout <= spi_dout; + b_wr2 <= 1; + end + + 8'h18: b_data <= sd_buff_din; + + // joystick analog + 8'h1a: begin + // first byte is joystick index + if(byte_cnt == 1) stick_idx <= spi_dout[2:0]; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) joystick_analog_0[15:8] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[15:8] <= spi_dout; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) joystick_analog_0[7:0] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[7:0] <= spi_dout; + end + end + + // notify image selection + 8'h1c: mount_strobe <= 1; + + // send image info + 8'h1d: if(byte_cnt<5) img_size[(byte_cnt-1)<<3 +:8] <= spi_dout; + + // status, 32bit version + 8'h1e: if(byte_cnt<5) status[(byte_cnt-1)<<3 +:8] <= spi_dout; + default: ; + endcase + end + end + end +end + + +/////////////////////////////// PS2 /////////////////////////////// +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +reg clk_ps2; +always @(negedge clk_sys) begin + integer cnt; + cnt <= cnt + 1'd1; + if(cnt == PS2DIV) begin + clk_ps2 <= ~clk_ps2; + cnt <= 0; + end +end + +// keyboard +reg [7:0] ps2_kbd_fifo[1<= 1)&&(ps2_kbd_tx_state < 9)) begin + ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits + ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down + if(ps2_kbd_tx_byte[0]) + ps2_kbd_parity <= !ps2_kbd_parity; + end + + // transmission of parity + if(ps2_kbd_tx_state == 9) ps2_kbd_data <= ps2_kbd_parity; + + // transmission of stop bit + if(ps2_kbd_tx_state == 10) ps2_kbd_data <= 1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) ps2_kbd_tx_state <= ps2_kbd_tx_state + 1'd1; + else ps2_kbd_tx_state <= 0; + end + end +end + +// mouse +reg [7:0] ps2_mouse_fifo[1<= 1)&&(ps2_mouse_tx_state < 9)) begin + ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits + ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down + if(ps2_mouse_tx_byte[0]) + ps2_mouse_parity <= !ps2_mouse_parity; + end + + // transmission of parity + if(ps2_mouse_tx_state == 9) ps2_mouse_data <= ps2_mouse_parity; + + // transmission of stop bit + if(ps2_mouse_tx_state == 10) ps2_mouse_data <= 1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) ps2_mouse_tx_state <= ps2_mouse_tx_state + 1'd1; + else ps2_mouse_tx_state <= 0; + end + end +end + + +/////////////////////////////// DOWNLOADING /////////////////////////////// + +reg [7:0] data_w; +reg [24:0] addr_w; +reg rclk = 0; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +// data_io has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS2) begin + reg [6:0] sbuf; + reg [7:0] cmd; + reg [4:0] cnt; + reg [24:0] addr; + + if(SPI_SS2) cnt <= 0; + else begin + rclk <= 0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; + + // increase target address after write + if(rclk) addr <= addr + 1'd1; + + // count 0-7 8-15 8-15 ... + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + // finished command byte + if(cnt == 7) cmd <= {sbuf, SPI_DI}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(SPI_DI) begin + addr <= 0; + ioctl_download <= 1; + end else begin + addr_w <= addr; + ioctl_download <= 0; + end + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin + addr_w <= addr; + data_w <= {sbuf, SPI_DI}; + rclk <= 1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI}; + end +end + +assign ioctl_wr = |ioctl_wrd; +reg [1:0] ioctl_wrd; + +always@(negedge clk_sys) begin + reg rclkD, rclkD2; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wrd<= {ioctl_wrd[0],1'b0}; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wrd <= 2'b11; + end +end + +endmodule diff --git a/ORAO_MiST/rtl/orao.vhd b/ORAO_MiST/rtl/orao.vhd new file mode 100644 index 00000000..6f5907ba --- /dev/null +++ b/ORAO_MiST/rtl/orao.vhd @@ -0,0 +1,263 @@ +-- This file is copyright by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the UK101 page at http://searle.hostei.com/grant/uk101FPGA/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. +-- +-- Emard modified original UK101 glue into Orao glue +-- video module not instantiated here +-- video bus used instead. +-- to avoid routing clock +-- thru this module and vendor specific modules + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_ARITH.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity orao is + generic ( + + ram_kb: integer := 32; -- KB RAM this computer will have + clk_mhz : integer := 25; -- clock freq in MHz + serial_baud : integer := 9600 -- output serial baudrate + ); + port( + n_reset : in std_logic; + clk : in std_logic; + clkvid : in std_logic; + video : out std_logic; + hs : out std_logic; + vs : out std_logic; + cs : out std_logic; + rxd : in std_logic; + txd : out std_logic; + rts : out std_logic; + key_b : in std_logic; + key_c : in std_logic; + key_enter : in std_logic; + ps2clk : in std_logic; + ps2data : in std_logic + ); +end orao; + +architecture struct of orao is + + signal n_WR : std_logic; + signal cpuAddress : std_logic_vector(15 downto 0); + signal cpuDataOut : std_logic_vector(7 downto 0); + signal cpuDataIn : std_logic_vector(7 downto 0); + + signal basRomData : std_logic_vector(7 downto 0); + signal ramDataOut : std_logic_vector(7 downto 0); + signal monitorRomData : std_logic_vector(7 downto 0); + signal aciaData : std_logic_vector(7 downto 0); + + signal n_memWR : std_logic; + + signal n_dispRamCS : std_logic; + signal n_ramCS : std_logic; + signal n_basRomCS : std_logic; + signal n_monitorRomCS : std_logic; + signal n_aciaCS : std_logic; + signal n_kbCS : std_logic; + + signal dispAddrB : std_logic_vector(12 downto 0); + signal dispRamDataOutA : std_logic_vector(7 downto 0); + signal dispRamDataOutB : std_logic_vector(7 downto 0); + signal dispData : std_logic_vector(7 downto 0); + signal charAddr : std_logic_vector(10 downto 0); + signal charData : std_logic_vector(7 downto 0); + signal videoAddr : std_logic_vector(12 downto 0); + signal videoData : std_logic_vector(7 downto 0); + signal serialClkCount: std_logic_vector(14 downto 0); + signal cpuClkCount : std_logic_vector(5 downto 0); + signal cpuClock : std_logic; + signal serialClock : std_logic; + + signal kbReadData : std_logic_vector(7 downto 0); + + signal uart_n_wr : std_logic; + signal uart_n_rd : std_logic; + + type matrix8x8 is array (7 downto 0) of std_logic_vector(7 downto 0); + constant test_pattern : matrix8x8 := (x"82", x"44", x"28", x"10", x"28", x"44", x"82", x"01"); + +begin + + n_memWR <= not(cpuClock) nand (not n_WR); + + -- 0x0000, 0x03FF, '0th block', + -- 0x0400, 0x5FFF, 'user RAM (23K)', + -- 0x6000, 0x7FFF, 'video RAM', + -- 0x8000, 0x9FFF, 'system locations (keyboard etc.)', + -- 0xA000, 0xAFFF, 'extension (maybe ROM cartridge)', + -- 0xB000, 0xBFFF, 'DOS', + -- 0xC000, 0xDFFF, 'BASIC ROM', + -- 0xE000, 0xFFFF, 'system ROM', + + n_dispRamCS <= '0' when cpuAddress(15 downto 13) = "011" else '1'; --8k @ 0x6000 + n_basRomCS <= '0' when cpuAddress(15 downto 13) = "110" else '1'; --8k @ 0xC000 + n_monitorRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K @ 0xE000 + n_ramCS <= '0' when conv_integer(cpuAddress(15 downto 12)) < ram_kb/4 else '1'; + n_aciaCS <= '0' when cpuAddress(15 downto 1) = "100010000000000" else '1'; + n_kbCS <= '0' when cpuAddress(15 downto 11) = "10000" else '1'; + + cpuDataIn <= + basRomData when n_basRomCS = '0' else + monitorRomData when n_monitorRomCS = '0' else + aciaData when n_aciaCS = '0' else + ramDataOut when n_ramCS = '0' else + kbReadData when n_kbCS='0' else + dispRamDataOutA when n_dispRamCS = '0' + else x"FF"; + + u1 : entity work.T65 + port map( + Enable => '1', + Mode => "00", + Res_n => n_reset, + Clk => cpuClock, + Rdy => '1', + Abort_n => '1', + IRQ_n => '1', + NMI_n => '1', + SO_n => '1', + R_W_n => n_WR, + A(23 downto 16) => open, + A(15 downto 0) => cpuAddress, + DI => cpuDataIn, + DO => cpuDataOut + ); + + u2 : entity work.rom_bas -- 8KB + port map( + clk => clk, + addr(12 downto 0) => cpuAddress(12 downto 0), + data => basRomData + ); + + u2b : entity work.rom_crt -- 8KB + port map( + clk => clk, + addr(12 downto 0) => cpuAddress(12 downto 0), + data => monitorRomData + ); + + u3: entity work.bram_1port + generic map( + C_mem_size => ram_kb + ) + port map + ( + clock => clk, + rw_port_addr(15) => '0', + rw_port_addr(14 downto 0) => cpuAddress(14 downto 0), + rw_port_write => not(n_memWR or n_ramCS), + rw_port_data_in => cpuDataOut, + rw_port_data_out => ramDataOut + ); + + + uart_n_wr <= n_aciaCS or cpuClock or n_WR; + uart_n_rd <= n_aciaCS or cpuClock or (not n_WR); + + u5: entity work.bufferedUART + port map( + n_wr => uart_n_wr, + n_rd => uart_n_rd, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => aciaData, + rxClock => serialClock, + txClock => serialClock, + rxd => rxd, + txd => txd, + n_cts => '0', + n_dcd => '0', + n_rts => rts + ); + + -- clock divider for CPU and serial port + process (clk) + begin + if rising_edge(clk) then + if cpuClkCount < clk_mhz-1 then + cpuClkCount <= cpuClkCount + 1; + else + cpuClkCount <= (others=>'0'); + end if; + if cpuClkCount < clk_mhz/2-1 then + cpuClock <= '0'; + else + cpuClock <= '1'; + end if; + + if serialClkCount < 1000000*clk_mhz/(serial_baud*16)-1 then + serialClkCount <= serialClkCount + 1; + else + serialClkCount <= (others => '0'); + end if; + if serialClkCount < 1000000*clk_mhz/(serial_baud*32)-1 then + serialClock <= '0'; + else + serialClock <= '1'; + end if; + end if; + end process; + + -- test grid on screen during the reset is pressed + videoData <= dispRamDataOutB when n_reset = '1' + else test_pattern(conv_integer(videoAddr(7 downto 5))); + + u8_generic: entity work.bram_2port + generic map( + C_mem_size => 8 + ) + port map + ( + clock => clk, + rw_port_addr(15 downto 13) => (others => '0'), + rw_port_addr(12 downto 0) => cpuAddress(12 downto 0), + rw_port_write => not(n_memWR or n_dispRamCS), + rw_port_data_in => cpuDataOut, + rw_port_data_out => dispRamDataOutA, + ro_port_addr(15 downto 13) => (others => '0'), + ro_port_addr(12 downto 0) => videoAddr, + ro_port_data_out => dispRamDataOutB + ); + + u9 : entity work.orao_keyboard_buttons + port map( + CLK => clk, + nRESET => n_reset, + PS2_CLK => ps2clk, + PS2_DATA => ps2data, + key_b => key_b, + key_c => key_c, + key_enter => key_enter, + A => cpuAddress(10 downto 0), + Q => kbReadData + ); + + vga : entity work.OraoGraphDisplay8K + port map( + dispAddr => videoAddr, + dispData => videoData, + clk => clkvid, + video => video, + h_sync => hs, + v_sync => vs, + sync => cs + ); + +end; diff --git a/ORAO_MiST/rtl/orao_keyboard_buttons.vhd b/ORAO_MiST/rtl/orao_keyboard_buttons.vhd new file mode 100644 index 00000000..feb797ba --- /dev/null +++ b/ORAO_MiST/rtl/orao_keyboard_buttons.vhd @@ -0,0 +1,402 @@ +-- This file was created and maintaned by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the UK101 page at http://searle.hostei.com/grant/uk101FPGA/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +-- Emard +-- buttons for B, C, ENTER + +-- Adapted from a creation by Mike Stirling. +-- Modifications are copyright by Grant Searle 2014. + +-- Original copyright message shown below: + +-- ZX Spectrum for Altera DE1 +-- +-- Copyright (c) 2009-2011 Mike Stirling +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- * Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- * Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written agreement from the author. +-- +-- * License is granted for non-commercial use only. A fee may not be charged +-- for redistributions as source code or in synthesized/hardware form without +-- specific prior written agreement from the author. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- + +-- 4 buttons to UK101 matrix conversion +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +entity orao_keyboard_buttons is +generic ( + ps2set : integer := 2 -- keycode scanset +); +port ( + CLK : in std_logic; + nRESET : in std_logic; + + -- PS/2 interface + PS2_CLK : in std_logic; + PS2_DATA : in std_logic; + + -- input keys + key_b : in std_logic; + key_c : in std_logic; + key_enter : in std_logic; + + -- select bus + A : in std_logic_vector(10 downto 0); + -- matrix return + Q : out std_logic_vector(7 downto 0); + + -- miscellaneous + -- FN keys passed out as general signals (momentary and toggled versions) + FNkeys : out std_logic_vector(12 downto 0); + FNtoggledKeys : out std_logic_vector(12 downto 0) + ); +end orao_keyboard_buttons; + +architecture rtl of orao_keyboard_buttons is + +-- PS/2 interface +component ps2_intf is +generic (filter_length : positive := 8); +port( + CLK : in std_logic; + nRESET : in std_logic; + + -- PS/2 interface (could be bi-dir) + PS2_CLK : in std_logic; + PS2_DATA : in std_logic; + + -- Byte-wide data interface - only valid for one clock + -- so must be latched externally if required + DATA : out std_logic_vector(7 downto 0); + VALID : out std_logic; + ERROR : out std_logic + ); +end component; + +-- Interface to PS/2 block +signal keyb_data : std_logic_vector(7 downto 0); +signal keyb_valid : std_logic; +signal keyb_error : std_logic; + +-- Internal signals +type key_matrix is array (10 downto 1) of std_logic_vector(7 downto 0); +signal keys : key_matrix; +signal release : std_logic; +signal extended : std_logic; +signal shiftPressed : std_logic; + +signal FNkeysSig : std_logic_vector(12 downto 0) := (others => '0'); +signal FNtoggledKeysSig : std_logic_vector(12 downto 0) := (others => '0'); + +signal KEYB : std_logic_vector(7 downto 0); + +-- PS/2 scan codes which are different in set2 and set3 + +-- PS/2 Set2 +constant scan_zh : std_logic_vector(7 downto 0) := x"5d"; +constant scan_left_ctrl : std_logic_vector(7 downto 0) := x"14"; +constant scan_right_ctrl : std_logic_vector(7 downto 0) := x"14"; -- extended +constant scan_ltgt : std_logic_vector(7 downto 0) := x"5d"; +constant scan_arrow_left : std_logic_vector(7 downto 0) := x"6b"; +constant scan_arrow_right : std_logic_vector(7 downto 0) := x"74"; +constant scan_arrow_up : std_logic_vector(7 downto 0) := x"75"; +constant scan_arrow_down : std_logic_vector(7 downto 0) := x"72"; +constant scan_f1 : std_logic_vector(7 downto 0) := x"05"; +constant scan_f2 : std_logic_vector(7 downto 0) := x"06"; +constant scan_f3 : std_logic_vector(7 downto 0) := x"04"; +constant scan_f4 : std_logic_vector(7 downto 0) := x"0c"; + +-- PS/2 Set3 +--constant scan_zh : std_logic_vector(7 downto 0) := x"5c"; +--constant scan_left_ctrl : std_logic_vector(7 downto 0) := x"11"; +--constant scan_right_ctrl : std_logic_vector(7 downto 0) := x"58"; +--constant scan_ltgt : std_logic_vector(7 downto 0) := x"13"; +--constant scan_arrow_left : std_logic_vector(7 downto 0) := x"61"; +--constant scan_arrow_right : std_logic_vector(7 downto 0) := x"6a"; +--constant scan_arrow_up : std_logic_vector(7 downto 0) := x"63"; +--constant scan_arrow_down : std_logic_vector(7 downto 0) := x"60"; +--constant scan_f1 : std_logic_vector(7 downto 0) := x"07"; +--constant scan_f2 : std_logic_vector(7 downto 0) := x"0f"; +--constant scan_f3 : std_logic_vector(7 downto 0) := x"17"; +--constant scan_f4 : std_logic_vector(7 downto 0) := x"1f"; + +begin + + ps2 : ps2_intf port map ( + CLK, nRESET, + PS2_CLK, PS2_DATA, + keyb_data, keyb_valid, keyb_error + ); + + -- shiftPressed <= keys(0)(2) or keys(0)(1); + + FNkeys <= FNkeysSig; + FNtoggledKeys <= FNtoggledKeysSig; + + -- Output addressed matrix row/col + -- Original monitor scans for more than one row at a time, so more than one address may be low ! + -- key(x)(y) have inverted logic. 0 when key pressed + KEYB(0) <= (keys( 1)(0) or A(1)) + and ((not key_enter) or A(1)) + and (keys( 2)(0) or A(2)) + and (keys( 3)(0) or A(3)) + and (keys( 4)(0) or A(4)) + and (keys( 5)(0) or A(5)) + and (keys( 6)(0) or A(6)) + and (keys( 7)(0) or A(7)) + and (keys( 8)(0) or A(8)) + and ((not key_b) or A(8)) + and (keys( 9)(0) or A(9)) + and (keys(10)(0) or A(10)); + KEYB(1) <= (keys( 1)(1) or A(1)) + and (keys( 2)(1) or A(2)) + and (keys( 3)(1) or A(3)) + and (keys( 4)(1) or A(4)) + and (keys( 5)(1) or A(5)) + and (keys( 6)(1) or A(6)) + and (keys( 7)(1) or A(7)) + and ((not key_c) or A(7)) + and (keys( 8)(1) or A(8)) + and (keys( 9)(1) or A(9)) + and (keys(10)(1) or A(10)); + KEYB(2) <= '1'; + KEYB(3) <= '1'; + + KEYB(4) <= (keys( 1)(4) or A(1)) + and (keys( 2)(4) or A(2)) + and (keys( 3)(4) or A(3)) + and (keys( 4)(4) or A(4)) + and (keys( 5)(4) or A(5)) + and (keys( 6)(4) or A(6)) + and (keys( 7)(4) or A(7)) + and (keys( 8)(4) or A(8)) + and (keys( 9)(4) or A(9)) + and (keys(10)(4) or A(10)); + KEYB(5) <= (keys( 1)(5) or A(1)) + and (keys( 2)(5) or A(2)) + and (keys( 3)(5) or A(3)) + and (keys( 4)(5) or A(4)) + and (keys( 5)(5) or A(5)) + and (keys( 6)(5) or A(6)) + and (keys( 7)(5) or A(7)) + and (keys( 8)(5) or A(8)) + and (keys( 9)(5) or A(9)) + and (keys(10)(5) or A(10)); + KEYB(6) <= (keys( 1)(6) or A(1)) + and (keys( 2)(6) or A(2)) + and (keys( 3)(6) or A(3)) + and (keys( 4)(6) or A(4)) + and (keys( 5)(6) or A(5)) + and (keys( 6)(6) or A(6)) + and (keys( 7)(6) or A(7)) + and (keys( 8)(6) or A(8)) + and (keys( 9)(6) or A(9)) + and (keys(10)(6) or A(10)); + KEYB(7) <= (keys( 1)(7) or A(1)) + and (keys( 2)(7) or A(2)) + and (keys( 3)(7) or A(3)) + and (keys( 4)(7) or A(4)) + and (keys( 5)(7) or A(5)) + and (keys( 6)(7) or A(6)) + and (keys( 7)(7) or A(7)) + and (keys( 8)(7) or A(8)) + and (keys( 9)(7) or A(9)) + and (keys(10)(7) or A(10)); + + Q <= KEYB(7 downto 4) & x"0" when A(0) = '0' + else KEYB(3 downto 0) & x"0"; + + process(nRESET,CLK) + begin + if nRESET = '0' then + release <= '0'; + extended <= '0'; + + keys(1) <= (others => '1'); + keys(2) <= (others => '1'); + keys(3) <= (others => '1'); + keys(4) <= (others => '1'); + keys(5) <= (others => '1'); + keys(6) <= (others => '1'); + keys(7) <= (others => '1'); + keys(8) <= (others => '1'); + keys(9) <= (others => '1'); + keys(10) <= (others => '1'); + elsif rising_edge(CLK) then + if keyb_valid = '1' then + -- keyb_data contains scan code of PS/2 Set2 + -- http://www.computer-engineering.org/ps2keyboard/scancodes2.html + if keyb_data = X"e0" then + -- Extended key code follows + extended <= '1'; + elsif keyb_data = X"f0" then + -- Release code follows + release <= '1'; + else + -- Cancel extended/release flags for next time + release <= '0'; + extended <= '0'; + + case keyb_data is + + when X"0e" => keys(9)(7) <= release; -- pipe -> :* + when X"16" => keys(5)(7) <= release; -- 1 + when X"1e" => keys(5)(0) <= release; -- 2 + when X"26" => keys(5)(1) <= release; -- 3 + when X"25" => keys(3)(1) <= release; -- 4 + when X"2e" => keys(3)(0) <= release; -- 5 + when X"36" => keys(3)(7) <= release; -- 6 + when X"3d" => keys(4)(7) <= release; -- 7 + when X"3e" => keys(4)(0) <= release; -- 8 + when X"46" => keys(4)(1) <= release; -- 9 + when X"45" => keys(10)(1) <= release; -- 0 + when X"4e" => keys(10)(0) <= release; -- -= + when X"55" => keys(10)(7) <= release; -- ;+ + when X"66" => keys(1)(4) <= release; -- Backspace same as cursor left + + when X"0d" => keys(9)(1) <= release; -- TAB -> ^@ + when X"15" => keys(5)(5) <= release; -- Q + when X"1d" => keys(5)(6) <= release; -- W + when X"24" => keys(5)(4) <= release; -- E + when X"2d" => keys(3)(4) <= release; -- R + when X"2c" => keys(3)(6) <= release; -- T + when X"35" => keys(3)(5) <= release; -- Y + when X"3c" => keys(4)(6) <= release; -- U + when X"43" => keys(4)(5) <= release; -- I + when X"44" => keys(4)(4) <= release; -- O + when X"4d" => keys(10)(4) <= release; -- P + when X"54" => keys(10)(6) <= release; -- [ sh + when X"5b" => keys(10)(5) <= release; -- ] dj + when X"5a" => keys(1)(0) <= release; -- ENTER + + -- when X"58" => -- Caps Lock + when X"1c" => keys(7)(5) <= release; -- A + when X"1b" => keys(7)(6) <= release; -- S + when X"23" => keys(7)(4) <= release; -- D + when X"2b" => keys(8)(4) <= release; -- F + when X"34" => keys(8)(6) <= release; -- G + when X"33" => keys(8)(5) <= release; -- H + when X"3b" => keys(6)(5) <= release; -- J + when X"42" => keys(6)(6) <= release; -- K + when X"4b" => keys(6)(4) <= release; -- L + when X"4c" => keys(9)(4) <= release; -- Č + when X"52" => keys(9)(5) <= release; -- Ć + when scan_zh => keys(9)(6) <= release; -- Ž + --when X"5D" => keys(9)(6) <= release; -- Ž + --when X"5c" => keys(9)(6) <= release; -- Set3: Ž + + when X"12" => keys(2)(1) <= release; -- Left shift + --when scan_ltgt => keys(9)(1) <= release; -- international < > -> ^@ + --when X"61" => keys(9)(1) <= release; -- international < > + --when X"13" => keys(9)(1) <= release; -- Set3: international < > + when X"1a" => keys(7)(7) <= release; -- Z + when X"22" => keys(7)(0) <= release; -- X + when X"21" => keys(7)(1) <= release; -- C + when X"2a" => keys(8)(1) <= release; -- V + when X"32" => keys(8)(0) <= release; -- B + when X"31" => keys(8)(7) <= release; -- N + when X"3a" => keys(6)(7) <= release; -- M + when X"41" => keys(6)(0) <= release; -- ,< + when X"49" => keys(6)(1) <= release; -- .> + when X"4a" => keys(9)(0) <= release; -- /? extended = KP / + when X"59" => keys(2)(1) <= release; -- Right shift + + --when X"76" => keys(0)(0) <= release; -- Escape not on ORAO + when X"29" => keys(2)(0) <= release; -- SPACE + when scan_left_ctrl => keys(1)(1) <= release; -- CTRL + + -- Cursor keys - these are actually extended (E0 xx), but + -- the scancodes for the numeric keypad cursor keys are + -- are the same but without the extension, so we'll accept + -- the codes whether they are extended or not + when scan_arrow_left => keys(1)(4) <= release; -- left arrow + when scan_arrow_right => keys(1)(7) <= release; -- right arrow + when scan_arrow_up => keys(1)(5) <= release; -- up arrow + when scan_arrow_down => keys(1)(6) <= release; -- down arrow + -- Set2: arrow keys + --when X"6b" => keys(1)(4) <= release; -- left arrow + --when X"74" => keys(1)(7) <= release; -- right arrow + --when X"75" => keys(1)(5) <= release; -- up arrow + --when X"72" => keys(1)(6) <= release; -- down arrow + -- Set3: arrow keys + --when X"61" => keys(1)(4) <= release; -- left arrow + --when X"6a" => keys(1)(7) <= release; -- right arrow + --when X"63" => keys(1)(5) <= release; -- up arrow + --when X"60" => keys(1)(6) <= release; -- down arrow + + when X"05" => keys(2)(4) <= release; -- F1 + when X"06" => keys(2)(5) <= release; -- F2 + when X"04" => keys(2)(6) <= release; -- F3 + when X"0C" => keys(2)(7) <= release; -- F4 + + when X"03" => --F5 + FNkeysSig(5) <= release; + if release = '0' then + FNtoggledKeysSig(5) <= not FNtoggledKeysSig(5); + end if; + when X"0B" => --F6 + FNkeysSig(6) <= release; + if release = '0' then + FNtoggledKeysSig(6) <= not FNtoggledKeysSig(6); + end if; + when X"83" => --F7 + FNkeysSig(7) <= release; + if release = '0' then + FNtoggledKeysSig(7) <= not FNtoggledKeysSig(7); + end if; + when X"0A" => --F8 + FNkeysSig(8) <= release; + if release = '0' then + FNtoggledKeysSig(8) <= not FNtoggledKeysSig(8); + end if; + + + when others => + null; + end case; + end if; + end if; + end if; + end process; + +end architecture; diff --git a/ORAO_MiST/rtl/orao_mist.sv b/ORAO_MiST/rtl/orao_mist.sv new file mode 100644 index 00000000..eee504b0 --- /dev/null +++ b/ORAO_MiST/rtl/orao_mist.sv @@ -0,0 +1,108 @@ +module orao_mist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input UART_RX, + output UART_TX, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Orao;;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire vid15khz; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire hs, vs, cs; +wire video; +wire [7:0] kbjoy; +wire clk_50, clk_25, clk_12p5; + +pll pll ( + .inclk0 ( CLOCK_27 ), + .c0 ( clk_50 ), + .c1 ( clk_25 ), + .c2 ( clk_12p5 ) +); + +orao #(.ram_kb(24), .clk_mhz(25), .serial_baud(9600)) orao ( + .n_reset (~(status[0]|status[6]|buttons[1])), + .clk ( clk_25 ), + .clkvid ( clk_50 ),//Check + .video ( video ), + .hs ( hs ), + .vs ( vs ), + .cs ( ), + .rxd ( UART_RX ), + .txd ( UART_TX ), + .rts ( ), + .key_b ( ), + .key_c ( ), + .key_enter ( ), + .ps2clk ( ps2_kbd_clk ), + .ps2data ( ps2_kbd_data ) +); + + +video_mixer #(.LINE_LENGTH(256), .HALF_DEPTH(1)) video_mixer ( + .clk_sys ( clk_50 ), + .ce_pix ( clk_12p5 ), + .ce_pix_actual ( clk_12p5 ), + .SPI_SCK ( SPI_SCK ), + .SPI_SS3 ( SPI_SS3 ), + .SPI_DI ( SPI_DI ), + .R ( {video,video,video}), + .G ( {video,video,video}), + .B ( {video,video,video}), + .HSync ( hs ), + .VSync ( vs ), + .VGA_R ( VGA_R ), + .VGA_G ( VGA_G ), + .VGA_B ( VGA_B ), + .VGA_VS ( VGA_VS ), + .VGA_HS ( VGA_HS ), + .scandoubler_disable(vid15khz ), + .ypbpr_full ( 1 ), + .line_start ( 0 ), + .mono ( 1 ) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io ( + .clk_sys ( clk_50 ), + .conf_str ( CONF_STR ), + .SPI_SCK ( SPI_SCK ), + .CONF_DATA0 ( CONF_DATA0 ), + .SPI_SS2 ( SPI_SS2 ), + .SPI_DO ( SPI_DO ), + .SPI_DI ( SPI_DI ), + .buttons ( buttons ), + .switches ( switches ), + .scandoubler_disable(vid15khz ), + .ypbpr ( ypbpr ), + .ps2_kbd_clk ( ps2_kbd_clk ), + .ps2_kbd_data ( ps2_kbd_data ), + .status ( status ) +); + + + + +endmodule \ No newline at end of file diff --git a/ORAO_MiST/rtl/osd.v b/ORAO_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/ORAO_MiST/rtl/osd.v @@ -0,0 +1,179 @@ +// A simple OSD implementation. Can be hooked up between a cores +// VGA output and the physical VGA pins + +module osd ( + // OSDs pixel clock, should be synchronous to cores pixel clock to + // avoid jitter. + input clk_sys, + + // SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // VGA signals coming from core + input [5:0] R_in, + input [5:0] G_in, + input [5:0] B_in, + input HSync, + input VSync, + + // VGA signals going to video connector + output [5:0] R_out, + output [5:0] G_out, + output [5:0] B_out +); + +parameter OSD_X_OFFSET = 10'd0; +parameter OSD_Y_OFFSET = 10'd0; +parameter OSD_COLOR = 3'd0; + +localparam OSD_WIDTH = 10'd256; +localparam OSD_HEIGHT = 10'd128; + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// this core supports only the display related OSD commands +// of the minimig +reg osd_enable; +(* ramstyle = "no_rw_check" *) reg [7:0] osd_buffer[2047:0]; // the OSD buffer itself + +// the OSD has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS3) begin + reg [4:0] cnt; + reg [10:0] bcnt; + reg [7:0] sbuf; + reg [7:0] cmd; + + if(SPI_SS3) begin + cnt <= 0; + bcnt <= 0; + end else begin + sbuf <= {sbuf[6:0], SPI_DI}; + + // 0:7 is command, rest payload + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + if(cnt == 7) begin + cmd <= {sbuf[6:0], SPI_DI}; + + // lower three command bits are line address + bcnt <= {sbuf[1:0], SPI_DI, 8'h00}; + + // command 0x40: OSDCMDENABLE, OSDCMDDISABLE + if(sbuf[6:3] == 4'b0100) osd_enable <= SPI_DI; + end + + // command 0x20: OSDCMDWRITE + if((cmd[7:3] == 5'b00100) && (cnt == 15)) begin + osd_buffer[bcnt] <= {sbuf[6:0], SPI_DI}; + bcnt <= bcnt + 1'd1; + end + end +end + +// ********************************************************************************* +// video timing and sync polarity anaylsis +// ********************************************************************************* + +// horizontal counter +reg [9:0] h_cnt; +reg [9:0] hs_low, hs_high; +wire hs_pol = hs_high < hs_low; +wire [9:0] dsp_width = hs_pol ? hs_low : hs_high; + +// vertical counter +reg [9:0] v_cnt; +reg [9:0] vs_low, vs_high; +wire vs_pol = vs_high < vs_low; +wire [9:0] dsp_height = vs_pol ? vs_low : vs_high; + +wire doublescan = (dsp_height>350); + +reg ce_pix; +always @(negedge clk_sys) begin + integer cnt = 0; + integer pixsz, pixcnt; + reg hs; + + cnt <= cnt + 1; + hs <= HSync; + + pixcnt <= pixcnt + 1; + if(pixcnt == pixsz) pixcnt <= 0; + ce_pix <= !pixcnt; + + if(hs && ~HSync) begin + cnt <= 0; + pixsz <= (cnt >> 9) - 1; + pixcnt <= 0; + ce_pix <= 1; + end +end + +always @(posedge clk_sys) begin + reg hsD, hsD2; + reg vsD, vsD2; + + if(ce_pix) begin + // bring hsync into local clock domain + hsD <= HSync; + hsD2 <= hsD; + + // falling edge of HSync + if(!hsD && hsD2) begin + h_cnt <= 0; + hs_high <= h_cnt; + end + + // rising edge of HSync + else if(hsD && !hsD2) begin + h_cnt <= 0; + hs_low <= h_cnt; + v_cnt <= v_cnt + 1'd1; + end else begin + h_cnt <= h_cnt + 1'd1; + end + + vsD <= VSync; + vsD2 <= vsD; + + // falling edge of VSync + if(!vsD && vsD2) begin + v_cnt <= 0; + vs_high <= v_cnt; + end + + // rising edge of VSync + else if(vsD && !vsD2) begin + v_cnt <= 0; + vs_low <= v_cnt; + end + end +end + +// area in which OSD is being displayed +wire [9:0] h_osd_start = ((dsp_width - OSD_WIDTH)>> 1) + OSD_X_OFFSET; +wire [9:0] h_osd_end = h_osd_start + OSD_WIDTH; +wire [9:0] v_osd_start = ((dsp_height- (OSD_HEIGHT<> 1) + OSD_Y_OFFSET; +wire [9:0] v_osd_end = v_osd_start + (OSD_HEIGHT<= h_osd_start) && (h_cnt < h_osd_end) && + (VSync != vs_pol) && (v_cnt >= v_osd_start) && (v_cnt < v_osd_end); + +reg [7:0] osd_byte; +always @(posedge clk_sys) if(ce_pix) osd_byte <= osd_buffer[{doublescan ? osd_vcnt[7:5] : osd_vcnt[6:4], osd_hcnt[7:0]}]; + +wire osd_pixel = osd_byte[doublescan ? osd_vcnt[4:2] : osd_vcnt[3:1]]; + +assign R_out = !osd_de ? R_in : {osd_pixel, osd_pixel, OSD_COLOR[2], R_in[5:3]}; +assign G_out = !osd_de ? G_in : {osd_pixel, osd_pixel, OSD_COLOR[1], G_in[5:3]}; +assign B_out = !osd_de ? B_in : {osd_pixel, osd_pixel, OSD_COLOR[0], B_in[5:3]}; + +endmodule diff --git a/ORAO_MiST/rtl/pll.qip b/ORAO_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/ORAO_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/ORAO_MiST/rtl/pll.v b/ORAO_MiST/rtl/pll.v new file mode 100644 index 00000000..82887cc3 --- /dev/null +++ b/ORAO_MiST/rtl/pll.v @@ -0,0 +1,357 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.0 Build 162 10/23/2013 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2013 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0, + c1, + c2); + + input inclk0; + output c0; + output c1; + output c2; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire6 = 1'h0; + wire [2:2] sub_wire3 = sub_wire0[2:2]; + wire [0:0] sub_wire2 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c0 = sub_wire2; + wire c2 = sub_wire3; + wire sub_wire4 = inclk0; + wire [1:0] sub_wire5 = {sub_wire6, sub_wire4}; + + altpll altpll_component ( + .inclk (sub_wire5), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 27, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 50, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 18, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 17, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 54, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 25, + altpll_component.clk2_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_USED", + altpll_component.port_clk2 = "PORT_USED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "54" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "50.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "25.500000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "12.500000" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "50" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "25" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "25" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "50.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "25.50000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "12.50000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK2 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLK1 STRING "1" +// Retrieval info: PRIVATE: USE_CLK2 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA2 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "18" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "17" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "54" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "25" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +// Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +// Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/ORAO_MiST/rtl/ps2_intf.vhd b/ORAO_MiST/rtl/ps2_intf.vhd new file mode 100644 index 00000000..f7960950 --- /dev/null +++ b/ORAO_MiST/rtl/ps2_intf.vhd @@ -0,0 +1,158 @@ +-- ZX Spectrum for Altera DE1 +-- +-- Copyright (c) 2009-2011 Mike Stirling +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- * Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- * Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written agreement from the author. +-- +-- * License is granted for non-commercial use only. A fee may not be charged +-- for redistributions as source code or in synthesized/hardware form without +-- specific prior written agreement from the author. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- + +-- PS/2 interface (input only) +-- Based loosely on ps2_ctrl.vhd (c) ALSE. http://www.alse-fr.com +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +-- This is input-only for the time being +entity ps2_intf is +generic (filter_length : positive := 8); +port( + CLK : in std_logic; + nRESET : in std_logic; + + -- PS/2 interface (could be bi-dir) + PS2_CLK : in std_logic; + PS2_DATA : in std_logic; + + -- Byte-wide data interface - only valid for one clock + -- so must be latched externally if required + DATA : out std_logic_vector(7 downto 0); + VALID : out std_logic; + ERROR : out std_logic + ); +end ps2_intf; + +architecture ps2_intf_arch of ps2_intf is +subtype filter_t is std_logic_vector(filter_length-1 downto 0); +signal clk_filter : filter_t; + +signal ps2_clk_in : std_logic; +signal ps2_dat_in : std_logic; +-- Goes high when a clock falling edge is detected +signal clk_edge : std_logic; +signal bit_count : unsigned (3 downto 0); +signal shiftreg : std_logic_vector(8 downto 0); +signal parity : std_logic; +begin + -- Register input signals + process(nRESET,CLK) + begin + if nRESET = '0' then + ps2_clk_in <= '1'; + ps2_dat_in <= '1'; + clk_filter <= (others => '1'); + clk_edge <= '0'; + elsif rising_edge(CLK) then + -- Register inputs (and filter clock) + ps2_dat_in <= PS2_DATA; + clk_filter <= PS2_CLK & clk_filter(clk_filter'high downto 1); + clk_edge <= '0'; + + if clk_filter = filter_t'(others => '1') then + -- Filtered clock is high + ps2_clk_in <= '1'; + elsif clk_filter = filter_t'(others => '0') then + -- Filter clock is low, check for edge + if ps2_clk_in = '1' then + clk_edge <= '1'; + end if; + ps2_clk_in <= '0'; + end if; + end if; + end process; + + -- Shift in keyboard data + process(nRESET,CLK) + begin + if nRESET = '0' then + bit_count <= (others => '0'); + shiftreg <= (others => '0'); + parity <= '0'; + DATA <= (others => '0'); + VALID <= '0'; + ERROR <= '0'; + elsif rising_edge(CLK) then + -- Clear flags + VALID <= '0'; + ERROR <= '0'; + + if clk_edge = '1' then + -- We have a new bit from the keyboard for processing + if bit_count = 0 then + -- Idle state, check for start bit (0) only and don't + -- start counting bits until we get it + + parity <= '0'; + + if ps2_dat_in = '0' then + -- This is a start bit + bit_count <= bit_count + 1; + end if; + else + -- Running. 8-bit data comes in LSb first followed by + -- a single stop bit (1) + if bit_count < 10 then + -- Shift in data and parity (9 bits) + bit_count <= bit_count + 1; + shiftreg <= ps2_dat_in & shiftreg(shiftreg'high downto 1); + parity <= parity xor ps2_dat_in; -- Calculate parity + elsif ps2_dat_in = '1' then + -- Valid stop bit received + bit_count <= (others => '0'); -- back to idle + if parity = '1' then + -- Parity correct, submit data to host + DATA <= shiftreg(7 downto 0); + VALID <= '1'; + else + -- Error + ERROR <= '1'; + end if; + else + -- Invalid stop bit + bit_count <= (others => '0'); -- back to idle + ERROR <= '1'; + end if; + end if; + end if; + end if; + end process; +end ps2_intf_arch; diff --git a/ORAO_MiST/rtl/rom/BAS102.ROM b/ORAO_MiST/rtl/rom/BAS102.ROM new file mode 100644 index 00000000..6457cea4 Binary files /dev/null and b/ORAO_MiST/rtl/rom/BAS102.ROM differ diff --git a/ORAO_MiST/rtl/rom/BAS103.ROM b/ORAO_MiST/rtl/rom/BAS103.ROM new file mode 100644 index 00000000..becb76aa Binary files /dev/null and b/ORAO_MiST/rtl/rom/BAS103.ROM differ diff --git a/ORAO_MiST/rtl/rom/CRT102.ROM b/ORAO_MiST/rtl/rom/CRT102.ROM new file mode 100644 index 00000000..1245d943 Binary files /dev/null and b/ORAO_MiST/rtl/rom/CRT102.ROM differ diff --git a/ORAO_MiST/rtl/rom/CRT103.ROM b/ORAO_MiST/rtl/rom/CRT103.ROM new file mode 100644 index 00000000..0e053fc6 Binary files /dev/null and b/ORAO_MiST/rtl/rom/CRT103.ROM differ diff --git a/ORAO_MiST/rtl/rom/rom_bas102.vhd b/ORAO_MiST/rtl/rom/rom_bas102.vhd new file mode 100644 index 00000000..6d50423b --- /dev/null +++ b/ORAO_MiST/rtl/rom/rom_bas102.vhd @@ -0,0 +1,1051 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity rom_bas is + port ( + clk: in std_logic; + addr: in std_logic_vector(12 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end entity; + +architecture Behavioral of rom_bas is + type romDef is array(0 to 8191) of std_logic_vector(7 downto 0); + constant romData: romDef := ( +x"39", x"C6", x"55", x"C5", x"3F", x"CA", x"0B", x"C7", +x"22", x"C9", x"00", x"CD", x"4E", x"C9", x"98", x"DE", +x"B8", x"C6", x"90", x"C6", x"3B", x"C7", x"19", x"C6", +x"9B", x"C6", x"E5", x"C6", x"4E", x"C7", x"37", x"C6", +x"5E", x"C7", x"80", x"DE", x"8C", x"DE", x"26", x"F2", +x"F4", x"F0", x"DD", x"CF", x"28", x"D4", x"2E", x"C8", +x"60", x"C6", x"B4", x"C4", x"8B", x"C6", x"60", x"C4", +x"D8", x"D7", x"62", x"D8", x"F5", x"D7", x"0A", x"00", +x"AD", x"CF", x"CE", x"CF", x"AC", x"DA", x"C0", x"DB", +x"BD", x"D5", x"1B", x"DB", x"FC", x"DB", x"03", x"DC", +x"4C", x"DC", x"99", x"DC", x"1E", x"D4", x"8C", x"D3", +x"8C", x"D0", x"BD", x"D3", x"9B", x"D3", x"FC", x"D2", +x"10", x"D3", x"3C", x"D3", x"47", x"D3", x"79", x"6E", +x"D4", x"79", x"57", x"D4", x"7B", x"FD", x"D5", x"7B", +x"CC", x"D6", x"7F", x"B5", x"DA", x"50", x"68", x"CC", +x"46", x"65", x"CC", x"7D", x"EE", x"DA", x"5A", x"D7", +x"CB", x"64", x"95", x"CC", x"45", x"4E", x"C4", x"46", +x"4F", x"D2", x"4E", x"45", x"58", x"D4", x"44", x"41", +x"54", x"C1", x"49", x"4E", x"50", x"55", x"D4", x"44", +x"49", x"CD", x"52", x"45", x"41", x"C4", x"4D", x"4F", +x"D6", x"47", x"4F", x"54", x"CF", x"52", x"55", x"CE", +x"49", x"C6", x"52", x"45", x"53", x"54", x"4F", x"52", +x"C5", x"47", x"4F", x"53", x"55", x"C2", x"52", x"45", +x"54", x"55", x"52", x"CE", x"52", x"45", x"CD", x"53", +x"54", x"4F", x"D0", x"4F", x"CE", x"44", x"52", x"41", +x"D7", x"50", x"4C", x"4F", x"D4", x"4C", x"4F", x"41", +x"C4", x"53", x"41", x"56", x"C5", x"44", x"45", x"C6", +x"50", x"4F", x"4B", x"C5", x"50", x"52", x"49", x"4E", +x"D4", x"43", x"4F", x"4E", x"D4", x"4C", x"49", x"53", +x"D4", x"43", x"4C", x"45", x"41", x"D2", x"4E", x"45", +x"D7", x"54", x"41", x"42", x"A8", x"54", x"CF", x"46", +x"CE", x"53", x"50", x"43", x"A8", x"54", x"48", x"45", +x"CE", x"4E", x"4F", x"D4", x"53", x"54", x"45", x"D0", +x"AB", x"AD", x"AA", x"AF", x"E0", x"41", x"4E", x"C4", +x"4F", x"D2", x"BE", x"BD", x"BC", x"53", x"47", x"CE", +x"49", x"4E", x"D4", x"41", x"42", x"D3", x"55", x"53", +x"D2", x"46", x"52", x"C5", x"50", x"4F", x"D3", x"53", +x"51", x"D2", x"52", x"4E", x"C4", x"4C", x"4F", x"C7", +x"45", x"58", x"D0", x"43", x"4F", x"D3", x"53", x"49", +x"CE", x"54", x"41", x"CE", x"41", x"54", x"CE", x"50", +x"45", x"45", x"CB", x"4C", x"45", x"CE", x"53", x"54", +x"52", x"A4", x"56", x"41", x"CC", x"41", x"53", x"C3", +x"43", x"48", x"52", x"A4", x"4C", x"45", x"46", x"54", +x"A4", x"52", x"49", x"47", x"48", x"54", x"A4", x"4D", +x"49", x"44", x"A4", x"00", x"4E", x"46", x"53", x"4E", +x"52", x"47", x"4E", x"50", x"46", x"50", x"52", x"4F", +x"4D", x"50", x"4E", x"4E", x"50", x"50", x"44", x"44", +x"2F", x"30", x"50", x"4E", x"50", x"54", x"44", x"4E", +x"49", x"4B", x"4E", x"44", x"44", x"46", x"20", x"47", +x"52", x"45", x"5E", x"4B", x"41", x"00", x"20", x"55", +x"20", x"00", x"0D", x"0A", x"3E", x"0D", x"0A", x"00", +x"00", x"0D", x"0A", x"20", x"53", x"54", x"4F", x"50", +x"00", x"BA", x"E8", x"E8", x"E8", x"E8", x"BD", x"01", +x"01", x"C9", x"81", x"D0", x"21", x"A5", x"98", x"D0", +x"0A", x"BD", x"02", x"01", x"85", x"97", x"BD", x"03", +x"01", x"85", x"98", x"DD", x"03", x"01", x"D0", x"07", +x"A5", x"97", x"DD", x"02", x"01", x"F0", x"07", x"8A", +x"18", x"69", x"10", x"AA", x"D0", x"D8", x"60", x"20", +x"1F", x"C2", x"85", x"7F", x"84", x"80", x"38", x"A5", +x"A6", x"E5", x"AA", x"85", x"71", x"A8", x"A5", x"A7", +x"E5", x"AB", x"AA", x"E8", x"98", x"F0", x"23", x"A5", +x"A6", x"38", x"E5", x"71", x"85", x"A6", x"B0", x"03", +x"C6", x"A7", x"38", x"A5", x"A4", x"E5", x"71", x"85", +x"A4", x"B0", x"08", x"C6", x"A5", x"90", x"04", x"B1", +x"A6", x"91", x"A4", x"88", x"D0", x"F9", x"B1", x"A6", +x"91", x"A4", x"C6", x"A7", x"C6", x"A5", x"CA", x"D0", +x"F2", x"60", x"0A", x"69", x"33", x"B0", x"35", x"85", +x"71", x"BA", x"E4", x"71", x"90", x"2E", x"60", x"C4", +x"82", x"90", x"28", x"D0", x"04", x"C5", x"81", x"90", +x"22", x"48", x"A2", x"08", x"98", x"48", x"B5", x"A3", +x"CA", x"10", x"FA", x"20", x"47", x"D1", x"A2", x"F8", +x"68", x"95", x"AC", x"E8", x"30", x"FA", x"68", x"A8", +x"68", x"C4", x"82", x"90", x"06", x"D0", x"05", x"C5", +x"81", x"58", x"01", x"60", x"A2", x"0C", x"46", x"64", +x"20", x"6C", x"C8", x"20", x"E3", x"C8", x"BD", x"64", +x"C1", x"20", x"E5", x"C8", x"BD", x"65", x"C1", x"20", +x"E5", x"C8", x"20", x"91", x"C4", x"A9", x"86", x"A0", +x"C1", x"20", x"C3", x"C8", x"A4", x"88", x"C8", x"F0", +x"03", x"20", x"53", x"D9", x"46", x"64", x"A9", x"92", +x"A0", x"C1", x"20", x"03", x"00", x"20", x"57", x"C3", +x"86", x"C3", x"84", x"C4", x"20", x"BC", x"00", x"F0", +x"F4", x"A2", x"FF", x"86", x"88", x"90", x"06", x"20", +x"A6", x"C3", x"4C", x"F6", x"C5", x"20", x"7F", x"C7", +x"20", x"A6", x"C3", x"84", x"5D", x"20", x"32", x"C4", +x"90", x"44", x"A0", x"01", x"B1", x"AA", x"85", x"72", +x"A5", x"7B", x"85", x"71", x"A5", x"AB", x"85", x"74", +x"A5", x"AA", x"88", x"F1", x"AA", x"18", x"65", x"7B", +x"85", x"7B", x"85", x"73", x"A5", x"7C", x"69", x"FF", +x"85", x"7C", x"E5", x"AB", x"AA", x"38", x"A5", x"AA", +x"E5", x"7B", x"A8", x"B0", x"03", x"E8", x"C6", x"74", +x"18", x"65", x"71", x"90", x"03", x"C6", x"72", x"18", +x"B1", x"71", x"91", x"73", x"C8", x"D0", x"F9", x"E6", +x"72", x"E6", x"74", x"CA", x"D0", x"F2", x"A5", x"13", +x"F0", x"2F", x"A5", x"85", x"A4", x"86", x"85", x"81", +x"84", x"82", x"A5", x"7B", x"85", x"A6", x"65", x"5D", +x"85", x"A4", x"A4", x"7C", x"84", x"A7", x"90", x"01", +x"C8", x"84", x"A5", x"20", x"CF", x"C1", x"A5", x"7F", +x"A4", x"80", x"85", x"7B", x"84", x"7C", x"A4", x"5D", +x"88", x"B9", x"0F", x"00", x"91", x"AA", x"88", x"10", +x"F8", x"20", x"77", x"C4", x"A5", x"79", x"A4", x"7A", +x"85", x"71", x"84", x"72", x"18", x"A0", x"01", x"B1", +x"71", x"D0", x"03", x"4C", x"7D", x"C2", x"A0", x"04", +x"C8", x"B1", x"71", x"D0", x"FB", x"C8", x"98", x"65", +x"71", x"AA", x"A0", x"00", x"91", x"71", x"A5", x"72", +x"69", x"00", x"C8", x"91", x"71", x"86", x"71", x"85", +x"72", x"90", x"DA", x"20", x"E5", x"C8", x"CA", x"10", +x"08", x"20", x"E5", x"C8", x"20", x"6C", x"C8", x"A2", +x"00", x"20", x"86", x"C3", x"C9", x"0D", x"F0", x"23", +x"C9", x"40", x"F0", x"F0", x"C9", x"08", x"D0", x"05", +x"CA", x"30", x"0E", x"C6", x"0E", x"C9", x"20", x"90", +x"E8", x"E6", x"0E", x"E0", x"47", x"B0", x"05", x"95", +x"13", x"E8", x"D0", x"DD", x"A9", x"07", x"20", x"E5", +x"C8", x"D0", x"D6", x"4C", x"66", x"C8", x"20", x"EE", +x"FF", x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", +x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", x"29", +x"FF", x"C9", x"1E", x"D0", x"08", x"48", x"A5", x"64", +x"49", x"FF", x"85", x"64", x"68", x"60", x"A6", x"C3", +x"A0", x"04", x"84", x"60", x"B5", x"00", x"C9", x"20", +x"F0", x"3A", x"85", x"5C", x"C9", x"22", x"F0", x"58", +x"24", x"60", x"70", x"30", x"C9", x"3F", x"D0", x"04", +x"A9", x"97", x"D0", x"28", x"C9", x"30", x"90", x"04", +x"C9", x"3C", x"90", x"20", x"84", x"BA", x"A0", x"00", +x"84", x"5D", x"88", x"86", x"C3", x"CA", x"C8", x"E8", +x"B5", x"00", x"C9", x"20", x"F0", x"F9", x"38", x"F9", +x"84", x"C0", x"F0", x"F2", x"C9", x"80", x"D0", x"2F", +x"05", x"5D", x"A4", x"BA", x"E8", x"C8", x"99", x"0E", +x"00", x"B9", x"0E", x"00", x"F0", x"34", x"38", x"E9", +x"3A", x"F0", x"04", x"C9", x"49", x"D0", x"02", x"85", +x"60", x"38", x"E9", x"54", x"D0", x"A6", x"85", x"5C", +x"B5", x"00", x"F0", x"E0", x"C5", x"5C", x"F0", x"DC", +x"C8", x"99", x"0E", x"00", x"E8", x"D0", x"F1", x"A6", +x"C3", x"E6", x"5D", x"C8", x"B9", x"83", x"C0", x"10", +x"FA", x"B9", x"84", x"C0", x"D0", x"B2", x"B5", x"00", +x"10", x"C0", x"99", x"10", x"00", x"A9", x"12", x"85", +x"C3", x"60", x"A5", x"79", x"A6", x"7A", x"A0", x"01", +x"85", x"AA", x"86", x"AB", x"B1", x"AA", x"F0", x"1F", +x"C8", x"C8", x"A5", x"12", x"D1", x"AA", x"90", x"18", +x"F0", x"03", x"88", x"D0", x"09", x"A5", x"11", x"88", +x"D1", x"AA", x"90", x"0C", x"F0", x"0A", x"88", x"B1", +x"AA", x"AA", x"88", x"B1", x"AA", x"B0", x"D7", x"18", +x"60", x"D0", x"FD", x"A9", x"00", x"A8", x"91", x"79", +x"C8", x"91", x"79", x"A5", x"79", x"69", x"02", x"85", +x"7B", x"A5", x"7A", x"69", x"00", x"85", x"7C", x"20", +x"A7", x"C4", x"A5", x"85", x"A4", x"86", x"85", x"81", +x"84", x"82", x"A5", x"7B", x"A4", x"7C", x"85", x"7D", +x"84", x"7E", x"85", x"7F", x"84", x"80", x"20", x"1A", +x"C6", x"A2", x"68", x"86", x"65", x"68", x"8D", x"FD", +x"01", x"68", x"8D", x"FE", x"01", x"A2", x"FC", x"9A", +x"A9", x"00", x"85", x"8C", x"85", x"61", x"60", x"18", +x"A5", x"79", x"69", x"FF", x"85", x"C3", x"A5", x"7A", +x"69", x"FF", x"85", x"C4", x"60", x"90", x"06", x"F0", +x"04", x"C9", x"A4", x"D0", x"F7", x"20", x"7F", x"C7", +x"20", x"32", x"C4", x"20", x"C2", x"00", x"F0", x"0C", +x"C9", x"A4", x"D0", x"94", x"20", x"BC", x"00", x"20", +x"7F", x"C7", x"D0", x"8C", x"68", x"68", x"A5", x"11", +x"05", x"12", x"D0", x"06", x"A9", x"FF", x"85", x"11", +x"85", x"12", x"A0", x"01", x"84", x"60", x"B1", x"AA", +x"F0", x"41", x"20", x"29", x"C6", x"20", x"6C", x"C8", +x"C8", x"B1", x"AA", x"AA", x"C8", x"B1", x"AA", x"C5", +x"12", x"D0", x"04", x"E4", x"11", x"F0", x"02", x"B0", +x"2A", x"84", x"97", x"20", x"5E", x"D9", x"A9", x"20", +x"A4", x"97", x"29", x"7F", x"20", x"E5", x"C8", x"C9", +x"22", x"D0", x"06", x"A5", x"60", x"49", x"FF", x"85", +x"60", x"C8", x"B1", x"AA", x"D0", x"10", x"A8", x"B1", +x"AA", x"AA", x"C8", x"B1", x"AA", x"86", x"AA", x"85", +x"AB", x"D0", x"B7", x"4C", x"74", x"C2", x"10", x"DC", +x"C9", x"FF", x"F0", x"D8", x"24", x"60", x"30", x"D4", +x"38", x"E9", x"7F", x"AA", x"84", x"97", x"A0", x"FF", +x"CA", x"F0", x"08", x"C8", x"B9", x"84", x"C0", x"10", +x"FA", x"30", x"F5", x"C8", x"B9", x"84", x"C0", x"30", +x"B7", x"20", x"E5", x"C8", x"D0", x"F5", x"A9", x"80", +x"85", x"61", x"20", x"B9", x"C7", x"20", x"A1", x"C1", +x"D0", x"05", x"8A", x"69", x"0D", x"AA", x"9A", x"68", +x"68", x"A9", x"08", x"20", x"12", x"C2", x"20", x"1A", +x"C7", x"18", x"98", x"65", x"C3", x"48", x"A5", x"C4", +x"69", x"00", x"48", x"A5", x"88", x"48", x"A5", x"87", +x"48", x"A9", x"9D", x"20", x"03", x"CC", x"20", x"B0", +x"CA", x"20", x"AD", x"CA", x"A5", x"B0", x"09", x"7F", +x"25", x"AD", x"85", x"AD", x"A9", x"9F", x"A0", x"C5", +x"85", x"71", x"84", x"72", x"4C", x"66", x"CB", x"A9", +x"9C", x"A0", x"D5", x"20", x"4B", x"D7", x"20", x"C2", +x"00", x"C9", x"A2", x"D0", x"06", x"20", x"BC", x"00", +x"20", x"AD", x"CA", x"20", x"CA", x"D7", x"20", x"5B", +x"CB", x"A5", x"98", x"48", x"A5", x"97", x"48", x"A9", +x"81", x"48", x"20", x"29", x"C6", x"A5", x"C3", x"A4", +x"C4", x"F0", x"06", x"85", x"8B", x"84", x"8C", x"A0", +x"00", x"B1", x"C3", x"F0", x"07", x"C9", x"3A", x"F0", +x"1D", x"4C", x"0C", x"CC", x"A0", x"02", x"B1", x"C3", +x"18", x"F0", x"6E", x"C8", x"B1", x"C3", x"85", x"87", +x"C8", x"B1", x"C3", x"85", x"88", x"98", x"65", x"C3", +x"85", x"C3", x"90", x"02", x"E6", x"C4", x"20", x"BC", +x"00", x"20", x"FF", x"C5", x"4C", x"C2", x"C5", x"F0", +x"79", x"38", x"E9", x"80", x"B0", x"03", x"4C", x"B9", +x"C7", x"C9", x"1C", x"B0", x"CC", x"0A", x"A8", x"B9", +x"01", x"C0", x"48", x"B9", x"00", x"C0", x"48", x"4C", +x"BC", x"00", x"38", x"A5", x"79", x"E9", x"01", x"A4", +x"7A", x"B0", x"01", x"88", x"85", x"8F", x"84", x"90", +x"60", x"2C", x"11", x"02", x"10", x"FA", x"20", x"0F", +x"E6", x"F0", x"F5", x"20", x"86", x"C3", x"C9", x"03", +x"B0", x"01", x"18", x"D0", x"3D", x"A5", x"C3", x"A4", +x"C4", x"F0", x"0C", x"85", x"8B", x"84", x"8C", x"A5", +x"87", x"A4", x"88", x"85", x"89", x"84", x"8A", x"68", +x"68", x"A9", x"99", x"A0", x"C1", x"A2", x"00", x"86", +x"64", x"90", x"03", x"4C", x"69", x"C2", x"4C", x"74", +x"C2", x"D0", x"17", x"A2", x"1E", x"A4", x"8C", x"D0", +x"03", x"4C", x"4E", x"C2", x"A5", x"8B", x"85", x"C3", +x"84", x"C4", x"A5", x"89", x"A4", x"8A", x"85", x"87", +x"84", x"88", x"60", x"20", x"AE", x"D3", x"D0", x"FA", +x"E8", x"E0", x"0A", x"B0", x"04", x"CA", x"86", x"0D", +x"60", x"4C", x"88", x"CE", x"D0", x"EC", x"4C", x"7A", +x"C4", x"D0", x"03", x"4C", x"77", x"C4", x"20", x"7A", +x"C4", x"4C", x"B0", x"C6", x"A9", x"03", x"20", x"12", +x"C2", x"A5", x"C4", x"48", x"A5", x"C3", x"48", x"A5", +x"88", x"48", x"A5", x"87", x"48", x"A9", x"8C", x"48", +x"20", x"C2", x"00", x"20", x"B9", x"C6", x"4C", x"C2", +x"C5", x"20", x"7F", x"C7", x"20", x"1D", x"C7", x"A5", +x"88", x"C5", x"12", x"B0", x"0B", x"98", x"38", x"65", +x"C3", x"A6", x"C4", x"90", x"07", x"E8", x"B0", x"04", +x"A5", x"79", x"A6", x"7A", x"20", x"36", x"C4", x"90", +x"1E", x"A5", x"AA", x"E9", x"01", x"85", x"C3", x"A5", +x"AB", x"E9", x"00", x"85", x"C4", x"60", x"D0", x"FD", +x"A9", x"FF", x"85", x"97", x"20", x"A1", x"C1", x"9A", +x"C9", x"8C", x"F0", x"0B", x"A2", x"04", x"2C", x"A2", +x"0E", x"4C", x"4E", x"C2", x"4C", x"0C", x"CC", x"68", +x"68", x"85", x"87", x"68", x"85", x"88", x"68", x"85", +x"C3", x"68", x"85", x"C4", x"20", x"1A", x"C7", x"98", +x"18", x"65", x"C3", x"85", x"C3", x"90", x"02", x"E6", +x"C4", x"60", x"A2", x"3A", x"2C", x"A2", x"00", x"86", +x"5B", x"A0", x"00", x"84", x"5C", x"A5", x"5C", x"A6", +x"5B", x"85", x"5B", x"86", x"5C", x"B1", x"C3", x"F0", +x"E8", x"C5", x"5C", x"F0", x"E4", x"C8", x"C9", x"22", +x"F0", x"EB", x"D0", x"F1", x"20", x"C1", x"CA", x"20", +x"C2", x"00", x"C9", x"88", x"F0", x"05", x"A9", x"A0", +x"20", x"03", x"CC", x"A5", x"AC", x"D0", x"05", x"20", +x"1D", x"C7", x"F0", x"BB", x"20", x"C2", x"00", x"B0", +x"03", x"4C", x"B9", x"C6", x"4C", x"FF", x"C5", x"20", +x"AE", x"D3", x"48", x"C9", x"8C", x"F0", x"04", x"C9", +x"88", x"D0", x"91", x"C6", x"AF", x"D0", x"04", x"68", +x"4C", x"02", x"C6", x"20", x"BC", x"00", x"20", x"7F", +x"C7", x"C9", x"2C", x"F0", x"EE", x"68", x"60", x"A2", +x"00", x"86", x"11", x"86", x"12", x"B0", x"F7", x"E9", +x"2F", x"85", x"5B", x"A5", x"12", x"85", x"71", x"C9", +x"19", x"B0", x"D4", x"A5", x"11", x"0A", x"26", x"71", +x"0A", x"26", x"71", x"65", x"11", x"85", x"11", x"A5", +x"71", x"65", x"12", x"85", x"12", x"06", x"11", x"26", +x"12", x"A5", x"11", x"65", x"5B", x"85", x"11", x"90", +x"02", x"E6", x"12", x"20", x"BC", x"00", x"4C", x"85", +x"C7", x"20", x"0B", x"CD", x"85", x"97", x"84", x"98", +x"A9", x"AB", x"20", x"03", x"CC", x"A5", x"5F", x"48", +x"20", x"C1", x"CA", x"68", x"2A", x"20", x"B3", x"CA", +x"D0", x"03", x"4C", x"74", x"D7", x"A0", x"02", x"B1", +x"AE", x"C5", x"82", x"90", x"17", x"D0", x"07", x"88", +x"B1", x"AE", x"C5", x"81", x"90", x"0E", x"A4", x"AF", +x"C4", x"7C", x"90", x"08", x"D0", x"0D", x"A5", x"AE", +x"C5", x"7B", x"B0", x"07", x"A5", x"AE", x"A4", x"AF", +x"4C", x"11", x"C8", x"A0", x"00", x"B1", x"AE", x"20", +x"9C", x"D0", x"A5", x"9E", x"A4", x"9F", x"85", x"B8", +x"84", x"B9", x"20", x"8A", x"D2", x"A9", x"AC", x"A0", +x"00", x"85", x"9E", x"84", x"9F", x"20", x"EB", x"D2", +x"A0", x"00", x"B1", x"9E", x"91", x"97", x"C8", x"B1", +x"9E", x"91", x"97", x"C8", x"B1", x"9E", x"91", x"97", +x"60", x"20", x"C6", x"C8", x"20", x"C2", x"00", x"F0", +x"3B", x"F0", x"57", x"C9", x"9C", x"F0", x"6B", x"C9", +x"9F", x"F0", x"67", x"C9", x"2C", x"F0", x"4C", x"C9", +x"3B", x"F0", x"7A", x"20", x"C1", x"CA", x"24", x"5F", +x"30", x"DF", x"20", x"6E", x"D9", x"20", x"AE", x"D0", +x"A0", x"00", x"B1", x"AE", x"18", x"65", x"0E", x"C5", +x"0F", x"90", x"03", x"20", x"6C", x"C8", x"20", x"C6", +x"C8", x"20", x"E0", x"C8", x"D0", x"C6", x"A0", x"00", +x"94", x"13", x"A2", x"12", x"A9", x"0D", x"85", x"0E", +x"20", x"E5", x"C8", x"A9", x"0A", x"20", x"E5", x"C8", +x"8A", x"48", x"A6", x"0D", x"F0", x"08", x"A9", x"00", +x"20", x"E5", x"C8", x"CA", x"D0", x"FA", x"86", x"0E", +x"68", x"AA", x"60", x"A5", x"0E", x"C5", x"10", x"90", +x"06", x"20", x"6C", x"C8", x"4C", x"BD", x"C8", x"38", +x"E9", x"0E", x"B0", x"FC", x"49", x"FF", x"69", x"01", +x"D0", x"14", x"48", x"20", x"AB", x"D3", x"C9", x"29", +x"D0", x"66", x"68", x"C9", x"9C", x"D0", x"08", x"8A", +x"E5", x"0E", x"90", x"09", x"F0", x"07", x"AA", x"20", +x"E0", x"C8", x"CA", x"D0", x"FA", x"20", x"BC", x"00", +x"4C", x"31", x"C8", x"20", x"AE", x"D0", x"20", x"B6", +x"D2", x"AA", x"A0", x"00", x"E8", x"CA", x"F0", x"BA", +x"B1", x"71", x"20", x"E5", x"C8", x"C8", x"C9", x"0D", +x"D0", x"F3", x"20", x"78", x"C8", x"4C", x"CD", x"C8", +x"A9", x"20", x"2C", x"A9", x"3F", x"24", x"64", x"30", +x"18", x"48", x"C9", x"20", x"90", x"0B", x"A5", x"0E", +x"C5", x"0F", x"D0", x"03", x"20", x"6C", x"C8", x"E6", +x"0E", x"68", x"20", x"F1", x"FF", x"EA", x"EA", x"EA", +x"EA", x"29", x"FF", x"60", x"A5", x"62", x"F0", x"0B", +x"A5", x"8D", x"A4", x"8E", x"85", x"87", x"84", x"88", +x"4C", x"0C", x"CC", x"A9", x"2D", x"A0", x"CA", x"20", +x"C3", x"C8", x"A5", x"8B", x"A4", x"8C", x"85", x"C3", +x"84", x"C4", x"60", x"46", x"64", x"C9", x"22", x"D0", +x"0B", x"20", x"C1", x"CB", x"A9", x"3B", x"20", x"03", +x"CC", x"20", x"C6", x"C8", x"20", x"D4", x"CF", x"A9", +x"2C", x"85", x"12", x"20", x"46", x"C9", x"A5", x"13", +x"D0", x"12", x"18", x"4C", x"47", x"C6", x"20", x"E3", +x"C8", x"20", x"E0", x"C8", x"4C", x"57", x"C3", x"A6", +x"8F", x"A4", x"90", x"A9", x"98", x"85", x"62", x"86", +x"91", x"84", x"92", x"20", x"0B", x"CD", x"85", x"97", +x"84", x"98", x"A5", x"C3", x"A4", x"C4", x"85", x"11", +x"84", x"12", x"A6", x"91", x"A4", x"92", x"86", x"C3", +x"84", x"C4", x"20", x"C2", x"00", x"D0", x"0E", x"24", +x"62", x"30", x"62", x"20", x"E3", x"C8", x"20", x"46", +x"C9", x"86", x"C3", x"84", x"C4", x"20", x"BC", x"00", +x"24", x"5F", x"10", x"24", x"85", x"5B", x"C9", x"22", +x"F0", x"07", x"A9", x"3A", x"85", x"5B", x"A9", x"2C", +x"18", x"85", x"5C", x"A5", x"C3", x"A4", x"C4", x"69", +x"00", x"90", x"01", x"C8", x"20", x"B4", x"D0", x"20", +x"F3", x"D3", x"20", x"D5", x"C7", x"4C", x"B6", x"C9", +x"20", x"87", x"D8", x"20", x"74", x"D7", x"20", x"C2", +x"00", x"F0", x"07", x"C9", x"2C", x"F0", x"03", x"4C", +x"04", x"C9", x"A5", x"C3", x"A4", x"C4", x"85", x"91", +x"84", x"92", x"A5", x"11", x"A4", x"12", x"85", x"C3", +x"84", x"C4", x"20", x"C2", x"00", x"F0", x"2C", x"20", +x"01", x"CC", x"4C", x"5B", x"C9", x"20", x"1A", x"C7", +x"C8", x"AA", x"D0", x"12", x"A2", x"06", x"C8", x"B1", +x"C3", x"F0", x"69", x"C8", x"B1", x"C3", x"85", x"8D", +x"C8", x"B1", x"C3", x"C8", x"85", x"8E", x"B1", x"C3", +x"AA", x"20", x"0F", x"C7", x"E0", x"83", x"D0", x"DD", +x"4C", x"85", x"C9", x"A5", x"91", x"A4", x"92", x"A6", +x"62", x"F0", x"03", x"4C", x"24", x"C6", x"A0", x"00", +x"B1", x"91", x"F0", x"07", x"A9", x"1C", x"A0", x"CA", +x"4C", x"C3", x"C8", x"60", x"3F", x"50", x"52", x"45", +x"56", x"49", x"5E", x"45", x"20", x"55", x"4C", x"41", +x"5A", x"41", x"0D", x"0A", x"00", x"20", x"3F", x"20", +x"50", x"4F", x"4E", x"4F", x"56", x"49", x"20", x"55", +x"50", x"49", x"53", x"20", x"20", x"0D", x"0A", x"00", +x"D0", x"04", x"A0", x"00", x"F0", x"03", x"20", x"0B", +x"CD", x"85", x"97", x"84", x"98", x"20", x"A1", x"C1", +x"F0", x"04", x"A2", x"00", x"F0", x"68", x"9A", x"E8", +x"E8", x"E8", x"E8", x"8A", x"E8", x"E8", x"E8", x"E8", +x"E8", x"86", x"73", x"A0", x"01", x"20", x"4B", x"D7", +x"BA", x"BD", x"08", x"01", x"85", x"B0", x"A5", x"97", +x"A4", x"98", x"20", x"6C", x"D4", x"20", x"74", x"D7", +x"A0", x"01", x"20", x"FA", x"D7", x"BA", x"38", x"FD", +x"08", x"01", x"F0", x"17", x"BD", x"0D", x"01", x"85", +x"87", x"BD", x"0E", x"01", x"85", x"88", x"BD", x"10", +x"01", x"85", x"C3", x"BD", x"0F", x"01", x"85", x"C4", +x"4C", x"C2", x"C5", x"8A", x"69", x"0F", x"AA", x"9A", +x"20", x"C2", x"00", x"C9", x"2C", x"D0", x"F1", x"20", +x"BC", x"00", x"20", x"46", x"CA", x"20", x"C1", x"CA", +x"18", x"24", x"38", x"24", x"5F", x"30", x"03", x"B0", +x"03", x"60", x"B0", x"FD", x"A2", x"18", x"4C", x"4E", +x"C2", x"A6", x"C3", x"D0", x"02", x"C6", x"C4", x"C6", +x"C3", x"A2", x"00", x"24", x"48", x"8A", x"48", x"A9", +x"01", x"20", x"12", x"C2", x"20", x"A0", x"CB", x"A9", +x"00", x"85", x"9B", x"20", x"C2", x"00", x"38", x"E9", +x"AA", x"90", x"17", x"C9", x"03", x"B0", x"13", x"C9", +x"01", x"2A", x"49", x"01", x"45", x"9B", x"C5", x"9B", +x"90", x"61", x"85", x"9B", x"20", x"BC", x"00", x"4C", +x"DE", x"CA", x"A6", x"9B", x"D0", x"2C", x"B0", x"78", +x"69", x"07", x"90", x"74", x"65", x"5F", x"D0", x"03", +x"4C", x"4D", x"D2", x"69", x"FF", x"85", x"71", x"0A", +x"65", x"71", x"A8", x"68", x"D9", x"66", x"C0", x"B0", +x"64", x"20", x"B0", x"CA", x"48", x"20", x"43", x"CB", +x"68", x"A4", x"99", x"10", x"17", x"AA", x"F0", x"53", +x"D0", x"5C", x"46", x"5F", x"8A", x"2A", x"A6", x"C3", +x"D0", x"02", x"C6", x"C4", x"C6", x"C3", x"A0", x"1B", +x"85", x"9B", x"D0", x"D7", x"D9", x"66", x"C0", x"B0", +x"45", x"90", x"D9", x"B9", x"68", x"C0", x"48", x"B9", +x"67", x"C0", x"48", x"20", x"56", x"CB", x"A5", x"9B", +x"4C", x"CC", x"CA", x"4C", x"0C", x"CC", x"A5", x"B0", +x"BE", x"66", x"C0", x"A8", x"68", x"85", x"71", x"E6", +x"71", x"68", x"85", x"72", x"98", x"48", x"20", x"BA", +x"D7", x"A5", x"AF", x"48", x"A5", x"AE", x"48", x"A5", +x"AD", x"48", x"A5", x"AC", x"48", x"6C", x"71", x"00", +x"A0", x"FF", x"68", x"F0", x"20", x"C9", x"64", x"F0", +x"03", x"20", x"B0", x"CA", x"84", x"99", x"68", x"4A", +x"85", x"63", x"68", x"85", x"B3", x"68", x"85", x"B4", +x"68", x"85", x"B5", x"68", x"85", x"B6", x"68", x"85", +x"B7", x"45", x"B0", x"85", x"B8", x"A5", x"AC", x"60", +x"A9", x"00", x"85", x"5F", x"20", x"BC", x"00", x"B0", +x"03", x"4C", x"87", x"D8", x"20", x"81", x"CD", x"B0", +x"67", x"C9", x"2E", x"F0", x"F4", x"C9", x"A4", x"F0", +x"58", x"C9", x"A3", x"F0", x"E7", x"C9", x"22", x"D0", +x"0F", x"A5", x"C3", x"A4", x"C4", x"69", x"00", x"90", +x"01", x"C8", x"20", x"AE", x"D0", x"4C", x"F3", x"D3", +x"C9", x"A1", x"D0", x"13", x"A0", x"18", x"D0", x"3B", +x"20", x"05", x"CE", x"A5", x"AF", x"49", x"FF", x"A8", +x"A5", x"AE", x"49", x"FF", x"4C", x"C1", x"CF", x"C9", +x"9E", x"D0", x"03", x"4C", x"1E", x"D0", x"C9", x"AD", +x"90", x"03", x"4C", x"27", x"CC", x"20", x"FE", x"CB", +x"20", x"C1", x"CA", x"A9", x"29", x"2C", x"A9", x"28", +x"2C", x"A9", x"2C", x"A0", x"00", x"D1", x"C3", x"D0", +x"03", x"4C", x"BC", x"00", x"A2", x"02", x"4C", x"4E", +x"C2", x"A0", x"15", x"68", x"68", x"4C", x"1D", x"CB", +x"20", x"0B", x"CD", x"85", x"AE", x"84", x"AF", x"A6", +x"5F", x"F0", x"01", x"60", x"4C", x"4B", x"D7", x"0A", +x"48", x"AA", x"20", x"BC", x"00", x"E0", x"81", x"90", +x"20", x"20", x"FE", x"CB", x"20", x"C1", x"CA", x"20", +x"01", x"CC", x"20", x"B2", x"CA", x"68", x"AA", x"A5", +x"AF", x"48", x"A5", x"AE", x"48", x"8A", x"48", x"20", +x"AE", x"D3", x"68", x"A8", x"8A", x"48", x"4C", x"56", +x"CC", x"20", x"F5", x"CB", x"68", x"A8", x"B9", x"DE", +x"BF", x"85", x"A2", x"B9", x"DF", x"BF", x"85", x"A3", +x"20", x"A1", x"00", x"4C", x"B0", x"CA", x"A0", x"FF", +x"2C", x"A0", x"00", x"84", x"5D", x"20", x"05", x"CE", +x"A5", x"AE", x"45", x"5D", x"85", x"5B", x"A5", x"AF", +x"45", x"5D", x"85", x"5C", x"20", x"9B", x"D7", x"20", +x"05", x"CE", x"A5", x"AF", x"45", x"5D", x"25", x"5C", +x"45", x"5D", x"A8", x"A5", x"AE", x"45", x"5D", x"25", +x"5B", x"45", x"5D", x"4C", x"C1", x"CF", x"20", x"B3", +x"CA", x"B0", x"13", x"A5", x"B7", x"09", x"7F", x"25", +x"B4", x"85", x"B4", x"A9", x"B3", x"A0", x"00", x"20", +x"F8", x"D7", x"AA", x"4C", x"E1", x"CC", x"A9", x"00", +x"85", x"5F", x"C6", x"9B", x"20", x"B6", x"D2", x"85", +x"AC", x"86", x"AD", x"84", x"AE", x"A5", x"B5", x"A4", +x"B6", x"20", x"BA", x"D2", x"86", x"B5", x"84", x"B6", +x"AA", x"38", x"E5", x"AC", x"F0", x"08", x"A9", x"01", +x"90", x"04", x"A6", x"AC", x"A9", x"FF", x"85", x"B0", +x"A0", x"FF", x"E8", x"C8", x"CA", x"D0", x"07", x"A6", +x"B0", x"30", x"0F", x"18", x"90", x"0C", x"B1", x"B5", +x"D1", x"AD", x"F0", x"EF", x"A2", x"FF", x"B0", x"02", +x"A2", x"01", x"E8", x"8A", x"2A", x"25", x"63", x"F0", +x"02", x"A9", x"FF", x"4C", x"DB", x"D7", x"20", x"01", +x"CC", x"AA", x"20", x"10", x"CD", x"20", x"C2", x"00", +x"D0", x"F4", x"60", x"A2", x"00", x"20", x"C2", x"00", +x"86", x"5E", x"85", x"93", x"20", x"C2", x"00", x"20", +x"81", x"CD", x"B0", x"03", x"4C", x"0C", x"CC", x"A2", +x"00", x"86", x"5F", x"20", x"BC", x"00", x"90", x"05", +x"20", x"81", x"CD", x"90", x"0B", x"AA", x"20", x"BC", +x"00", x"90", x"FB", x"20", x"81", x"CD", x"B0", x"F6", +x"C9", x"24", x"D0", x"0B", x"A9", x"FF", x"85", x"5F", +x"8A", x"09", x"80", x"AA", x"20", x"BC", x"00", x"86", +x"94", x"38", x"05", x"61", x"E9", x"28", x"D0", x"03", +x"4C", x"17", x"CE", x"A9", x"00", x"85", x"61", x"A5", +x"7B", x"A6", x"7C", x"A0", x"00", x"86", x"AB", x"85", +x"AA", x"E4", x"7E", x"D0", x"04", x"C5", x"7D", x"F0", +x"22", x"A5", x"93", x"D1", x"AA", x"D0", x"08", x"A5", +x"94", x"C8", x"D1", x"AA", x"F0", x"61", x"88", x"18", +x"A5", x"AA", x"69", x"06", x"90", x"E1", x"E8", x"D0", +x"DC", x"C9", x"41", x"90", x"05", x"E9", x"5B", x"38", +x"E9", x"A5", x"60", x"68", x"48", x"C9", x"1A", x"D0", +x"07", x"A9", x"96", x"A0", x"CD", x"60", x"00", x"00", +x"A5", x"7D", x"A4", x"7E", x"85", x"AA", x"84", x"AB", +x"A5", x"7F", x"A4", x"80", x"85", x"A6", x"84", x"A7", +x"18", x"69", x"06", x"90", x"01", x"C8", x"85", x"A4", +x"84", x"A5", x"20", x"CF", x"C1", x"A5", x"A4", x"A4", +x"A5", x"C8", x"85", x"7D", x"84", x"7E", x"A0", x"00", +x"A5", x"93", x"91", x"AA", x"C8", x"A5", x"94", x"91", +x"AA", x"A9", x"00", x"C8", x"91", x"AA", x"C8", x"91", +x"AA", x"C8", x"91", x"AA", x"C8", x"91", x"AA", x"A5", +x"AA", x"18", x"69", x"02", x"A4", x"AB", x"90", x"01", +x"C8", x"85", x"95", x"84", x"96", x"60", x"A5", x"5D", +x"0A", x"69", x"05", x"65", x"AA", x"A4", x"AB", x"90", +x"01", x"C8", x"85", x"A4", x"84", x"A5", x"60", x"90", +x"80", x"00", x"00", x"20", x"BC", x"00", x"20", x"AD", +x"CA", x"A5", x"B0", x"30", x"0D", x"A5", x"AC", x"C9", +x"90", x"90", x"09", x"A9", x"F7", x"A0", x"CD", x"20", +x"F8", x"D7", x"D0", x"74", x"4C", x"31", x"D8", x"A5", +x"5E", x"48", x"A5", x"5F", x"48", x"A0", x"00", x"98", +x"48", x"A5", x"94", x"48", x"A5", x"93", x"48", x"20", +x"FB", x"CD", x"68", x"85", x"93", x"68", x"85", x"94", +x"68", x"A8", x"BA", x"BD", x"02", x"01", x"48", x"BD", +x"01", x"01", x"48", x"A5", x"AE", x"9D", x"02", x"01", +x"A5", x"AF", x"9D", x"01", x"01", x"C8", x"20", x"C2", +x"00", x"C9", x"2C", x"F0", x"D2", x"84", x"5D", x"20", +x"FB", x"CB", x"68", x"85", x"5F", x"68", x"85", x"5E", +x"A6", x"7D", x"A5", x"7E", x"86", x"AA", x"85", x"AB", +x"C5", x"80", x"D0", x"04", x"E4", x"7F", x"F0", x"39", +x"A0", x"00", x"B1", x"AA", x"C8", x"C5", x"93", x"D0", +x"06", x"A5", x"94", x"D1", x"AA", x"F0", x"16", x"C8", +x"B1", x"AA", x"18", x"65", x"AA", x"AA", x"C8", x"B1", +x"AA", x"65", x"AB", x"90", x"D7", x"A2", x"10", x"2C", +x"A2", x"08", x"4C", x"4E", x"C2", x"A2", x"12", x"A5", +x"5E", x"D0", x"F7", x"20", x"E6", x"CD", x"A5", x"5D", +x"A0", x"04", x"D1", x"AA", x"D0", x"E7", x"4C", x"24", +x"CF", x"20", x"E6", x"CD", x"20", x"1F", x"C2", x"A9", +x"00", x"A8", x"85", x"BB", x"A2", x"04", x"86", x"BA", +x"A5", x"93", x"91", x"AA", x"C8", x"A5", x"94", x"91", +x"AA", x"A5", x"5D", x"C8", x"C8", x"C8", x"91", x"AA", +x"A2", x"0B", x"A9", x"00", x"24", x"5E", x"50", x"08", +x"68", x"18", x"69", x"01", x"AA", x"68", x"69", x"00", +x"C8", x"91", x"AA", x"C8", x"8A", x"91", x"AA", x"20", +x"7C", x"CF", x"86", x"BA", x"85", x"BB", x"A4", x"71", +x"C6", x"5D", x"D0", x"DC", x"65", x"A5", x"B0", x"5D", +x"85", x"A5", x"A8", x"8A", x"65", x"A4", x"90", x"03", +x"C8", x"F0", x"52", x"20", x"1F", x"C2", x"85", x"7F", +x"84", x"80", x"A9", x"00", x"E6", x"BB", x"A4", x"BA", +x"F0", x"05", x"88", x"91", x"A4", x"D0", x"FB", x"C6", +x"A5", x"C6", x"BB", x"D0", x"F5", x"E6", x"A5", x"38", +x"A5", x"7F", x"E5", x"AA", x"A0", x"02", x"91", x"AA", +x"A5", x"80", x"C8", x"E5", x"AB", x"91", x"AA", x"A5", +x"5E", x"D0", x"58", x"C8", x"B1", x"AA", x"85", x"5D", +x"A9", x"00", x"85", x"BA", x"85", x"BB", x"C8", x"68", +x"AA", x"85", x"AE", x"68", x"85", x"AF", x"D1", x"AA", +x"90", x"0E", x"D0", x"06", x"C8", x"8A", x"D1", x"AA", +x"90", x"07", x"4C", x"85", x"CE", x"4C", x"4C", x"C2", +x"C8", x"A5", x"BB", x"05", x"BA", x"18", x"F0", x"0A", +x"20", x"7C", x"CF", x"8A", x"65", x"AE", x"AA", x"98", +x"A4", x"71", x"65", x"AF", x"86", x"BA", x"C6", x"5D", +x"D0", x"CA", x"06", x"BA", x"2A", x"B0", x"DB", x"06", +x"BA", x"2A", x"B0", x"D6", x"A8", x"A5", x"BA", x"65", +x"A4", x"85", x"95", x"98", x"65", x"A5", x"85", x"96", +x"A8", x"A5", x"95", x"60", x"84", x"71", x"B1", x"AA", +x"85", x"76", x"88", x"B1", x"AA", x"85", x"77", x"A9", +x"10", x"85", x"A8", x"A2", x"00", x"A0", x"00", x"8A", +x"0A", x"AA", x"98", x"2A", x"A8", x"B0", x"AE", x"06", +x"BA", x"26", x"BB", x"90", x"0B", x"18", x"8A", x"65", +x"76", x"AA", x"98", x"65", x"77", x"A8", x"B0", x"9D", +x"C6", x"A8", x"D0", x"E3", x"60", x"A5", x"5F", x"F0", +x"03", x"20", x"B6", x"D2", x"20", x"47", x"D1", x"38", +x"A5", x"81", x"E5", x"7F", x"A8", x"A5", x"82", x"E5", +x"80", x"A2", x"00", x"86", x"5F", x"85", x"AD", x"84", +x"AE", x"A2", x"90", x"4C", x"E3", x"D7", x"A4", x"0E", +x"A9", x"00", x"F0", x"ED", x"A6", x"88", x"E8", x"D0", +x"A2", x"A2", x"16", x"4C", x"4E", x"C2", x"20", x"0B", +x"D0", x"20", x"D4", x"CF", x"20", x"FE", x"CB", x"A9", +x"80", x"85", x"61", x"20", x"0B", x"CD", x"20", x"B0", +x"CA", x"20", x"FB", x"CB", x"A9", x"AB", x"20", x"03", +x"CC", x"A5", x"96", x"48", x"A5", x"95", x"48", x"A5", +x"C4", x"48", x"A5", x"C3", x"48", x"20", x"0C", x"C7", +x"4C", x"7A", x"D0", x"A9", x"9E", x"20", x"03", x"CC", +x"09", x"80", x"85", x"61", x"20", x"12", x"CD", x"85", +x"9C", x"84", x"9D", x"4C", x"B0", x"CA", x"20", x"0B", +x"D0", x"A5", x"9D", x"48", x"A5", x"9C", x"48", x"20", +x"F5", x"CB", x"20", x"B0", x"CA", x"68", x"85", x"9C", +x"68", x"85", x"9D", x"A0", x"02", x"A2", x"20", x"B1", +x"9C", x"F0", x"A0", x"85", x"95", x"AA", x"C8", x"B1", +x"9C", x"85", x"96", x"B1", x"95", x"48", x"88", x"10", +x"FA", x"A4", x"96", x"20", x"78", x"D7", x"A5", x"C4", +x"48", x"A5", x"C3", x"48", x"B1", x"9C", x"85", x"C3", +x"C8", x"B1", x"9C", x"85", x"C4", x"A5", x"96", x"48", +x"A5", x"95", x"48", x"20", x"AD", x"CA", x"68", x"85", +x"9C", x"68", x"85", x"9D", x"20", x"C2", x"00", x"F0", +x"03", x"4C", x"0C", x"CC", x"68", x"85", x"C3", x"68", +x"85", x"C4", x"A0", x"00", x"68", x"91", x"9C", x"68", +x"C8", x"91", x"9C", x"68", x"C8", x"91", x"9C", x"68", +x"C8", x"91", x"9C", x"60", x"20", x"B0", x"CA", x"A0", +x"00", x"20", x"70", x"D9", x"68", x"68", x"A9", x"FF", +x"A0", x"00", x"F0", x"12", x"A6", x"AE", x"A4", x"AF", +x"86", x"9E", x"84", x"9F", x"20", x"15", x"D1", x"86", +x"AD", x"84", x"AE", x"85", x"AC", x"60", x"A2", x"22", +x"86", x"5B", x"86", x"5C", x"85", x"B8", x"84", x"B9", +x"85", x"AD", x"84", x"AE", x"A0", x"FF", x"C8", x"B1", +x"B8", x"F0", x"0C", x"C5", x"5B", x"F0", x"04", x"C5", +x"5C", x"D0", x"F3", x"C9", x"22", x"F0", x"01", x"18", +x"84", x"AC", x"98", x"65", x"B8", x"85", x"BA", x"A6", +x"B9", x"90", x"01", x"E8", x"86", x"BB", x"A5", x"B9", +x"D0", x"0B", x"98", x"20", x"9C", x"D0", x"A6", x"B8", +x"A4", x"B9", x"20", x"98", x"D2", x"A6", x"65", x"E0", +x"71", x"D0", x"05", x"A2", x"1C", x"4C", x"4E", x"C2", +x"A5", x"AC", x"95", x"00", x"A5", x"AD", x"95", x"01", +x"A5", x"AE", x"95", x"02", x"A0", x"00", x"86", x"AE", +x"84", x"AF", x"88", x"84", x"5F", x"86", x"66", x"E8", +x"E8", x"E8", x"86", x"65", x"60", x"46", x"60", x"48", +x"49", x"FF", x"38", x"65", x"81", x"A4", x"82", x"B0", +x"01", x"88", x"C4", x"80", x"90", x"11", x"D0", x"04", +x"C5", x"7F", x"90", x"0B", x"85", x"81", x"84", x"82", +x"85", x"83", x"84", x"84", x"AA", x"68", x"60", x"A2", +x"0C", x"A5", x"60", x"30", x"B8", x"20", x"47", x"D1", +x"A9", x"80", x"85", x"60", x"68", x"D0", x"D0", x"A6", +x"85", x"A5", x"86", x"86", x"81", x"85", x"82", x"A0", +x"00", x"84", x"9D", x"A5", x"7F", x"A6", x"80", x"85", +x"AA", x"86", x"AB", x"A9", x"68", x"A2", x"00", x"85", +x"71", x"86", x"72", x"C5", x"65", x"F0", x"05", x"20", +x"D9", x"D1", x"F0", x"F7", x"A9", x"06", x"85", x"A0", +x"A5", x"7B", x"A6", x"7C", x"85", x"71", x"86", x"72", +x"E4", x"7E", x"D0", x"04", x"C5", x"7D", x"F0", x"05", +x"20", x"D3", x"D1", x"F0", x"F3", x"85", x"A4", x"86", +x"A5", x"A9", x"03", x"85", x"A0", x"A5", x"A4", x"A6", +x"A5", x"E4", x"80", x"D0", x"07", x"C5", x"7F", x"D0", +x"03", x"4C", x"18", x"D2", x"85", x"71", x"86", x"72", +x"A0", x"01", x"B1", x"71", x"08", x"C8", x"B1", x"71", +x"65", x"A4", x"85", x"A4", x"C8", x"B1", x"71", x"65", +x"A5", x"85", x"A5", x"28", x"10", x"D7", x"C8", x"B1", +x"71", x"0A", x"69", x"05", x"65", x"71", x"85", x"71", +x"90", x"02", x"E6", x"72", x"A6", x"72", x"E4", x"A5", +x"D0", x"04", x"C5", x"A4", x"F0", x"C3", x"20", x"D9", +x"D1", x"F0", x"F3", x"C8", x"B1", x"71", x"10", x"30", +x"C8", x"B1", x"71", x"F0", x"2B", x"C8", x"B1", x"71", +x"AA", x"C8", x"B1", x"71", x"C5", x"82", x"90", x"06", +x"D0", x"1E", x"E4", x"81", x"B0", x"1A", x"C5", x"AB", +x"90", x"16", x"D0", x"04", x"E4", x"AA", x"90", x"10", +x"86", x"AA", x"85", x"AB", x"A5", x"71", x"A6", x"72", +x"85", x"9C", x"86", x"9D", x"A5", x"A0", x"85", x"A2", +x"A5", x"A0", x"18", x"65", x"71", x"85", x"71", x"90", +x"02", x"E6", x"72", x"A6", x"72", x"A0", x"00", x"60", +x"A6", x"9D", x"F0", x"F7", x"A5", x"A2", x"29", x"04", +x"4A", x"A8", x"85", x"A2", x"B1", x"9C", x"65", x"AA", +x"85", x"A6", x"A5", x"AB", x"69", x"00", x"85", x"A7", +x"A5", x"81", x"A6", x"82", x"85", x"A4", x"86", x"A5", +x"20", x"D6", x"C1", x"A4", x"A2", x"C8", x"A5", x"A4", +x"91", x"9C", x"AA", x"E6", x"A5", x"A5", x"A5", x"C8", +x"91", x"9C", x"4C", x"4B", x"D1", x"A5", x"AF", x"48", +x"A5", x"AE", x"48", x"20", x"A0", x"CB", x"20", x"B2", +x"CA", x"68", x"85", x"B8", x"68", x"85", x"B9", x"A0", +x"00", x"B1", x"B8", x"18", x"71", x"AE", x"90", x"05", +x"A2", x"1A", x"4C", x"4E", x"C2", x"20", x"9C", x"D0", +x"20", x"8A", x"D2", x"A5", x"9E", x"A4", x"9F", x"20", +x"BA", x"D2", x"20", x"9C", x"D2", x"A5", x"B8", x"A4", +x"B9", x"20", x"BA", x"D2", x"20", x"ED", x"D0", x"4C", +x"DB", x"CA", x"A0", x"00", x"B1", x"B8", x"48", x"C8", +x"B1", x"B8", x"AA", x"C8", x"B1", x"B8", x"A8", x"68", +x"86", x"71", x"84", x"72", x"A8", x"F0", x"0A", x"48", +x"88", x"B1", x"71", x"91", x"83", x"98", x"D0", x"F8", +x"68", x"18", x"65", x"83", x"85", x"83", x"90", x"02", +x"E6", x"84", x"60", x"20", x"B2", x"CA", x"A5", x"AE", +x"A4", x"AF", x"85", x"71", x"84", x"72", x"20", x"EB", +x"D2", x"08", x"A0", x"00", x"B1", x"71", x"48", x"C8", +x"B1", x"71", x"AA", x"C8", x"B1", x"71", x"A8", x"68", +x"28", x"D0", x"13", x"C4", x"82", x"D0", x"0F", x"E4", +x"81", x"D0", x"0B", x"48", x"18", x"65", x"81", x"85", +x"81", x"90", x"02", x"E6", x"82", x"68", x"86", x"71", +x"84", x"72", x"60", x"C4", x"67", x"D0", x"0C", x"C5", +x"66", x"D0", x"08", x"85", x"65", x"E9", x"03", x"85", +x"66", x"A0", x"00", x"60", x"20", x"B1", x"D3", x"8A", +x"48", x"A9", x"01", x"20", x"A4", x"D0", x"68", x"A0", +x"00", x"91", x"AD", x"68", x"68", x"4C", x"ED", x"D0", +x"20", x"6F", x"D3", x"D1", x"9E", x"98", x"90", x"04", +x"B1", x"9E", x"AA", x"98", x"48", x"8A", x"48", x"20", +x"A4", x"D0", x"A5", x"9E", x"A4", x"9F", x"20", x"BA", +x"D2", x"68", x"A8", x"68", x"18", x"65", x"71", x"85", +x"71", x"90", x"02", x"E6", x"72", x"98", x"20", x"9C", +x"D2", x"4C", x"ED", x"D0", x"20", x"6F", x"D3", x"18", +x"F1", x"9E", x"49", x"FF", x"4C", x"16", x"D3", x"A9", +x"FF", x"85", x"AF", x"20", x"C2", x"00", x"C9", x"29", +x"F0", x"06", x"20", x"01", x"CC", x"20", x"AE", x"D3", +x"20", x"6F", x"D3", x"CA", x"8A", x"48", x"18", x"A2", +x"00", x"F1", x"9E", x"B0", x"B8", x"49", x"FF", x"C5", +x"AF", x"90", x"B3", x"A5", x"AF", x"B0", x"AF", x"20", +x"FB", x"CB", x"68", x"85", x"A2", x"68", x"85", x"A3", +x"68", x"68", x"68", x"AA", x"68", x"85", x"9E", x"68", +x"85", x"9F", x"A0", x"00", x"8A", x"F0", x"21", x"E6", +x"A2", x"6C", x"A2", x"00", x"20", x"92", x"D3", x"4C", +x"D0", x"CF", x"20", x"B3", x"D2", x"A2", x"00", x"86", +x"5F", x"A8", x"60", x"20", x"92", x"D3", x"F0", x"08", +x"A0", x"00", x"B1", x"71", x"A8", x"4C", x"8F", x"D3", +x"4C", x"88", x"CE", x"20", x"BC", x"00", x"20", x"AD", +x"CA", x"20", x"01", x"CE", x"A6", x"AE", x"D0", x"F0", +x"A6", x"AF", x"4C", x"C2", x"00", x"20", x"92", x"D3", +x"D0", x"03", x"4C", x"F1", x"D4", x"A6", x"C3", x"A4", +x"C4", x"86", x"BA", x"84", x"BB", x"A6", x"71", x"86", +x"C3", x"18", x"65", x"71", x"85", x"73", x"A6", x"72", +x"86", x"C4", x"90", x"01", x"E8", x"86", x"74", x"A0", +x"00", x"B1", x"73", x"48", x"A9", x"00", x"91", x"73", +x"20", x"C2", x"00", x"20", x"87", x"D8", x"68", x"A0", +x"00", x"91", x"73", x"A6", x"BA", x"A4", x"BB", x"86", +x"C3", x"84", x"C4", x"60", x"20", x"AD", x"CA", x"20", +x"08", x"D4", x"20", x"01", x"CC", x"4C", x"AE", x"D3", +x"A5", x"B0", x"30", x"9C", x"A5", x"AC", x"C9", x"91", +x"B0", x"96", x"20", x"31", x"D8", x"A5", x"AE", x"A4", +x"AF", x"84", x"11", x"85", x"12", x"60", x"20", x"08", +x"D4", x"A0", x"00", x"B1", x"11", x"A8", x"4C", x"D0", +x"CF", x"20", x"FC", x"D3", x"8A", x"A0", x"00", x"91", +x"11", x"60", x"20", x"FC", x"D3", x"86", x"97", x"A2", +x"00", x"20", x"C2", x"00", x"F0", x"03", x"20", x"02", +x"D4", x"86", x"98", x"A0", x"00", x"B1", x"11", x"45", +x"98", x"25", x"97", x"F0", x"F8", x"60", x"A9", x"96", +x"A0", x"DA", x"4C", x"6C", x"D4", x"20", x"4D", x"D6", +x"A5", x"B0", x"49", x"FF", x"85", x"B0", x"45", x"B7", +x"85", x"B8", x"A5", x"AC", x"4C", x"6F", x"D4", x"20", +x"7B", x"D5", x"90", x"3C", x"20", x"4D", x"D6", x"D0", +x"03", x"4C", x"9B", x"D7", x"A6", x"B9", x"86", x"A3", +x"A2", x"B3", x"A5", x"B3", x"A8", x"F0", x"CE", x"38", +x"E5", x"AC", x"F0", x"24", x"90", x"12", x"84", x"AC", +x"A4", x"B7", x"84", x"B0", x"49", x"FF", x"69", x"00", +x"A0", x"00", x"84", x"A3", x"A2", x"AC", x"D0", x"04", +x"A0", x"00", x"84", x"B9", x"C9", x"F9", x"30", x"C7", +x"A8", x"A5", x"B9", x"56", x"01", x"20", x"92", x"D5", +x"24", x"B8", x"10", x"4C", x"A0", x"AC", x"E0", x"B3", +x"F0", x"02", x"A0", x"B3", x"38", x"49", x"FF", x"65", +x"A3", x"85", x"B9", x"B9", x"03", x"00", x"F5", x"03", +x"85", x"AF", x"B9", x"02", x"00", x"F5", x"02", x"85", +x"AE", x"B9", x"01", x"00", x"F5", x"01", x"85", x"AD", +x"B0", x"03", x"20", x"37", x"D5", x"A0", x"00", x"98", +x"18", x"A6", x"AD", x"D0", x"3E", x"A6", x"AE", x"86", +x"AD", x"A6", x"AF", x"86", x"AE", x"A6", x"B9", x"86", +x"AF", x"84", x"B9", x"69", x"08", x"C9", x"18", x"D0", +x"E8", x"A9", x"00", x"85", x"AC", x"85", x"B0", x"60", +x"65", x"A3", x"85", x"B9", x"A5", x"AF", x"65", x"B6", +x"85", x"AF", x"A5", x"AE", x"65", x"B5", x"85", x"AE", +x"A5", x"AD", x"65", x"B4", x"85", x"AD", x"4C", x"28", +x"D5", x"69", x"01", x"06", x"B9", x"26", x"AF", x"26", +x"AE", x"26", x"AD", x"10", x"F4", x"38", x"E5", x"AC", +x"B0", x"CF", x"49", x"FF", x"69", x"01", x"85", x"AC", +x"90", x"0C", x"E6", x"AC", x"F0", x"36", x"66", x"AD", +x"66", x"AE", x"66", x"AF", x"66", x"B9", x"60", x"A5", +x"B0", x"49", x"FF", x"85", x"B0", x"A5", x"AD", x"49", +x"FF", x"85", x"AD", x"A5", x"AE", x"49", x"FF", x"85", +x"AE", x"A5", x"AF", x"49", x"FF", x"85", x"AF", x"A5", +x"B9", x"49", x"FF", x"85", x"B9", x"E6", x"B9", x"D0", +x"0A", x"E6", x"AF", x"D0", x"06", x"E6", x"AE", x"D0", +x"02", x"E6", x"AD", x"60", x"A2", x"0A", x"4C", x"4E", +x"C2", x"A2", x"74", x"B4", x"03", x"84", x"B9", x"B4", +x"02", x"94", x"03", x"B4", x"01", x"94", x"02", x"A4", +x"B2", x"94", x"01", x"69", x"08", x"30", x"EC", x"F0", +x"EA", x"E9", x"08", x"A8", x"A5", x"B9", x"B0", x"12", +x"16", x"01", x"90", x"02", x"F6", x"01", x"76", x"01", +x"76", x"01", x"76", x"02", x"76", x"03", x"6A", x"C8", +x"D0", x"EE", x"18", x"60", x"81", x"00", x"00", x"00", +x"02", x"80", x"19", x"56", x"62", x"80", x"76", x"22", +x"F3", x"82", x"38", x"AA", x"40", x"80", x"35", x"04", +x"F3", x"81", x"35", x"04", x"F3", x"80", x"80", x"00", +x"00", x"80", x"31", x"72", x"18", x"20", x"CA", x"D7", +x"F0", x"02", x"10", x"03", x"4C", x"88", x"CE", x"A5", +x"AC", x"E9", x"7F", x"48", x"A9", x"80", x"85", x"AC", +x"A9", x"AD", x"A0", x"D5", x"20", x"6C", x"D4", x"A9", +x"B1", x"A0", x"D5", x"20", x"CA", x"D6", x"A9", x"9C", +x"A0", x"D5", x"20", x"55", x"D4", x"A9", x"A0", x"A0", +x"D5", x"20", x"6E", x"DB", x"A9", x"B5", x"A0", x"D5", +x"20", x"6C", x"D4", x"68", x"20", x"12", x"D9", x"A9", +x"B9", x"A0", x"D5", x"20", x"4D", x"D6", x"F0", x"4C", +x"20", x"73", x"D6", x"A9", x"00", x"85", x"75", x"85", +x"76", x"85", x"77", x"A5", x"B9", x"20", x"22", x"D6", +x"A5", x"AF", x"20", x"22", x"D6", x"A5", x"AE", x"20", +x"22", x"D6", x"A5", x"AD", x"20", x"27", x"D6", x"4C", +x"3C", x"D7", x"D0", x"03", x"4C", x"69", x"D5", x"4A", +x"09", x"80", x"A8", x"90", x"13", x"18", x"A5", x"77", +x"65", x"B6", x"85", x"77", x"A5", x"76", x"65", x"B5", +x"85", x"76", x"A5", x"75", x"65", x"B4", x"85", x"75", +x"66", x"75", x"66", x"76", x"66", x"77", x"66", x"B9", +x"98", x"4A", x"D0", x"DE", x"60", x"85", x"71", x"84", +x"72", x"A0", x"03", x"B1", x"71", x"85", x"B6", x"88", +x"B1", x"71", x"85", x"B5", x"88", x"B1", x"71", x"85", +x"B7", x"45", x"B0", x"85", x"B8", x"A5", x"B7", x"09", +x"80", x"85", x"B4", x"88", x"B1", x"71", x"85", x"B3", +x"A5", x"AC", x"60", x"A5", x"B3", x"F0", x"1F", x"18", +x"65", x"AC", x"90", x"04", x"30", x"1D", x"18", x"2C", +x"10", x"14", x"69", x"80", x"85", x"AC", x"D0", x"03", +x"4C", x"F5", x"D4", x"A5", x"B8", x"85", x"B0", x"60", +x"A5", x"B0", x"49", x"FF", x"30", x"05", x"68", x"68", +x"4C", x"F1", x"D4", x"4C", x"64", x"D5", x"20", x"AB", +x"D7", x"AA", x"F0", x"10", x"18", x"69", x"02", x"B0", +x"F2", x"A2", x"00", x"86", x"B8", x"20", x"7C", x"D4", +x"E6", x"AC", x"F0", x"E7", x"60", x"84", x"20", x"00", +x"00", x"20", x"AB", x"D7", x"A9", x"B5", x"A0", x"D6", +x"A2", x"00", x"86", x"B8", x"20", x"4B", x"D7", x"4C", +x"CD", x"D6", x"20", x"4D", x"D6", x"F0", x"68", x"20", +x"BA", x"D7", x"A9", x"00", x"38", x"E5", x"AC", x"85", +x"AC", x"20", x"73", x"D6", x"E6", x"AC", x"F0", x"BB", +x"A2", x"FD", x"A9", x"01", x"A4", x"B4", x"C4", x"AD", +x"D0", x"0A", x"A4", x"B5", x"C4", x"AE", x"D0", x"04", +x"A4", x"B6", x"C4", x"AF", x"08", x"2A", x"90", x"09", +x"E8", x"95", x"77", x"F0", x"2A", x"10", x"2C", x"A9", +x"01", x"28", x"B0", x"0C", x"06", x"B6", x"26", x"B5", +x"26", x"B4", x"B0", x"E8", x"30", x"D6", x"10", x"E4", +x"A8", x"A5", x"B6", x"E5", x"AF", x"85", x"B6", x"A5", +x"B5", x"E5", x"AE", x"85", x"B5", x"A5", x"B4", x"E5", +x"AD", x"85", x"B4", x"98", x"4C", x"04", x"D7", x"A9", +x"40", x"D0", x"D6", x"0A", x"0A", x"0A", x"0A", x"0A", +x"0A", x"85", x"B9", x"28", x"4C", x"3C", x"D7", x"A2", +x"14", x"4C", x"4E", x"C2", x"A5", x"75", x"85", x"AD", +x"A5", x"76", x"85", x"AE", x"A5", x"77", x"85", x"AF", +x"4C", x"D5", x"D4", x"85", x"71", x"84", x"72", x"A0", +x"03", x"B1", x"71", x"85", x"AF", x"88", x"B1", x"71", +x"85", x"AE", x"88", x"B1", x"71", x"85", x"B0", x"09", +x"80", x"85", x"AD", x"88", x"B1", x"71", x"85", x"AC", +x"84", x"B9", x"60", x"A2", x"A8", x"2C", x"A2", x"A4", +x"A0", x"00", x"F0", x"04", x"A6", x"97", x"A4", x"98", +x"20", x"BA", x"D7", x"86", x"71", x"84", x"72", x"A0", +x"03", x"A5", x"AF", x"91", x"71", x"88", x"A5", x"AE", +x"91", x"71", x"88", x"A5", x"B0", x"09", x"7F", x"25", +x"AD", x"91", x"71", x"88", x"A5", x"AC", x"91", x"71", +x"84", x"B9", x"60", x"A5", x"B7", x"85", x"B0", x"A2", +x"04", x"B5", x"B2", x"95", x"AB", x"CA", x"D0", x"F9", +x"86", x"B9", x"60", x"20", x"BA", x"D7", x"A2", x"05", +x"B5", x"AB", x"95", x"B2", x"CA", x"D0", x"F9", x"86", +x"B9", x"60", x"A5", x"AC", x"F0", x"FB", x"06", x"B9", +x"90", x"F7", x"20", x"59", x"D5", x"D0", x"F2", x"4C", +x"2A", x"D5", x"A5", x"AC", x"F0", x"09", x"A5", x"B0", +x"2A", x"A9", x"FF", x"B0", x"02", x"A9", x"01", x"60", +x"20", x"CA", x"D7", x"85", x"AD", x"A9", x"00", x"85", +x"AE", x"A2", x"88", x"A5", x"AD", x"49", x"FF", x"2A", +x"A9", x"00", x"85", x"AF", x"86", x"AC", x"85", x"B9", +x"85", x"B0", x"4C", x"D0", x"D4", x"46", x"B0", x"60", +x"85", x"73", x"84", x"74", x"A0", x"00", x"B1", x"73", +x"C8", x"AA", x"F0", x"C6", x"B1", x"73", x"45", x"B0", +x"30", x"C4", x"E4", x"AC", x"D0", x"1A", x"B1", x"73", +x"09", x"80", x"C5", x"AD", x"D0", x"12", x"C8", x"B1", +x"73", x"C5", x"AE", x"D0", x"0B", x"C8", x"A9", x"7F", +x"C5", x"B9", x"B1", x"73", x"E5", x"AF", x"F0", x"28", +x"A5", x"B0", x"90", x"02", x"49", x"FF", x"4C", x"D0", +x"D7", x"A5", x"AC", x"F0", x"4A", x"38", x"E9", x"98", +x"24", x"B0", x"10", x"09", x"AA", x"A9", x"FF", x"85", +x"B2", x"20", x"3D", x"D5", x"8A", x"A2", x"AC", x"C9", +x"F9", x"10", x"06", x"20", x"7B", x"D5", x"84", x"B2", +x"60", x"A8", x"A5", x"B0", x"29", x"80", x"46", x"AD", +x"05", x"AD", x"85", x"AD", x"20", x"92", x"D5", x"84", +x"B2", x"60", x"A5", x"AC", x"C9", x"98", x"B0", x"1E", +x"20", x"31", x"D8", x"84", x"B9", x"A5", x"B0", x"84", +x"B0", x"49", x"80", x"2A", x"A9", x"98", x"85", x"AC", +x"A5", x"AF", x"85", x"5B", x"4C", x"D0", x"D4", x"85", +x"AD", x"85", x"AE", x"85", x"AF", x"A8", x"60", x"A0", +x"00", x"A2", x"09", x"94", x"A8", x"CA", x"10", x"FB", +x"90", x"0F", x"C9", x"2D", x"D0", x"04", x"86", x"B1", +x"F0", x"04", x"C9", x"2B", x"D0", x"05", x"20", x"BC", +x"00", x"90", x"5B", x"C9", x"2E", x"F0", x"2E", x"C9", +x"45", x"D0", x"30", x"20", x"BC", x"00", x"90", x"17", +x"C9", x"A4", x"F0", x"0E", x"C9", x"2D", x"F0", x"0A", +x"C9", x"A3", x"F0", x"08", x"C9", x"2B", x"F0", x"04", +x"D0", x"07", x"66", x"AB", x"20", x"BC", x"00", x"90", +x"5C", x"24", x"AB", x"10", x"0E", x"A9", x"00", x"38", +x"E5", x"A9", x"4C", x"DD", x"D8", x"66", x"AA", x"24", +x"AA", x"50", x"C3", x"A5", x"A9", x"38", x"E5", x"A8", +x"85", x"A9", x"F0", x"12", x"10", x"09", x"20", x"B9", +x"D6", x"E6", x"A9", x"D0", x"F9", x"F0", x"07", x"20", +x"9E", x"D6", x"C6", x"A9", x"D0", x"F9", x"A5", x"B1", +x"30", x"01", x"60", x"4C", x"EF", x"DA", x"48", x"24", +x"AA", x"10", x"02", x"E6", x"A8", x"20", x"9E", x"D6", +x"68", x"38", x"E9", x"30", x"20", x"12", x"D9", x"4C", +x"9E", x"D8", x"48", x"20", x"AB", x"D7", x"68", x"20", +x"DB", x"D7", x"A5", x"B7", x"45", x"B0", x"85", x"B8", +x"A6", x"AC", x"4C", x"6F", x"D4", x"A5", x"A9", x"C9", +x"0A", x"90", x"09", x"A9", x"64", x"24", x"AB", x"30", +x"11", x"4C", x"64", x"D5", x"0A", x"0A", x"18", x"65", +x"A9", x"0A", x"18", x"A0", x"00", x"71", x"C3", x"38", +x"E9", x"30", x"85", x"A9", x"4C", x"C4", x"D8", x"91", +x"43", x"4F", x"F8", x"94", x"74", x"23", x"F7", x"94", +x"74", x"24", x"00", x"A9", x"8E", x"A0", x"C1", x"20", +x"6B", x"D9", x"A5", x"88", x"A6", x"87", x"85", x"AD", +x"86", x"AE", x"A2", x"90", x"38", x"20", x"E8", x"D7", +x"20", x"6E", x"D9", x"4C", x"C3", x"C8", x"A0", x"01", +x"A9", x"20", x"24", x"B0", x"10", x"02", x"A9", x"2D", +x"99", x"FF", x"00", x"85", x"B0", x"84", x"BA", x"C8", +x"A9", x"30", x"A6", x"AC", x"D0", x"03", x"4C", x"89", +x"DA", x"A9", x"00", x"E0", x"80", x"F0", x"02", x"B0", +x"09", x"A9", x"4F", x"A0", x"D9", x"20", x"FB", x"D5", +x"A9", x"FA", x"85", x"A8", x"A9", x"4B", x"A0", x"D9", +x"20", x"F8", x"D7", x"F0", x"1E", x"10", x"12", x"A9", +x"47", x"A0", x"D9", x"20", x"F8", x"D7", x"F0", x"02", +x"10", x"0E", x"20", x"9E", x"D6", x"C6", x"A8", x"D0", +x"EE", x"20", x"B9", x"D6", x"E6", x"A8", x"D0", x"DC", +x"20", x"4E", x"D4", x"20", x"31", x"D8", x"A2", x"01", +x"A5", x"A8", x"18", x"69", x"07", x"30", x"09", x"C9", +x"08", x"B0", x"06", x"69", x"FF", x"AA", x"A9", x"02", +x"38", x"E9", x"02", x"85", x"A9", x"86", x"A8", x"8A", +x"F0", x"02", x"10", x"13", x"A4", x"BA", x"A9", x"2E", +x"C8", x"99", x"FF", x"00", x"8A", x"F0", x"06", x"A9", +x"30", x"C8", x"99", x"FF", x"00", x"84", x"BA", x"A0", +x"00", x"A2", x"80", x"A5", x"AF", x"18", x"79", x"9C", +x"DA", x"85", x"AF", x"A5", x"AE", x"79", x"9B", x"DA", +x"85", x"AE", x"A5", x"AD", x"79", x"9A", x"DA", x"85", +x"AD", x"E8", x"B0", x"04", x"10", x"E5", x"30", x"02", +x"30", x"E1", x"8A", x"90", x"04", x"49", x"FF", x"69", +x"0A", x"69", x"2F", x"C8", x"C8", x"C8", x"84", x"95", +x"A4", x"BA", x"C8", x"AA", x"29", x"7F", x"99", x"FF", +x"00", x"C6", x"A8", x"D0", x"06", x"A9", x"2E", x"C8", +x"99", x"FF", x"00", x"84", x"BA", x"A4", x"95", x"8A", +x"49", x"FF", x"29", x"80", x"AA", x"C0", x"12", x"D0", +x"B2", x"A4", x"BA", x"B9", x"FF", x"00", x"88", x"C9", +x"30", x"F0", x"F8", x"C9", x"2E", x"F0", x"01", x"C8", +x"A9", x"2B", x"A6", x"A9", x"F0", x"2E", x"10", x"08", +x"A9", x"00", x"38", x"E5", x"A9", x"AA", x"A9", x"2D", +x"99", x"01", x"01", x"A9", x"45", x"99", x"00", x"01", +x"8A", x"A2", x"2F", x"38", x"E8", x"E9", x"0A", x"B0", +x"FB", x"69", x"3A", x"99", x"03", x"01", x"8A", x"99", +x"02", x"01", x"A9", x"00", x"99", x"04", x"01", x"F0", +x"08", x"99", x"FF", x"00", x"A9", x"00", x"99", x"00", +x"01", x"A9", x"00", x"A0", x"01", x"60", x"80", x"00", +x"00", x"00", x"FE", x"79", x"60", x"00", x"27", x"10", +x"FF", x"FC", x"18", x"00", x"00", x"64", x"FF", x"FF", +x"F6", x"00", x"00", x"01", x"20", x"AB", x"D7", x"A9", +x"96", x"A0", x"DA", x"20", x"4B", x"D7", x"F0", x"63", +x"A5", x"B3", x"D0", x"03", x"4C", x"F3", x"D4", x"A2", +x"9C", x"A0", x"00", x"20", x"78", x"D7", x"A5", x"B7", +x"10", x"0F", x"20", x"62", x"D8", x"A9", x"9C", x"A0", +x"00", x"20", x"F8", x"D7", x"D0", x"03", x"98", x"A4", +x"5B", x"20", x"9D", x"D7", x"98", x"48", x"20", x"BD", +x"D5", x"A9", x"9C", x"A0", x"00", x"20", x"FB", x"D5", +x"20", x"1B", x"DB", x"68", x"4A", x"90", x"0A", x"A5", +x"AC", x"F0", x"06", x"A5", x"B0", x"49", x"FF", x"85", +x"B0", x"60", x"81", x"38", x"AA", x"3B", x"06", x"74", +x"63", x"90", x"8C", x"77", x"23", x"0C", x"AB", x"7A", +x"1E", x"94", x"00", x"7C", x"63", x"42", x"80", x"7E", +x"75", x"FE", x"D0", x"80", x"31", x"72", x"15", x"81", +x"00", x"00", x"00", x"A9", x"FA", x"A0", x"DA", x"20", +x"FB", x"D5", x"A5", x"B9", x"69", x"50", x"90", x"03", +x"20", x"C2", x"D7", x"85", x"A3", x"20", x"AE", x"D7", +x"A5", x"AC", x"C9", x"88", x"90", x"03", x"20", x"90", +x"D6", x"20", x"62", x"D8", x"A5", x"5B", x"18", x"69", +x"81", x"F0", x"F3", x"38", x"E9", x"01", x"48", x"A2", +x"04", x"B5", x"B3", x"B4", x"AC", x"95", x"AC", x"94", +x"B3", x"CA", x"10", x"F5", x"A5", x"A3", x"85", x"B9", +x"20", x"58", x"D4", x"20", x"EF", x"DA", x"A9", x"FE", +x"A0", x"DA", x"20", x"84", x"DB", x"A9", x"00", x"85", +x"B8", x"68", x"20", x"75", x"D6", x"60", x"85", x"BA", +x"84", x"BB", x"20", x"6E", x"D7", x"A9", x"A4", x"20", +x"FB", x"D5", x"20", x"88", x"DB", x"A9", x"A4", x"A0", +x"00", x"4C", x"FB", x"D5", x"85", x"BA", x"84", x"BB", +x"20", x"6B", x"D7", x"B1", x"BA", x"85", x"B1", x"A4", +x"BA", x"C8", x"98", x"D0", x"02", x"E6", x"BB", x"85", +x"BA", x"A4", x"BB", x"20", x"FB", x"D5", x"A5", x"BA", +x"A4", x"BB", x"18", x"69", x"04", x"90", x"01", x"C8", +x"85", x"BA", x"84", x"BB", x"20", x"6C", x"D4", x"A9", +x"A8", x"A0", x"00", x"C6", x"B1", x"D0", x"E4", x"60", +x"98", x"35", x"44", x"7A", x"68", x"28", x"B1", x"46", +x"20", x"CA", x"D7", x"AA", x"30", x"18", x"A9", x"D4", +x"A0", x"00", x"20", x"4B", x"D7", x"8A", x"F0", x"E7", +x"A9", x"B8", x"A0", x"DB", x"20", x"FB", x"D5", x"A9", +x"BC", x"A0", x"DB", x"20", x"6C", x"D4", x"A6", x"AF", +x"A5", x"AD", x"85", x"AF", x"86", x"AD", x"A9", x"00", +x"85", x"B0", x"A5", x"AC", x"85", x"B9", x"A9", x"80", +x"85", x"AC", x"20", x"D5", x"D4", x"A2", x"D4", x"A0", +x"00", x"4C", x"78", x"D7", x"A9", x"78", x"A0", x"DC", +x"20", x"6C", x"D4", x"20", x"AB", x"D7", x"A9", x"7C", +x"A0", x"DC", x"A6", x"B7", x"20", x"C2", x"D6", x"20", +x"AB", x"D7", x"20", x"62", x"D8", x"A9", x"00", x"85", +x"B8", x"20", x"58", x"D4", x"A9", x"80", x"A0", x"DC", +x"20", x"55", x"D4", x"A5", x"B0", x"48", x"10", x"0D", +x"20", x"4E", x"D4", x"A5", x"B0", x"30", x"09", x"A5", +x"63", x"49", x"FF", x"85", x"63", x"20", x"EF", x"DA", +x"A9", x"80", x"A0", x"DC", x"20", x"6C", x"D4", x"68", +x"10", x"03", x"20", x"EF", x"DA", x"A9", x"84", x"A0", +x"DC", x"4C", x"6E", x"DB", x"20", x"6E", x"D7", x"A9", +x"00", x"85", x"63", x"20", x"03", x"DC", x"A2", x"9C", +x"A0", x"00", x"20", x"F9", x"DB", x"A9", x"A4", x"A0", +x"00", x"20", x"4B", x"D7", x"A9", x"00", x"85", x"B0", +x"A5", x"63", x"20", x"74", x"DC", x"A9", x"9C", x"A0", +x"00", x"4C", x"CA", x"D6", x"48", x"4C", x"35", x"DC", +x"81", x"49", x"0F", x"DB", x"83", x"49", x"0F", x"DB", +x"7F", x"00", x"00", x"00", x"04", x"86", x"1E", x"D7", +x"FB", x"87", x"99", x"26", x"65", x"87", x"23", x"34", +x"58", x"86", x"A5", x"5D", x"E1", x"83", x"49", x"0F", +x"DB", x"A5", x"B0", x"48", x"10", x"03", x"20", x"EF", +x"DA", x"A5", x"AC", x"48", x"C9", x"81", x"90", x"07", +x"A9", x"9C", x"A0", x"D5", x"20", x"CA", x"D6", x"A9", +x"C9", x"A0", x"DC", x"20", x"6E", x"DB", x"68", x"C9", +x"81", x"90", x"07", x"A9", x"78", x"A0", x"DC", x"20", +x"55", x"D4", x"68", x"10", x"03", x"4C", x"EF", x"DA", +x"60", x"08", x"78", x"3A", x"C5", x"37", x"7B", x"83", +x"A2", x"5C", x"7C", x"2E", x"DD", x"4D", x"7D", x"99", +x"B0", x"1E", x"7D", x"59", x"ED", x"24", x"7E", x"91", +x"72", x"00", x"7E", x"4C", x"B9", x"73", x"7F", x"AA", +x"AA", x"53", x"81", x"00", x"00", x"00", x"E6", x"C3", +x"D0", x"02", x"E6", x"C4", x"AD", x"DD", x"DD", x"C9", +x"3A", x"B0", x"0A", x"C9", x"20", x"F0", x"EF", x"38", +x"E9", x"30", x"38", x"E9", x"D0", x"60", x"80", x"4F", +x"C7", x"52", x"A9", x"39", x"A0", x"DE", x"20", x"C3", +x"C8", x"A2", x"FF", x"86", x"88", x"9A", x"A9", x"11", +x"A0", x"DD", x"85", x"01", x"84", x"02", x"85", x"04", +x"84", x"05", x"A9", x"05", x"A0", x"CE", x"85", x"06", +x"84", x"07", x"A9", x"C1", x"A0", x"CF", x"85", x"08", +x"84", x"09", x"A9", x"4C", x"85", x"00", x"85", x"03", +x"85", x"A1", x"85", x"0A", x"A9", x"88", x"A0", x"CE", +x"85", x"0B", x"84", x"0C", x"A9", x"3F", x"85", x"0F", +x"A9", x"38", x"85", x"10", x"A2", x"1C", x"BD", x"ED", +x"DC", x"95", x"BB", x"CA", x"D0", x"F8", x"8A", x"85", +x"B2", x"85", x"67", x"85", x"0D", x"85", x"0E", x"48", +x"85", x"64", x"A9", x"03", x"85", x"A0", x"A9", x"2C", +x"85", x"12", x"20", x"6C", x"C8", x"A2", x"68", x"86", +x"65", x"A9", x"5A", x"A0", x"DE", x"20", x"C3", x"C8", +x"20", x"46", x"C9", x"86", x"C3", x"84", x"C4", x"20", +x"BC", x"00", x"C9", x"41", x"F0", x"84", x"A8", x"D0", +x"21", x"A9", x"00", x"A0", x"04", x"85", x"11", x"84", +x"12", x"A0", x"00", x"E6", x"11", x"D0", x"02", x"E6", +x"12", x"4C", x"A3", x"DE", x"EA", x"D1", x"11", x"D0", +x"15", x"0A", x"91", x"11", x"D1", x"11", x"F0", x"EB", +x"D0", x"0C", x"20", x"C2", x"00", x"20", x"7F", x"C7", +x"A8", x"F0", x"03", x"4C", x"0C", x"CC", x"A5", x"11", +x"A4", x"12", x"85", x"85", x"84", x"86", x"85", x"81", +x"84", x"82", x"A9", x"66", x"A0", x"DE", x"20", x"C3", +x"C8", x"20", x"46", x"C9", x"86", x"C3", x"84", x"C4", +x"20", x"BC", x"00", x"A8", x"F0", x"1C", x"20", x"7F", +x"C7", x"A5", x"12", x"D0", x"E5", x"A5", x"11", x"C9", +x"10", x"90", x"DF", x"85", x"0F", x"E9", x"0E", x"B0", +x"FC", x"49", x"FF", x"E9", x"0C", x"18", x"65", x"0F", +x"85", x"10", x"A2", x"00", x"A0", x"04", x"86", x"79", +x"84", x"7A", x"A0", x"00", x"98", x"91", x"79", x"E6", +x"79", x"D0", x"02", x"E6", x"7A", x"A5", x"79", x"A4", +x"7A", x"20", x"1F", x"C2", x"20", x"6C", x"C8", x"A5", +x"85", x"38", x"E5", x"79", x"AA", x"A5", x"86", x"E5", +x"7A", x"20", x"5E", x"D9", x"A9", x"75", x"A0", x"DE", +x"20", x"C3", x"C8", x"A9", x"C3", x"A0", x"C8", x"85", +x"04", x"84", x"05", x"20", x"63", x"C4", x"A9", x"74", +x"A0", x"C2", x"85", x"01", x"84", x"02", x"6C", x"01", +x"00", x"42", x"41", x"53", x"49", x"43", x"2D", x"50", +x"52", x"49", x"56", x"52", x"45", x"4D", x"45", x"4E", +x"41", x"20", x"56", x"45", x"52", x"5A", x"49", x"4A", +x"41", x"20", x"38", x"34", x"30", x"31", x"32", x"34", +x"0C", x"00", x"20", x"4D", x"45", x"4D", x"4F", x"52", +x"49", x"4A", x"41", x"20", x"20", x"00", x"44", x"55", +x"4C", x"4A", x"49", x"4E", x"41", x"20", x"4C", x"49", +x"4E", x"49", x"4A", x"45", x"00", x"20", x"4C", x"4F", +x"4B", x"41", x"43", x"49", x"4A", x"41", x"0D", x"0A", +x"00", x"20", x"FC", x"D3", x"A5", x"11", x"85", x"E4", +x"86", x"E5", x"4C", x"8B", x"FE", x"20", x"FC", x"D3", +x"A5", x"11", x"85", x"E2", x"86", x"E3", x"4C", x"69", +x"FE", x"20", x"FC", x"D3", x"A5", x"11", x"85", x"E2", +x"86", x"E3", x"60", x"A5", x"12", x"C9", x"60", x"F0", +x"07", x"A9", x"92", x"91", x"11", x"4C", x"9D", x"DD", +x"4C", x"B6", x"DD", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF" + ); +begin + process(clk) + begin + if rising_edge(clk) then + data <= romData(conv_integer(addr)); + end if; + end process; +end architecture; + diff --git a/ORAO_MiST/rtl/rom/rom_bas103.vhd b/ORAO_MiST/rtl/rom/rom_bas103.vhd new file mode 100644 index 00000000..ac4a1379 --- /dev/null +++ b/ORAO_MiST/rtl/rom/rom_bas103.vhd @@ -0,0 +1,1051 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity rom_bas is + port ( + clk: in std_logic; + addr: in std_logic_vector(12 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end entity; + +architecture Behavioral of rom_bas is + type romDef is array(0 to 8191) of std_logic_vector(7 downto 0); + constant romData: romDef := ( +x"4C", x"A3", x"DE", x"4C", x"7F", x"C2", x"FE", x"CE", +x"D1", x"D0", x"5D", x"C6", x"5B", x"C5", x"FF", x"CA", +x"66", x"C7", x"BB", x"C9", x"D9", x"CD", x"EF", x"C9", +x"13", x"C8", x"13", x"C7", x"EB", x"C6", x"96", x"C7", +x"30", x"C6", x"F6", x"C6", x"40", x"C7", x"A9", x"C7", +x"5B", x"C6", x"B9", x"C7", x"02", x"F0", x"6B", x"D5", +x"14", x"F0", x"9E", x"C6", x"F0", x"D0", x"62", x"D5", +x"A8", x"C8", x"84", x"C6", x"BB", x"C4", x"80", x"C4", +x"FF", x"EF", x"64", x"C4", x"78", x"D9", x"0B", x"DA", +x"97", x"D9", x"03", x"00", x"BD", x"D0", x"DE", x"D0", +x"75", x"DC", x"96", x"DD", x"29", x"D7", x"F1", x"DC", +x"D2", x"DD", x"D9", x"DD", x"22", x"DE", x"B1", x"C3", +x"4C", x"D5", x"BA", x"D4", x"A3", x"D1", x"EB", x"D4", +x"C9", x"D4", x"2A", x"D4", x"3E", x"D4", x"6A", x"D4", +x"75", x"D4", x"79", x"A8", x"D5", x"79", x"91", x"D5", +x"7B", x"69", x"D7", x"7B", x"50", x"D8", x"7F", x"7E", +x"DC", x"50", x"41", x"CD", x"46", x"3E", x"CD", x"7D", +x"B7", x"DC", x"5A", x"9B", x"CC", x"64", x"6E", x"CD", +x"45", x"4E", x"C4", x"46", x"4F", x"D2", x"4E", x"45", +x"58", x"D4", x"44", x"41", x"54", x"C1", x"49", x"4E", +x"50", x"55", x"D4", x"44", x"49", x"CD", x"52", x"45", +x"41", x"C4", x"44", x"44", x"D4", x"47", x"4F", x"54", +x"CF", x"52", x"55", x"CE", x"49", x"C6", x"52", x"45", +x"53", x"54", x"4F", x"52", x"C5", x"47", x"4F", x"53", +x"55", x"C2", x"52", x"45", x"54", x"55", x"52", x"CE", +x"52", x"45", x"CD", x"53", x"54", x"4F", x"D0", x"4F", +x"CE", x"44", x"52", x"41", x"D7", x"57", x"41", x"49", +x"D4", x"4C", x"4F", x"41", x"C4", x"53", x"41", x"56", +x"C5", x"44", x"45", x"C6", x"50", x"4F", x"4B", x"C5", +x"50", x"52", x"49", x"4E", x"D4", x"43", x"4F", x"4E", +x"D4", x"4C", x"49", x"53", x"D4", x"43", x"4C", x"45", +x"41", x"D2", x"47", x"45", x"D4", x"4E", x"45", x"D7", +x"54", x"41", x"42", x"A8", x"54", x"CF", x"46", x"CE", +x"53", x"50", x"43", x"A8", x"54", x"48", x"45", x"CE", +x"4E", x"4F", x"D4", x"53", x"54", x"45", x"D0", x"AB", +x"AD", x"AA", x"AF", x"E0", x"41", x"4E", x"C4", x"4F", +x"D2", x"BE", x"BD", x"BC", x"53", x"47", x"CE", x"49", +x"4E", x"D4", x"41", x"42", x"D3", x"55", x"53", x"D2", +x"46", x"52", x"C5", x"50", x"4F", x"D3", x"53", x"51", +x"D2", x"52", x"4E", x"C4", x"4C", x"4F", x"C7", x"45", +x"58", x"D0", x"43", x"4F", x"D3", x"53", x"49", x"CE", +x"54", x"41", x"CE", x"41", x"54", x"CE", x"50", x"45", +x"45", x"CB", x"4C", x"45", x"CE", x"53", x"54", x"52", +x"A4", x"56", x"41", x"CC", x"41", x"53", x"C3", x"43", +x"48", x"52", x"A4", x"4C", x"45", x"46", x"54", x"A4", +x"52", x"49", x"47", x"48", x"54", x"A4", x"4D", x"49", +x"44", x"A4", x"47", x"CF", x"00", x"4E", x"46", x"53", +x"4E", x"52", x"47", x"4F", x"44", x"46", x"43", x"4F", +x"56", x"4F", x"4D", x"55", x"53", x"42", x"53", x"44", +x"44", x"2F", x"30", x"49", x"44", x"54", x"4D", x"4C", +x"53", x"53", x"54", x"43", x"4E", x"55", x"46", x"20", +x"45", x"52", x"52", x"4F", x"52", x"00", x"20", x"49", +x"4E", x"20", x"00", x"0D", x"0A", x"20", x"42", x"52", +x"45", x"41", x"4B", x"00", x"BA", x"E8", x"E8", x"E8", +x"E8", x"BD", x"01", x"01", x"C9", x"81", x"D0", x"21", +x"A5", x"92", x"D0", x"0A", x"BD", x"02", x"01", x"85", +x"91", x"BD", x"03", x"01", x"85", x"92", x"DD", x"03", +x"01", x"D0", x"07", x"A5", x"91", x"DD", x"02", x"01", +x"F0", x"07", x"8A", x"18", x"69", x"12", x"AA", x"D0", +x"D8", x"60", x"20", x"2A", x"C2", x"85", x"79", x"84", +x"7A", x"38", x"A5", x"A2", x"E5", x"A7", x"85", x"6A", +x"A8", x"A5", x"A3", x"E5", x"A8", x"AA", x"E8", x"98", +x"F0", x"23", x"A5", x"A2", x"38", x"E5", x"6A", x"85", +x"A2", x"B0", x"03", x"C6", x"A3", x"38", x"A5", x"A0", +x"E5", x"6A", x"85", x"A0", x"B0", x"08", x"C6", x"A1", +x"90", x"04", x"B1", x"A2", x"91", x"A0", x"88", x"D0", +x"F9", x"B1", x"A2", x"91", x"A0", x"C6", x"A3", x"C6", +x"A1", x"CA", x"D0", x"F2", x"60", x"0A", x"69", x"44", +x"B0", x"35", x"85", x"6A", x"BA", x"E4", x"6A", x"90", +x"2E", x"60", x"C4", x"7C", x"90", x"28", x"D0", x"04", +x"C5", x"7B", x"90", x"22", x"48", x"A2", x"09", x"98", +x"48", x"B5", x"9F", x"CA", x"10", x"FA", x"20", x"64", +x"D2", x"A2", x"F7", x"68", x"95", x"A9", x"E8", x"30", +x"FA", x"68", x"A8", x"68", x"C4", x"7C", x"90", x"06", +x"D0", x"05", x"C5", x"7B", x"B0", x"01", x"60", x"A2", +x"0C", x"46", x"10", x"20", x"00", x"C9", x"20", x"6A", +x"C9", x"BD", x"75", x"C1", x"20", x"6C", x"C9", x"BD", +x"76", x"C1", x"20", x"6C", x"C9", x"20", x"9A", x"C4", +x"A9", x"97", x"A0", x"C1", x"20", x"4A", x"C9", x"A4", +x"82", x"C8", x"F0", x"03", x"20", x"1E", x"F0", x"46", +x"10", x"20", x"00", x"00", x"20", x"65", x"C3", x"86", +x"C6", x"84", x"C7", x"20", x"BF", x"00", x"AA", x"F0", +x"F3", x"A2", x"FF", x"86", x"82", x"90", x"06", x"20", +x"AE", x"C3", x"4C", x"F8", x"C5", x"20", x"DA", x"C7", +x"20", x"AE", x"C3", x"84", x"08", x"20", x"36", x"C4", +x"90", x"44", x"A0", x"01", x"B1", x"A7", x"85", x"6B", +x"A5", x"75", x"85", x"6A", x"A5", x"A8", x"85", x"6D", +x"A5", x"A7", x"88", x"F1", x"A7", x"18", x"65", x"75", +x"85", x"75", x"85", x"6C", x"A5", x"76", x"69", x"FF", +x"85", x"76", x"E5", x"A8", x"AA", x"38", x"A5", x"A7", +x"E5", x"75", x"A8", x"B0", x"03", x"E8", x"C6", x"6D", +x"18", x"65", x"6A", x"90", x"03", x"C6", x"6B", x"18", +x"B1", x"6A", x"91", x"6C", x"C8", x"D0", x"F9", x"E6", +x"6B", x"E6", x"6D", x"CA", x"D0", x"F2", x"20", x"7C", +x"C4", x"20", x"29", x"C3", x"A5", x"16", x"F0", x"8C", +x"18", x"A5", x"75", x"85", x"A2", x"65", x"08", x"85", +x"A0", x"A4", x"76", x"84", x"A3", x"90", x"01", x"C8", +x"84", x"A1", x"20", x"DA", x"C1", x"A5", x"79", x"A4", +x"7A", x"85", x"75", x"84", x"76", x"A4", x"08", x"88", +x"B9", x"12", x"00", x"91", x"A7", x"88", x"10", x"F8", +x"20", x"7C", x"C4", x"20", x"29", x"C3", x"4C", x"84", +x"C2", x"A5", x"73", x"A4", x"74", x"85", x"6A", x"84", +x"6B", x"18", x"A0", x"01", x"B1", x"6A", x"F0", x"1D", +x"A0", x"04", x"C8", x"B1", x"6A", x"D0", x"FB", x"C8", +x"98", x"65", x"6A", x"AA", x"A0", x"00", x"91", x"6A", +x"A5", x"6B", x"69", x"00", x"C8", x"91", x"6A", x"86", +x"6A", x"85", x"6B", x"90", x"DD", x"60", x"CA", x"30", +x"09", x"EA", x"EA", x"EA", x"4C", x"67", x"C3", x"20", +x"6C", x"C9", x"20", x"00", x"C9", x"A2", x"00", x"20", +x"9E", x"C3", x"C9", x"1A", x"D0", x"06", x"20", x"18", +x"F0", x"4C", x"65", x"C3", x"C9", x"03", x"F0", x"14", +x"C9", x"0D", x"F0", x"1F", x"C9", x"08", x"F0", x"D6", +x"C9", x"18", x"F0", x"DB", x"C9", x"20", x"90", x"0E", +x"C9", x"80", x"B0", x"DB", x"E0", x"47", x"B0", x"04", +x"95", x"16", x"E8", x"2C", x"A9", x"07", x"20", x"2A", +x"F0", x"D0", x"CC", x"4C", x"FA", x"C8", x"20", x"AB", +x"C6", x"C9", x"0F", x"D0", x"08", x"48", x"A5", x"10", +x"49", x"FF", x"85", x"10", x"68", x"60", x"4C", x"36", +x"F0", x"A5", x"AE", x"48", x"10", x"03", x"20", x"E1", +x"C3", x"A5", x"A9", x"48", x"C9", x"81", x"90", x"07", +x"A9", x"FB", x"A0", x"D6", x"20", x"4E", x"D8", x"A9", +x"EC", x"A0", x"C3", x"20", x"5A", x"DD", x"68", x"C9", +x"81", x"90", x"07", x"A9", x"4E", x"A0", x"DE", x"20", +x"8F", x"D5", x"68", x"10", x"03", x"4C", x"E1", x"C3", +x"60", x"A5", x"A9", x"F0", x"06", x"A5", x"AE", x"49", +x"FF", x"85", x"AE", x"60", x"0C", x"76", x"B3", x"83", +x"BD", x"D3", x"79", x"1E", x"F4", x"A6", x"F5", x"7B", +x"83", x"FC", x"B0", x"10", x"7C", x"0C", x"1F", x"67", +x"CA", x"7C", x"DE", x"53", x"CB", x"C1", x"7D", x"14", +x"64", x"70", x"4C", x"7D", x"B7", x"EA", x"51", x"7A", +x"7D", x"63", x"30", x"88", x"7E", x"7E", x"92", x"44", +x"99", x"3A", x"7E", x"4C", x"CC", x"91", x"C7", x"7F", +x"AA", x"AA", x"AA", x"13", x"81", x"00", x"00", x"00", +x"00", x"00", x"00", x"00", x"00", x"00", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"A5", x"73", +x"A6", x"74", x"A0", x"01", x"85", x"A7", x"86", x"A8", +x"B1", x"A7", x"F0", x"1F", x"C8", x"C8", x"A5", x"15", +x"D1", x"A7", x"90", x"18", x"F0", x"03", x"88", x"D0", +x"09", x"A5", x"14", x"88", x"D1", x"A7", x"90", x"0C", +x"F0", x"0A", x"88", x"B1", x"A7", x"AA", x"88", x"B1", +x"A7", x"B0", x"D7", x"18", x"60", x"D0", x"FD", x"A9", +x"00", x"A8", x"91", x"73", x"C8", x"91", x"73", x"A5", +x"73", x"18", x"69", x"02", x"85", x"75", x"A5", x"74", +x"69", x"00", x"85", x"76", x"20", x"AE", x"C4", x"A9", +x"00", x"D0", x"2A", x"A5", x"7F", x"A4", x"80", x"85", +x"7B", x"84", x"7C", x"A5", x"75", x"A4", x"76", x"85", +x"77", x"84", x"78", x"85", x"79", x"84", x"7A", x"20", +x"31", x"C6", x"A2", x"61", x"86", x"5E", x"68", x"A8", +x"68", x"A2", x"FD", x"9A", x"48", x"98", x"48", x"A9", +x"00", x"85", x"86", x"85", x"0D", x"60", x"18", x"A5", +x"73", x"69", x"FF", x"85", x"C6", x"A5", x"74", x"69", +x"FF", x"85", x"C7", x"60", x"48", x"A9", x"00", x"85", +x"0E", x"68", x"08", x"20", x"DA", x"C7", x"20", x"36", +x"C4", x"28", x"F0", x"14", x"20", x"C5", x"00", x"F0", +x"15", x"C9", x"A5", x"D0", x"8F", x"20", x"BF", x"00", +x"F0", x"06", x"20", x"DA", x"C7", x"F0", x"07", x"60", +x"A9", x"FF", x"85", x"14", x"85", x"15", x"68", x"68", +x"A0", x"01", x"B1", x"A7", x"F0", x"39", x"20", x"40", +x"C6", x"20", x"00", x"C9", x"C8", x"B1", x"A7", x"AA", +x"C8", x"B1", x"A7", x"C5", x"15", x"D0", x"04", x"E4", +x"14", x"F0", x"02", x"B0", x"22", x"84", x"91", x"20", +x"0C", x"DB", x"A9", x"20", x"A4", x"91", x"29", x"7F", +x"20", x"6C", x"C9", x"C8", x"F0", x"11", x"B1", x"A7", +x"D0", x"22", x"A8", x"B1", x"A7", x"AA", x"C8", x"B1", +x"A7", x"86", x"A7", x"85", x"A8", x"D0", x"C1", x"A5", +x"0E", x"F0", x"0E", x"20", x"00", x"C9", x"20", x"00", +x"C9", x"A9", x"1A", x"20", x"6C", x"C9", x"20", x"1B", +x"F0", x"4C", x"7F", x"C2", x"10", x"D2", x"4C", x"39", +x"F0", x"AA", x"84", x"91", x"A0", x"FF", x"CA", x"F0", +x"08", x"C8", x"B9", x"90", x"C0", x"10", x"FA", x"30", +x"F5", x"C8", x"B9", x"90", x"C0", x"30", x"B5", x"20", +x"6C", x"C9", x"D0", x"F5", x"A9", x"80", x"85", x"0D", +x"20", x"14", x"C8", x"20", x"AC", x"C1", x"D0", x"05", +x"8A", x"69", x"0F", x"AA", x"9A", x"68", x"68", x"A9", +x"09", x"20", x"1D", x"C2", x"20", x"75", x"C7", x"18", +x"98", x"65", x"C6", x"48", x"A5", x"C7", x"69", x"00", +x"48", x"A5", x"82", x"48", x"A5", x"81", x"48", x"A9", +x"9E", x"20", x"C7", x"CC", x"20", x"6E", x"CB", x"20", +x"6B", x"CB", x"A5", x"AE", x"09", x"7F", x"25", x"AA", +x"85", x"AA", x"A9", x"A5", x"A0", x"C5", x"85", x"6A", +x"84", x"6B", x"4C", x"24", x"CC", x"A9", x"FB", x"A0", +x"D6", x"20", x"E1", x"D8", x"20", x"C5", x"00", x"C9", +x"A3", x"D0", x"06", x"20", x"BF", x"00", x"20", x"6B", +x"CB", x"20", x"6A", x"D9", x"20", x"19", x"CC", x"A5", +x"92", x"48", x"A5", x"91", x"48", x"A9", x"81", x"48", +x"20", x"40", x"C6", x"A5", x"C6", x"A4", x"C7", x"F0", +x"06", x"85", x"85", x"84", x"86", x"A0", x"00", x"B1", +x"C6", x"D0", x"40", x"A0", x"02", x"B1", x"C6", x"18", +x"D0", x"03", x"4C", x"75", x"C6", x"C8", x"B1", x"C6", +x"85", x"81", x"C8", x"B1", x"C6", x"85", x"82", x"98", +x"65", x"C6", x"85", x"C6", x"90", x"02", x"E6", x"C7", +x"20", x"BF", x"00", x"20", x"01", x"C6", x"4C", x"C8", +x"C5", x"4C", x"33", x"F0", x"EA", x"90", x"11", x"C9", +x"1D", x"B0", x"17", x"0A", x"A8", x"B9", x"0B", x"C0", +x"48", x"B9", x"0A", x"C0", x"48", x"4C", x"BF", x"00", +x"4C", x"14", x"C8", x"C9", x"3A", x"F0", x"D9", x"4C", +x"D0", x"CC", x"C9", x"45", x"D0", x"F9", x"20", x"BF", +x"00", x"A9", x"9E", x"20", x"C7", x"CC", x"4C", x"14", +x"C7", x"38", x"A5", x"73", x"E9", x"01", x"A4", x"74", +x"B0", x"01", x"88", x"85", x"89", x"84", x"8A", x"60", +x"AD", x"FD", x"87", x"29", x"30", x"C9", x"10", x"38", +x"D0", x"F5", x"AD", x"7F", x"87", x"29", x"30", x"C9", +x"10", x"38", x"D0", x"EB", x"20", x"30", x"F0", x"EA", +x"A9", x"03", x"C9", x"03", x"B0", x"01", x"18", x"D0", +x"3D", x"A5", x"C6", x"A4", x"C7", x"F0", x"0C", x"85", +x"85", x"84", x"86", x"A5", x"81", x"A4", x"82", x"85", +x"83", x"84", x"84", x"68", x"68", x"A9", x"A3", x"A0", +x"C1", x"A2", x"00", x"86", x"10", x"90", x"03", x"4C", +x"74", x"C2", x"4C", x"7F", x"C2", x"D0", x"17", x"A2", +x"1E", x"A4", x"86", x"D0", x"03", x"4C", x"59", x"C2", +x"A5", x"85", x"85", x"C6", x"84", x"C7", x"A5", x"83", +x"A4", x"84", x"85", x"81", x"84", x"82", x"60", x"48", +x"20", x"12", x"F0", x"20", x"67", x"C9", x"A9", x"FF", +x"4C", x"BF", x"C4", x"AD", x"40", x"02", x"20", x"D8", +x"C6", x"D0", x"03", x"4C", x"0F", x"F0", x"4C", x"24", +x"F0", x"48", x"AD", x"41", x"02", x"20", x"D8", x"C6", +x"D0", x"04", x"68", x"4C", x"0C", x"F0", x"68", x"C9", +x"0A", x"EA", x"EA", x"C9", x"0D", x"F0", x"03", x"4C", +x"27", x"F0", x"20", x"27", x"F0", x"A9", x"0D", x"60", +x"C9", x"54", x"F0", x"06", x"C9", x"44", x"F0", x"02", +x"C9", x"FF", x"60", x"20", x"B0", x"E5", x"EA", x"90", +x"EF", x"EA", x"EA", x"60", x"D0", x"03", x"4C", x"7C", +x"C4", x"20", x"83", x"C4", x"4C", x"0B", x"C7", x"A9", +x"03", x"20", x"1D", x"C2", x"A5", x"C7", x"48", x"A5", +x"C6", x"48", x"A5", x"82", x"48", x"A5", x"81", x"48", +x"A9", x"8C", x"48", x"20", x"C5", x"00", x"20", x"14", +x"C7", x"4C", x"C8", x"C5", x"20", x"DA", x"C7", x"20", +x"78", x"C7", x"A5", x"82", x"C5", x"15", x"B0", x"0B", +x"98", x"38", x"65", x"C6", x"A6", x"C7", x"90", x"07", +x"E8", x"B0", x"04", x"A5", x"73", x"A6", x"74", x"20", +x"3A", x"C4", x"90", x"1E", x"A5", x"A7", x"E9", x"01", +x"85", x"C6", x"A5", x"A8", x"E9", x"00", x"85", x"C7", +x"60", x"D0", x"FD", x"A9", x"FF", x"85", x"92", x"20", +x"AC", x"C1", x"9A", x"C9", x"8C", x"F0", x"0B", x"A2", +x"04", x"2C", x"A2", x"0E", x"4C", x"59", x"C2", x"4C", +x"D0", x"CC", x"68", x"68", x"85", x"81", x"68", x"85", +x"82", x"68", x"85", x"C6", x"68", x"85", x"C7", x"20", +x"75", x"C7", x"98", x"18", x"65", x"C6", x"85", x"C6", +x"90", x"02", x"E6", x"C7", x"60", x"A2", x"3A", x"2C", +x"A2", x"00", x"86", x"06", x"A0", x"00", x"84", x"07", +x"A5", x"07", x"A6", x"06", x"85", x"06", x"86", x"07", +x"B1", x"C6", x"F0", x"E8", x"C5", x"07", x"F0", x"E4", +x"C8", x"C9", x"22", x"D0", x"F3", x"F0", x"E9", x"20", +x"7F", x"CB", x"20", x"C5", x"00", x"C9", x"88", x"F0", +x"05", x"A9", x"A1", x"20", x"C7", x"CC", x"A5", x"A9", +x"D0", x"05", x"20", x"78", x"C7", x"F0", x"BB", x"20", +x"C5", x"00", x"B0", x"03", x"4C", x"14", x"C7", x"4C", +x"01", x"C6", x"20", x"DC", x"D4", x"48", x"C9", x"8C", +x"F0", x"04", x"C9", x"88", x"D0", x"91", x"C6", x"AD", +x"D0", x"04", x"68", x"4C", x"21", x"F0", x"20", x"BF", +x"00", x"20", x"DA", x"C7", x"C9", x"2C", x"F0", x"EE", +x"68", x"60", x"A2", x"00", x"86", x"14", x"86", x"15", +x"B0", x"F7", x"E9", x"2F", x"85", x"06", x"A5", x"15", +x"85", x"6A", x"C9", x"19", x"B0", x"D4", x"A5", x"14", +x"0A", x"26", x"6A", x"0A", x"26", x"6A", x"65", x"14", +x"85", x"14", x"A5", x"6A", x"65", x"15", x"85", x"15", +x"06", x"14", x"26", x"15", x"A5", x"14", x"65", x"06", +x"85", x"14", x"90", x"02", x"E6", x"15", x"20", x"BF", +x"00", x"4C", x"E0", x"C7", x"20", x"E4", x"CD", x"85", +x"91", x"84", x"92", x"A9", x"AC", x"20", x"C7", x"CC", +x"A5", x"0B", x"48", x"A5", x"0A", x"48", x"20", x"4B", +x"F0", x"68", x"2A", x"20", x"71", x"CB", x"D0", x"18", +x"68", x"10", x"12", x"20", x"5A", x"D9", x"20", x"FE", +x"CE", x"A0", x"00", x"A5", x"AC", x"91", x"91", x"C8", +x"A5", x"AD", x"91", x"91", x"60", x"4C", x"0F", x"D9", +x"68", x"A0", x"02", x"B1", x"AC", x"C5", x"7C", x"90", +x"17", x"D0", x"07", x"88", x"B1", x"AC", x"C5", x"7B", +x"90", x"0E", x"A4", x"AD", x"C4", x"76", x"90", x"08", +x"D0", x"0D", x"A5", x"AC", x"C5", x"75", x"B0", x"07", +x"A5", x"AC", x"A4", x"AD", x"4C", x"85", x"C8", x"A0", +x"00", x"B1", x"AC", x"20", x"B3", x"D1", x"A5", x"98", +x"A4", x"99", x"85", x"B7", x"84", x"B8", x"20", x"B8", +x"D3", x"A9", x"A9", x"A0", x"00", x"85", x"98", x"84", +x"99", x"20", x"19", x"D4", x"A0", x"00", x"B1", x"98", +x"91", x"91", x"C8", x"B1", x"98", x"91", x"91", x"C8", +x"B1", x"98", x"91", x"91", x"60", x"C9", x"21", x"D0", +x"FB", x"A9", x"FF", x"8D", x"10", x"02", x"4C", x"BF", +x"00", x"AD", x"10", x"02", x"85", x"BE", x"20", x"BA", +x"C8", x"A5", x"BE", x"8D", x"10", x"02", x"60", x"20", +x"4D", x"C9", x"20", x"C5", x"00", x"F0", x"41", x"F0", +x"51", x"20", x"9D", x"C8", x"F0", x"4C", x"C9", x"9D", +x"F0", x"60", x"C9", x"A0", x"18", x"F0", x"5B", x"C9", +x"2C", x"F0", x"40", x"C9", x"3B", x"F0", x"68", x"20", +x"7F", x"CB", x"24", x"0A", x"30", x"D9", x"20", x"1C", +x"DB", x"20", x"C5", x"D1", x"A0", x"00", x"B1", x"AC", +x"18", x"65", x"11", x"C5", x"12", x"90", x"03", x"20", +x"00", x"C9", x"20", x"4D", x"C9", x"20", x"67", x"C9", +x"D0", x"C0", x"A0", x"00", x"94", x"16", x"A2", x"15", +x"A9", x"0D", x"85", x"11", x"20", x"6C", x"C9", x"A9", +x"0A", x"20", x"6C", x"C9", x"A9", x"00", x"85", x"11", +x"49", x"FF", x"60", x"A5", x"11", x"C5", x"13", x"90", +x"06", x"20", x"00", x"C9", x"4C", x"3F", x"C9", x"38", +x"E9", x"0A", x"B0", x"FC", x"49", x"FF", x"69", x"01", +x"D0", x"10", x"08", x"20", x"D9", x"D4", x"C9", x"29", +x"D0", x"68", x"28", x"90", x"06", x"8A", x"E5", x"11", +x"90", x"05", x"AA", x"E8", x"CA", x"D0", x"06", x"20", +x"BF", x"00", x"4C", x"BF", x"C8", x"20", x"67", x"C9", +x"D0", x"F2", x"20", x"C5", x"D1", x"20", x"E4", x"D3", +x"AA", x"A0", x"00", x"E8", x"CA", x"F0", x"BB", x"B1", +x"6A", x"20", x"6C", x"C9", x"C8", x"C9", x"0D", x"D0", +x"F3", x"20", x"0C", x"C9", x"4C", x"54", x"C9", x"A9", +x"20", x"2C", x"A9", x"3F", x"24", x"10", x"30", x"15", +x"48", x"C9", x"20", x"90", x"0C", x"A5", x"11", x"C5", +x"12", x"D0", x"04", x"A9", x"00", x"85", x"11", x"E6", +x"11", x"68", x"20", x"B9", x"C6", x"29", x"FF", x"60", +x"A5", x"0E", x"F0", x"11", x"30", x"04", x"A0", x"FF", +x"D0", x"04", x"A5", x"87", x"A4", x"88", x"85", x"81", +x"84", x"82", x"4C", x"D0", x"CC", x"A9", x"ED", x"A0", +x"CA", x"20", x"4A", x"C9", x"A5", x"85", x"A4", x"86", +x"85", x"C6", x"84", x"C7", x"60", x"20", x"E4", x"D0", +x"A2", x"17", x"A0", x"00", x"84", x"17", x"A9", x"40", +x"20", x"F6", x"C9", x"60", x"46", x"10", x"AD", x"10", +x"02", x"85", x"BE", x"20", x"FA", x"DF", x"C9", x"22", +x"D0", x"0B", x"20", x"85", x"CC", x"A9", x"3B", x"20", +x"C7", x"CC", x"20", x"4D", x"C9", x"20", x"E4", x"D0", +x"A9", x"2C", x"85", x"15", x"20", x"E7", x"C9", x"A5", +x"16", x"20", x"5D", x"DF", x"4C", x"F5", x"C9", x"20", +x"6A", x"C9", x"20", x"67", x"C9", x"4C", x"65", x"C3", +x"A6", x"89", x"A4", x"8A", x"A9", x"98", x"85", x"0E", +x"86", x"8B", x"84", x"8C", x"20", x"E4", x"CD", x"85", +x"91", x"84", x"92", x"A5", x"C6", x"A4", x"C7", x"85", +x"93", x"84", x"94", x"A6", x"8B", x"A4", x"8C", x"86", +x"C6", x"84", x"C7", x"20", x"C5", x"00", x"D0", x"1B", +x"24", x"0E", x"50", x"0B", x"20", x"E3", x"C6", x"85", +x"16", x"A2", x"15", x"A0", x"00", x"F0", x"08", x"30", +x"71", x"20", x"6A", x"C9", x"20", x"E7", x"C9", x"86", +x"C6", x"84", x"C7", x"20", x"BF", x"00", x"24", x"0A", +x"10", x"31", x"24", x"0E", x"50", x"09", x"E8", x"86", +x"C6", x"A9", x"00", x"85", x"06", x"F0", x"0C", x"85", +x"06", x"C9", x"22", x"F0", x"07", x"A9", x"3A", x"85", +x"06", x"A9", x"2C", x"18", x"85", x"07", x"A5", x"C6", +x"A4", x"C7", x"69", x"00", x"90", x"01", x"C8", x"20", +x"CB", x"D1", x"20", x"21", x"D5", x"20", x"49", x"C8", +x"4C", x"73", x"CA", x"20", x"32", x"DA", x"A5", x"0B", +x"20", x"31", x"C8", x"20", x"C5", x"00", x"F0", x"07", +x"C9", x"2C", x"F0", x"03", x"4C", x"88", x"C9", x"A5", +x"C6", x"A4", x"C7", x"85", x"8B", x"84", x"8C", x"A5", +x"93", x"A4", x"94", x"85", x"C6", x"84", x"C7", x"20", +x"C5", x"00", x"F0", x"2C", x"20", x"C5", x"CC", x"4C", +x"FC", x"C9", x"20", x"75", x"C7", x"C8", x"AA", x"D0", +x"12", x"A2", x"06", x"C8", x"B1", x"C6", x"F0", x"6C", +x"C8", x"B1", x"C6", x"85", x"87", x"C8", x"B1", x"C6", +x"C8", x"85", x"88", x"B1", x"C6", x"AA", x"20", x"6A", +x"C7", x"E0", x"83", x"D0", x"DD", x"4C", x"33", x"CA", +x"A5", x"8B", x"A4", x"8C", x"A6", x"0E", x"10", x"03", +x"4C", x"3B", x"C6", x"A0", x"00", x"20", x"B1", x"C8", +x"B1", x"8B", x"F0", x"07", x"A9", x"DC", x"A0", x"CA", +x"4C", x"4A", x"C9", x"60", x"3F", x"45", x"58", x"54", +x"52", x"41", x"20", x"49", x"47", x"4E", x"4F", x"52", +x"45", x"44", x"0D", x"0A", x"00", x"3F", x"52", x"45", +x"44", x"4F", x"20", x"46", x"52", x"4F", x"4D", x"20", +x"53", x"54", x"41", x"52", x"54", x"0D", x"0A", x"00", +x"D0", x"04", x"A0", x"00", x"F0", x"03", x"20", x"E4", +x"CD", x"85", x"91", x"84", x"92", x"20", x"AC", x"C1", +x"F0", x"04", x"A2", x"00", x"F0", x"66", x"9A", x"8A", +x"18", x"69", x"04", x"48", x"69", x"06", x"85", x"6C", +x"68", x"A0", x"01", x"20", x"E1", x"D8", x"BA", x"BD", +x"09", x"01", x"85", x"AE", x"A5", x"91", x"A4", x"92", +x"20", x"A6", x"D5", x"20", x"0F", x"D9", x"A0", x"01", +x"20", x"9C", x"D9", x"BA", x"38", x"FD", x"09", x"01", +x"F0", x"17", x"BD", x"0F", x"01", x"85", x"81", x"BD", +x"10", x"01", x"85", x"82", x"BD", x"12", x"01", x"85", +x"C6", x"BD", x"11", x"01", x"85", x"C7", x"4C", x"C8", +x"C5", x"8A", x"69", x"11", x"AA", x"9A", x"20", x"C5", +x"00", x"C9", x"2C", x"D0", x"F1", x"20", x"BF", x"00", +x"20", x"06", x"CB", x"20", x"7F", x"CB", x"18", x"24", +x"38", x"24", x"0A", x"30", x"03", x"B0", x"03", x"60", +x"B0", x"FD", x"A2", x"18", x"4C", x"59", x"C2", x"A6", +x"C6", x"D0", x"02", x"C6", x"C7", x"C6", x"C6", x"A2", +x"00", x"24", x"48", x"8A", x"48", x"A9", x"01", x"20", +x"1D", x"C2", x"20", x"64", x"CC", x"A9", x"00", x"85", +x"95", x"20", x"C5", x"00", x"38", x"E9", x"AB", x"90", +x"17", x"C9", x"03", x"B0", x"13", x"C9", x"01", x"2A", +x"49", x"01", x"45", x"95", x"C5", x"95", x"90", x"61", +x"85", x"95", x"20", x"BF", x"00", x"4C", x"9C", x"CB", +x"A6", x"95", x"D0", x"2C", x"B0", x"7B", x"69", x"07", +x"90", x"77", x"65", x"0A", x"D0", x"03", x"4C", x"7B", +x"D3", x"69", x"FF", x"85", x"6A", x"0A", x"65", x"6A", +x"A8", x"68", x"D9", x"72", x"C0", x"B0", x"67", x"20", +x"6E", x"CB", x"48", x"20", x"01", x"CC", x"68", x"A4", +x"93", x"10", x"17", x"AA", x"F0", x"56", x"D0", x"5F", +x"46", x"0A", x"8A", x"2A", x"A6", x"C6", x"D0", x"02", +x"C6", x"C7", x"C6", x"C6", x"A0", x"1B", x"85", x"95", +x"D0", x"D7", x"D9", x"72", x"C0", x"B0", x"48", x"90", +x"D9", x"B9", x"74", x"C0", x"48", x"B9", x"73", x"C0", +x"48", x"20", x"14", x"CC", x"A5", x"95", x"4C", x"8A", +x"CB", x"4C", x"D0", x"CC", x"A5", x"AE", x"BE", x"72", +x"C0", x"A8", x"68", x"85", x"6A", x"E6", x"6A", x"68", +x"85", x"6B", x"98", x"48", x"20", x"5A", x"D9", x"A5", +x"AD", x"48", x"A5", x"AC", x"48", x"A5", x"AB", x"48", +x"A5", x"AA", x"48", x"A5", x"A9", x"48", x"6C", x"6A", +x"00", x"A0", x"FF", x"68", x"F0", x"23", x"C9", x"64", +x"F0", x"03", x"20", x"6E", x"CB", x"84", x"93", x"68", +x"4A", x"85", x"0F", x"68", x"85", x"B1", x"68", x"85", +x"B2", x"68", x"85", x"B3", x"68", x"85", x"B4", x"68", +x"85", x"B5", x"68", x"85", x"B6", x"45", x"AE", x"85", +x"B7", x"A5", x"A9", x"60", x"A9", x"00", x"85", x"0A", +x"20", x"BF", x"00", x"B0", x"03", x"4C", x"32", x"DA", +x"20", x"6E", x"CE", x"B0", x"67", x"C9", x"2E", x"F0", +x"F4", x"C9", x"A5", x"F0", x"58", x"C9", x"A4", x"F0", +x"E7", x"C9", x"22", x"D0", x"0F", x"A5", x"C6", x"A4", +x"C7", x"69", x"00", x"90", x"01", x"C8", x"20", x"C5", +x"D1", x"4C", x"21", x"D5", x"C9", x"A2", x"D0", x"13", +x"A0", x"18", x"D0", x"3B", x"20", x"FE", x"CE", x"A5", +x"AD", x"49", x"FF", x"A8", x"A5", x"AC", x"49", x"FF", +x"4C", x"D1", x"D0", x"C9", x"9F", x"D0", x"03", x"4C", +x"32", x"D1", x"C9", x"AE", x"90", x"03", x"4C", x"00", +x"CD", x"20", x"C2", x"CC", x"20", x"7F", x"CB", x"A9", +x"29", x"2C", x"A9", x"28", x"2C", x"A9", x"2C", x"A0", +x"00", x"D1", x"C6", x"D0", x"03", x"4C", x"BF", x"00", +x"A2", x"02", x"4C", x"59", x"C2", x"A0", x"15", x"68", +x"68", x"4C", x"DB", x"CB", x"20", x"E4", x"CD", x"85", +x"AC", x"84", x"AD", x"A6", x"0A", x"F0", x"05", x"A2", +x"00", x"86", x"B8", x"60", x"A6", x"0B", x"10", x"0D", +x"A0", x"00", x"B1", x"AC", x"AA", x"C8", x"B1", x"AC", +x"A8", x"8A", x"4C", x"D1", x"D0", x"4C", x"E1", x"D8", +x"0A", x"48", x"AA", x"20", x"BF", x"00", x"E0", x"83", +x"90", x"20", x"20", x"C2", x"CC", x"20", x"7F", x"CB", +x"20", x"C5", x"CC", x"20", x"70", x"CB", x"68", x"AA", +x"A5", x"AD", x"48", x"A5", x"AC", x"48", x"8A", x"48", +x"20", x"DC", x"D4", x"68", x"A8", x"8A", x"48", x"4C", +x"2F", x"CD", x"20", x"B9", x"CC", x"68", x"A8", x"B9", +x"E8", x"BF", x"85", x"9D", x"B9", x"E9", x"BF", x"85", +x"9E", x"20", x"9C", x"00", x"4C", x"6E", x"CB", x"A0", +x"FF", x"2C", x"A0", x"00", x"84", x"08", x"20", x"FE", +x"CE", x"A5", x"AC", x"45", x"08", x"85", x"06", x"A5", +x"AD", x"45", x"08", x"85", x"07", x"20", x"3B", x"D9", +x"20", x"FE", x"CE", x"A5", x"AD", x"45", x"08", x"25", +x"07", x"45", x"08", x"A8", x"A5", x"AC", x"45", x"08", +x"25", x"06", x"45", x"08", x"4C", x"D1", x"D0", x"20", +x"71", x"CB", x"B0", x"13", x"A5", x"B6", x"09", x"7F", +x"25", x"B2", x"85", x"B2", x"A9", x"B1", x"A0", x"00", +x"20", x"9A", x"D9", x"AA", x"4C", x"BA", x"CD", x"A9", +x"00", x"85", x"0A", x"C6", x"95", x"20", x"E4", x"D3", +x"85", x"A9", x"86", x"AA", x"84", x"AB", x"A5", x"B4", +x"A4", x"B5", x"20", x"E8", x"D3", x"86", x"B4", x"84", +x"B5", x"AA", x"38", x"E5", x"A9", x"F0", x"08", x"A9", +x"01", x"90", x"04", x"A6", x"A9", x"A9", x"FF", x"85", +x"AE", x"A0", x"FF", x"E8", x"C8", x"CA", x"D0", x"07", +x"A6", x"AE", x"30", x"0F", x"18", x"90", x"0C", x"B1", +x"B4", x"D1", x"AA", x"F0", x"EF", x"A2", x"FF", x"B0", +x"02", x"A2", x"01", x"E8", x"8A", x"2A", x"25", x"0F", +x"F0", x"02", x"A9", x"FF", x"4C", x"7B", x"D9", x"20", +x"C5", x"CC", x"AA", x"20", x"E9", x"CD", x"20", x"C5", +x"00", x"D0", x"F4", x"60", x"A2", x"00", x"20", x"C5", +x"00", x"86", x"09", x"85", x"8D", x"20", x"C5", x"00", +x"20", x"6E", x"CE", x"B0", x"03", x"4C", x"D0", x"CC", +x"A2", x"00", x"86", x"0A", x"86", x"0B", x"20", x"BF", +x"00", x"90", x"05", x"20", x"6E", x"CE", x"90", x"0B", +x"AA", x"20", x"BF", x"00", x"90", x"FB", x"20", x"6E", +x"CE", x"B0", x"F6", x"C9", x"24", x"D0", x"06", x"A9", +x"FF", x"85", x"0A", x"D0", x"10", x"C9", x"25", x"D0", +x"13", x"A5", x"0D", x"D0", x"D0", x"A9", x"80", x"85", +x"0B", x"05", x"8D", x"85", x"8D", x"8A", x"09", x"80", +x"AA", x"20", x"BF", x"00", x"86", x"8E", x"38", x"05", +x"0D", x"E9", x"28", x"D0", x"03", x"4C", x"10", x"CF", +x"A9", x"00", x"85", x"0D", x"A5", x"75", x"A6", x"76", +x"A0", x"00", x"86", x"A8", x"85", x"A7", x"E4", x"78", +x"D0", x"04", x"C5", x"77", x"F0", x"22", x"A5", x"8D", +x"D1", x"A7", x"D0", x"08", x"A5", x"8E", x"C8", x"D1", +x"A7", x"F0", x"6A", x"88", x"18", x"A5", x"A7", x"69", +x"07", x"90", x"E1", x"E8", x"D0", x"DC", x"C9", x"41", +x"90", x"05", x"4C", x"3C", x"F0", x"EA", x"EA", x"60", +x"68", x"48", x"C9", x"DE", x"D0", x"0D", x"BA", x"BD", +x"02", x"01", x"C9", x"CC", x"D0", x"05", x"A9", x"4E", +x"A0", x"DC", x"60", x"A5", x"77", x"A4", x"78", x"85", +x"A7", x"84", x"A8", x"A5", x"79", x"A4", x"7A", x"85", +x"A2", x"84", x"A3", x"18", x"69", x"07", x"90", x"01", +x"C8", x"85", x"A0", x"84", x"A1", x"20", x"DA", x"C1", +x"A5", x"A0", x"A4", x"A1", x"C8", x"85", x"77", x"84", +x"78", x"A0", x"00", x"A5", x"8D", x"91", x"A7", x"C8", +x"A5", x"8E", x"91", x"A7", x"A9", x"00", x"C8", x"91", +x"A7", x"C8", x"91", x"A7", x"C8", x"91", x"A7", x"C8", +x"91", x"A7", x"C8", x"91", x"A7", x"A5", x"A7", x"18", +x"69", x"02", x"A4", x"A8", x"90", x"01", x"C8", x"85", +x"8F", x"84", x"90", x"60", x"A5", x"08", x"0A", x"69", +x"05", x"65", x"A7", x"A4", x"A8", x"90", x"01", x"C8", +x"85", x"A0", x"84", x"A1", x"60", x"90", x"80", x"00", +x"00", x"20", x"BF", x"00", x"20", x"7F", x"CB", x"20", +x"6E", x"CB", x"A5", x"AE", x"30", x"0D", x"A5", x"A9", +x"C9", x"90", x"90", x"09", x"A9", x"ED", x"A0", x"CE", +x"20", x"9A", x"D9", x"D0", x"7A", x"4C", x"DA", x"D9", +x"A5", x"09", x"05", x"0B", x"48", x"A5", x"0A", x"48", +x"A0", x"00", x"98", x"48", x"A5", x"8E", x"48", x"A5", +x"8D", x"48", x"20", x"F1", x"CE", x"68", x"85", x"8D", +x"68", x"85", x"8E", x"68", x"A8", x"BA", x"BD", x"02", +x"01", x"48", x"BD", x"01", x"01", x"48", x"A5", x"AC", +x"9D", x"02", x"01", x"A5", x"AD", x"9D", x"01", x"01", +x"C8", x"20", x"C5", x"00", x"C9", x"2C", x"F0", x"D2", +x"84", x"08", x"20", x"BF", x"CC", x"68", x"85", x"0A", +x"68", x"85", x"0B", x"29", x"7F", x"85", x"09", x"A6", +x"77", x"A5", x"78", x"86", x"A7", x"85", x"A8", x"C5", +x"7A", x"D0", x"04", x"E4", x"79", x"F0", x"39", x"A0", +x"00", x"B1", x"A7", x"C8", x"C5", x"8D", x"D0", x"06", +x"A5", x"8E", x"D1", x"A7", x"F0", x"16", x"C8", x"B1", +x"A7", x"18", x"65", x"A7", x"AA", x"C8", x"B1", x"A7", +x"65", x"A8", x"90", x"D7", x"A2", x"10", x"2C", x"A2", +x"08", x"4C", x"59", x"C2", x"A2", x"12", x"A5", x"09", +x"D0", x"F7", x"20", x"DC", x"CE", x"A5", x"08", x"A0", +x"04", x"D1", x"A7", x"D0", x"E7", x"4C", x"2A", x"D0", +x"20", x"DC", x"CE", x"20", x"2A", x"C2", x"A9", x"00", +x"A8", x"85", x"BA", x"A2", x"05", x"A5", x"8D", x"91", +x"A7", x"10", x"01", x"CA", x"C8", x"A5", x"8E", x"91", +x"A7", x"10", x"02", x"CA", x"CA", x"86", x"B9", x"A5", +x"08", x"C8", x"C8", x"C8", x"91", x"A7", x"A2", x"0B", +x"A9", x"00", x"24", x"09", x"50", x"08", x"68", x"18", +x"69", x"01", x"AA", x"68", x"69", x"00", x"C8", x"91", +x"A7", x"C8", x"8A", x"91", x"A7", x"20", x"8C", x"D0", +x"86", x"B9", x"85", x"BA", x"A4", x"6A", x"C6", x"08", +x"D0", x"DC", x"65", x"A1", x"B0", x"5D", x"85", x"A1", +x"A8", x"8A", x"65", x"A0", x"90", x"03", x"C8", x"F0", +x"52", x"20", x"2A", x"C2", x"85", x"79", x"84", x"7A", +x"A9", x"00", x"E6", x"BA", x"A4", x"B9", x"F0", x"05", +x"88", x"91", x"A0", x"D0", x"FB", x"C6", x"A1", x"C6", +x"BA", x"D0", x"F5", x"E6", x"A1", x"38", x"A5", x"79", +x"E5", x"A7", x"A0", x"02", x"91", x"A7", x"A5", x"7A", +x"C8", x"E5", x"A8", x"91", x"A7", x"A5", x"09", x"D0", +x"62", x"C8", x"B1", x"A7", x"85", x"08", x"A9", x"00", +x"85", x"B9", x"85", x"BA", x"C8", x"68", x"AA", x"85", +x"AC", x"68", x"85", x"AD", x"D1", x"A7", x"90", x"0E", +x"D0", x"06", x"C8", x"8A", x"D1", x"A7", x"90", x"07", +x"4C", x"84", x"CF", x"4C", x"57", x"C2", x"C8", x"A5", +x"BA", x"05", x"B9", x"18", x"F0", x"0A", x"20", x"8C", +x"D0", x"8A", x"65", x"AC", x"AA", x"98", x"A4", x"6A", +x"65", x"AD", x"86", x"B9", x"C6", x"08", x"D0", x"CA", +x"85", x"BA", x"A2", x"05", x"A5", x"8D", x"10", x"01", +x"CA", x"A5", x"8E", x"10", x"02", x"CA", x"CA", x"86", +x"70", x"A9", x"00", x"20", x"95", x"D0", x"8A", x"65", +x"A0", x"85", x"8F", x"98", x"65", x"A1", x"85", x"90", +x"A8", x"A5", x"8F", x"60", x"84", x"6A", x"B1", x"A7", +x"85", x"70", x"88", x"B1", x"A7", x"85", x"71", x"A9", +x"10", x"85", x"A5", x"A2", x"00", x"A0", x"00", x"8A", +x"0A", x"AA", x"98", x"2A", x"A8", x"B0", x"A4", x"06", +x"B9", x"26", x"BA", x"90", x"0B", x"18", x"8A", x"65", +x"70", x"AA", x"98", x"65", x"71", x"A8", x"B0", x"93", +x"C6", x"A5", x"D0", x"E3", x"60", x"A5", x"0A", x"F0", +x"03", x"20", x"E4", x"D3", x"20", x"64", x"D2", x"38", +x"A5", x"7B", x"E5", x"79", x"A8", x"A5", x"7C", x"E5", +x"7A", x"A2", x"00", x"86", x"0A", x"85", x"AA", x"84", +x"AB", x"A2", x"90", x"4C", x"83", x"D9", x"A4", x"11", +x"A9", x"00", x"F0", x"ED", x"A6", x"82", x"E8", x"D0", +x"A2", x"A2", x"16", x"2C", x"A2", x"20", x"4C", x"59", +x"C2", x"20", x"1F", x"D1", x"20", x"E4", x"D0", x"20", +x"C2", x"CC", x"A9", x"80", x"85", x"0D", x"20", x"E4", +x"CD", x"20", x"6E", x"CB", x"20", x"BF", x"CC", x"A9", +x"AC", x"20", x"C7", x"CC", x"48", x"A5", x"90", x"48", +x"A5", x"8F", x"48", x"A5", x"C7", x"48", x"A5", x"C6", +x"48", x"20", x"67", x"C7", x"4C", x"8D", x"D1", x"A9", +x"9F", x"20", x"C7", x"CC", x"09", x"80", x"85", x"0D", +x"20", x"EB", x"CD", x"85", x"96", x"84", x"97", x"4C", +x"6E", x"CB", x"20", x"1F", x"D1", x"A5", x"97", x"48", +x"A5", x"96", x"48", x"20", x"B9", x"CC", x"20", x"6E", +x"CB", x"68", x"85", x"96", x"68", x"85", x"97", x"A0", +x"02", x"B1", x"96", x"85", x"8F", x"AA", x"C8", x"B1", +x"96", x"F0", x"99", x"85", x"90", x"C8", x"B1", x"8F", +x"48", x"88", x"10", x"FA", x"A4", x"90", x"20", x"13", +x"D9", x"A5", x"C7", x"48", x"A5", x"C6", x"48", x"B1", +x"96", x"85", x"C6", x"C8", x"B1", x"96", x"85", x"C7", +x"A5", x"90", x"48", x"A5", x"8F", x"48", x"20", x"6B", +x"CB", x"68", x"85", x"96", x"68", x"85", x"97", x"20", +x"C5", x"00", x"F0", x"03", x"4C", x"D0", x"CC", x"68", +x"85", x"C6", x"68", x"85", x"C7", x"A0", x"00", x"68", +x"91", x"96", x"68", x"C8", x"91", x"96", x"68", x"C8", +x"91", x"96", x"68", x"C8", x"91", x"96", x"68", x"C8", +x"91", x"96", x"60", x"20", x"6E", x"CB", x"A0", x"00", +x"20", x"1E", x"DB", x"68", x"68", x"A9", x"FF", x"A0", +x"03", x"D0", x"12", x"A6", x"AC", x"A4", x"AD", x"86", +x"98", x"84", x"99", x"20", x"32", x"D2", x"86", x"AA", +x"84", x"AB", x"85", x"A9", x"60", x"A2", x"22", x"86", +x"06", x"86", x"07", x"85", x"B7", x"84", x"B8", x"85", +x"AA", x"84", x"AB", x"A0", x"FF", x"C8", x"B1", x"B7", +x"F0", x"0C", x"C5", x"06", x"F0", x"04", x"C5", x"07", +x"D0", x"F3", x"C9", x"22", x"F0", x"01", x"18", x"84", +x"A9", x"98", x"65", x"B7", x"85", x"B9", x"A6", x"B8", +x"90", x"01", x"E8", x"86", x"BA", x"A5", x"B8", x"F0", +x"04", x"C9", x"03", x"D0", x"0B", x"98", x"20", x"B3", +x"D1", x"A6", x"B7", x"A4", x"B8", x"20", x"C6", x"D3", +x"A6", x"5E", x"E0", x"6A", x"D0", x"05", x"A2", x"1C", +x"4C", x"59", x"C2", x"A5", x"A9", x"95", x"00", x"A5", +x"AA", x"95", x"01", x"A5", x"AB", x"95", x"02", x"A0", +x"00", x"86", x"AC", x"84", x"AD", x"84", x"B8", x"88", +x"84", x"0A", x"86", x"5F", x"E8", x"E8", x"E8", x"86", +x"5E", x"60", x"46", x"0C", x"48", x"49", x"FF", x"38", +x"65", x"7B", x"A4", x"7C", x"B0", x"01", x"88", x"C4", +x"7A", x"90", x"11", x"D0", x"04", x"C5", x"79", x"90", +x"0B", x"85", x"7B", x"84", x"7C", x"85", x"7D", x"84", +x"7E", x"AA", x"68", x"60", x"A2", x"0C", x"A5", x"0C", +x"30", x"B6", x"20", x"64", x"D2", x"A9", x"80", x"85", +x"0C", x"68", x"D0", x"D0", x"A6", x"7F", x"A5", x"80", +x"86", x"7B", x"85", x"7C", x"A0", x"00", x"84", x"97", +x"84", x"96", x"A5", x"79", x"A6", x"7A", x"85", x"A7", +x"86", x"A8", x"A9", x"61", x"A2", x"00", x"85", x"6A", +x"86", x"6B", x"C5", x"5E", x"F0", x"05", x"20", x"05", +x"D3", x"F0", x"F7", x"A9", x"07", x"85", x"9B", x"A5", +x"75", x"A6", x"76", x"85", x"6A", x"86", x"6B", x"E4", +x"78", x"D0", x"04", x"C5", x"77", x"F0", x"05", x"20", +x"FB", x"D2", x"F0", x"F3", x"85", x"A0", x"86", x"A1", +x"A9", x"03", x"85", x"9B", x"A5", x"A0", x"A6", x"A1", +x"E4", x"7A", x"D0", x"07", x"C5", x"79", x"D0", x"03", +x"4C", x"44", x"D3", x"85", x"6A", x"86", x"6B", x"A0", +x"00", x"B1", x"6A", x"AA", x"C8", x"B1", x"6A", x"08", +x"C8", x"B1", x"6A", x"65", x"A0", x"85", x"A0", x"C8", +x"B1", x"6A", x"65", x"A1", x"85", x"A1", x"28", x"10", +x"D3", x"8A", x"30", x"D0", x"C8", x"B1", x"6A", x"A0", +x"00", x"0A", x"69", x"05", x"65", x"6A", x"85", x"6A", +x"90", x"02", x"E6", x"6B", x"A6", x"6B", x"E4", x"A1", +x"D0", x"04", x"C5", x"A0", x"F0", x"BA", x"20", x"05", +x"D3", x"F0", x"F3", x"B1", x"6A", x"30", x"35", x"C8", +x"B1", x"6A", x"10", x"30", x"C8", x"B1", x"6A", x"F0", +x"2B", x"C8", x"B1", x"6A", x"AA", x"C8", x"B1", x"6A", +x"C5", x"7C", x"90", x"06", x"D0", x"1E", x"E4", x"7B", +x"B0", x"1A", x"C5", x"A8", x"90", x"16", x"D0", x"04", +x"E4", x"A7", x"90", x"10", x"86", x"A7", x"85", x"A8", +x"A5", x"6A", x"A6", x"6B", x"85", x"96", x"86", x"97", +x"A5", x"9B", x"85", x"9D", x"A5", x"9B", x"18", x"65", +x"6A", x"85", x"6A", x"90", x"02", x"E6", x"6B", x"A6", +x"6B", x"A0", x"00", x"60", x"A5", x"97", x"05", x"96", +x"F0", x"F5", x"A5", x"9D", x"29", x"04", x"4A", x"A8", +x"85", x"9D", x"B1", x"96", x"65", x"A7", x"85", x"A2", +x"A5", x"A8", x"69", x"00", x"85", x"A3", x"A5", x"7B", +x"A6", x"7C", x"85", x"A0", x"86", x"A1", x"20", x"E1", +x"C1", x"A4", x"9D", x"C8", x"A5", x"A0", x"91", x"96", +x"AA", x"E6", x"A1", x"A5", x"A1", x"C8", x"91", x"96", +x"4C", x"68", x"D2", x"A5", x"AD", x"48", x"A5", x"AC", +x"48", x"20", x"64", x"CC", x"20", x"70", x"CB", x"68", +x"85", x"B7", x"68", x"85", x"B8", x"A0", x"00", x"B1", +x"B7", x"18", x"71", x"AC", x"90", x"05", x"A2", x"1A", +x"4C", x"59", x"C2", x"20", x"B3", x"D1", x"20", x"B8", +x"D3", x"A5", x"98", x"A4", x"99", x"20", x"E8", x"D3", +x"20", x"CA", x"D3", x"A5", x"B7", x"A4", x"B8", x"20", +x"E8", x"D3", x"20", x"08", x"D2", x"4C", x"99", x"CB", +x"A0", x"00", x"B1", x"B7", x"48", x"C8", x"B1", x"B7", +x"AA", x"C8", x"B1", x"B7", x"A8", x"68", x"86", x"6A", +x"84", x"6B", x"A8", x"F0", x"0A", x"48", x"88", x"B1", +x"6A", x"91", x"7D", x"98", x"D0", x"F8", x"68", x"18", +x"65", x"7D", x"85", x"7D", x"90", x"02", x"E6", x"7E", +x"60", x"20", x"70", x"CB", x"A5", x"AC", x"A4", x"AD", +x"85", x"6A", x"84", x"6B", x"20", x"19", x"D4", x"08", +x"A0", x"00", x"B1", x"6A", x"48", x"C8", x"B1", x"6A", +x"AA", x"C8", x"B1", x"6A", x"A8", x"68", x"28", x"D0", +x"13", x"C4", x"7C", x"D0", x"0F", x"E4", x"7B", x"D0", +x"0B", x"48", x"18", x"65", x"7B", x"85", x"7B", x"90", +x"02", x"E6", x"7C", x"68", x"86", x"6A", x"84", x"6B", +x"60", x"C4", x"60", x"D0", x"0C", x"C5", x"5F", x"D0", +x"08", x"85", x"5E", x"E9", x"03", x"85", x"5F", x"A0", +x"00", x"60", x"20", x"DF", x"D4", x"8A", x"48", x"A9", +x"01", x"20", x"BB", x"D1", x"68", x"A0", x"00", x"91", +x"AA", x"68", x"68", x"4C", x"08", x"D2", x"20", x"9F", +x"D4", x"D1", x"98", x"98", x"90", x"04", x"B1", x"98", +x"AA", x"98", x"48", x"8A", x"48", x"20", x"BB", x"D1", +x"A5", x"98", x"A4", x"99", x"20", x"E8", x"D3", x"68", +x"A8", x"68", x"18", x"65", x"6A", x"85", x"6A", x"90", +x"02", x"E6", x"6B", x"98", x"20", x"CA", x"D3", x"4C", +x"08", x"D2", x"20", x"9F", x"D4", x"18", x"F1", x"98", +x"49", x"FF", x"4C", x"44", x"D4", x"A9", x"FF", x"85", +x"AD", x"20", x"C5", x"00", x"C9", x"29", x"F0", x"06", +x"20", x"C5", x"CC", x"20", x"DC", x"D4", x"20", x"9F", +x"D4", x"F0", x"4B", x"CA", x"8A", x"48", x"18", x"A2", +x"00", x"F1", x"98", x"B0", x"B6", x"49", x"FF", x"C5", +x"AD", x"90", x"B1", x"A5", x"AD", x"B0", x"AD", x"20", +x"BF", x"CC", x"68", x"A8", x"68", x"85", x"9D", x"68", +x"68", x"68", x"AA", x"68", x"85", x"98", x"68", x"85", +x"99", x"A5", x"9D", x"48", x"98", x"48", x"A0", x"00", +x"8A", x"60", x"20", x"C0", x"D4", x"4C", x"E0", x"D0", +x"20", x"E1", x"D3", x"A2", x"00", x"86", x"0A", x"A8", +x"60", x"20", x"C0", x"D4", x"F0", x"08", x"A0", x"00", +x"B1", x"6A", x"A8", x"4C", x"E0", x"D0", x"4C", x"87", +x"CF", x"20", x"BF", x"00", x"20", x"6B", x"CB", x"20", +x"F7", x"CE", x"A6", x"AC", x"D0", x"F0", x"A6", x"AD", +x"4C", x"C5", x"00", x"20", x"C0", x"D4", x"D0", x"03", +x"4C", x"36", x"D6", x"A6", x"C6", x"A4", x"C7", x"86", +x"B9", x"84", x"BA", x"A6", x"6A", x"86", x"C6", x"18", +x"65", x"6A", x"85", x"6C", x"A6", x"6B", x"86", x"C7", +x"90", x"01", x"E8", x"86", x"6D", x"A0", x"00", x"B1", +x"6C", x"48", x"A9", x"00", x"91", x"6C", x"20", x"C5", +x"00", x"20", x"32", x"DA", x"68", x"A0", x"00", x"91", +x"6C", x"A6", x"B9", x"A4", x"BA", x"86", x"C6", x"84", +x"C7", x"60", x"20", x"6B", x"CB", x"20", x"36", x"D5", +x"20", x"C5", x"CC", x"4C", x"DC", x"D4", x"A5", x"AE", +x"30", x"9C", x"A5", x"A9", x"C9", x"91", x"B0", x"96", +x"20", x"DA", x"D9", x"A5", x"AC", x"A4", x"AD", x"84", +x"14", x"85", x"15", x"60", x"A5", x"15", x"48", x"A5", +x"14", x"48", x"20", x"36", x"D5", x"A0", x"00", x"B1", +x"14", x"A8", x"68", x"85", x"14", x"68", x"85", x"15", +x"4C", x"E0", x"D0", x"20", x"2A", x"D5", x"8A", x"A0", +x"00", x"91", x"14", x"60", x"20", x"2A", x"D5", x"86", +x"91", x"A2", x"00", x"20", x"C5", x"00", x"F0", x"03", +x"20", x"30", x"D5", x"86", x"92", x"A0", x"00", x"B1", +x"14", x"45", x"92", x"25", x"91", x"F0", x"F8", x"60", +x"A9", x"4C", x"A0", x"DC", x"4C", x"A6", x"D5", x"20", +x"CB", x"D7", x"A5", x"AE", x"49", x"FF", x"85", x"AE", +x"45", x"B6", x"85", x"B7", x"A5", x"A9", x"4C", x"A9", +x"D5", x"20", x"D8", x"D6", x"90", x"3C", x"20", x"CB", +x"D7", x"D0", x"03", x"4C", x"3B", x"D9", x"A6", x"B8", +x"86", x"9E", x"A2", x"B1", x"A5", x"B1", x"A8", x"F0", +x"CE", x"38", x"E5", x"A9", x"F0", x"24", x"90", x"12", +x"84", x"A9", x"A4", x"B6", x"84", x"AE", x"49", x"FF", +x"69", x"00", x"A0", x"00", x"84", x"9E", x"A2", x"A9", +x"D0", x"04", x"A0", x"00", x"84", x"B8", x"C9", x"F9", +x"30", x"C7", x"A8", x"A5", x"B8", x"56", x"01", x"20", +x"EF", x"D6", x"24", x"B7", x"10", x"57", x"A0", x"A9", +x"E0", x"B1", x"F0", x"02", x"A0", x"B1", x"38", x"49", +x"FF", x"65", x"9E", x"85", x"B8", x"B9", x"04", x"00", +x"F5", x"04", x"85", x"AD", x"B9", x"03", x"00", x"F5", +x"03", x"85", x"AC", x"B9", x"02", x"00", x"F5", x"02", +x"85", x"AB", x"B9", x"01", x"00", x"F5", x"01", x"85", +x"AA", x"B0", x"03", x"20", x"86", x"D6", x"A0", x"00", +x"98", x"18", x"A6", x"AA", x"D0", x"4A", x"A6", x"AB", +x"86", x"AA", x"A6", x"AC", x"86", x"AB", x"A6", x"AD", +x"86", x"AC", x"A6", x"B8", x"86", x"AD", x"84", x"B8", +x"69", x"08", x"C9", x"20", x"D0", x"E4", x"A9", x"00", +x"85", x"A9", x"85", x"AE", x"60", x"65", x"9E", x"85", +x"B8", x"A5", x"AD", x"65", x"B5", x"85", x"AD", x"A5", +x"AC", x"65", x"B4", x"85", x"AC", x"A5", x"AB", x"65", +x"B3", x"85", x"AB", x"A5", x"AA", x"65", x"B2", x"85", +x"AA", x"4C", x"75", x"D6", x"69", x"01", x"06", x"B8", +x"26", x"AD", x"26", x"AC", x"26", x"AB", x"26", x"AA", +x"10", x"F2", x"38", x"E5", x"A9", x"B0", x"C7", x"49", +x"FF", x"69", x"01", x"85", x"A9", x"90", x"0E", x"E6", +x"A9", x"F0", x"42", x"66", x"AA", x"66", x"AB", x"66", +x"AC", x"66", x"AD", x"66", x"B8", x"60", x"A5", x"AE", +x"49", x"FF", x"85", x"AE", x"A5", x"AA", x"49", x"FF", +x"85", x"AA", x"A5", x"AB", x"49", x"FF", x"85", x"AB", +x"A5", x"AC", x"49", x"FF", x"85", x"AC", x"A5", x"AD", +x"49", x"FF", x"85", x"AD", x"A5", x"B8", x"49", x"FF", +x"85", x"B8", x"E6", x"B8", x"D0", x"0E", x"E6", x"AD", +x"D0", x"0A", x"E6", x"AC", x"D0", x"06", x"E6", x"AB", +x"D0", x"02", x"E6", x"AA", x"60", x"A2", x"0A", x"4C", +x"59", x"C2", x"A2", x"6D", x"B4", x"04", x"84", x"B8", +x"B4", x"03", x"94", x"04", x"B4", x"02", x"94", x"03", +x"B4", x"01", x"94", x"02", x"A4", x"B0", x"94", x"01", +x"69", x"08", x"30", x"E8", x"F0", x"E6", x"E9", x"08", +x"A8", x"A5", x"B8", x"B0", x"14", x"16", x"01", x"90", +x"02", x"F6", x"01", x"76", x"01", x"76", x"01", x"76", +x"02", x"76", x"03", x"76", x"04", x"6A", x"C8", x"D0", +x"EC", x"18", x"60", x"81", x"00", x"00", x"00", x"00", +x"03", x"7F", x"5E", x"56", x"CB", x"79", x"80", x"13", +x"9B", x"0B", x"64", x"80", x"76", x"38", x"93", x"16", +x"82", x"38", x"AA", x"3B", x"20", x"80", x"35", x"04", +x"F3", x"34", x"81", x"35", x"04", x"F3", x"34", x"80", +x"80", x"00", x"00", x"00", x"80", x"31", x"72", x"17", +x"F8", x"20", x"6A", x"D9", x"F0", x"02", x"10", x"03", +x"4C", x"87", x"CF", x"A5", x"A9", x"E9", x"7F", x"48", +x"A9", x"80", x"85", x"A9", x"A9", x"15", x"A0", x"D7", +x"20", x"A6", x"D5", x"A9", x"1A", x"A0", x"D7", x"20", +x"4E", x"D8", x"A9", x"FB", x"A0", x"D6", x"20", x"8F", +x"D5", x"A9", x"00", x"A0", x"D7", x"20", x"44", x"DD", +x"A9", x"1F", x"A0", x"D7", x"20", x"A6", x"D5", x"68", +x"20", x"BD", x"DA", x"A9", x"24", x"A0", x"D7", x"20", +x"CB", x"D7", x"D0", x"03", x"4C", x"CA", x"D7", x"20", +x"F6", x"D7", x"A9", x"00", x"85", x"6E", x"85", x"6F", +x"85", x"70", x"85", x"71", x"A5", x"B8", x"20", x"98", +x"D7", x"A5", x"AD", x"20", x"98", x"D7", x"A5", x"AC", +x"20", x"98", x"D7", x"A5", x"AB", x"20", x"98", x"D7", +x"A5", x"AA", x"20", x"9D", x"D7", x"4C", x"CE", x"D8", +x"D0", x"03", x"4C", x"C2", x"D6", x"4A", x"09", x"80", +x"A8", x"90", x"19", x"18", x"A5", x"71", x"65", x"B5", +x"85", x"71", x"A5", x"70", x"65", x"B4", x"85", x"70", +x"A5", x"6F", x"65", x"B3", x"85", x"6F", x"A5", x"6E", +x"65", x"B2", x"85", x"6E", x"66", x"6E", x"66", x"6F", +x"66", x"70", x"66", x"71", x"66", x"B8", x"98", x"4A", +x"D0", x"D6", x"60", x"85", x"6A", x"84", x"6B", x"A0", +x"04", x"B1", x"6A", x"85", x"B5", x"88", x"B1", x"6A", +x"85", x"B4", x"88", x"B1", x"6A", x"85", x"B3", x"88", +x"B1", x"6A", x"85", x"B6", x"45", x"AE", x"85", x"B7", +x"A5", x"B6", x"09", x"80", x"85", x"B2", x"88", x"B1", +x"6A", x"85", x"B1", x"A5", x"A9", x"60", x"A5", x"B1", +x"F0", x"1F", x"18", x"65", x"A9", x"90", x"04", x"30", +x"1D", x"18", x"2C", x"10", x"14", x"69", x"80", x"85", +x"A9", x"D0", x"03", x"4C", x"3A", x"D6", x"A5", x"B7", +x"85", x"AE", x"60", x"A5", x"AE", x"49", x"FF", x"30", +x"05", x"68", x"68", x"4C", x"36", x"D6", x"4C", x"BD", +x"D6", x"20", x"4B", x"D9", x"AA", x"F0", x"10", x"18", +x"69", x"02", x"B0", x"F2", x"A2", x"00", x"86", x"B7", +x"20", x"B6", x"D5", x"E6", x"A9", x"F0", x"E7", x"60", +x"84", x"20", x"00", x"00", x"00", x"20", x"4B", x"D9", +x"A9", x"38", x"A0", x"D8", x"A2", x"00", x"86", x"B7", +x"20", x"E1", x"D8", x"4C", x"51", x"D8", x"20", x"CB", +x"D7", x"F0", x"76", x"20", x"5A", x"D9", x"A9", x"00", +x"38", x"E5", x"A9", x"85", x"A9", x"20", x"F6", x"D7", +x"E6", x"A9", x"F0", x"BA", x"A2", x"FC", x"A9", x"01", +x"A4", x"B2", x"C4", x"AA", x"D0", x"10", x"A4", x"B3", +x"C4", x"AB", x"D0", x"0A", x"A4", x"B4", x"C4", x"AC", +x"D0", x"04", x"A4", x"B5", x"C4", x"AD", x"08", x"2A", +x"90", x"09", x"E8", x"95", x"71", x"F0", x"32", x"10", +x"34", x"A9", x"01", x"28", x"B0", x"0E", x"06", x"B5", +x"26", x"B4", x"26", x"B3", x"26", x"B2", x"B0", x"E6", +x"30", x"CE", x"10", x"E2", x"A8", x"A5", x"B5", x"E5", +x"AD", x"85", x"B5", x"A5", x"B4", x"E5", x"AC", x"85", +x"B4", x"A5", x"B3", x"E5", x"AB", x"85", x"B3", x"A5", +x"B2", x"E5", x"AA", x"85", x"B2", x"98", x"4C", x"8E", +x"D8", x"A9", x"40", x"D0", x"CE", x"0A", x"0A", x"0A", +x"0A", x"0A", x"0A", x"85", x"B8", x"28", x"4C", x"CE", +x"D8", x"A2", x"14", x"4C", x"59", x"C2", x"A5", x"6E", +x"85", x"AA", x"A5", x"6F", x"85", x"AB", x"A5", x"70", +x"85", x"AC", x"A5", x"71", x"85", x"AD", x"4C", x"16", +x"D6", x"85", x"6A", x"84", x"6B", x"A0", x"04", x"B1", +x"6A", x"85", x"AD", x"88", x"B1", x"6A", x"85", x"AC", +x"88", x"B1", x"6A", x"85", x"AB", x"88", x"B1", x"6A", +x"85", x"AE", x"09", x"80", x"85", x"AA", x"88", x"B1", +x"6A", x"85", x"A9", x"84", x"B8", x"60", x"A2", x"A4", +x"2C", x"A2", x"9F", x"A0", x"00", x"F0", x"04", x"A6", +x"91", x"A4", x"92", x"20", x"5A", x"D9", x"86", x"6A", +x"84", x"6B", x"A0", x"04", x"A5", x"AD", x"91", x"6A", +x"88", x"A5", x"AC", x"91", x"6A", x"88", x"A5", x"AB", +x"91", x"6A", x"88", x"A5", x"AE", x"09", x"7F", x"25", +x"AA", x"91", x"6A", x"88", x"A5", x"A9", x"91", x"6A", +x"84", x"B8", x"60", x"A5", x"B6", x"85", x"AE", x"A2", +x"05", x"B5", x"B0", x"95", x"A8", x"CA", x"D0", x"F9", +x"86", x"B8", x"60", x"20", x"5A", x"D9", x"A2", x"06", +x"B5", x"A8", x"95", x"B0", x"CA", x"D0", x"F9", x"86", +x"B8", x"60", x"A5", x"A9", x"F0", x"FB", x"06", x"B8", +x"90", x"F7", x"20", x"AE", x"D6", x"D0", x"F2", x"4C", +x"77", x"D6", x"A5", x"A9", x"F0", x"09", x"A5", x"AE", +x"2A", x"A9", x"FF", x"B0", x"02", x"A9", x"01", x"60", +x"20", x"6A", x"D9", x"85", x"AA", x"A9", x"00", x"85", +x"AB", x"A2", x"88", x"A5", x"AA", x"49", x"FF", x"2A", +x"A9", x"00", x"85", x"AD", x"85", x"AC", x"86", x"A9", +x"85", x"B8", x"85", x"AE", x"4C", x"11", x"D6", x"46", +x"AE", x"60", x"85", x"6C", x"84", x"6D", x"A0", x"00", +x"B1", x"6C", x"C8", x"AA", x"F0", x"C4", x"B1", x"6C", +x"45", x"AE", x"30", x"C2", x"E4", x"A9", x"D0", x"21", +x"B1", x"6C", x"09", x"80", x"C5", x"AA", x"D0", x"19", +x"C8", x"B1", x"6C", x"C5", x"AB", x"D0", x"12", x"C8", +x"B1", x"6C", x"C5", x"AC", x"D0", x"0B", x"C8", x"A9", +x"7F", x"C5", x"B8", x"B1", x"6C", x"E5", x"AD", x"F0", +x"28", x"A5", x"AE", x"90", x"02", x"49", x"FF", x"4C", +x"70", x"D9", x"A5", x"A9", x"F0", x"4A", x"38", x"E9", +x"A0", x"24", x"AE", x"10", x"09", x"AA", x"A9", x"FF", +x"85", x"B0", x"20", x"8C", x"D6", x"8A", x"A2", x"A9", +x"C9", x"F9", x"10", x"06", x"20", x"D8", x"D6", x"84", +x"B0", x"60", x"A8", x"A5", x"AE", x"29", x"80", x"46", +x"AA", x"05", x"AA", x"85", x"AA", x"20", x"EF", x"D6", +x"84", x"B0", x"60", x"A5", x"A9", x"C9", x"A0", x"B0", +x"20", x"20", x"DA", x"D9", x"84", x"B8", x"A5", x"AE", +x"84", x"AE", x"49", x"80", x"2A", x"A9", x"A0", x"85", +x"A9", x"A5", x"AD", x"85", x"06", x"4C", x"11", x"D6", +x"85", x"AA", x"85", x"AB", x"85", x"AC", x"85", x"AD", +x"A8", x"60", x"A0", x"00", x"A2", x"0A", x"94", x"A5", +x"CA", x"10", x"FB", x"90", x"0F", x"C9", x"2D", x"D0", +x"04", x"86", x"AF", x"F0", x"04", x"C9", x"2B", x"D0", +x"05", x"20", x"BF", x"00", x"90", x"5B", x"C9", x"2E", +x"F0", x"2E", x"C9", x"45", x"D0", x"30", x"20", x"BF", +x"00", x"90", x"17", x"C9", x"A5", x"F0", x"0E", x"C9", +x"2D", x"F0", x"0A", x"C9", x"A4", x"F0", x"08", x"C9", +x"2B", x"F0", x"04", x"D0", x"07", x"66", x"A8", x"20", +x"BF", x"00", x"90", x"5C", x"24", x"A8", x"10", x"0E", +x"A9", x"00", x"38", x"E5", x"A6", x"4C", x"88", x"DA", +x"66", x"A7", x"24", x"A7", x"50", x"C3", x"A5", x"A6", +x"38", x"E5", x"A5", x"85", x"A6", x"F0", x"12", x"10", +x"09", x"20", x"3D", x"D8", x"E6", x"A6", x"D0", x"F9", +x"F0", x"07", x"20", x"21", x"D8", x"C6", x"A6", x"D0", +x"F9", x"A5", x"AF", x"30", x"01", x"60", x"4C", x"B8", +x"DC", x"48", x"24", x"A7", x"10", x"02", x"E6", x"A5", +x"20", x"21", x"D8", x"68", x"38", x"E9", x"30", x"20", +x"BD", x"DA", x"4C", x"49", x"DA", x"48", x"20", x"4B", +x"D9", x"68", x"20", x"7B", x"D9", x"A5", x"B6", x"45", +x"AE", x"85", x"B7", x"A6", x"A9", x"4C", x"A9", x"D5", +x"A5", x"A6", x"C9", x"0A", x"90", x"09", x"A9", x"64", +x"24", x"A8", x"30", x"11", x"4C", x"BD", x"D6", x"0A", +x"0A", x"18", x"65", x"A6", x"0A", x"18", x"A0", x"00", +x"71", x"C6", x"38", x"E9", x"30", x"85", x"A6", x"4C", +x"6F", x"DA", x"9B", x"3E", x"BC", x"1F", x"FD", x"9E", +x"6E", x"6B", x"27", x"FD", x"9E", x"6E", x"6B", x"28", +x"00", x"A9", x"9E", x"A0", x"C1", x"20", x"19", x"DB", +x"A5", x"82", x"A6", x"81", x"85", x"AA", x"86", x"AB", +x"A2", x"90", x"38", x"20", x"88", x"D9", x"20", x"1C", +x"DB", x"4C", x"4A", x"C9", x"A0", x"01", x"A9", x"20", +x"24", x"AE", x"10", x"02", x"A9", x"2D", x"99", x"FF", +x"03", x"85", x"AE", x"84", x"B9", x"C8", x"A9", x"30", +x"A6", x"A9", x"D0", x"03", x"4C", x"3F", x"DC", x"A9", +x"00", x"E0", x"80", x"F0", x"02", x"B0", x"09", x"A9", +x"FC", x"A0", x"DA", x"20", x"67", x"D7", x"A9", x"F7", +x"85", x"A5", x"A9", x"F7", x"A0", x"DA", x"20", x"9A", +x"D9", x"F0", x"1E", x"10", x"12", x"A9", x"F2", x"A0", +x"DA", x"20", x"9A", x"D9", x"F0", x"02", x"10", x"0E", +x"20", x"21", x"D8", x"C6", x"A5", x"D0", x"EE", x"20", +x"3D", x"D8", x"E6", x"A5", x"D0", x"DC", x"20", x"88", +x"D5", x"20", x"DA", x"D9", x"A2", x"01", x"A5", x"A5", +x"18", x"69", x"0A", x"30", x"09", x"C9", x"0B", x"B0", +x"06", x"69", x"FF", x"AA", x"A9", x"02", x"38", x"E9", +x"02", x"85", x"A6", x"86", x"A5", x"8A", x"F0", x"02", +x"10", x"13", x"A4", x"B9", x"A9", x"2E", x"C8", x"99", +x"FF", x"03", x"8A", x"F0", x"06", x"A9", x"30", x"C8", +x"99", x"FF", x"03", x"84", x"B9", x"A0", x"00", x"A2", +x"80", x"A5", x"AD", x"18", x"79", x"54", x"DC", x"85", +x"AD", x"A5", x"AC", x"79", x"53", x"DC", x"85", x"AC", +x"A5", x"AB", x"79", x"52", x"DC", x"85", x"AB", x"A5", +x"AA", x"79", x"51", x"DC", x"85", x"AA", x"E8", x"B0", +x"04", x"10", x"DE", x"30", x"02", x"30", x"DA", x"8A", +x"90", x"04", x"49", x"FF", x"69", x"0A", x"69", x"2F", +x"C8", x"C8", x"C8", x"C8", x"84", x"8F", x"A4", x"B9", +x"C8", x"AA", x"29", x"7F", x"99", x"FF", x"03", x"C6", +x"A5", x"D0", x"06", x"A9", x"2E", x"C8", x"99", x"FF", +x"03", x"84", x"B9", x"A4", x"8F", x"8A", x"49", x"FF", +x"29", x"80", x"AA", x"C0", x"24", x"D0", x"AA", x"A4", +x"B9", x"B9", x"FF", x"03", x"88", x"C9", x"30", x"F0", +x"F8", x"C9", x"2E", x"F0", x"01", x"C8", x"A9", x"2B", +x"A6", x"A6", x"F0", x"2E", x"10", x"08", x"A9", x"00", +x"38", x"E5", x"A6", x"AA", x"A9", x"2D", x"99", x"01", +x"04", x"A9", x"45", x"99", x"00", x"04", x"8A", x"A2", +x"2F", x"38", x"E8", x"E9", x"0A", x"B0", x"FB", x"69", +x"3A", x"99", x"03", x"04", x"8A", x"99", x"02", x"04", +x"A9", x"00", x"99", x"04", x"04", x"F0", x"08", x"99", +x"FF", x"03", x"A9", x"00", x"99", x"00", x"04", x"A9", +x"00", x"A0", x"04", x"60", x"80", x"00", x"00", x"00", +x"00", x"FA", x"0A", x"1F", x"00", x"00", x"98", x"96", +x"80", x"FF", x"F0", x"BD", x"C0", x"00", x"01", x"86", +x"A0", x"FF", x"FF", x"D8", x"F0", x"00", x"00", x"03", +x"E8", x"FF", x"FF", x"FF", x"9C", x"00", x"00", x"00", +x"0A", x"FF", x"FF", x"FF", x"FF", x"20", x"4B", x"D9", +x"A9", x"4C", x"A0", x"DC", x"20", x"E1", x"D8", x"F0", +x"70", x"A5", x"B1", x"D0", x"03", x"4C", x"38", x"D6", +x"A2", x"96", x"A0", x"00", x"20", x"13", x"D9", x"A5", +x"B6", x"10", x"0F", x"20", x"0B", x"DA", x"A9", x"96", +x"A0", x"00", x"20", x"9A", x"D9", x"D0", x"03", x"98", +x"A4", x"06", x"20", x"3D", x"D9", x"98", x"48", x"20", +x"29", x"D7", x"A9", x"96", x"A0", x"00", x"20", x"67", +x"D7", x"20", x"F1", x"DC", x"68", x"4A", x"90", x"0A", +x"A5", x"A9", x"F0", x"06", x"A5", x"AE", x"49", x"FF", +x"85", x"AE", x"60", x"81", x"38", x"AA", x"3B", x"29", +x"07", x"71", x"34", x"58", x"3E", x"56", x"74", x"16", +x"7E", x"B3", x"1B", x"77", x"2F", x"EE", x"E3", x"85", +x"7A", x"1D", x"84", x"1C", x"2A", x"7C", x"63", x"59", +x"58", x"0A", x"7E", x"75", x"FD", x"E7", x"C6", x"80", +x"31", x"72", x"18", x"10", x"81", x"00", x"00", x"00", +x"00", x"A9", x"C3", x"A0", x"DC", x"20", x"67", x"D7", +x"A5", x"B8", x"69", x"50", x"90", x"03", x"20", x"62", +x"D9", x"85", x"9E", x"20", x"4E", x"D9", x"A5", x"A9", +x"C9", x"88", x"90", x"03", x"20", x"13", x"D8", x"20", +x"0B", x"DA", x"A5", x"06", x"18", x"69", x"81", x"F0", +x"F3", x"38", x"E9", x"01", x"48", x"A2", x"05", x"B5", +x"B1", x"B4", x"A9", x"95", x"A9", x"94", x"B1", x"CA", +x"10", x"F5", x"A5", x"9E", x"85", x"B8", x"20", x"92", +x"D5", x"20", x"B8", x"DC", x"A9", x"C8", x"A0", x"DC", +x"20", x"5A", x"DD", x"A9", x"00", x"85", x"B7", x"68", +x"20", x"F8", x"D7", x"60", x"85", x"B9", x"84", x"BA", +x"20", x"09", x"D9", x"A9", x"9F", x"20", x"67", x"D7", +x"20", x"5E", x"DD", x"A9", x"9F", x"A0", x"00", x"4C", +x"67", x"D7", x"85", x"B9", x"84", x"BA", x"20", x"06", +x"D9", x"B1", x"B9", x"85", x"AF", x"A4", x"B9", x"C8", +x"98", x"D0", x"02", x"E6", x"BA", x"85", x"B9", x"A4", +x"BA", x"20", x"67", x"D7", x"A5", x"B9", x"A4", x"BA", +x"18", x"69", x"05", x"90", x"01", x"C8", x"85", x"B9", +x"84", x"BA", x"20", x"A6", x"D5", x"A9", x"A4", x"A0", +x"00", x"C6", x"AF", x"D0", x"E4", x"60", x"98", x"35", +x"44", x"7A", x"68", x"28", x"B1", x"46", x"20", x"6A", +x"D9", x"AA", x"30", x"18", x"A9", x"D7", x"A0", x"00", +x"20", x"E1", x"D8", x"8A", x"F0", x"E7", x"A9", x"8E", +x"A0", x"DD", x"20", x"67", x"D7", x"A9", x"92", x"A0", +x"DD", x"20", x"A6", x"D5", x"A6", x"AD", x"A5", x"AA", +x"85", x"AD", x"86", x"AA", x"A9", x"00", x"85", x"AE", +x"A5", x"A9", x"85", x"B8", x"A9", x"80", x"85", x"A9", +x"20", x"16", x"D6", x"A2", x"D7", x"A0", x"00", x"4C", +x"13", x"D9", x"A9", x"4E", x"A0", x"DE", x"20", x"A6", +x"D5", x"20", x"4B", x"D9", x"A9", x"53", x"A0", x"DE", +x"A6", x"B6", x"20", x"46", x"D8", x"20", x"4B", x"D9", +x"20", x"0B", x"DA", x"A9", x"00", x"85", x"B7", x"20", +x"92", x"D5", x"A9", x"58", x"A0", x"DE", x"20", x"8F", +x"D5", x"A5", x"AE", x"48", x"10", x"0D", x"20", x"88", +x"D5", x"A5", x"AE", x"30", x"09", x"A5", x"0F", x"49", +x"FF", x"85", x"0F", x"20", x"B8", x"DC", x"A9", x"58", +x"A0", x"DE", x"20", x"A6", x"D5", x"68", x"10", x"03", +x"20", x"B8", x"DC", x"A9", x"5D", x"A0", x"DE", x"4C", +x"44", x"DD", x"20", x"09", x"D9", x"A9", x"00", x"85", +x"0F", x"20", x"D9", x"DD", x"A2", x"96", x"A0", x"00", +x"20", x"CF", x"DD", x"A9", x"9F", x"A0", x"00", x"20", +x"E1", x"D8", x"A9", x"00", x"85", x"AE", x"A5", x"0F", +x"20", x"4A", x"DE", x"A9", x"96", x"A0", x"00", x"4C", +x"4E", x"D8", x"48", x"4C", x"0B", x"DE", x"81", x"49", +x"0F", x"DA", x"A2", x"83", x"49", x"0F", x"DA", x"A2", +x"7F", x"00", x"00", x"00", x"00", x"05", x"84", x"E6", +x"1A", x"2D", x"1B", x"86", x"28", x"07", x"FB", x"F8", +x"87", x"99", x"68", x"89", x"01", x"87", x"23", x"35", +x"DF", x"E1", x"86", x"A5", x"5D", x"E7", x"28", x"83", +x"49", x"0F", x"DA", x"A2", x"A1", x"54", x"46", x"8F", +x"13", x"8F", x"52", x"43", x"89", x"CD", x"E6", x"C6", +x"D0", x"02", x"E6", x"C7", x"AD", x"60", x"EA", x"C9", +x"3A", x"B0", x"0A", x"C9", x"20", x"F0", x"EF", x"38", +x"E9", x"30", x"38", x"E9", x"D0", x"60", x"80", x"4F", +x"C7", x"52", x"58", x"A2", x"FF", x"86", x"82", x"A2", +x"FE", x"9A", x"A9", x"A3", x"A0", x"DE", x"85", x"01", +x"84", x"02", x"A9", x"4C", x"85", x"00", x"85", x"9C", +x"85", x"BB", x"85", x"03", x"20", x"43", x"DF", x"EA", +x"A9", x"87", x"A0", x"CF", x"85", x"04", x"84", x"05", +x"A9", x"20", x"85", x"12", x"A9", x"1E", x"85", x"13", +x"A2", x"1C", x"BD", x"85", x"DE", x"95", x"BE", x"CA", +x"D0", x"F8", x"A9", x"03", x"85", x"9B", x"8A", x"85", +x"B0", x"85", x"60", x"48", x"85", x"10", x"20", x"00", +x"C9", x"A2", x"61", x"86", x"5E", x"A9", x"AF", x"A0", +x"DF", x"20", x"4A", x"C9", x"20", x"E7", x"C9", x"86", +x"C6", x"84", x"C7", x"20", x"BF", x"00", x"A8", x"D0", +x"2B", x"A9", x"11", x"A0", x"04", x"85", x"73", x"84", +x"74", x"85", x"14", x"84", x"15", x"A0", x"00", x"E6", +x"14", x"D0", x"08", x"E6", x"15", x"A5", x"15", x"C5", +x"BC", x"F0", x"1D", x"A9", x"55", x"91", x"14", x"D1", +x"14", x"D0", x"15", x"0A", x"91", x"14", x"D1", x"14", +x"D0", x"0E", x"F0", x"E3", x"20", x"C5", x"00", x"20", +x"DA", x"C7", x"A8", x"F0", x"03", x"4C", x"D0", x"CC", +x"A5", x"14", x"A4", x"15", x"85", x"7F", x"84", x"80", +x"4C", x"70", x"DF", x"A9", x"60", x"85", x"BC", x"A2", +x"42", x"A0", x"40", x"BD", x"00", x"B0", x"5D", x"00", +x"B0", x"CA", x"CA", x"CA", x"D0", x"F8", x"C9", x"4C", +x"D0", x"02", x"84", x"BC", x"60", x"C9", x"03", x"D0", +x"FB", x"A9", x"00", x"85", x"C7", x"4C", x"58", x"C6", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"A2", x"11", x"A0", x"04", x"86", x"73", x"84", x"74", +x"A0", x"00", x"98", x"91", x"73", x"E6", x"73", x"D0", +x"02", x"E6", x"74", x"20", x"67", x"C4", x"A5", x"73", +x"A4", x"74", x"20", x"2A", x"C2", x"20", x"00", x"C9", +x"A5", x"7F", x"38", x"E5", x"73", x"AA", x"A5", x"80", +x"E5", x"74", x"20", x"0C", x"DB", x"A9", x"EB", x"A0", +x"DF", x"20", x"4A", x"C9", x"A9", x"00", x"A0", x"C9", +x"85", x"01", x"84", x"02", x"4C", x"7F", x"C2", x"0C", +x"20", x"20", x"3E", x"45", x"41", x"47", x"4C", x"45", +x"3C", x"20", x"45", x"58", x"54", x"45", x"4E", x"44", +x"45", x"44", x"20", x"42", x"41", x"53", x"49", x"43", +x"0D", x"0A", x"0A", x"20", x"20", x"20", x"20", x"20", +x"56", x"20", x"31", x"2E", x"30", x"20", x"28", x"43", +x"29", x"20", x"38", x"35", x"0D", x"0A", x"0A", x"0A", +x"4D", x"45", x"4D", x"20", x"53", x"49", x"5A", x"45", +x"20", x"20", x"00", x"20", x"42", x"59", x"54", x"45", +x"53", x"20", x"46", x"52", x"45", x"45", x"0D", x"0A", +x"0A", x"00", x"20", x"C5", x"00", x"4C", x"9D", x"C8" + ); +begin + process(clk) + begin + if rising_edge(clk) then + data <= romData(conv_integer(addr)); + end if; + end process; +end architecture; + diff --git a/ORAO_MiST/rtl/rom/rom_crt102.vhd b/ORAO_MiST/rtl/rom/rom_crt102.vhd new file mode 100644 index 00000000..a0f5243a --- /dev/null +++ b/ORAO_MiST/rtl/rom/rom_crt102.vhd @@ -0,0 +1,1051 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity rom_crt is + port ( + clk: in std_logic; + addr: in std_logic_vector(12 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end entity; + +architecture Behavioral of rom_crt is + type romDef is array(0 to 8191) of std_logic_vector(7 downto 0); + constant romData: romDef := ( +x"00", x"00", x"00", x"00", x"00", x"00", x"00", x"00", +x"08", x"08", x"08", x"08", x"08", x"00", x"08", x"00", +x"14", x"14", x"00", x"00", x"00", x"00", x"00", x"00", +x"28", x"28", x"7C", x"28", x"7C", x"28", x"28", x"00", +x"10", x"78", x"14", x"38", x"50", x"3C", x"10", x"00", +x"46", x"26", x"10", x"08", x"64", x"62", x"00", x"00", +x"08", x"14", x"14", x"0C", x"52", x"22", x"5C", x"00", +x"20", x"10", x"08", x"00", x"00", x"00", x"00", x"00", +x"20", x"10", x"08", x"08", x"08", x"10", x"20", x"00", +x"04", x"08", x"10", x"10", x"10", x"08", x"04", x"00", +x"00", x"10", x"54", x"38", x"54", x"10", x"00", x"00", +x"00", x"10", x"10", x"7C", x"10", x"10", x"00", x"00", +x"00", x"00", x"00", x"00", x"18", x"18", x"04", x"00", +x"00", x"00", x"00", x"7C", x"00", x"00", x"00", x"00", +x"00", x"00", x"00", x"00", x"18", x"18", x"00", x"00", +x"00", x"40", x"20", x"10", x"08", x"04", x"00", x"00", +x"38", x"44", x"64", x"54", x"4C", x"44", x"38", x"00", +x"10", x"18", x"10", x"10", x"10", x"10", x"38", x"00", +x"38", x"44", x"40", x"20", x"18", x"04", x"7C", x"00", +x"7C", x"20", x"10", x"20", x"40", x"44", x"38", x"00", +x"20", x"30", x"28", x"24", x"7C", x"20", x"20", x"00", +x"7C", x"04", x"3C", x"40", x"40", x"44", x"38", x"00", +x"30", x"08", x"04", x"3C", x"44", x"44", x"38", x"00", +x"7C", x"40", x"20", x"10", x"08", x"08", x"08", x"00", +x"38", x"44", x"44", x"38", x"44", x"44", x"38", x"00", +x"38", x"44", x"44", x"78", x"40", x"20", x"18", x"00", +x"00", x"18", x"18", x"00", x"18", x"18", x"00", x"00", +x"00", x"18", x"18", x"00", x"18", x"18", x"04", x"00", +x"20", x"10", x"08", x"04", x"08", x"10", x"20", x"00", +x"00", x"00", x"7C", x"00", x"7C", x"00", x"00", x"00", +x"04", x"08", x"10", x"20", x"10", x"08", x"04", x"00", +x"1C", x"22", x"20", x"18", x"08", x"00", x"08", x"00", +x"38", x"44", x"74", x"54", x"74", x"04", x"78", x"00", +x"38", x"44", x"44", x"7C", x"44", x"44", x"44", x"00", +x"3C", x"48", x"48", x"38", x"48", x"48", x"3C", x"00", +x"38", x"44", x"04", x"04", x"04", x"44", x"38", x"00", +x"3C", x"48", x"48", x"48", x"48", x"48", x"3C", x"00", +x"7C", x"04", x"04", x"1C", x"04", x"04", x"7C", x"00", +x"7C", x"04", x"04", x"1C", x"04", x"04", x"04", x"00", +x"38", x"44", x"04", x"04", x"74", x"44", x"78", x"00", +x"44", x"44", x"44", x"7C", x"44", x"44", x"44", x"00", +x"38", x"10", x"10", x"10", x"10", x"10", x"38", x"00", +x"70", x"20", x"20", x"20", x"20", x"24", x"18", x"00", +x"44", x"24", x"14", x"0C", x"14", x"24", x"44", x"00", +x"04", x"04", x"04", x"04", x"04", x"04", x"7C", x"00", +x"44", x"6C", x"54", x"54", x"44", x"44", x"44", x"00", +x"44", x"44", x"4C", x"54", x"64", x"44", x"44", x"00", +x"38", x"44", x"44", x"44", x"44", x"44", x"38", x"00", +x"3C", x"44", x"44", x"3C", x"04", x"04", x"04", x"00", +x"38", x"44", x"44", x"44", x"54", x"24", x"58", x"00", +x"3C", x"44", x"44", x"3C", x"14", x"24", x"44", x"00", +x"38", x"44", x"08", x"10", x"20", x"44", x"38", x"00", +x"7C", x"10", x"10", x"10", x"10", x"10", x"10", x"00", +x"44", x"44", x"44", x"44", x"44", x"44", x"38", x"00", +x"44", x"44", x"44", x"44", x"44", x"28", x"10", x"00", +x"44", x"44", x"44", x"54", x"54", x"54", x"28", x"00", +x"44", x"44", x"28", x"10", x"28", x"44", x"44", x"00", +x"44", x"44", x"44", x"28", x"10", x"10", x"10", x"00", +x"7C", x"40", x"20", x"10", x"08", x"04", x"7C", x"00", +x"28", x"38", x"44", x"04", x"04", x"44", x"38", x"00", +x"20", x"38", x"44", x"04", x"04", x"44", x"38", x"00", +x"3C", x"48", x"48", x"5C", x"48", x"48", x"3C", x"00", +x"28", x"38", x"44", x"08", x"30", x"44", x"38", x"00", +x"28", x"7C", x"40", x"20", x"10", x"08", x"7C", x"00", +x"10", x"28", x"44", x"00", x"00", x"00", x"00", x"00", +x"00", x"18", x"20", x"38", x"24", x"38", x"00", x"00", +x"04", x"04", x"1C", x"24", x"24", x"1C", x"00", x"00", +x"00", x"38", x"04", x"04", x"04", x"38", x"00", x"00", +x"20", x"20", x"38", x"24", x"24", x"38", x"00", x"00", +x"00", x"18", x"24", x"1C", x"04", x"18", x"00", x"00", +x"10", x"28", x"08", x"1C", x"08", x"08", x"08", x"00", +x"00", x"38", x"24", x"24", x"38", x"20", x"18", x"00", +x"04", x"04", x"1C", x"24", x"24", x"24", x"00", x"00", +x"10", x"00", x"18", x"10", x"10", x"38", x"00", x"00", +x"10", x"00", x"18", x"10", x"10", x"14", x"08", x"00", +x"04", x"04", x"14", x"0C", x"14", x"24", x"00", x"00", +x"18", x"10", x"10", x"10", x"10", x"38", x"00", x"00", +x"00", x"2C", x"54", x"54", x"54", x"54", x"00", x"00", +x"00", x"1C", x"24", x"24", x"24", x"24", x"00", x"00", +x"00", x"18", x"24", x"24", x"24", x"18", x"00", x"00", +x"00", x"1C", x"24", x"24", x"1C", x"04", x"04", x"00", +x"00", x"1C", x"12", x"12", x"1C", x"10", x"78", x"00", +x"00", x"34", x"0C", x"04", x"04", x"04", x"00", x"00", +x"00", x"38", x"04", x"18", x"20", x"1C", x"00", x"00", +x"10", x"38", x"10", x"10", x"10", x"20", x"00", x"00", +x"00", x"24", x"24", x"24", x"24", x"38", x"00", x"00", +x"00", x"44", x"44", x"44", x"28", x"10", x"00", x"00", +x"00", x"44", x"44", x"54", x"54", x"28", x"00", x"00", +x"00", x"44", x"28", x"10", x"28", x"44", x"00", x"00", +x"00", x"24", x"24", x"24", x"38", x"20", x"18", x"00", +x"00", x"3C", x"20", x"10", x"08", x"3C", x"00", x"00", +x"38", x"00", x"38", x"04", x"04", x"38", x"00", x"00", +x"20", x"00", x"38", x"04", x"04", x"38", x"00", x"00", +x"20", x"70", x"20", x"38", x"24", x"38", x"00", x"00", +x"28", x"38", x"04", x"18", x"20", x"1C", x"00", x"00", +x"38", x"00", x"3C", x"10", x"08", x"3C", x"00", x"00", +x"09", x"0A", x"0B", x"08", x"14", x"13", x"12", x"11", +x"36", x"74", x"7A", x"72", x"37", x"75", x"69", x"6F", +x"31", x"77", x"71", x"65", x"6D", x"6B", x"6A", x"6C", +x"79", x"73", x"61", x"64", x"6E", x"67", x"68", x"66", +x"3A", x"7F", x"7C", x"7B", x"3B", x"7E", x"7D", x"70", +x"00", x"0D", x"00", x"20", x"34", x"35", x"39", x"38", +x"33", x"32", x"2E", x"2C", x"63", x"78", x"76", x"62", +x"60", x"2F", x"30", x"2D", x"87", x"FC", x"87", x"FA", +x"87", x"F6", x"87", x"EE", x"87", x"DE", x"87", x"BE", +x"87", x"7E", x"86", x"FE", x"85", x"FE", x"83", x"FE", +x"85", x"FC", x"8A", x"48", x"98", x"48", x"A5", x"FC", +x"A8", x"2A", x"2A", x"2A", x"2A", x"29", x"03", x"AA", +x"BD", x"00", x"02", x"D0", x"05", x"BD", x"04", x"02", +x"F0", x"24", x"85", x"F1", x"98", x"0A", x"0A", x"0A", +x"85", x"F0", x"A0", x"07", x"B1", x"F0", x"84", x"FA", +x"A4", x"E9", x"24", x"FC", x"10", x"02", x"49", x"FF", +x"91", x"E6", x"A5", x"E6", x"38", x"E9", x"20", x"85", +x"E6", x"A4", x"FA", x"88", x"10", x"E6", x"68", x"A8", +x"68", x"AA", x"A5", x"FC", x"60", x"A6", x"EA", x"86", +x"E8", x"A4", x"EC", x"84", x"E9", x"A9", x"E0", x"85", +x"E6", x"A5", x"E8", x"20", x"9E", x"EE", x"60", x"EA", +x"EA", x"EA", x"A6", x"EB", x"18", x"90", x"05", x"20", +x"95", x"E3", x"A4", x"EC", x"20", x"AD", x"E4", x"C4", +x"ED", x"C8", x"90", x"F8", x"E4", x"EB", x"B0", x"15", +x"E8", x"E6", x"E7", x"90", x"ED", x"C6", x"E9", x"C4", +x"EC", x"D0", x"0D", x"A4", x"ED", x"84", x"E9", x"E4", +x"EA", x"F0", x"05", x"C6", x"E8", x"20", x"9D", x"E3", +x"68", x"A8", x"68", x"AA", x"A5", x"FC", x"60", x"85", +x"FC", x"8A", x"48", x"98", x"48", x"A5", x"FC", x"A6", +x"E8", x"A4", x"E9", x"C9", x"20", x"B0", x"39", x"2C", +x"08", x"02", x"30", x"34", x"4C", x"B0", x"EE", x"EA", +x"C9", x"0C", x"F0", x"B3", x"C9", x"06", x"F0", x"B4", +x"C9", x"08", x"F0", x"C1", x"C9", x"0B", x"F0", x"C7", +x"C9", x"09", x"F0", x"1F", x"C9", x"0A", x"F0", x"25", +x"C9", x"0D", x"F0", x"6A", x"C9", x"04", x"D0", x"06", +x"20", x"95", x"E3", x"4C", x"D8", x"E3", x"C9", x"07", +x"D0", x"B6", x"20", x"F4", x"E4", x"4C", x"D8", x"E3", +x"20", x"50", x"E3", x"E6", x"E9", x"C4", x"ED", x"90", +x"A7", x"A4", x"EC", x"84", x"E9", x"E6", x"E8", x"E4", +x"EB", x"90", x"9A", x"C6", x"E8", x"A5", x"EA", x"20", +x"A3", x"E3", x"A5", x"E6", x"18", x"90", x"13", x"E6", +x"E7", x"A4", x"EC", x"B1", x"E6", x"91", x"EE", x"C4", +x"ED", x"C8", x"90", x"F7", x"A5", x"E6", x"E9", x"20", +x"85", x"E6", x"85", x"EE", x"B0", x"EB", x"A5", x"E7", +x"85", x"EF", x"38", x"E9", x"60", x"C5", x"EB", x"90", +x"DE", x"4C", x"B2", x"E3", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"20", x"0F", +x"E6", x"F0", x"1C", x"A0", x"09", x"88", x"F0", x"17", +x"A2", x"FF", x"20", x"E3", x"E4", x"20", x"0F", x"E6", +x"D0", x"F3", x"A4", x"E9", x"20", x"C2", x"E4", x"20", +x"0F", x"E6", x"F0", x"FB", x"20", x"C2", x"E4", x"A6", +x"E8", x"AD", x"09", x"02", x"D0", x"8B", x"A4", x"EC", +x"84", x"E9", x"4C", x"D8", x"E3", x"86", x"FB", x"A2", +x"08", x"A9", x"00", x"91", x"E6", x"A5", x"E6", x"38", +x"E9", x"20", x"85", x"E6", x"CA", x"D0", x"F2", x"A6", +x"FB", x"60", x"86", x"FB", x"A2", x"08", x"B1", x"E6", +x"49", x"FF", x"91", x"E6", x"A5", x"E6", x"38", x"E9", +x"20", x"85", x"E6", x"CA", x"D0", x"F0", x"A6", x"FB", +x"60", x"48", x"98", x"A0", x"BB", x"88", x"D0", x"FD", +x"A8", x"68", x"60", x"20", x"D9", x"E4", x"CA", x"D0", +x"FA", x"60", x"8E", x"00", x"88", x"20", x"D9", x"E4", +x"CA", x"D0", x"F7", x"60", x"48", x"8A", x"A2", x"70", +x"20", x"EA", x"E4", x"AA", x"68", x"60", x"FF", x"FF", +x"8A", x"48", x"98", x"48", x"A4", x"E9", x"B1", x"E6", +x"48", x"A4", x"E9", x"B1", x"E6", x"49", x"FF", x"91", +x"E6", x"A0", x"00", x"88", x"F0", x"F3", x"20", x"B0", +x"E5", x"90", x"F8", x"85", x"FC", x"F0", x"F4", x"A2", +x"0A", x"20", x"E3", x"E4", x"20", x"B0", x"E5", x"90", +x"EA", x"C5", x"FC", x"D0", x"E6", x"A4", x"E9", x"68", +x"91", x"E6", x"AD", x"0B", x"02", x"F0", x"05", x"A2", +x"0F", x"20", x"EA", x"E4", x"A2", x"04", x"20", x"E3", +x"E4", x"20", x"B0", x"E5", x"90", x"12", x"C5", x"FC", +x"D0", x"0E", x"AE", x"0C", x"02", x"F0", x"ED", x"CE", +x"0C", x"02", x"D0", x"E8", x"A2", x"20", x"D0", x"07", +x"AE", x"0C", x"02", x"F0", x"05", x"A2", x"FF", x"8E", +x"0C", x"02", x"AD", x"FB", x"87", x"29", x"20", x"0A", +x"85", x"FA", x"AD", x"FD", x"87", x"29", x"20", x"05", +x"FA", x"0A", x"85", x"FA", x"A5", x"FC", x"C9", x"21", +x"90", x"2D", x"C9", x"60", x"B0", x"0F", x"2C", x"0E", +x"02", x"10", x"02", x"09", x"80", x"A4", x"FA", x"30", +x"1E", x"49", x"10", x"D0", x"1A", x"F0", x"05", x"2C", +x"0D", x"02", x"10", x"04", x"A4", x"FA", x"30", x"02", +x"49", x"20", x"2C", x"0E", x"02", x"10", x"02", x"09", +x"80", x"24", x"FA", x"70", x"02", x"29", x"1F", x"85", +x"FC", x"68", x"A8", x"68", x"AA", x"A5", x"FC", x"60", +x"8A", x"48", x"98", x"48", x"A2", x"14", x"CA", x"CA", +x"30", x"2D", x"BD", x"3C", x"E3", x"85", x"F1", x"BD", +x"3D", x"E3", x"85", x"F0", x"20", x"F9", x"E5", x"90", +x"ED", x"C0", x"00", x"D0", x"21", x"0A", x"B0", x"09", +x"C8", x"0A", x"B0", x"05", x"C8", x"0A", x"B0", x"01", +x"C8", x"8A", x"0A", x"84", x"FA", x"18", x"65", x"FA", +x"AA", x"BD", x"00", x"E3", x"85", x"FA", x"38", x"68", +x"A8", x"68", x"AA", x"A5", x"FA", x"60", x"29", x"10", +x"D0", x"01", x"88", x"8A", x"18", x"69", x"28", x"D0", +x"E2", x"38", x"A0", x"00", x"B1", x"F0", x"09", x"0F", +x"49", x"FF", x"D0", x"0A", x"C8", x"B1", x"F0", x"09", +x"CF", x"49", x"FF", x"D0", x"01", x"18", x"60", x"AD", +x"00", x"80", x"09", x"0F", x"49", x"FF", x"D0", x"07", +x"AD", x"01", x"80", x"09", x"CF", x"49", x"FF", x"60", +x"20", x"33", x"E6", x"C9", x"57", x"D0", x"03", x"4C", +x"74", x"C2", x"C9", x"43", x"D0", x"03", x"4C", x"11", +x"DD", x"60", x"E8", x"BD", x"80", x"02", x"C9", x"20", +x"F0", x"F8", x"60", x"85", x"F3", x"84", x"F2", x"98", +x"48", x"A0", x"00", x"B1", x"F2", x"C9", x"04", x"F0", +x"0B", x"20", x"F1", x"FF", x"E6", x"F2", x"D0", x"F3", +x"E6", x"F3", x"D0", x"EF", x"68", x"A8", x"60", x"A2", +x"00", x"8A", x"F0", x"01", x"CA", x"20", x"EE", x"FF", +x"9D", x"80", x"02", x"C9", x"0D", x"F0", x"1B", x"C9", +x"08", x"F0", x"EE", x"C9", x"18", x"F0", x"0D", x"C9", +x"20", x"90", x"EA", x"E8", x"10", x"E7", x"20", x"F4", +x"E4", x"38", x"B0", x"E0", x"A9", x"0D", x"A2", x"00", +x"F0", x"DE", x"60", x"FF", x"0D", x"0A", x"00", x"00", +x"00", x"00", x"2A", x"04", x"E0", x"2F", x"00", x"00", +x"00", x"00", x"E0", x"60", x"00", x"00", x"00", x"1F", +x"00", x"1F", x"E0", x"20", x"00", x"00", x"00", x"00", +x"00", x"E0", x"E1", x"E2", x"00", x"00", x"00", x"00", +x"FF", x"00", x"00", x"00", x"00", x"FF", x"FD", x"2A", +x"FF", x"FF", x"1C", x"E7", x"62", x"E7", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"20", x"E6", x"FD", x"E8", x"06", x"E9", x"0E", x"E9", +x"D0", x"EA", x"09", x"EB", x"48", x"EB", x"6A", x"EB", +x"AB", x"EB", x"80", x"EC", x"F6", x"EE", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"42", x"4A", x"55", x"45", x"43", x"51", x"46", x"4D", +x"41", x"58", x"50", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"20", x"00", x"E5", x"C9", +x"11", x"90", x"09", x"C9", x"14", x"B0", x"05", x"20", +x"34", x"E7", x"A9", x"00", x"2C", x"0F", x"02", x"30", +x"30", x"4C", x"F1", x"FF", x"C9", x"12", x"90", x"21", +x"F0", x"16", x"C9", x"13", x"B0", x"09", x"AD", x"0B", +x"02", x"49", x"FF", x"8D", x"0B", x"02", x"60", x"AD", +x"0E", x"02", x"49", x"FF", x"8D", x"0E", x"02", x"60", +x"AD", x"10", x"02", x"49", x"FF", x"8D", x"10", x"02", +x"60", x"AD", x"0D", x"02", x"49", x"FF", x"8D", x"0D", +x"02", x"60", x"20", x"DF", x"E3", x"2C", x"10", x"02", +x"10", x"F7", x"4C", x"E9", x"EE", x"EA", x"EA", x"BA", +x"BD", x"03", x"01", x"A2", x"09", x"18", x"2A", x"6A", +x"B0", x"05", x"8D", x"00", x"98", x"90", x"07", x"29", +x"FF", x"30", x"03", x"8D", x"00", x"90", x"AC", x"13", +x"02", x"20", x"B8", x"E7", x"CA", x"30", x"06", x"D0", +x"E6", x"09", x"01", x"D0", x"E2", x"68", x"A8", x"68", +x"AA", x"68", x"60", x"FF", x"FF", x"FF", x"FF", x"A0", +x"00", x"8C", x"00", x"98", x"8C", x"00", x"90", x"2C", +x"FF", x"87", x"10", x"03", x"C8", x"D0", x"F8", x"88", +x"84", x"F4", x"60", x"AE", x"2A", x"0A", x"04", x"EA", +x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", x"88", x"D0", +x"F6", x"60", x"FF", x"48", x"10", x"05", x"38", x"90", +x"02", x"49", x"80", x"0A", x"D0", x"F9", x"68", x"60", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"48", x"A9", x"20", x"20", +x"F1", x"FF", x"68", x"60", x"A2", x"03", x"20", x"DC", +x"E7", x"CA", x"D0", x"FA", x"60", x"C9", x"0A", x"90", +x"02", x"69", x"06", x"69", x"30", x"60", x"A9", x"0D", +x"20", x"F1", x"FF", x"A9", x"0A", x"4C", x"F1", x"FF", +x"20", x"DC", x"E7", x"48", x"4A", x"4A", x"4A", x"4A", +x"20", x"ED", x"E7", x"20", x"F1", x"FF", x"68", x"29", +x"0F", x"20", x"ED", x"E7", x"4C", x"F1", x"FF", x"20", +x"DC", x"E7", x"A5", x"FF", x"20", x"03", x"E8", x"A5", +x"FE", x"4C", x"03", x"E8", x"20", x"33", x"E6", x"BD", +x"80", x"02", x"E8", x"C9", x"30", x"90", x"0F", x"E9", +x"30", x"C9", x"0A", x"90", x"0A", x"C9", x"11", x"90", +x"05", x"E9", x"07", x"C9", x"10", x"60", x"38", x"60", +x"20", x"27", x"E8", x"90", x"06", x"60", x"20", x"24", +x"E8", x"B0", x"0F", x"0A", x"0A", x"0A", x"0A", x"85", +x"FC", x"20", x"27", x"E8", x"B0", x"04", x"05", x"FC", +x"85", x"FC", x"60", x"20", x"46", x"E8", x"B0", x"07", +x"85", x"F7", x"20", x"40", x"E8", x"85", x"F6", x"60", +x"20", x"7D", x"E8", x"B0", x"1D", x"20", x"92", x"E8", +x"B0", x"18", x"4C", x"5B", x"E8", x"20", x"7D", x"E8", +x"B0", x"10", x"4C", x"5B", x"E8", x"20", x"5B", x"E8", +x"B0", x"08", x"A5", x"F6", x"85", x"FE", x"A5", x"F7", +x"85", x"FF", x"60", x"E6", x"FE", x"D0", x"02", x"E6", +x"FF", x"60", x"20", x"5B", x"E8", x"B0", x"08", x"A5", +x"F6", x"85", x"F4", x"A5", x"F7", x"85", x"F5", x"60", +x"E6", x"F4", x"D0", x"02", x"E6", x"F5", x"60", x"18", +x"A5", x"FE", x"65", x"F6", x"85", x"FE", x"A5", x"FF", +x"65", x"F7", x"85", x"FF", x"60", x"38", x"A5", x"FE", +x"E5", x"F4", x"85", x"FE", x"A5", x"FF", x"E5", x"F5", +x"85", x"FF", x"60", x"38", x"A5", x"F6", x"E5", x"F4", +x"A5", x"F7", x"E5", x"F5", x"60", x"38", x"A5", x"FE", +x"E5", x"F4", x"A5", x"FF", x"E5", x"F5", x"60", x"18", +x"A5", x"F6", x"E9", x"00", x"85", x"F6", x"A5", x"F7", +x"E9", x"00", x"85", x"F7", x"60", x"18", x"A5", x"FE", +x"E9", x"00", x"85", x"FE", x"A5", x"FF", x"E9", x"00", +x"85", x"FF", x"60", x"38", x"A5", x"FE", x"E5", x"F6", +x"A5", x"FF", x"E5", x"F7", x"60", x"20", x"5B", x"E8", +x"B0", x"2C", x"68", x"68", x"90", x"05", x"20", x"5B", +x"E8", x"B0", x"23", x"6C", x"F6", x"00", x"20", x"75", +x"E8", x"B0", x"1B", x"A0", x"00", x"20", x"F6", x"E7", +x"20", x"17", x"E8", x"A2", x"09", x"CA", x"F0", x"F5", +x"B1", x"FE", x"20", x"00", x"E8", x"20", x"F3", x"E8", +x"20", x"8B", x"E8", x"90", x"F0", x"18", x"60", x"FF", +x"00", x"90", x"6D", x"65", x"69", x"7D", x"79", x"61", +x"71", x"75", x"D0", x"2D", x"25", x"29", x"3D", x"39", +x"21", x"31", x"35", x"30", x"0A", x"0E", x"06", x"1E", +x"16", x"08", x"90", x"08", x"B0", x"88", x"F0", x"48", +x"2C", x"24", x"C8", x"30", x"C8", x"D0", x"28", x"10", +x"28", x"00", x"A8", x"50", x"A8", x"70", x"D8", x"18", +x"D8", x"D8", x"D8", x"58", x"D8", x"B8", x"D8", x"CD", +x"C5", x"C9", x"DD", x"D9", x"C1", x"D1", x"D5", x"38", +x"EC", x"E4", x"E0", x"38", x"CC", x"C4", x"C0", x"84", +x"CE", x"C6", x"DE", x"D6", x"84", x"CA", x"84", x"88", +x"D4", x"4D", x"45", x"49", x"5D", x"59", x"41", x"51", +x"55", x"D2", x"EE", x"E6", x"FE", x"F6", x"D2", x"E8", +x"D2", x"C8", x"CA", x"4C", x"6C", x"2A", x"20", x"86", +x"AD", x"A5", x"A9", x"BD", x"B9", x"A1", x"B1", x"B5", +x"86", x"AE", x"A6", x"A2", x"BE", x"B6", x"86", x"AC", +x"A4", x"A0", x"BC", x"B4", x"26", x"4A", x"4E", x"46", +x"5E", x"56", x"CE", x"EA", x"3E", x"0D", x"05", x"09", +x"1D", x"19", x"01", x"11", x"15", x"41", x"48", x"41", +x"08", x"C1", x"68", x"C1", x"28", x"C9", x"2A", x"2E", +x"26", x"3E", x"36", x"C9", x"6A", x"6E", x"66", x"7E", +x"76", x"A9", x"40", x"A9", x"60", x"19", x"ED", x"E5", +x"E9", x"FD", x"F9", x"E1", x"F1", x"F5", x"99", x"38", +x"99", x"F8", x"99", x"78", x"B9", x"8D", x"85", x"9D", +x"99", x"81", x"91", x"95", x"B9", x"8E", x"86", x"96", +x"B9", x"8C", x"84", x"94", x"05", x"AA", x"05", x"A8", +x"25", x"BA", x"65", x"8A", x"65", x"9A", x"65", x"98", +x"00", x"60", x"82", x"81", x"C1", x"8A", x"86", x"99", +x"95", x"89", x"11", x"82", x"81", x"C1", x"8A", x"86", +x"99", x"95", x"89", x"1B", x"80", x"82", x"81", x"8A", +x"89", x"63", x"A1", x"67", x"A1", x"46", x"A1", x"16", +x"82", x"81", x"4A", x"A1", x"51", x"A1", x"18", x"A1", +x"69", x"80", x"61", x"A1", x"65", x"A1", x"60", x"80", +x"10", x"80", x"48", x"80", x"34", x"80", x"06", x"82", +x"81", x"C1", x"8A", x"86", x"99", x"95", x"89", x"0C", +x"82", x"81", x"C1", x"4C", x"82", x"81", x"C1", x"62", +x"82", x"81", x"8A", x"89", x"0E", x"80", x"4E", x"80", +x"27", x"82", x"81", x"C1", x"8A", x"86", x"99", x"95", +x"89", x"61", x"82", x"81", x"8A", x"89", x"0D", x"80", +x"4D", x"80", x"06", x"82", x"92", x"27", x"82", x"40", +x"82", x"81", x"C1", x"8A", x"86", x"99", x"95", x"89", +x"0C", x"82", x"81", x"C1", x"86", x"85", x"4C", x"82", +x"81", x"C1", x"8A", x"89", x"27", x"80", x"82", x"81", +x"8A", x"89", x"07", x"80", x"41", x"82", x"81", x"C1", +x"8A", x"86", x"99", x"95", x"89", x"40", x"80", x"04", +x"80", x"40", x"80", x"04", x"80", x"1B", x"80", x"82", +x"81", x"8A", x"89", x"27", x"80", x"82", x"81", x"8A", +x"89", x"48", x"80", x"64", x"80", x"61", x"82", x"81", +x"C1", x"8A", x"86", x"99", x"95", x"89", x"62", x"80", +x"12", x"80", x"4A", x"80", x"40", x"82", x"81", x"8A", +x"86", x"99", x"95", x"89", x"0C", x"82", x"81", x"85", +x"4C", x"82", x"81", x"89", x"0E", x"80", x"4E", x"80", +x"0F", x"80", x"40", x"80", x"64", x"80", x"42", x"80", +x"20", x"75", x"E8", x"B0", x"33", x"A2", x"00", x"86", +x"F4", x"86", x"F5", x"A0", x"00", x"8A", x"71", x"FE", +x"AA", x"90", x"06", x"E6", x"F4", x"D0", x"02", x"E6", +x"F5", x"20", x"F3", x"E8", x"20", x"8B", x"E8", x"90", +x"EC", x"20", x"F6", x"E7", x"A9", x"3D", x"20", x"F1", +x"FF", x"A5", x"F5", x"20", x"00", x"E8", x"A5", x"F4", +x"20", x"00", x"E8", x"8A", x"20", x"00", x"E8", x"18", +x"60", x"20", x"68", x"E8", x"B0", x"25", x"20", x"C3", +x"E8", x"90", x"33", x"A0", x"00", x"20", x"CD", x"E8", +x"90", x"1A", x"20", x"B5", x"E8", x"20", x"A7", x"E8", +x"B0", x"11", x"B1", x"F6", x"91", x"FE", x"20", x"D7", +x"E8", x"90", x"08", x"20", x"E5", x"E8", x"20", x"C3", +x"E8", x"B0", x"EF", x"60", x"B1", x"F4", x"91", x"FE", +x"20", x"A0", x"E8", x"F0", x"F6", x"20", x"8B", x"E8", +x"20", x"C3", x"E8", x"B0", x"EF", x"60", x"38", x"60", +x"20", x"75", x"E8", x"B0", x"1C", x"A0", x"00", x"20", +x"46", x"E8", x"90", x"09", x"C9", x"27", x"D0", x"EE", +x"BD", x"80", x"02", x"AA", x"8A", x"91", x"FE", x"AA", +x"20", x"F3", x"E8", x"20", x"8B", x"E8", x"90", x"F4", +x"18", x"60", x"20", x"7D", x"E8", x"A0", x"00", x"F0", +x"0D", x"BD", x"80", x"02", x"91", x"FE", x"D1", x"FE", +x"38", x"D0", x"2F", x"20", x"8B", x"E8", x"20", x"F6", +x"E7", x"20", x"17", x"E8", x"B1", x"FE", x"20", x"00", +x"E8", x"20", x"DC", x"E7", x"20", x"57", x"E6", x"A2", +x"00", x"20", x"46", x"E8", x"90", x"DE", x"C9", x"0D", +x"F0", x"E1", x"C9", x"27", x"F0", x"D3", x"C9", x"2D", +x"18", x"D0", x"07", x"20", x"E5", x"E8", x"18", x"90", +x"D5", x"18", x"60", x"20", x"7D", x"E8", x"20", x"F6", +x"E7", x"20", x"17", x"E8", x"20", x"57", x"E6", x"A2", +x"00", x"20", x"33", x"E6", x"20", x"C2", x"EB", x"90", +x"ED", x"60", x"A9", x"FD", x"85", x"FC", x"A0", x"04", +x"BD", x"80", x"02", x"E8", x"0A", x"0A", x"0A", x"0A", +x"66", x"F5", x"66", x"F4", x"88", x"10", x"F8", x"E6", +x"FC", x"30", x"EB", x"F0", x"F2", x"20", x"33", x"E6", +x"A9", x"80", x"D0", x"02", x"05", x"F8", x"85", x"F8", +x"20", x"40", x"E8", x"90", x"18", x"C9", x"23", x"D0", +x"04", x"A9", x"40", x"D0", x"EF", x"C9", x"28", x"D0", +x"04", x"A9", x"10", x"D0", x"E7", x"C9", x"27", x"D0", +x"30", x"BD", x"80", x"02", x"E8", x"85", x"E4", x"E6", +x"F8", x"20", x"40", x"E8", x"B0", x"07", x"85", x"E5", +x"E6", x"F8", x"20", x"40", x"E8", x"C9", x"21", x"D0", +x"08", x"A9", x"08", x"05", x"F8", x"85", x"F8", x"D0", +x"10", x"C9", x"22", x"D0", x"04", x"A9", x"04", x"D0", +x"F2", x"C9", x"2C", x"F0", x"E5", x"C9", x"29", x"F0", +x"E1", x"A2", x"D0", x"CA", x"F0", x"43", x"BD", x"00", +x"EA", x"30", x"F8", x"C5", x"F5", x"D0", x"F4", x"BD", +x"30", x"E9", x"C5", x"F4", x"D0", x"ED", x"E8", x"BD", +x"00", x"EA", x"10", x"2D", x"C5", x"F8", x"F0", x"10", +x"29", x"20", x"F0", x"F2", x"A5", x"E5", x"38", x"E9", +x"02", x"38", x"E5", x"FE", x"85", x"E4", x"A9", x"01", +x"29", x"03", x"48", x"A0", x"00", x"BD", x"30", x"E9", +x"91", x"FE", x"68", x"AA", x"18", x"20", x"8B", x"E8", +x"CA", x"30", x"07", x"B5", x"E4", x"91", x"FE", x"90", +x"F4", x"38", x"60", x"FF", x"FF", x"FF", x"FF", x"FF", +x"20", x"75", x"E8", x"90", x"14", x"A2", x"1C", x"8A", +x"48", x"20", x"F6", x"E7", x"20", x"A9", x"EC", x"20", +x"8B", x"E8", x"68", x"AA", x"CA", x"D0", x"F0", x"18", +x"60", x"20", x"F6", x"E7", x"20", x"A9", x"EC", x"20", +x"F3", x"E8", x"20", x"8B", x"E8", x"90", x"F2", x"18", +x"60", x"20", x"17", x"E8", x"A0", x"00", x"B1", x"FE", +x"A0", x"80", x"84", x"F8", x"A2", x"D0", x"CA", x"F0", +x"0D", x"DD", x"30", x"E9", x"D0", x"F8", x"BC", x"00", +x"EA", x"10", x"F3", x"84", x"F8", x"CA", x"BD", x"00", +x"EA", x"30", x"FA", x"85", x"F5", x"BD", x"30", x"E9", +x"85", x"F4", x"98", x"29", x"03", x"AA", x"A0", x"FF", +x"C8", x"B1", x"FE", x"20", x"00", x"E8", x"CA", x"10", +x"F7", x"C8", x"20", x"E4", x"E7", x"C0", x"04", x"D0", +x"F8", x"88", x"A2", x"05", x"A9", x"02", x"46", x"F5", +x"66", x"F4", x"2A", x"CA", x"D0", x"F8", x"20", x"F1", +x"FF", x"88", x"D0", x"EE", x"20", x"DC", x"E7", x"A5", +x"F8", x"0A", x"F0", x"A3", x"10", x"04", x"A9", x"23", +x"D0", x"08", x"29", x"20", x"F0", x"02", x"A9", x"08", +x"09", x"20", x"20", x"F1", x"FF", x"A5", x"F8", x"C9", +x"A1", x"D0", x"1D", x"20", x"8B", x"E8", x"B1", x"FE", +x"A8", x"38", x"65", x"FE", x"48", x"A6", x"FF", x"98", +x"10", x"03", x"B0", x"04", x"CA", x"90", x"01", x"E8", +x"8A", x"20", x"03", x"E8", x"68", x"4C", x"03", x"E8", +x"29", x"03", x"A8", x"B1", x"FE", x"20", x"03", x"E8", +x"20", x"8B", x"E8", x"88", x"88", x"F0", x"F4", x"A2", +x"58", x"A5", x"F8", x"29", x"1C", x"F0", x"22", x"0A", +x"0A", x"0A", x"0A", x"F0", x"0B", x"B0", x"04", x"10", +x"0E", x"30", x"0D", x"10", x"07", x"20", x"68", x"ED", +x"A9", x"29", x"D0", x"0A", x"20", x"60", x"ED", x"E8", +x"A9", x"2C", x"20", x"F1", x"FF", x"8A", x"4C", x"F1", +x"FF", x"18", x"60", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"A5", x"7B", x"85", x"FE", x"A5", x"7C", x"85", x"FF", +x"A9", x"00", x"85", x"F4", x"A9", x"04", x"85", x"F5", +x"20", x"B5", x"E8", x"E6", x"FE", x"E6", x"FF", x"A9", +x"60", x"A2", x"00", x"A0", x"14", x"20", x"B7", x"E7", +x"8D", x"00", x"88", x"CA", x"D0", x"F5", x"A8", x"88", +x"98", x"D0", x"F0", x"A0", x"08", x"20", x"DC", x"ED", +x"A5", x"FE", x"20", x"D8", x"ED", x"A5", x"FF", x"20", +x"D8", x"ED", x"20", x"D7", x"ED", x"20", x"D7", x"ED", +x"B1", x"F4", x"A2", x"07", x"A0", x"07", x"20", x"DC", +x"ED", x"E6", x"F4", x"D0", x"02", x"E6", x"F5", x"C6", +x"FE", x"D0", x"EA", x"C6", x"FF", x"D0", x"E9", x"60", +x"A2", x"07", x"A0", x"09", x"20", x"B7", x"E7", x"6A", +x"B0", x"05", x"8D", x"00", x"88", x"90", x"0D", x"A0", +x"0A", x"20", x"B7", x"E7", x"8D", x"00", x"88", x"A0", +x"09", x"20", x"B7", x"E7", x"A0", x"0A", x"20", x"B7", +x"E7", x"8D", x"00", x"88", x"CA", x"10", x"DB", x"60", +x"E8", x"F0", x"05", x"2C", x"FF", x"87", x"70", x"F8", +x"60", x"E8", x"F0", x"05", x"2C", x"FF", x"87", x"50", +x"F8", x"60", x"A0", x"08", x"20", x"1C", x"EE", x"6A", +x"88", x"D0", x"F9", x"60", x"A2", x"00", x"2C", x"FF", +x"87", x"50", x"08", x"20", x"00", x"EE", x"20", x"09", +x"EE", x"70", x"06", x"20", x"09", x"EE", x"20", x"00", +x"EE", x"E0", x"33", x"60", x"A2", x"00", x"2C", x"FF", +x"87", x"50", x"06", x"20", x"00", x"EE", x"E0", x"19", +x"60", x"20", x"09", x"EE", x"E0", x"19", x"60", x"20", +x"34", x"EE", x"90", x"FB", x"E0", x"33", x"B0", x"F7", +x"A0", x"0A", x"20", x"34", x"EE", x"90", x"F0", x"88", +x"D0", x"F8", x"20", x"34", x"EE", x"B0", x"FB", x"20", +x"34", x"EE", x"B0", x"E3", x"60", x"A0", x"FF", x"A9", +x"03", x"84", x"7B", x"85", x"7C", x"20", x"47", x"EE", +x"20", x"12", x"EE", x"85", x"FE", x"20", x"12", x"EE", +x"85", x"FF", x"20", x"12", x"EE", x"E6", x"7B", x"D0", +x"02", x"E6", x"7C", x"91", x"7B", x"C6", x"FE", x"D0", +x"F1", x"C6", x"FF", x"D0", x"ED", x"60", x"C9", x"10", +x"90", x"07", x"29", x"0F", x"09", x"70", x"85", x"E1", +x"60", x"09", x"60", x"85", x"E1", x"60", x"C9", x"10", +x"B0", x"07", x"29", x"0F", x"09", x"60", x"85", x"E7", +x"60", x"29", x"0F", x"09", x"70", x"85", x"E7", x"60", +x"C9", x"05", x"F0", x"19", x"C9", x"14", x"F0", x"18", +x"C9", x"02", x"F0", x"17", x"C9", x"15", x"F0", x"1B", +x"C9", x"16", x"F0", x"1F", x"EA", x"EA", x"EA", x"EA", +x"EA", x"EA", x"4C", x"F8", x"E3", x"4C", x"AA", x"E3", +x"4C", x"00", x"F0", x"A9", x"FF", x"8D", x"10", x"02", +x"4C", x"D8", x"E3", x"A9", x"00", x"8D", x"10", x"02", +x"4C", x"D8", x"E3", x"20", x"3E", x"E7", x"4C", x"D8", +x"E3", x"48", x"8A", x"48", x"98", x"48", x"2C", x"00", +x"80", x"10", x"FB", x"4C", x"6F", x"E7", x"20", x"33", +x"E6", x"C9", x"34", x"B0", x"0F", x"C9", x"30", x"90", +x"0B", x"29", x"03", x"AA", x"BD", x"19", x"EF", x"8D", +x"13", x"02", x"18", x"60", x"A2", x"EE", x"BD", x"2D", +x"EE", x"20", x"62", x"E7", x"E8", x"D0", x"F7", x"18", +x"60", x"A8", x"54", x"2A", x"15", x"0A", x"4E", x"45", +x"50", x"52", x"41", x"56", x"49", x"4C", x"41", x"4E", +x"20", x"55", x"4E", x"4F", x"53", x"A9", x"60", x"85", +x"E1", x"A9", x"00", x"85", x"E0", x"A8", x"A9", x"00", +x"91", x"E0", x"E6", x"E0", x"D0", x"F8", x"E6", x"E1", +x"A5", x"E1", x"C9", x"80", x"D0", x"F0", x"A0", x"57", +x"A9", x"EF", x"20", x"3B", x"E6", x"A0", x"84", x"A9", +x"E6", x"20", x"3B", x"E6", x"4C", x"AA", x"FF", x"20", +x"20", x"20", x"20", x"20", x"20", x"2A", x"2A", x"2A", +x"20", x"4F", x"20", x"52", x"20", x"41", x"20", x"4F", +x"20", x"2A", x"2A", x"2A", x"04", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"A9", x"00", x"85", x"E0", x"85", x"E3", x"AA", x"A8", +x"A9", x"E0", x"85", x"E1", x"A5", x"E7", x"85", x"EF", +x"EA", x"A5", x"E9", x"85", x"EE", x"B1", x"EE", x"85", +x"E2", x"A5", x"EE", x"18", x"69", x"20", x"85", x"EE", +x"E8", x"20", x"49", x"F0", x"A5", x"E1", x"C9", x"E3", +x"B0", x"73", x"E0", x"07", x"90", x"E7", x"A5", x"E0", +x"29", x"F8", x"85", x"E0", x"A2", x"00", x"E6", x"E3", +x"A5", x"E3", x"C9", x"02", x"90", x"D3", x"EA", x"EA", +x"20", x"6A", x"F0", x"20", x"62", x"E7", x"4C", x"D8", +x"E3", x"A5", x"E2", x"D1", x"E0", x"F0", x"14", x"18", +x"A5", x"E0", x"69", x"08", x"85", x"E0", x"90", x"02", +x"E6", x"E1", x"A5", x"E1", x"C9", x"E3", x"B0", x"09", +x"4C", x"49", x"F0", x"E6", x"E0", x"D0", x"02", x"E6", +x"E1", x"60", x"A5", x"E1", x"29", x"0F", x"0A", x"0A", +x"0A", x"0A", x"0A", x"18", x"69", x"20", x"85", x"E2", +x"A5", x"E0", x"29", x"F8", x"6A", x"6A", x"6A", x"65", +x"E2", x"85", x"E2", x"60", x"D1", x"E0", x"F0", x"0E", +x"18", x"A5", x"E0", x"69", x"08", x"85", x"E0", x"90", +x"02", x"E6", x"E1", x"4C", x"82", x"F0", x"E6", x"E0", +x"D0", x"02", x"E6", x"E1", x"60", x"A9", x"20", x"85", +x"E2", x"4C", x"43", x"F0", x"0A", x"0D", x"53", x"4E", +x"49", x"4D", x"41", x"4E", x"4A", x"45", x"20", x"3F", +x"04", x"24", x"0A", x"0D", x"52", x"45", x"50", x"52", +x"4F", x"44", x"55", x"4B", x"43", x"49", x"4A", x"41", +x"20", x"3F", x"04", x"0A", x"0D", x"4E", x"45", x"50", +x"52", x"41", x"56", x"49", x"4C", x"41", x"4E", x"20", +x"55", x"4E", x"4F", x"53", x"0A", x"0D", x"04", x"24", +x"A5", x"7B", x"85", x"FE", x"A5", x"7C", x"85", x"FF", +x"A9", x"00", x"85", x"F4", x"A9", x"04", x"85", x"F5", +x"4C", x"58", x"F1", x"A9", x"F0", x"A0", x"C3", x"20", +x"3B", x"E6", x"4C", x"74", x"C2", x"A2", x"FF", x"E8", +x"B5", x"13", x"9D", x"80", x"02", x"D0", x"F8", x"A2", +x"01", x"20", x"33", x"E6", x"E0", x"1A", x"B0", x"E3", +x"C9", x"22", x"D0", x"DF", x"A0", x"00", x"BD", x"81", +x"02", x"E8", x"99", x"00", x"03", x"C8", x"C0", x"0F", +x"B0", x"D1", x"C9", x"22", x"D0", x"F0", x"A9", x"00", +x"99", x"FF", x"02", x"E8", x"20", x"33", x"E6", x"BD", +x"80", x"02", x"F0", x"AC", x"20", x"5B", x"E8", x"B0", +x"BA", x"A5", x"F7", x"85", x"F5", x"A5", x"F6", x"85", +x"F4", x"20", x"33", x"E6", x"C9", x"2C", x"D0", x"AB", +x"20", x"33", x"E6", x"E8", x"20", x"5B", x"E8", x"B0", +x"A2", x"A5", x"F7", x"85", x"FF", x"A5", x"F6", x"85", +x"FE", x"20", x"33", x"E6", x"C9", x"00", x"D0", x"93", +x"A0", x"10", x"A9", x"FF", x"99", x"80", x"02", x"88", +x"D0", x"F8", x"A9", x"F0", x"A0", x"A4", x"20", x"3B", +x"E6", x"20", x"00", x"E5", x"A5", x"FC", x"C9", x"0D", +x"D0", x"F7", x"A9", x"10", x"A2", x"00", x"A0", x"14", +x"20", x"B7", x"E7", x"8D", x"00", x"88", x"CA", x"D0", +x"F5", x"A8", x"88", x"98", x"D0", x"F0", x"A0", x"08", +x"20", x"DC", x"ED", x"A0", x"10", x"20", x"D7", x"ED", +x"88", x"98", x"48", x"B9", x"00", x"EA", x"A2", x"07", +x"A0", x"07", x"20", x"DC", x"ED", x"EA", x"68", x"A8", +x"D0", x"EB", x"20", x"D7", x"ED", x"A0", x"FF", x"20", +x"D7", x"ED", x"C8", x"98", x"48", x"B9", x"00", x"03", +x"A2", x"07", x"A0", x"07", x"20", x"DC", x"ED", x"68", +x"A8", x"B9", x"00", x"03", x"D0", x"E9", x"20", x"D7", +x"ED", x"A5", x"F4", x"20", x"D8", x"ED", x"A5", x"F5", +x"20", x"D8", x"ED", x"A5", x"FE", x"20", x"D8", x"ED", +x"A5", x"FF", x"20", x"D8", x"ED", x"20", x"B5", x"E8", +x"A5", x"FE", x"20", x"D8", x"ED", x"A5", x"FF", x"20", +x"D8", x"ED", x"E6", x"FE", x"E6", x"FF", x"A9", x"05", +x"20", x"99", x"ED", x"4C", x"74", x"C2", x"4C", x"74", +x"C2", x"20", x"B0", x"E5", x"90", x"02", x"F0", x"F6", +x"A0", x"20", x"20", x"1C", x"EE", x"90", x"F2", x"88", +x"D0", x"F8", x"60", x"4C", x"DE", x"F2", x"A9", x"F0", +x"A0", x"C3", x"20", x"3B", x"E6", x"4C", x"74", x"C2", +x"A9", x"F0", x"A0", x"B2", x"20", x"3B", x"E6", x"20", +x"00", x"E5", x"A5", x"FC", x"C9", x"0D", x"D0", x"F7", +x"20", x"F6", x"E7", x"20", x"F6", x"E7", x"60", x"A5", +x"14", x"C9", x"43", x"D0", x"D6", x"A2", x"FF", x"E8", +x"B5", x"13", x"9D", x"80", x"02", x"D0", x"F8", x"A2", +x"02", x"20", x"33", x"E6", x"BD", x"80", x"02", x"D0", +x"C5", x"20", x"10", x"F2", x"20", x"F1", x"F1", x"20", +x"47", x"EE", x"A0", x"10", x"88", x"98", x"48", x"20", +x"12", x"EE", x"85", x"F4", x"68", x"A8", x"B9", x"00", +x"EA", x"EA", x"EA", x"EA", x"C5", x"F4", x"D0", x"E4", +x"88", x"D0", x"EA", x"A9", x"20", x"A0", x"03", x"85", +x"E0", x"84", x"E1", x"20", x"12", x"EE", x"20", x"12", +x"EE", x"91", x"E0", x"C9", x"00", x"F0", x"04", x"E6", +x"E0", x"D0", x"F3", x"20", x"12", x"EE", x"85", x"F4", +x"20", x"12", x"EE", x"85", x"F5", x"20", x"12", x"EE", +x"85", x"FE", x"20", x"12", x"EE", x"85", x"FF", x"20", +x"12", x"EE", x"85", x"E0", x"20", x"12", x"EE", x"85", +x"E1", x"A0", x"FF", x"C8", x"B9", x"20", x"03", x"20", +x"F1", x"FF", x"C9", x"00", x"D0", x"F5", x"A9", x"20", +x"20", x"F1", x"FF", x"C8", x"C0", x"0F", x"D0", x"F6", +x"A5", x"F5", x"20", x"03", x"E8", x"A5", x"F4", x"20", +x"03", x"E8", x"A5", x"FF", x"20", x"00", x"E8", x"A5", +x"FE", x"20", x"03", x"E8", x"A5", x"E1", x"20", x"00", +x"E8", x"A5", x"E0", x"20", x"03", x"E8", x"20", x"F6", +x"E7", x"4C", x"44", x"F2", x"A9", x"FF", x"85", x"F8", +x"4C", x"75", x"F3", x"4C", x"06", x"F2", x"A2", x"FF", +x"E8", x"B5", x"13", x"9D", x"80", x"02", x"D0", x"F8", +x"A2", x"01", x"20", x"33", x"E6", x"E0", x"1A", x"B0", +x"EA", x"C9", x"22", x"D0", x"E6", x"A0", x"00", x"BD", +x"81", x"02", x"E8", x"99", x"00", x"03", x"C8", x"C0", +x"0F", x"B0", x"D8", x"C9", x"22", x"D0", x"F0", x"A9", +x"00", x"99", x"FF", x"02", x"E8", x"20", x"33", x"E6", +x"BD", x"80", x"02", x"F0", x"BF", x"20", x"5B", x"E8", +x"B0", x"C1", x"20", x"33", x"E6", x"C9", x"00", x"D0", +x"BA", x"20", x"10", x"F2", x"A9", x"00", x"85", x"F8", +x"A5", x"7B", x"48", x"A5", x"7C", x"48", x"20", x"78", +x"F3", x"A5", x"F7", x"85", x"F5", x"A5", x"F6", x"85", +x"F4", x"A5", x"F4", x"C9", x"00", x"F0", x"09", x"C6", +x"F4", x"A5", x"F4", x"85", x"7B", x"18", x"90", x"08", +x"C6", x"F4", x"A5", x"F4", x"85", x"7B", x"C6", x"F5", +x"A5", x"F5", x"85", x"7C", x"E6", x"E0", x"E6", x"E1", +x"A5", x"E0", x"85", x"FE", x"A5", x"E1", x"85", x"FF", +x"20", x"47", x"EE", x"20", x"12", x"EE", x"20", x"12", +x"EE", x"20", x"7A", x"EE", x"68", x"85", x"7C", x"68", +x"85", x"7B", x"4C", x"74", x"C2", x"20", x"10", x"F2", +x"20", x"F1", x"F1", x"20", x"47", x"EE", x"A0", x"10", +x"88", x"98", x"48", x"20", x"12", x"EE", x"85", x"F4", +x"68", x"A8", x"B9", x"00", x"EA", x"C5", x"F4", x"D0", +x"EA", x"88", x"D0", x"ED", x"A9", x"20", x"A0", x"03", +x"85", x"E0", x"84", x"E1", x"20", x"12", x"EE", x"20", +x"12", x"EE", x"91", x"E0", x"C9", x"00", x"F0", x"04", +x"E6", x"E0", x"D0", x"F3", x"20", x"12", x"EE", x"85", +x"F4", x"20", x"12", x"EE", x"85", x"F5", x"20", x"12", +x"EE", x"85", x"FE", x"20", x"12", x"EE", x"85", x"FF", +x"20", x"12", x"EE", x"85", x"E0", x"20", x"12", x"EE", +x"85", x"E1", x"A0", x"FF", x"C8", x"B9", x"00", x"03", +x"C9", x"00", x"F0", x"18", x"D9", x"20", x"03", x"F0", +x"F3", x"A0", x"FF", x"C8", x"B9", x"20", x"03", x"20", +x"F1", x"FF", x"C9", x"00", x"D0", x"F5", x"20", x"F6", +x"E7", x"4C", x"78", x"F3", x"A5", x"F8", x"30", x"0B", +x"A0", x"20", x"A9", x"FF", x"99", x"80", x"02", x"88", +x"D0", x"F8", x"60", x"A0", x"FF", x"A9", x"03", x"84", +x"7B", x"85", x"7C", x"E6", x"E0", x"E6", x"E1", x"A5", +x"E0", x"85", x"FE", x"A5", x"E1", x"85", x"FF", x"20", +x"47", x"EE", x"20", x"12", x"EE", x"20", x"12", x"EE", +x"20", x"7A", x"EE", x"A0", x"20", x"A9", x"FF", x"99", +x"80", x"02", x"88", x"D0", x"F8", x"A5", x"7B", x"85", +x"7D", x"85", x"7F", x"A5", x"7C", x"85", x"7E", x"85", +x"80", x"4C", x"74", x"C2", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FC", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FA", x"FF", x"FA", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FA", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FC", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"A5", x"E3", x"49", x"FF", x"AA", +x"4A", x"4A", x"4A", x"20", x"8E", x"EE", x"EA", x"8A", +x"0A", x"0A", x"0A", x"0A", x"0A", x"85", x"E0", x"60", +x"FF", x"FF", x"FF", x"A5", x"E2", x"4A", x"4A", x"4A", +x"A8", x"60", x"01", x"02", x"04", x"08", x"10", x"20", +x"40", x"80", x"20", x"33", x"FE", x"20", x"4B", x"FE", +x"A5", x"E2", x"29", x"07", x"AA", x"BD", x"52", x"FE", +x"60", x"8A", x"48", x"98", x"48", x"20", x"5A", x"FE", +x"18", x"AE", x"0A", x"02", x"30", x"06", x"D0", x"08", +x"11", x"E0", x"90", x"08", x"51", x"E0", x"90", x"04", +x"49", x"FF", x"31", x"E0", x"91", x"E0", x"68", x"A8", +x"68", x"AA", x"60", x"8A", x"48", x"98", x"48", x"A2", +x"01", x"A5", x"E4", x"38", x"E5", x"E2", x"B0", x"06", +x"A2", x"FF", x"49", x"FF", x"69", x"01", x"85", x"F4", +x"85", x"F8", x"4A", x"69", x"00", x"85", x"F7", x"A0", +x"01", x"A5", x"E5", x"38", x"E5", x"E3", x"B0", x"06", +x"A0", x"FF", x"49", x"FF", x"69", x"01", x"85", x"F6", +x"C5", x"F4", x"B0", x"02", x"85", x"F8", x"4A", x"69", +x"00", x"85", x"F5", x"18", x"90", x"2C", x"A5", x"F5", +x"38", x"E5", x"F8", x"85", x"F5", x"90", x"03", x"D0", +x"0B", x"18", x"65", x"F6", x"85", x"F5", x"8A", x"18", +x"65", x"E2", x"85", x"E2", x"A5", x"F7", x"38", x"E5", +x"F8", x"85", x"F7", x"90", x"03", x"D0", x"0B", x"18", +x"65", x"F4", x"85", x"F7", x"98", x"18", x"65", x"E3", +x"85", x"E3", x"20", x"69", x"FE", x"A5", x"E2", x"C5", +x"E4", x"D0", x"CB", x"A5", x"E3", x"C5", x"E5", x"D0", +x"C5", x"68", x"A8", x"68", x"AA", x"60", x"8A", x"48", +x"98", x"48", x"A5", x"E2", x"85", x"E4", x"A5", x"E3", +x"85", x"E5", x"A9", x"00", x"85", x"F6", x"85", x"F7", +x"A9", x"FF", x"85", x"F4", x"A5", x"F8", x"85", x"F5", +x"A2", x"04", x"A0", x"24", x"A5", x"F7", x"0A", x"90", +x"03", x"E6", x"F5", x"18", x"E5", x"F4", x"49", x"FF", +x"85", x"F4", x"90", x"02", x"C6", x"F5", x"A5", x"F5", +x"0A", x"90", x"03", x"C6", x"F7", x"18", x"65", x"F6", +x"85", x"F6", x"90", x"02", x"E6", x"F7", x"A5", x"F5", +x"18", x"65", x"E4", x"85", x"E2", x"EA", x"EA", x"EA", +x"EA", x"A5", x"F7", x"18", x"65", x"E5", x"EA", x"EA", +x"EA", x"EA", x"85", x"E3", x"20", x"69", x"FE", x"88", +x"D0", x"C2", x"CA", x"D0", x"BF", x"A5", x"E4", x"85", +x"E2", x"A5", x"E5", x"85", x"E3", x"68", x"A8", x"68", +x"AA", x"60", x"48", x"8A", x"48", x"98", x"48", x"D8", +x"BA", x"BD", x"04", x"01", x"29", x"10", x"D0", x"06", +x"6C", x"1E", x"02", x"6C", x"20", x"02", x"6C", x"22", +x"02", x"78", x"D8", x"A2", x"F9", x"9A", x"A2", x"0F", +x"BD", x"8C", x"E6", x"95", x"E0", x"CA", x"10", x"F8", +x"A2", x"23", x"BD", x"9C", x"E6", x"9D", x"00", x"02", +x"CA", x"10", x"F7", x"4C", x"2D", x"EF", x"EA", x"4C", +x"4D", x"EF", x"20", x"57", x"E6", x"A2", x"00", x"20", +x"33", x"E6", x"E8", x"C9", x"0D", x"F0", x"F0", x"A0", +x"FF", x"C8", x"B9", x"00", x"E7", x"C9", x"FF", x"F0", +x"17", x"DD", x"7F", x"02", x"D0", x"F3", x"98", x"0A", +x"A8", x"B9", x"C8", x"E6", x"85", x"F6", x"B9", x"C9", +x"E6", x"85", x"F7", x"20", x"0B", x"E9", x"90", x"CF", +x"20", x"F4", x"E4", x"20", x"F6", x"E7", x"A9", x"3F", +x"20", x"F1", x"FF", x"38", x"B0", x"C1", x"FF", x"FF", +x"6C", x"FE", x"00", x"6C", x"14", x"02", x"6C", x"16", +x"02", x"6C", x"18", x"02", x"6C", x"1A", x"02", x"6C", +x"1C", x"02", x"83", x"FF", x"89", x"FF", x"72", x"FF" + ); +begin + process(clk) + begin + if rising_edge(clk) then + data <= romData(conv_integer(addr)); + end if; + end process; +end architecture; + diff --git a/ORAO_MiST/rtl/rom/rom_crt103.vhd b/ORAO_MiST/rtl/rom/rom_crt103.vhd new file mode 100644 index 00000000..a1f06523 --- /dev/null +++ b/ORAO_MiST/rtl/rom/rom_crt103.vhd @@ -0,0 +1,1051 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity rom_crt is + port ( + clk: in std_logic; + addr: in std_logic_vector(12 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end entity; + +architecture Behavioral of rom_crt is + type romDef is array(0 to 8191) of std_logic_vector(7 downto 0); + constant romData: romDef := ( +x"00", x"00", x"00", x"00", x"00", x"00", x"00", x"00", +x"08", x"08", x"08", x"08", x"08", x"00", x"08", x"00", +x"14", x"14", x"00", x"00", x"00", x"00", x"00", x"00", +x"28", x"28", x"7C", x"28", x"7C", x"28", x"28", x"00", +x"10", x"78", x"14", x"38", x"50", x"3C", x"10", x"00", +x"46", x"26", x"10", x"08", x"64", x"62", x"00", x"00", +x"08", x"14", x"14", x"0C", x"52", x"22", x"5C", x"00", +x"20", x"10", x"08", x"00", x"00", x"00", x"00", x"00", +x"20", x"10", x"08", x"08", x"08", x"10", x"20", x"00", +x"04", x"08", x"10", x"10", x"10", x"08", x"04", x"00", +x"00", x"10", x"54", x"38", x"54", x"10", x"00", x"00", +x"00", x"10", x"10", x"7C", x"10", x"10", x"00", x"00", +x"00", x"00", x"00", x"00", x"18", x"18", x"04", x"00", +x"00", x"00", x"00", x"7C", x"00", x"00", x"00", x"00", +x"00", x"00", x"00", x"00", x"18", x"18", x"00", x"00", +x"00", x"40", x"20", x"10", x"08", x"04", x"00", x"00", +x"38", x"44", x"64", x"54", x"4C", x"44", x"38", x"00", +x"10", x"18", x"10", x"10", x"10", x"10", x"38", x"00", +x"38", x"44", x"40", x"20", x"18", x"04", x"7C", x"00", +x"7C", x"20", x"10", x"20", x"40", x"44", x"38", x"00", +x"20", x"30", x"28", x"24", x"7C", x"20", x"20", x"00", +x"7C", x"04", x"3C", x"40", x"40", x"44", x"38", x"00", +x"30", x"08", x"04", x"3C", x"44", x"44", x"38", x"00", +x"7C", x"40", x"20", x"10", x"08", x"08", x"08", x"00", +x"38", x"44", x"44", x"38", x"44", x"44", x"38", x"00", +x"38", x"44", x"44", x"78", x"40", x"20", x"18", x"00", +x"00", x"18", x"18", x"00", x"18", x"18", x"00", x"00", +x"00", x"18", x"18", x"00", x"18", x"18", x"04", x"00", +x"20", x"10", x"08", x"04", x"08", x"10", x"20", x"00", +x"00", x"00", x"7C", x"00", x"7C", x"00", x"00", x"00", +x"04", x"08", x"10", x"20", x"10", x"08", x"04", x"00", +x"1C", x"22", x"20", x"18", x"08", x"00", x"08", x"00", +x"38", x"44", x"74", x"54", x"74", x"04", x"78", x"00", +x"38", x"44", x"44", x"7C", x"44", x"44", x"44", x"00", +x"3C", x"48", x"48", x"38", x"48", x"48", x"3C", x"00", +x"38", x"44", x"04", x"04", x"04", x"44", x"38", x"00", +x"3C", x"48", x"48", x"48", x"48", x"48", x"3C", x"00", +x"7C", x"04", x"04", x"1C", x"04", x"04", x"7C", x"00", +x"7C", x"04", x"04", x"1C", x"04", x"04", x"04", x"00", +x"38", x"44", x"04", x"04", x"74", x"44", x"78", x"00", +x"44", x"44", x"44", x"7C", x"44", x"44", x"44", x"00", +x"38", x"10", x"10", x"10", x"10", x"10", x"38", x"00", +x"70", x"20", x"20", x"20", x"20", x"24", x"18", x"00", +x"44", x"24", x"14", x"0C", x"14", x"24", x"44", x"00", +x"04", x"04", x"04", x"04", x"04", x"04", x"7C", x"00", +x"44", x"6C", x"54", x"54", x"44", x"44", x"44", x"00", +x"44", x"44", x"4C", x"54", x"64", x"44", x"44", x"00", +x"38", x"44", x"44", x"44", x"44", x"44", x"38", x"00", +x"3C", x"44", x"44", x"3C", x"04", x"04", x"04", x"00", +x"38", x"44", x"44", x"44", x"54", x"24", x"58", x"00", +x"3C", x"44", x"44", x"3C", x"14", x"24", x"44", x"00", +x"38", x"44", x"08", x"10", x"20", x"44", x"38", x"00", +x"7C", x"10", x"10", x"10", x"10", x"10", x"10", x"00", +x"44", x"44", x"44", x"44", x"44", x"44", x"38", x"00", +x"44", x"44", x"44", x"44", x"44", x"28", x"10", x"00", +x"44", x"44", x"44", x"54", x"54", x"54", x"28", x"00", +x"44", x"44", x"28", x"10", x"28", x"44", x"44", x"00", +x"44", x"44", x"44", x"28", x"10", x"10", x"10", x"00", +x"7C", x"40", x"20", x"10", x"08", x"04", x"7C", x"00", +x"28", x"38", x"44", x"04", x"04", x"44", x"38", x"00", +x"20", x"38", x"44", x"04", x"04", x"44", x"38", x"00", +x"3C", x"48", x"48", x"5C", x"48", x"48", x"3C", x"00", +x"28", x"38", x"44", x"08", x"30", x"44", x"38", x"00", +x"28", x"7C", x"40", x"20", x"10", x"08", x"7C", x"00", +x"10", x"28", x"44", x"00", x"00", x"00", x"00", x"00", +x"00", x"18", x"20", x"38", x"24", x"38", x"00", x"00", +x"04", x"04", x"1C", x"24", x"24", x"1C", x"00", x"00", +x"00", x"38", x"04", x"04", x"04", x"38", x"00", x"00", +x"20", x"20", x"38", x"24", x"24", x"38", x"00", x"00", +x"00", x"18", x"24", x"1C", x"04", x"18", x"00", x"00", +x"10", x"28", x"08", x"1C", x"08", x"08", x"08", x"00", +x"00", x"38", x"24", x"24", x"38", x"20", x"18", x"00", +x"04", x"04", x"1C", x"24", x"24", x"24", x"00", x"00", +x"10", x"00", x"18", x"10", x"10", x"38", x"00", x"00", +x"10", x"00", x"18", x"10", x"10", x"14", x"08", x"00", +x"04", x"04", x"14", x"0C", x"14", x"24", x"00", x"00", +x"18", x"10", x"10", x"10", x"10", x"38", x"00", x"00", +x"00", x"2C", x"54", x"54", x"54", x"54", x"00", x"00", +x"00", x"1C", x"24", x"24", x"24", x"24", x"00", x"00", +x"00", x"18", x"24", x"24", x"24", x"18", x"00", x"00", +x"00", x"1C", x"24", x"24", x"1C", x"04", x"04", x"00", +x"00", x"1C", x"12", x"12", x"1C", x"10", x"78", x"00", +x"00", x"34", x"0C", x"04", x"04", x"04", x"00", x"00", +x"00", x"38", x"04", x"18", x"20", x"1C", x"00", x"00", +x"10", x"38", x"10", x"10", x"10", x"20", x"00", x"00", +x"00", x"24", x"24", x"24", x"24", x"38", x"00", x"00", +x"00", x"44", x"44", x"44", x"28", x"10", x"00", x"00", +x"00", x"44", x"44", x"54", x"54", x"28", x"00", x"00", +x"00", x"44", x"28", x"10", x"28", x"44", x"00", x"00", +x"00", x"24", x"24", x"24", x"38", x"20", x"18", x"00", +x"00", x"3C", x"20", x"10", x"08", x"3C", x"00", x"00", +x"38", x"00", x"38", x"04", x"04", x"38", x"00", x"00", +x"20", x"00", x"38", x"04", x"04", x"38", x"00", x"00", +x"20", x"70", x"20", x"38", x"24", x"38", x"00", x"00", +x"28", x"38", x"04", x"18", x"20", x"1C", x"00", x"00", +x"38", x"00", x"3C", x"10", x"08", x"3C", x"00", x"00", +x"09", x"0A", x"0B", x"1F", x"14", x"13", x"12", x"11", +x"36", x"74", x"7A", x"72", x"37", x"75", x"69", x"6F", +x"31", x"77", x"71", x"65", x"6D", x"6B", x"6A", x"6C", +x"79", x"73", x"61", x"64", x"6E", x"67", x"68", x"66", +x"3A", x"7F", x"7C", x"7B", x"3B", x"7E", x"7D", x"70", +x"00", x"0D", x"00", x"20", x"34", x"35", x"39", x"38", +x"33", x"32", x"2E", x"2C", x"63", x"78", x"76", x"62", +x"60", x"2F", x"30", x"2D", x"87", x"FC", x"87", x"FA", +x"87", x"F6", x"87", x"EE", x"87", x"DE", x"87", x"BE", +x"87", x"7E", x"86", x"FE", x"85", x"FE", x"83", x"FE", +x"85", x"FC", x"8A", x"48", x"98", x"48", x"A5", x"FC", +x"A8", x"2A", x"2A", x"2A", x"2A", x"29", x"03", x"AA", +x"BD", x"00", x"02", x"D0", x"05", x"BD", x"04", x"02", +x"F0", x"24", x"85", x"F1", x"98", x"0A", x"0A", x"0A", +x"85", x"F0", x"A0", x"07", x"B1", x"F0", x"84", x"FA", +x"A4", x"E9", x"20", x"C1", x"EE", x"EA", x"EA", x"EA", +x"91", x"E6", x"A5", x"E6", x"38", x"E9", x"20", x"85", +x"E6", x"A4", x"FA", x"88", x"10", x"E6", x"68", x"A8", +x"68", x"AA", x"A5", x"FC", x"60", x"A6", x"EA", x"86", +x"E8", x"A4", x"EC", x"84", x"E9", x"A9", x"E0", x"85", +x"E6", x"A5", x"E8", x"4C", x"9E", x"EE", x"EA", x"EA", +x"EA", x"60", x"A6", x"EB", x"18", x"90", x"05", x"20", +x"95", x"E3", x"A4", x"EC", x"20", x"AD", x"E4", x"C4", +x"ED", x"C8", x"90", x"F8", x"E4", x"EB", x"B0", x"15", +x"E8", x"E6", x"E7", x"90", x"ED", x"C6", x"E9", x"C4", +x"EC", x"D0", x"0D", x"A4", x"ED", x"84", x"E9", x"E4", +x"EA", x"F0", x"05", x"C6", x"E8", x"20", x"9D", x"E3", +x"68", x"A8", x"68", x"AA", x"A5", x"FC", x"60", x"85", +x"FC", x"8A", x"48", x"98", x"48", x"A5", x"FC", x"A6", +x"E8", x"A4", x"E9", x"C9", x"20", x"B0", x"39", x"2C", +x"08", x"02", x"30", x"34", x"C9", x"05", x"F0", x"B2", +x"C9", x"0C", x"F0", x"B3", x"C9", x"06", x"F0", x"B4", +x"C9", x"08", x"F0", x"C1", x"C9", x"0B", x"F0", x"C7", +x"C9", x"09", x"F0", x"1F", x"C9", x"0A", x"F0", x"25", +x"C9", x"0D", x"F0", x"6A", x"C9", x"04", x"D0", x"06", +x"20", x"95", x"E3", x"4C", x"D8", x"E3", x"C9", x"07", +x"D0", x"B6", x"20", x"F4", x"E4", x"4C", x"D8", x"E3", +x"20", x"50", x"E3", x"E6", x"E9", x"C4", x"ED", x"90", +x"A7", x"A4", x"EC", x"84", x"E9", x"E6", x"E8", x"E4", +x"EB", x"90", x"9A", x"C6", x"E8", x"A5", x"EA", x"20", +x"A3", x"E3", x"A5", x"E6", x"18", x"90", x"13", x"E6", +x"E7", x"A4", x"EC", x"B1", x"E6", x"91", x"EE", x"C4", +x"ED", x"C8", x"90", x"F7", x"A5", x"E6", x"E9", x"20", +x"85", x"E6", x"85", x"EE", x"B0", x"EB", x"A5", x"E7", +x"85", x"EF", x"38", x"E9", x"60", x"C5", x"EB", x"90", +x"DE", x"2C", x"43", x"02", x"10", x"03", x"20", x"4E", +x"F0", x"4C", x"B2", x"E3", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"4C", x"9F", +x"E4", x"F0", x"1C", x"A0", x"09", x"88", x"F0", x"17", +x"A2", x"FF", x"20", x"E3", x"E4", x"20", x"0F", x"E6", +x"D0", x"F3", x"A4", x"E9", x"20", x"C2", x"E4", x"20", +x"0F", x"E6", x"F0", x"FB", x"20", x"C2", x"E4", x"A6", +x"E8", x"AD", x"09", x"02", x"D0", x"8B", x"A4", x"EC", +x"84", x"E9", x"4C", x"D8", x"E3", x"86", x"FB", x"A2", +x"08", x"A9", x"00", x"91", x"E6", x"A5", x"E6", x"38", +x"E9", x"20", x"85", x"E6", x"CA", x"D0", x"F2", x"A6", +x"FB", x"60", x"86", x"FB", x"A2", x"08", x"B1", x"E6", +x"49", x"FF", x"91", x"E6", x"A5", x"E6", x"38", x"E9", +x"20", x"85", x"E6", x"CA", x"D0", x"F0", x"A6", x"FB", +x"60", x"48", x"98", x"A0", x"BB", x"88", x"D0", x"FD", +x"A8", x"68", x"60", x"20", x"D9", x"E4", x"CA", x"D0", +x"FA", x"60", x"8E", x"00", x"88", x"20", x"D9", x"E4", +x"CA", x"D0", x"F7", x"60", x"48", x"8A", x"A2", x"70", +x"20", x"EA", x"E4", x"AA", x"68", x"60", x"FF", x"FF", +x"8A", x"48", x"98", x"48", x"20", x"42", x"F0", x"8D", +x"42", x"02", x"20", x"42", x"F0", x"49", x"FF", x"91", +x"E6", x"A0", x"00", x"88", x"F0", x"F4", x"20", x"B0", +x"E5", x"90", x"3E", x"85", x"FC", x"F0", x"3A", x"A2", +x"0A", x"20", x"E3", x"E4", x"20", x"B0", x"E5", x"90", +x"30", x"C5", x"FC", x"D0", x"2C", x"A4", x"E9", x"AD", +x"42", x"02", x"91", x"E6", x"AD", x"0C", x"02", x"D0", +x"06", x"38", x"6E", x"0C", x"02", x"90", x"23", x"2C", +x"0C", x"02", x"10", x"0E", x"A9", x"40", x"8D", x"0C", +x"02", x"A0", x"30", x"20", x"3F", x"F0", x"90", x"09", +x"B0", x"10", x"A0", x"08", x"20", x"3F", x"F0", x"B0", +x"09", x"A9", x"00", x"8D", x"0C", x"02", x"4C", x"13", +x"E5", x"EA", x"AD", x"FB", x"87", x"29", x"20", x"0A", +x"85", x"FA", x"AD", x"FD", x"87", x"29", x"20", x"05", +x"FA", x"0A", x"85", x"FA", x"A5", x"FC", x"C9", x"21", +x"90", x"2D", x"C9", x"60", x"B0", x"0F", x"2C", x"0E", +x"02", x"10", x"02", x"EA", x"EA", x"A4", x"FA", x"30", +x"1E", x"49", x"10", x"D0", x"1A", x"F0", x"05", x"2C", +x"0D", x"02", x"10", x"04", x"A4", x"FA", x"30", x"02", +x"49", x"20", x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", +x"EA", x"24", x"FA", x"70", x"02", x"29", x"1F", x"85", +x"FC", x"68", x"A8", x"68", x"AA", x"A5", x"FC", x"60", +x"8A", x"48", x"98", x"48", x"A2", x"14", x"CA", x"CA", +x"30", x"2D", x"BD", x"3C", x"E3", x"85", x"F1", x"BD", +x"3D", x"E3", x"85", x"F0", x"20", x"F9", x"E5", x"90", +x"ED", x"C0", x"00", x"D0", x"21", x"0A", x"B0", x"09", +x"C8", x"0A", x"B0", x"05", x"C8", x"0A", x"B0", x"01", +x"C8", x"8A", x"0A", x"84", x"FA", x"18", x"65", x"FA", +x"AA", x"BD", x"00", x"E3", x"85", x"FA", x"38", x"68", +x"A8", x"68", x"AA", x"A5", x"FA", x"60", x"29", x"10", +x"D0", x"01", x"88", x"8A", x"18", x"69", x"28", x"D0", +x"E2", x"38", x"A0", x"00", x"B1", x"F0", x"09", x"0F", +x"49", x"FF", x"D0", x"0A", x"C8", x"B1", x"F0", x"09", +x"CF", x"49", x"FF", x"D0", x"01", x"18", x"60", x"AD", +x"00", x"80", x"09", x"0F", x"49", x"FF", x"D0", x"07", +x"AD", x"01", x"80", x"09", x"CF", x"49", x"FF", x"60", +x"4C", x"2D", x"F0", x"C9", x"57", x"D0", x"03", x"4C", +x"03", x"C0", x"C9", x"43", x"D0", x"03", x"4C", x"00", +x"C0", x"60", x"E8", x"BD", x"80", x"02", x"C9", x"20", +x"F0", x"F8", x"60", x"85", x"F3", x"84", x"F2", x"98", +x"48", x"A0", x"00", x"B1", x"F2", x"C9", x"04", x"F0", +x"0B", x"20", x"F1", x"FF", x"E6", x"F2", x"D0", x"F3", +x"E6", x"F3", x"D0", x"EF", x"68", x"A8", x"60", x"A2", +x"00", x"8A", x"F0", x"01", x"CA", x"20", x"EE", x"FF", +x"9D", x"80", x"02", x"C9", x"0D", x"F0", x"1B", x"C9", +x"08", x"F0", x"EE", x"C9", x"18", x"F0", x"0D", x"C9", +x"20", x"90", x"EA", x"E8", x"10", x"E7", x"20", x"F4", +x"E4", x"38", x"B0", x"E0", x"A9", x"0D", x"A2", x"00", +x"F0", x"DE", x"60", x"FF", x"0D", x"0A", x"00", x"00", +x"00", x"00", x"2A", x"04", x"E0", x"2F", x"00", x"00", +x"00", x"00", x"E0", x"60", x"00", x"00", x"00", x"1F", +x"00", x"1F", x"E0", x"20", x"00", x"00", x"00", x"00", +x"00", x"E0", x"E1", x"E2", x"00", x"00", x"00", x"00", +x"FF", x"00", x"00", x"00", x"00", x"FF", x"FD", x"53", +x"FF", x"FF", x"1C", x"E7", x"62", x"E7", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"20", x"E6", x"FD", x"E8", x"06", x"E9", x"0E", x"E9", +x"D0", x"EA", x"09", x"EB", x"48", x"EB", x"6A", x"EB", +x"AB", x"EB", x"80", x"EC", x"D0", x"EE", x"57", x"EF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"42", x"4A", x"55", x"45", x"43", x"51", x"46", x"4D", +x"41", x"58", x"48", x"23", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"20", x"00", x"E5", x"C9", +x"11", x"D0", x"0B", x"AD", x"0D", x"02", x"49", x"FF", +x"8D", x"0D", x"02", x"6C", x"16", x"02", x"C9", x"12", +x"D0", x"0B", x"AD", x"10", x"02", x"49", x"FF", x"8D", +x"10", x"02", x"6C", x"16", x"02", x"C9", x"13", x"D0", +x"0B", x"AD", x"0E", x"02", x"49", x"FF", x"8D", x"0E", +x"02", x"6C", x"16", x"02", x"4C", x"45", x"F0", x"EA", +x"2C", x"0F", x"02", x"30", x"03", x"20", x"F1", x"FF", +x"60", x"48", x"8A", x"2C", x"00", x"80", x"10", x"FB", +x"30", x"0A", x"20", x"DF", x"E3", x"2C", x"10", x"02", +x"10", x"EE", x"30", x"ED", x"48", x"98", x"48", x"BA", +x"BD", x"03", x"01", x"A2", x"09", x"18", x"2A", x"6A", +x"B0", x"05", x"8D", x"00", x"98", x"90", x"07", x"29", +x"FF", x"30", x"03", x"8D", x"00", x"90", x"AC", x"13", +x"02", x"20", x"B8", x"E7", x"CA", x"30", x"06", x"D0", +x"E6", x"09", x"01", x"D0", x"E2", x"68", x"A8", x"68", +x"AA", x"68", x"60", x"FF", x"FF", x"FF", x"FF", x"A0", +x"00", x"8C", x"00", x"98", x"8C", x"00", x"90", x"2C", +x"FF", x"87", x"10", x"03", x"C8", x"D0", x"F8", x"88", +x"84", x"F4", x"60", x"AE", x"2A", x"0A", x"04", x"EA", +x"EA", x"EA", x"EA", x"EA", x"EA", x"EA", x"88", x"D0", +x"F6", x"60", x"FF", x"48", x"10", x"05", x"38", x"90", +x"02", x"49", x"80", x"0A", x"D0", x"F9", x"68", x"60", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"48", x"A9", x"20", x"20", +x"F1", x"FF", x"68", x"60", x"A2", x"03", x"20", x"DC", +x"E7", x"CA", x"D0", x"FA", x"60", x"C9", x"0A", x"90", +x"02", x"69", x"06", x"69", x"30", x"60", x"A9", x"0D", +x"20", x"F1", x"FF", x"A9", x"0A", x"4C", x"F1", x"FF", +x"20", x"DC", x"E7", x"48", x"4A", x"4A", x"4A", x"4A", +x"20", x"ED", x"E7", x"20", x"F1", x"FF", x"68", x"29", +x"0F", x"20", x"ED", x"E7", x"4C", x"F1", x"FF", x"20", +x"DC", x"E7", x"A5", x"FF", x"20", x"03", x"E8", x"A5", +x"FE", x"4C", x"03", x"E8", x"20", x"33", x"E6", x"BD", +x"80", x"02", x"E8", x"C9", x"30", x"90", x"0F", x"E9", +x"30", x"C9", x"0A", x"90", x"0A", x"C9", x"11", x"90", +x"05", x"E9", x"07", x"C9", x"10", x"60", x"38", x"60", +x"20", x"27", x"E8", x"90", x"06", x"60", x"20", x"24", +x"E8", x"B0", x"0F", x"0A", x"0A", x"0A", x"0A", x"85", +x"FC", x"20", x"27", x"E8", x"B0", x"04", x"05", x"FC", +x"85", x"FC", x"60", x"20", x"46", x"E8", x"B0", x"07", +x"85", x"F7", x"20", x"40", x"E8", x"85", x"F6", x"60", +x"20", x"7D", x"E8", x"B0", x"1D", x"20", x"92", x"E8", +x"B0", x"18", x"4C", x"5B", x"E8", x"20", x"7D", x"E8", +x"B0", x"10", x"4C", x"5B", x"E8", x"20", x"5B", x"E8", +x"B0", x"08", x"A5", x"F6", x"85", x"FE", x"A5", x"F7", +x"85", x"FF", x"60", x"E6", x"FE", x"D0", x"02", x"E6", +x"FF", x"60", x"20", x"5B", x"E8", x"B0", x"08", x"A5", +x"F6", x"85", x"F4", x"A5", x"F7", x"85", x"F5", x"60", +x"E6", x"F4", x"D0", x"02", x"E6", x"F5", x"60", x"18", +x"A5", x"FE", x"65", x"F6", x"85", x"FE", x"A5", x"FF", +x"65", x"F7", x"85", x"FF", x"60", x"38", x"A5", x"FE", +x"E5", x"F4", x"85", x"FE", x"A5", x"FF", x"E5", x"F5", +x"85", x"FF", x"60", x"38", x"A5", x"F6", x"E5", x"F4", +x"A5", x"F7", x"E5", x"F5", x"60", x"38", x"A5", x"FE", +x"E5", x"F4", x"A5", x"FF", x"E5", x"F5", x"60", x"18", +x"A5", x"F6", x"E9", x"00", x"85", x"F6", x"A5", x"F7", +x"E9", x"00", x"85", x"F7", x"60", x"18", x"A5", x"FE", +x"E9", x"00", x"85", x"FE", x"A5", x"FF", x"E9", x"00", +x"85", x"FF", x"60", x"38", x"A5", x"FE", x"E5", x"F6", +x"A5", x"FF", x"E5", x"F7", x"60", x"20", x"5B", x"E8", +x"B0", x"2C", x"68", x"68", x"90", x"05", x"20", x"5B", +x"E8", x"B0", x"23", x"6C", x"F6", x"00", x"20", x"75", +x"E8", x"B0", x"1B", x"A0", x"00", x"20", x"F6", x"E7", +x"20", x"17", x"E8", x"A2", x"09", x"CA", x"F0", x"F5", +x"B1", x"FE", x"20", x"00", x"E8", x"20", x"F3", x"E8", +x"20", x"8B", x"E8", x"90", x"F0", x"18", x"60", x"FF", +x"00", x"90", x"6D", x"65", x"69", x"7D", x"79", x"61", +x"71", x"75", x"D0", x"2D", x"25", x"29", x"3D", x"39", +x"21", x"31", x"35", x"30", x"0A", x"0E", x"06", x"1E", +x"16", x"08", x"90", x"08", x"B0", x"88", x"F0", x"48", +x"2C", x"24", x"C8", x"30", x"C8", x"D0", x"28", x"10", +x"28", x"00", x"A8", x"50", x"A8", x"70", x"D8", x"18", +x"D8", x"D8", x"D8", x"58", x"D8", x"B8", x"D8", x"CD", +x"C5", x"C9", x"DD", x"D9", x"C1", x"D1", x"D5", x"38", +x"EC", x"E4", x"E0", x"38", x"CC", x"C4", x"C0", x"84", +x"CE", x"C6", x"DE", x"D6", x"84", x"CA", x"84", x"88", +x"D4", x"4D", x"45", x"49", x"5D", x"59", x"41", x"51", +x"55", x"D2", x"EE", x"E6", x"FE", x"F6", x"D2", x"E8", +x"D2", x"C8", x"CA", x"4C", x"6C", x"2A", x"20", x"86", +x"AD", x"A5", x"A9", x"BD", x"B9", x"A1", x"B1", x"B5", +x"86", x"AE", x"A6", x"A2", x"BE", x"B6", x"86", x"AC", +x"A4", x"A0", x"BC", x"B4", x"26", x"4A", x"4E", x"46", +x"5E", x"56", x"CE", x"EA", x"3E", x"0D", x"05", x"09", +x"1D", x"19", x"01", x"11", x"15", x"41", x"48", x"41", +x"08", x"C1", x"68", x"C1", x"28", x"C9", x"2A", x"2E", +x"26", x"3E", x"36", x"C9", x"6A", x"6E", x"66", x"7E", +x"76", x"A9", x"40", x"A9", x"60", x"19", x"ED", x"E5", +x"E9", x"FD", x"F9", x"E1", x"F1", x"F5", x"99", x"38", +x"99", x"F8", x"99", x"78", x"B9", x"8D", x"85", x"9D", +x"99", x"81", x"91", x"95", x"B9", x"8E", x"86", x"96", +x"B9", x"8C", x"84", x"94", x"05", x"AA", x"05", x"A8", +x"25", x"BA", x"65", x"8A", x"65", x"9A", x"65", x"98", +x"00", x"60", x"82", x"81", x"C1", x"8A", x"86", x"99", +x"95", x"89", x"11", x"82", x"81", x"C1", x"8A", x"86", +x"99", x"95", x"89", x"1B", x"80", x"82", x"81", x"8A", +x"89", x"63", x"A1", x"67", x"A1", x"46", x"A1", x"16", +x"82", x"81", x"4A", x"A1", x"51", x"A1", x"18", x"A1", +x"69", x"80", x"61", x"A1", x"65", x"A1", x"60", x"80", +x"10", x"80", x"48", x"80", x"34", x"80", x"06", x"82", +x"81", x"C1", x"8A", x"86", x"99", x"95", x"89", x"0C", +x"82", x"81", x"C1", x"4C", x"82", x"81", x"C1", x"62", +x"82", x"81", x"8A", x"89", x"0E", x"80", x"4E", x"80", +x"27", x"82", x"81", x"C1", x"8A", x"86", x"99", x"95", +x"89", x"61", x"82", x"81", x"8A", x"89", x"0D", x"80", +x"4D", x"80", x"06", x"82", x"92", x"27", x"82", x"40", +x"82", x"81", x"C1", x"8A", x"86", x"99", x"95", x"89", +x"0C", x"82", x"81", x"C1", x"86", x"85", x"4C", x"82", +x"81", x"C1", x"8A", x"89", x"27", x"80", x"82", x"81", +x"8A", x"89", x"07", x"80", x"41", x"82", x"81", x"C1", +x"8A", x"86", x"99", x"95", x"89", x"40", x"80", x"04", +x"80", x"40", x"80", x"04", x"80", x"1B", x"80", x"82", +x"81", x"8A", x"89", x"27", x"80", x"82", x"81", x"8A", +x"89", x"48", x"80", x"64", x"80", x"61", x"82", x"81", +x"C1", x"8A", x"86", x"99", x"95", x"89", x"62", x"80", +x"12", x"80", x"4A", x"80", x"40", x"82", x"81", x"8A", +x"86", x"99", x"95", x"89", x"0C", x"82", x"81", x"85", +x"4C", x"82", x"81", x"89", x"0E", x"80", x"4E", x"80", +x"0F", x"80", x"40", x"80", x"64", x"80", x"42", x"80", +x"20", x"75", x"E8", x"B0", x"33", x"A2", x"00", x"86", +x"F4", x"86", x"F5", x"A0", x"00", x"8A", x"71", x"FE", +x"AA", x"90", x"06", x"E6", x"F4", x"D0", x"02", x"E6", +x"F5", x"20", x"F3", x"E8", x"20", x"8B", x"E8", x"90", +x"EC", x"20", x"F6", x"E7", x"A9", x"3D", x"20", x"F1", +x"FF", x"A5", x"F5", x"20", x"00", x"E8", x"A5", x"F4", +x"20", x"00", x"E8", x"8A", x"20", x"00", x"E8", x"18", +x"60", x"20", x"68", x"E8", x"B0", x"25", x"20", x"C3", +x"E8", x"90", x"33", x"A0", x"00", x"20", x"CD", x"E8", +x"90", x"1A", x"20", x"B5", x"E8", x"20", x"A7", x"E8", +x"B0", x"11", x"B1", x"F6", x"91", x"FE", x"20", x"D7", +x"E8", x"90", x"08", x"20", x"E5", x"E8", x"20", x"C3", +x"E8", x"B0", x"EF", x"60", x"B1", x"F4", x"91", x"FE", +x"20", x"A0", x"E8", x"F0", x"F6", x"20", x"8B", x"E8", +x"20", x"C3", x"E8", x"B0", x"EF", x"60", x"38", x"60", +x"20", x"75", x"E8", x"B0", x"1C", x"A0", x"00", x"20", +x"46", x"E8", x"90", x"09", x"C9", x"27", x"D0", x"EE", +x"BD", x"80", x"02", x"AA", x"8A", x"91", x"FE", x"AA", +x"20", x"F3", x"E8", x"20", x"8B", x"E8", x"90", x"F4", +x"18", x"60", x"20", x"7D", x"E8", x"A0", x"00", x"F0", +x"0D", x"BD", x"80", x"02", x"91", x"FE", x"D1", x"FE", +x"38", x"D0", x"2F", x"20", x"8B", x"E8", x"20", x"F6", +x"E7", x"20", x"17", x"E8", x"B1", x"FE", x"20", x"00", +x"E8", x"20", x"DC", x"E7", x"20", x"57", x"E6", x"A2", +x"00", x"20", x"46", x"E8", x"90", x"DE", x"C9", x"0D", +x"F0", x"E1", x"C9", x"27", x"F0", x"D3", x"C9", x"2D", +x"18", x"D0", x"07", x"20", x"E5", x"E8", x"18", x"90", +x"D5", x"18", x"60", x"20", x"7D", x"E8", x"20", x"F6", +x"E7", x"20", x"17", x"E8", x"20", x"57", x"E6", x"A2", +x"00", x"20", x"33", x"E6", x"20", x"C2", x"EB", x"90", +x"ED", x"60", x"A9", x"FD", x"85", x"FC", x"A0", x"04", +x"BD", x"80", x"02", x"E8", x"0A", x"0A", x"0A", x"0A", +x"66", x"F5", x"66", x"F4", x"88", x"10", x"F8", x"E6", +x"FC", x"30", x"EB", x"F0", x"F2", x"20", x"33", x"E6", +x"A9", x"80", x"D0", x"02", x"05", x"F8", x"85", x"F8", +x"20", x"40", x"E8", x"90", x"18", x"C9", x"23", x"D0", +x"04", x"A9", x"40", x"D0", x"EF", x"C9", x"28", x"D0", +x"04", x"A9", x"10", x"D0", x"E7", x"C9", x"27", x"D0", +x"30", x"BD", x"80", x"02", x"E8", x"85", x"E4", x"E6", +x"F8", x"20", x"40", x"E8", x"B0", x"07", x"85", x"E5", +x"E6", x"F8", x"20", x"40", x"E8", x"C9", x"21", x"D0", +x"08", x"A9", x"08", x"05", x"F8", x"85", x"F8", x"D0", +x"10", x"C9", x"22", x"D0", x"04", x"A9", x"04", x"D0", +x"F2", x"C9", x"2C", x"F0", x"E5", x"C9", x"29", x"F0", +x"E1", x"A2", x"D0", x"CA", x"F0", x"43", x"BD", x"00", +x"EA", x"30", x"F8", x"C5", x"F5", x"D0", x"F4", x"BD", +x"30", x"E9", x"C5", x"F4", x"D0", x"ED", x"E8", x"BD", +x"00", x"EA", x"10", x"2D", x"C5", x"F8", x"F0", x"10", +x"29", x"20", x"F0", x"F2", x"A5", x"E5", x"38", x"E9", +x"02", x"38", x"E5", x"FE", x"85", x"E4", x"A9", x"01", +x"29", x"03", x"48", x"A0", x"00", x"BD", x"30", x"E9", +x"91", x"FE", x"68", x"AA", x"18", x"20", x"8B", x"E8", +x"CA", x"30", x"07", x"B5", x"E4", x"91", x"FE", x"90", +x"F4", x"38", x"60", x"FF", x"FF", x"FF", x"FF", x"FF", +x"20", x"75", x"E8", x"90", x"14", x"A2", x"0C", x"8A", +x"48", x"20", x"F6", x"E7", x"20", x"A9", x"EC", x"20", +x"8B", x"E8", x"68", x"AA", x"CA", x"D0", x"F0", x"18", +x"60", x"20", x"F6", x"E7", x"20", x"A9", x"EC", x"20", +x"F3", x"E8", x"20", x"8B", x"E8", x"90", x"F2", x"18", +x"60", x"20", x"17", x"E8", x"A0", x"00", x"B1", x"FE", +x"A0", x"80", x"84", x"F8", x"A2", x"D0", x"CA", x"F0", +x"0D", x"DD", x"30", x"E9", x"D0", x"F8", x"BC", x"00", +x"EA", x"10", x"F3", x"84", x"F8", x"CA", x"BD", x"00", +x"EA", x"30", x"FA", x"85", x"F5", x"BD", x"30", x"E9", +x"85", x"F4", x"98", x"29", x"03", x"AA", x"A0", x"FF", +x"C8", x"B1", x"FE", x"20", x"00", x"E8", x"CA", x"10", +x"F7", x"C8", x"20", x"E4", x"E7", x"C0", x"04", x"D0", +x"F8", x"88", x"A2", x"05", x"A9", x"02", x"46", x"F5", +x"66", x"F4", x"2A", x"CA", x"D0", x"F8", x"20", x"F1", +x"FF", x"88", x"D0", x"EE", x"20", x"DC", x"E7", x"A5", +x"F8", x"0A", x"F0", x"A3", x"10", x"04", x"A9", x"23", +x"D0", x"08", x"29", x"20", x"F0", x"02", x"A9", x"08", +x"09", x"20", x"20", x"F1", x"FF", x"A5", x"F8", x"C9", +x"A1", x"D0", x"1D", x"20", x"8B", x"E8", x"B1", x"FE", +x"A8", x"38", x"65", x"FE", x"48", x"A6", x"FF", x"98", +x"10", x"03", x"B0", x"04", x"CA", x"90", x"01", x"E8", +x"8A", x"20", x"03", x"E8", x"68", x"4C", x"03", x"E8", +x"29", x"03", x"A8", x"B1", x"FE", x"20", x"03", x"E8", +x"20", x"8B", x"E8", x"88", x"88", x"F0", x"F4", x"A2", +x"58", x"A5", x"F8", x"29", x"1C", x"F0", x"22", x"0A", +x"0A", x"0A", x"0A", x"F0", x"0B", x"B0", x"04", x"10", +x"0E", x"30", x"0D", x"10", x"07", x"20", x"68", x"ED", +x"A9", x"29", x"D0", x"0A", x"20", x"60", x"ED", x"E8", +x"A9", x"2C", x"20", x"F1", x"FF", x"8A", x"4C", x"F1", +x"FF", x"18", x"60", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"A5", x"7B", x"85", x"FE", x"A5", x"7C", x"85", x"FF", +x"A9", x"00", x"85", x"F4", x"A9", x"04", x"85", x"F5", +x"20", x"B5", x"E8", x"E6", x"FE", x"E6", x"FF", x"A9", +x"60", x"A2", x"00", x"A0", x"14", x"20", x"B7", x"E7", +x"8D", x"00", x"88", x"CA", x"D0", x"F5", x"A8", x"88", +x"98", x"D0", x"F0", x"A0", x"08", x"20", x"DC", x"ED", +x"A5", x"FE", x"20", x"D8", x"ED", x"A5", x"FF", x"20", +x"D8", x"ED", x"20", x"D7", x"ED", x"20", x"D7", x"ED", +x"B1", x"F4", x"A2", x"07", x"A0", x"07", x"20", x"DC", +x"ED", x"E6", x"F4", x"D0", x"02", x"E6", x"F5", x"C6", +x"FE", x"D0", x"EA", x"C6", x"FF", x"D0", x"E9", x"60", +x"A2", x"07", x"A0", x"09", x"20", x"B7", x"E7", x"6A", +x"B0", x"05", x"8D", x"00", x"88", x"90", x"0D", x"A0", +x"0A", x"20", x"B7", x"E7", x"8D", x"00", x"88", x"A0", +x"09", x"20", x"B7", x"E7", x"A0", x"0A", x"20", x"B7", +x"E7", x"8D", x"00", x"88", x"CA", x"10", x"DB", x"60", +x"E8", x"F0", x"05", x"2C", x"FF", x"87", x"70", x"F8", +x"60", x"E8", x"F0", x"05", x"2C", x"FF", x"87", x"50", +x"F8", x"60", x"A0", x"08", x"20", x"1C", x"EE", x"6A", +x"88", x"D0", x"F9", x"60", x"A2", x"00", x"2C", x"FF", +x"87", x"50", x"08", x"20", x"00", x"EE", x"20", x"09", +x"EE", x"70", x"06", x"20", x"09", x"EE", x"20", x"00", +x"EE", x"E0", x"33", x"60", x"A2", x"00", x"2C", x"FF", +x"87", x"50", x"06", x"20", x"00", x"EE", x"E0", x"19", +x"60", x"20", x"09", x"EE", x"E0", x"19", x"60", x"20", +x"34", x"EE", x"90", x"FB", x"E0", x"33", x"B0", x"F7", +x"A0", x"0A", x"20", x"34", x"EE", x"90", x"F0", x"88", +x"D0", x"F8", x"20", x"34", x"EE", x"B0", x"FB", x"20", +x"34", x"EE", x"B0", x"E3", x"60", x"A0", x"FF", x"A9", +x"03", x"84", x"7B", x"85", x"7C", x"20", x"47", x"EE", +x"20", x"12", x"EE", x"85", x"FE", x"20", x"12", x"EE", +x"85", x"FF", x"20", x"12", x"EE", x"E6", x"7B", x"D0", +x"02", x"E6", x"7C", x"91", x"7B", x"C6", x"FE", x"D0", +x"F1", x"C6", x"FF", x"D0", x"ED", x"60", x"C9", x"10", +x"90", x"07", x"29", x"0F", x"09", x"70", x"85", x"E1", +x"60", x"09", x"60", x"85", x"E1", x"60", x"C9", x"10", +x"B0", x"07", x"29", x"0F", x"09", x"60", x"85", x"E7", +x"60", x"29", x"0F", x"09", x"70", x"85", x"E7", x"60", +x"A2", x"23", x"BD", x"9C", x"E6", x"9D", x"00", x"02", +x"CA", x"10", x"F7", x"A9", x"00", x"8D", x"43", x"02", +x"60", x"2C", x"0E", x"02", x"10", x"03", x"49", x"FF", +x"60", x"24", x"FC", x"30", x"F9", x"60", x"FF", x"FF", +x"20", x"75", x"E8", x"90", x"03", x"20", x"49", x"EF", +x"A0", x"00", x"20", x"F6", x"E7", x"20", x"17", x"E8", +x"A2", x"FF", x"E8", x"E0", x"05", x"B0", x"0E", x"B1", +x"FE", x"20", x"00", x"E8", x"20", x"F3", x"E8", x"20", +x"8B", x"E8", x"90", x"EE", x"E8", x"A5", x"FE", x"48", +x"86", x"FE", x"38", x"E5", x"FE", x"85", x"FE", x"A5", +x"FF", x"48", x"E9", x"00", x"85", x"FF", x"20", x"40", +x"EF", x"E8", x"E0", x"06", x"90", x"F8", x"CA", x"F0", +x"1B", x"B1", x"FE", x"C9", x"20", x"90", x"04", x"C9", +x"80", x"90", x"02", x"A9", x"2E", x"20", x"F1", x"FF", +x"20", x"F3", x"E8", x"20", x"8B", x"E8", x"90", x"E6", +x"68", x"68", x"18", x"60", x"20", x"B0", x"E5", x"C9", +x"71", x"F0", x"F5", x"C9", x"0D", x"F0", x"F5", x"68", +x"85", x"FF", x"68", x"85", x"FE", x"4C", x"DA", x"EE", +x"20", x"DC", x"E7", x"20", x"DC", x"E7", x"4C", x"DC", +x"E7", x"A5", x"FE", x"18", x"69", x"04", x"85", x"F6", +x"A5", x"FF", x"69", x"00", x"85", x"F7", x"60", x"20", +x"7D", x"E8", x"B0", x"FA", x"90", x"58", x"20", x"0C", +x"DB", x"18", x"60", x"20", x"9D", x"F9", x"D0", x"6A", +x"C9", x"01", x"F0", x"0E", x"A8", x"D0", x"53", x"20", +x"85", x"EF", x"D0", x"1E", x"20", x"3D", x"A7", x"4C", +x"C5", x"00", x"20", x"85", x"EF", x"D0", x"13", x"20", +x"B6", x"A4", x"4C", x"C5", x"00", x"AD", x"00", x"A4", +x"C9", x"A9", x"D0", x"05", x"AD", x"02", x"A4", x"C9", +x"8D", x"60", x"A9", x"EF", x"A0", x"9C", x"20", x"3B", +x"E6", x"4C", x"03", x"C0", x"0D", x"0A", x"0A", x"20", +x"43", x"52", x"54", x"20", x"4E", x"4F", x"54", x"20", +x"49", x"4D", x"50", x"4C", x"45", x"4D", x"45", x"4E", +x"54", x"45", x"44", x"0D", x"0A", x"04", x"20", x"F6", +x"E7", x"A5", x"FF", x"A6", x"FE", x"20", x"0C", x"DB", +x"18", x"60", x"C9", x"02", x"D0", x"0C", x"20", x"85", +x"EF", x"D0", x"C7", x"18", x"20", x"B6", x"A4", x"4C", +x"C5", x"00", x"A2", x"02", x"4C", x"59", x"C2", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"4C", x"6D", x"FA", x"4C", x"67", x"F0", x"4C", x"FF", +x"FF", x"4C", x"FF", x"FF", x"4C", x"A0", x"F3", x"4C", +x"87", x"F5", x"4C", x"73", x"F3", x"4C", x"0F", x"F5", +x"4C", x"D2", x"F5", x"4C", x"17", x"F4", x"4C", x"F6", +x"F0", x"4C", x"93", x"F8", x"4C", x"EE", x"FF", x"4C", +x"43", x"F4", x"4C", x"09", x"F3", x"4C", x"A1", x"F0", +x"4C", x"ED", x"F0", x"4C", x"90", x"F8", x"4C", x"B0", +x"F8", x"4C", x"57", x"F9", x"4C", x"82", x"F9", x"4C", +x"72", x"F1", x"4C", x"87", x"F1", x"4C", x"C4", x"F1", +x"4C", x"D6", x"FB", x"4C", x"D9", x"FB", x"4C", x"1F", +x"FC", x"20", x"C5", x"CC", x"20", x"C5", x"00", x"4C", +x"DC", x"D4", x"20", x"54", x"F0", x"86", x"E2", x"20", +x"51", x"F0", x"86", x"E3", x"4C", x"C5", x"00", x"20", +x"54", x"F0", x"86", x"E4", x"20", x"51", x"F0", x"86", +x"E5", x"20", x"8B", x"FE", x"20", x"C5", x"00", x"F0", +x"6D", x"20", x"51", x"F0", x"86", x"E4", x"4C", x"6C", +x"F0", x"20", x"5A", x"F0", x"20", x"69", x"FE", x"4C", +x"C5", x"00", x"20", x"5A", x"F0", x"20", x"51", x"F0", +x"86", x"F8", x"20", x"06", x"FF", x"4C", x"C5", x"00", +x"20", x"54", x"F0", x"8E", x"0A", x"02", x"4C", x"C5", +x"00", x"A9", x"00", x"8D", x"5A", x"02", x"20", x"ED", +x"F0", x"20", x"33", x"E6", x"C9", x"57", x"D0", x"03", +x"4C", x"03", x"C0", x"C9", x"43", x"D0", x"2F", x"A9", +x"14", x"8D", x"4F", x"02", x"A9", x"54", x"8D", x"66", +x"02", x"A9", x"FD", x"8D", x"5F", x"02", x"8D", x"61", +x"02", x"8D", x"63", x"02", x"8D", x"65", x"02", x"A9", +x"8F", x"8D", x"5E", x"02", x"A9", x"9D", x"8D", x"60", +x"02", x"A9", x"A1", x"8D", x"62", x"02", x"A9", x"AB", +x"8D", x"64", x"02", x"4C", x"00", x"C0", x"60", x"A9", +x"20", x"8D", x"40", x"02", x"60", x"20", x"E7", x"F0", +x"A9", x"20", x"8D", x"41", x"02", x"60", x"20", x"00", +x"C9", x"A5", x"81", x"85", x"14", x"A5", x"82", x"85", +x"15", x"20", x"36", x"C4", x"A0", x"02", x"B1", x"A7", +x"AA", x"C8", x"B1", x"A7", x"84", x"91", x"20", x"0C", +x"DB", x"A9", x"20", x"A4", x"91", x"29", x"7F", x"20", +x"51", x"F1", x"C8", x"B1", x"A7", x"D0", x"03", x"4C", +x"00", x"C9", x"10", x"F3", x"C9", x"C6", x"90", x"09", +x"20", x"85", x"F8", x"38", x"E9", x"C5", x"4C", x"37", +x"F1", x"20", x"7A", x"F8", x"38", x"E9", x"7F", x"AA", +x"84", x"91", x"A0", x"FF", x"CA", x"F0", x"07", x"C8", +x"B1", x"FE", x"10", x"FB", x"30", x"F6", x"C8", x"B1", +x"FE", x"30", x"C8", x"20", x"6C", x"C9", x"4C", x"46", +x"F1", x"20", x"6C", x"C9", x"98", x"38", x"65", x"A7", +x"85", x"A7", x"90", x"02", x"E6", x"A8", x"A0", x"FF", +x"84", x"91", x"C5", x"C6", x"D0", x"0B", x"A5", x"A8", +x"C5", x"C7", x"D0", x"05", x"A9", x"BF", x"20", x"6C", +x"C9", x"60", x"A2", x"0A", x"20", x"E3", x"E4", x"20", +x"B0", x"E5", x"90", x"09", x"F0", x"07", x"85", x"FC", +x"88", x"D0", x"EF", x"38", x"60", x"18", x"60", x"A4", +x"E9", x"B1", x"E6", x"60", x"8A", x"48", x"A2", x"00", +x"F0", x"04", x"8A", x"48", x"A2", x"05", x"A0", x"00", +x"B9", x"E6", x"00", x"9D", x"44", x"02", x"E8", x"C8", +x"C0", x"04", x"D0", x"F4", x"A8", x"68", x"AA", x"60", +x"8A", x"48", x"A2", x"00", x"F0", x"04", x"8A", x"48", +x"A2", x"05", x"A0", x"00", x"BD", x"44", x"02", x"99", +x"E6", x"00", x"E8", x"C8", x"C0", x"04", x"D0", x"F4", +x"A8", x"68", x"AA", x"60", x"C9", x"08", x"D0", x"1D", +x"2C", x"43", x"02", x"10", x"25", x"20", x"92", x"F1", +x"20", x"A8", x"F1", x"20", x"C2", x"E4", x"20", x"F2", +x"F1", x"20", x"8C", x"F1", x"20", x"C2", x"E4", x"20", +x"AE", x"F1", x"A9", x"08", x"60", x"C9", x"1F", x"D0", +x"18", x"2C", x"43", x"02", x"10", x"04", x"A9", x"08", +x"D0", x"25", x"A9", x"08", x"20", x"50", x"E7", x"A9", +x"20", x"20", x"50", x"E7", x"A9", x"08", x"4C", x"50", +x"E7", x"C9", x"0A", x"D0", x"18", x"2C", x"43", x"02", +x"30", x"0D", x"48", x"A9", x"FF", x"8D", x"43", x"02", +x"20", x"8C", x"F1", x"20", x"C2", x"E4", x"68", x"20", +x"50", x"E7", x"6C", x"16", x"02", x"C9", x"09", x"F0", +x"E4", x"C9", x"0B", x"F0", x"E0", x"C9", x"0D", x"D0", +x"15", x"2C", x"43", x"02", x"10", x"0D", x"48", x"20", +x"A8", x"F1", x"20", x"C2", x"E4", x"A9", x"00", x"8D", +x"43", x"02", x"68", x"4C", x"50", x"E7", x"C9", x"14", +x"F0", x"23", x"C9", x"20", x"90", x"F5", x"48", x"2C", +x"43", x"02", x"10", x"EE", x"20", x"92", x"F1", x"20", +x"A8", x"F1", x"20", x"C2", x"E4", x"68", x"48", x"20", +x"50", x"E7", x"20", x"8C", x"F1", x"20", x"C2", x"E4", +x"20", x"AE", x"F1", x"68", x"60", x"2C", x"43", x"02", +x"30", x"03", x"6C", x"16", x"02", x"20", x"92", x"F1", +x"20", x"A8", x"F1", x"20", x"C2", x"E4", x"20", x"8D", +x"F2", x"20", x"8C", x"F1", x"20", x"C2", x"E4", x"20", +x"AE", x"F1", x"A9", x"09", x"20", x"50", x"E7", x"AD", +x"48", x"02", x"F0", x"DE", x"60", x"8A", x"48", x"98", +x"48", x"AD", x"49", x"02", x"18", x"6D", x"4C", x"02", +x"69", x"20", x"85", x"F0", x"85", x"FC", x"AD", x"4A", +x"02", x"85", x"F1", x"A2", x"00", x"A9", x"20", x"8D", +x"48", x"02", x"E8", x"A9", x"20", x"8D", x"5D", x"02", +x"BD", x"00", x"02", x"85", x"FE", x"BD", x"04", x"02", +x"85", x"FF", x"A0", x"00", x"84", x"FA", x"A0", x"00", +x"B1", x"F0", x"A4", x"FA", x"D1", x"FE", x"F0", x"1E", +x"EE", x"48", x"02", x"2C", x"48", x"02", x"30", x"32", +x"A5", x"FC", x"85", x"F0", x"A5", x"FE", x"CE", x"5D", +x"02", x"F0", x"CF", x"18", x"69", x"08", x"85", x"FE", +x"90", x"D8", x"E6", x"FF", x"D0", x"D4", x"C8", x"84", +x"FA", x"C0", x"07", x"F0", x"0A", x"A5", x"F0", x"18", +x"69", x"20", x"85", x"F0", x"4C", x"BE", x"F2", x"AD", +x"48", x"02", x"20", x"50", x"E7", x"68", x"A8", x"68", +x"AA", x"60", x"A9", x"00", x"8D", x"48", x"02", x"F0", +x"F4", x"24", x"10", x"30", x"12", x"48", x"C9", x"20", +x"90", x"0C", x"A5", x"11", x"C5", x"12", x"D0", x"04", +x"A9", x"00", x"85", x"11", x"E6", x"11", x"68", x"29", +x"FF", x"60", x"A9", x"20", x"A2", x"09", x"9D", x"50", +x"02", x"CA", x"10", x"FA", x"20", x"C5", x"00", x"D0", +x"03", x"4C", x"92", x"FA", x"20", x"71", x"F6", x"CA", +x"F0", x"0A", x"B1", x"6A", x"99", x"50", x"02", x"C8", +x"C0", x"0A", x"D0", x"F3", x"4C", x"C5", x"00", x"86", +x"FA", x"A2", x"03", x"A9", x"1B", x"9D", x"80", x"02", +x"CA", x"10", x"FA", x"A9", x"42", x"8D", x"84", x"02", +x"A2", x"05", x"BD", x"4B", x"02", x"9D", x"80", x"02", +x"E8", x"E0", x"0F", x"D0", x"F5", x"AD", x"4E", x"02", +x"8D", x"8F", x"02", x"A9", x"10", x"8D", x"4D", x"02", +x"A6", x"FA", x"60", x"8A", x"48", x"AD", x"66", x"02", +x"8D", x"41", x"02", x"20", x"C5", x"00", x"20", x"22", +x"F3", x"BA", x"9D", x"04", x"01", x"A9", x"00", x"8D", +x"4E", x"02", x"20", x"47", x"F3", x"AD", x"41", x"02", +x"C9", x"44", x"D0", x"09", x"38", x"20", x"E1", x"F3", +x"90", x"03", x"4C", x"60", x"FD", x"68", x"AA", x"60", +x"85", x"FC", x"48", x"8A", x"48", x"98", x"48", x"20", +x"40", x"C6", x"A5", x"FC", x"AE", x"4D", x"02", x"9D", +x"80", x"02", x"EE", x"4D", x"02", x"D0", x"11", x"20", +x"D1", x"F3", x"EE", x"4E", x"02", x"AD", x"4E", x"02", +x"8D", x"8F", x"02", x"A9", x"10", x"8D", x"4D", x"02", +x"68", x"A8", x"68", x"AA", x"20", x"C5", x"00", x"68", +x"60", x"AD", x"41", x"02", x"C9", x"44", x"D0", x"0C", +x"20", x"E0", x"F3", x"90", x"F3", x"4C", x"60", x"FD", +x"18", x"6C", x"5E", x"02", x"AD", x"4F", x"02", x"A2", +x"00", x"A0", x"14", x"20", x"B7", x"E7", x"8D", x"00", +x"88", x"CA", x"D0", x"F5", x"A8", x"88", x"98", x"D0", +x"F0", x"A0", x"08", x"20", x"DC", x"ED", x"EA", x"EA", +x"EA", x"20", x"D7", x"ED", x"AE", x"4D", x"02", x"BD", +x"80", x"02", x"A2", x"07", x"A0", x"06", x"20", x"DC", +x"ED", x"EE", x"4D", x"02", x"D0", x"E8", x"60", x"8A", +x"48", x"AE", x"4D", x"02", x"A9", x"20", x"9D", x"80", +x"02", x"E8", x"D0", x"FA", x"8E", x"4D", x"02", x"20", +x"D1", x"F3", x"AD", x"41", x"02", x"C9", x"44", x"D0", +x"0B", x"20", x"39", x"F4", x"90", x"06", x"4C", x"60", +x"FD", x"6C", x"60", x"02", x"20", x"ED", x"F0", x"68", +x"AA", x"18", x"60", x"48", x"AD", x"40", x"02", x"20", +x"D8", x"C6", x"F0", x"04", x"68", x"4C", x"F1", x"FF", +x"68", x"60", x"8A", x"48", x"A2", x"00", x"BD", x"50", +x"02", x"20", x"F1", x"FF", x"E8", x"E0", x"0A", x"D0", +x"F5", x"68", x"AA", x"A9", x"22", x"4C", x"F1", x"FF", +x"8A", x"48", x"AD", x"40", x"02", x"C9", x"44", x"F0", +x"43", x"A2", x"00", x"BD", x"85", x"02", x"20", x"F1", +x"FF", x"E8", x"E0", x"0A", x"D0", x"F5", x"A9", x"22", +x"20", x"F1", x"FF", x"A9", x"20", x"20", x"F1", x"FF", +x"AD", x"84", x"02", x"20", x"F1", x"FF", x"AE", x"8F", +x"02", x"AD", x"40", x"02", x"48", x"20", x"E7", x"F0", +x"A9", x"00", x"20", x"0C", x"DB", x"68", x"8D", x"40", +x"02", x"AD", x"84", x"02", x"C9", x"4F", x"D0", x"0C", +x"AD", x"91", x"02", x"20", x"00", x"E8", x"AD", x"90", +x"02", x"20", x"03", x"E8", x"68", x"AA", x"60", x"A2", +x"05", x"BD", x"4B", x"02", x"C9", x"20", x"F0", x"0A", +x"DD", x"80", x"02", x"D0", x"10", x"E8", x"E0", x"0F", +x"D0", x"EF", x"08", x"AD", x"8F", x"02", x"D0", x"03", +x"28", x"18", x"60", x"28", x"38", x"60", x"AD", x"40", +x"02", x"C9", x"44", x"F0", x"F8", x"B9", x"24", x"F6", +x"F0", x"F3", x"20", x"F1", x"FF", x"C8", x"D0", x"F5", +x"AD", x"40", x"02", x"C9", x"44", x"D0", x"08", x"20", +x"F8", x"F4", x"90", x"03", x"4C", x"60", x"FD", x"60", +x"38", x"6C", x"62", x"02", x"AD", x"40", x"02", x"C9", +x"44", x"D0", x"09", x"18", x"20", x"F9", x"F4", x"90", +x"EE", x"4C", x"60", x"FD", x"4C", x"F1", x"F5", x"AD", +x"66", x"02", x"8D", x"40", x"02", x"8A", x"48", x"98", +x"48", x"20", x"C5", x"00", x"20", x"22", x"F3", x"20", +x"E8", x"F4", x"A9", x"42", x"48", x"A0", x"00", x"AD", +x"40", x"02", x"C9", x"44", x"F0", x"06", x"20", x"D6", +x"F4", x"20", x"52", x"F4", x"20", x"FC", x"F4", x"20", +x"B7", x"F4", x"F0", x"0B", x"A0", x"1C", x"20", x"D6", +x"F4", x"20", x"68", x"F4", x"4C", x"34", x"F5", x"90", +x"1E", x"A0", x"1C", x"20", x"D6", x"F4", x"20", x"68", +x"F4", x"68", x"48", x"CD", x"84", x"02", x"D0", x"DC", +x"A0", x"2A", x"20", x"D6", x"F4", x"20", x"EE", x"FF", +x"C9", x"0D", x"F0", x"D0", x"4C", x"58", x"C6", x"68", +x"48", x"CD", x"84", x"02", x"D0", x"CE", x"68", x"A0", +x"0E", x"20", x"D6", x"F4", x"20", x"68", x"F4", x"A9", +x"10", x"8D", x"4D", x"02", x"A9", x"01", x"8D", x"4E", +x"02", x"68", x"A8", x"68", x"AA", x"18", x"60", x"8A", +x"48", x"98", x"48", x"AE", x"4D", x"02", x"F0", x"10", +x"BD", x"80", x"02", x"EE", x"4D", x"02", x"85", x"FA", +x"68", x"A8", x"68", x"AA", x"A5", x"FA", x"18", x"60", +x"20", x"FC", x"F4", x"A0", x"1C", x"20", x"D6", x"F4", +x"20", x"68", x"F4", x"20", x"B7", x"F4", x"F0", x"0F", +x"A0", x"39", x"20", x"D6", x"F4", x"20", x"DE", x"F5", +x"20", x"ED", x"F0", x"A9", x"1A", x"D0", x"D7", x"AD", +x"8F", x"02", x"CD", x"4E", x"02", x"D0", x"E9", x"EE", +x"4E", x"02", x"A9", x"10", x"8D", x"4D", x"02", x"4C", +x"8B", x"F5", x"20", x"DE", x"F5", x"20", x"ED", x"F0", +x"20", x"00", x"C9", x"4C", x"00", x"C9", x"AD", x"40", +x"02", x"C9", x"44", x"D0", x"08", x"20", x"EE", x"F5", +x"90", x"03", x"4C", x"60", x"FD", x"60", x"6C", x"64", +x"02", x"20", x"40", x"C6", x"A9", x"04", x"8D", x"4D", +x"02", x"A0", x"20", x"20", x"1C", x"EE", x"90", x"F1", +x"88", x"D0", x"F8", x"20", x"47", x"EE", x"A9", x"04", +x"85", x"FA", x"20", x"12", x"EE", x"C9", x"1B", x"D0", +x"E0", x"C6", x"FA", x"D0", x"F5", x"20", x"12", x"EE", +x"AE", x"4D", x"02", x"9D", x"80", x"02", x"EE", x"4D", +x"02", x"D0", x"F2", x"60", x"0D", x"0A", x"53", x"45", +x"41", x"52", x"43", x"48", x"49", x"4E", x"47", x"20", +x"22", x"00", x"0D", x"0A", x"4C", x"4F", x"41", x"44", +x"49", x"4E", x"47", x"20", x"20", x"20", x"22", x"00", +x"0D", x"0A", x"20", x"20", x"20", x"20", x"20", x"20", +x"20", x"20", x"20", x"20", x"22", x"00", x"0D", x"0A", +x"0A", x"52", x"45", x"57", x"49", x"4E", x"44", x"20", +x"54", x"41", x"50", x"45", x"00", x"0D", x"0A", x"0A", +x"4C", x"4F", x"41", x"44", x"49", x"4E", x"47", x"20", +x"45", x"52", x"52", x"4F", x"52", x"0D", x"0A", x"0A", +x"00", x"20", x"7F", x"CB", x"20", x"70", x"CB", x"20", +x"E4", x"D3", x"AA", x"A0", x"00", x"E8", x"60", x"20", +x"71", x"F6", x"CA", x"F0", x"08", x"B1", x"6A", x"99", +x"80", x"02", x"C8", x"D0", x"F5", x"A9", x"00", x"99", +x"80", x"02", x"20", x"C5", x"00", x"20", x"51", x"F0", +x"8E", x"5B", x"02", x"20", x"51", x"F0", x"8A", x"29", +x"03", x"6A", x"6A", x"6A", x"8D", x"5C", x"02", x"A2", +x"00", x"AD", x"0A", x"02", x"48", x"BD", x"80", x"02", +x"F0", x"08", x"20", x"C6", x"F6", x"B0", x"0A", x"E8", +x"D0", x"F3", x"68", x"8D", x"0A", x"02", x"4C", x"C5", +x"00", x"A2", x"08", x"4C", x"59", x"C2", x"29", x"7F", +x"85", x"FC", x"C9", x"20", x"B0", x"02", x"38", x"60", +x"8A", x"48", x"98", x"48", x"A5", x"FC", x"A8", x"2A", +x"2A", x"2A", x"2A", x"29", x"03", x"AA", x"BD", x"00", +x"02", x"D0", x"03", x"BD", x"04", x"02", x"85", x"FF", +x"98", x"0A", x"0A", x"0A", x"85", x"FE", x"A5", x"E2", +x"8D", x"50", x"02", x"A5", x"E3", x"8D", x"51", x"02", +x"A0", x"07", x"AD", x"5B", x"02", x"8D", x"52", x"02", +x"2C", x"5C", x"02", x"50", x"08", x"A5", x"E3", x"8D", +x"53", x"02", x"4C", x"12", x"F7", x"A5", x"E2", x"8D", +x"53", x"02", x"B1", x"FE", x"A2", x"08", x"48", x"6A", +x"90", x"06", x"20", x"75", x"F7", x"4C", x"23", x"F7", +x"20", x"79", x"F7", x"68", x"6A", x"CA", x"D0", x"EE", +x"AD", x"53", x"02", x"2C", x"5C", x"02", x"50", x"10", +x"08", x"85", x"E3", x"28", x"10", x"05", x"E6", x"E2", +x"4C", x"4D", x"F7", x"C6", x"E2", x"4C", x"4D", x"F7", +x"08", x"85", x"E2", x"28", x"10", x"05", x"C6", x"E3", +x"4C", x"4D", x"F7", x"E6", x"E3", x"CE", x"52", x"02", +x"D0", x"C0", x"88", x"10", x"A5", x"AD", x"50", x"02", +x"85", x"E2", x"AD", x"51", x"02", x"85", x"E3", x"AE", +x"5B", x"02", x"F0", x"0B", x"A0", x"08", x"20", x"91", +x"F7", x"88", x"D0", x"FA", x"CA", x"D0", x"F5", x"68", +x"A8", x"68", x"AA", x"18", x"60", x"A9", x"00", x"F0", +x"02", x"A9", x"01", x"8D", x"0A", x"02", x"8A", x"48", +x"AE", x"5B", x"02", x"F0", x"09", x"20", x"69", x"FE", +x"20", x"91", x"F7", x"CA", x"D0", x"F7", x"68", x"AA", +x"60", x"2C", x"5C", x"02", x"30", x"05", x"70", x"0B", +x"E6", x"E2", x"60", x"70", x"03", x"C6", x"E2", x"60", +x"C6", x"E3", x"60", x"E6", x"E3", x"60", x"4D", x"4F", +x"44", x"C5", x"4D", x"4F", x"56", x"C5", x"45", x"58", +x"49", x"D4", x"4C", x"4E", x"CB", x"4C", x"45", x"54", +x"54", x"45", x"D2", x"44", x"4D", x"45", x"CD", x"4C", +x"4D", x"45", x"CD", x"49", x"4E", x"4B", x"45", x"D9", +x"4F", x"50", x"45", x"4E", x"D7", x"57", x"52", x"49", +x"54", x"C5", x"43", x"4C", x"4F", x"53", x"45", x"D7", +x"4F", x"50", x"45", x"4E", x"C7", x"43", x"4C", x"4F", +x"53", x"45", x"C7", x"53", x"4F", x"55", x"4E", x"C4", +x"43", x"4C", x"D3", x"56", x"44", x"D5", x"52", x"41", +x"54", x"C5", x"43", x"55", x"D2", x"54", x"47", x"41", +x"D0", x"53", x"43", x"52", x"45", x"45", x"4E", x"A4", +x"44", x"4F", x"D4", x"43", x"52", x"D4", x"49", x"4E", +x"D6", x"53", x"4D", x"4F", x"56", x"C5", x"43", x"49", +x"D2", x"50", x"4C", x"4F", x"D4", x"50", x"54", x"D2", +x"44", x"4F", x"53", x"C9", x"44", x"4F", x"D3", x"43", +x"4F", x"4D", x"CD", x"41", x"54", x"45", x"4F", x"C6", +x"54", x"41", x"50", x"C5", x"44", x"49", x"53", x"CB", +x"43", x"48", x"41", x"D2", x"00", x"00", x"97", x"F0", +x"59", x"F0", x"FB", x"FD", x"8D", x"F9", x"7E", x"F6", +x"AE", x"F9", x"01", x"FA", x"A7", x"F9", x"4F", x"FA", +x"70", x"FA", x"C5", x"FA", x"DD", x"FA", x"01", x"FB", +x"09", x"FB", x"33", x"FB", x"42", x"FB", x"81", x"FB", +x"A2", x"FB", x"BC", x"FB", x"EA", x"FB", x"02", x"FC", +x"62", x"EF", x"2F", x"FC", x"3F", x"FC", x"89", x"F0", +x"80", x"F0", x"70", x"FB", x"C5", x"FB", x"CD", x"FB", +x"67", x"FD", x"C5", x"FD", x"53", x"FD", x"5B", x"FD", +x"D5", x"FD", x"48", x"A9", x"90", x"85", x"FE", x"A9", +x"C0", x"85", x"FF", x"68", x"60", x"48", x"A9", x"A6", +x"85", x"FE", x"A9", x"F7", x"85", x"FF", x"68", x"60", +x"D0", x"01", x"60", x"E9", x"80", x"B0", x"03", x"4C", +x"05", x"C6", x"C9", x"46", x"B0", x"03", x"4C", x"07", +x"C6", x"E9", x"46", x"0A", x"A8", x"B9", x"37", x"F8", +x"48", x"B9", x"36", x"F8", x"48", x"4C", x"BF", x"00", +x"20", x"7A", x"F8", x"A9", x"00", x"8D", x"5B", x"02", +x"20", x"C5", x"F8", x"20", x"85", x"F8", x"A9", x"80", +x"8D", x"5B", x"02", x"E6", x"C6", x"A6", x"C6", x"A0", +x"04", x"84", x"0C", x"B5", x"00", x"30", x"41", x"C9", +x"20", x"F0", x"3D", x"85", x"07", x"C9", x"22", x"F0", +x"5B", x"24", x"0C", x"70", x"33", x"C9", x"3F", x"D0", +x"04", x"A9", x"97", x"D0", x"2B", x"C9", x"30", x"90", +x"04", x"C9", x"3C", x"90", x"23", x"84", x"B9", x"A0", +x"00", x"84", x"08", x"88", x"86", x"C6", x"CA", x"C8", +x"E8", x"B5", x"00", x"38", x"F1", x"FE", x"F0", x"F7", +x"C9", x"80", x"D0", x"37", x"05", x"08", x"2C", x"5B", +x"02", x"10", x"03", x"18", x"69", x"46", x"A4", x"B9", +x"E8", x"C8", x"99", x"11", x"00", x"B9", x"11", x"00", +x"F0", x"32", x"38", x"E9", x"3A", x"F0", x"04", x"C9", +x"49", x"D0", x"02", x"85", x"0C", x"38", x"E9", x"54", +x"D0", x"A1", x"85", x"07", x"B5", x"00", x"F0", x"E0", +x"C5", x"07", x"F0", x"DC", x"C8", x"99", x"11", x"00", +x"E8", x"D0", x"F1", x"A6", x"C6", x"E6", x"08", x"B1", +x"FE", x"10", x"11", x"C8", x"B1", x"FE", x"D0", x"B1", +x"B5", x"00", x"10", x"C2", x"99", x"13", x"00", x"A9", +x"15", x"85", x"C6", x"60", x"C8", x"D0", x"E8", x"38", +x"E9", x"7F", x"C9", x"47", x"B0", x"03", x"4C", x"41", +x"C5", x"E9", x"46", x"AA", x"84", x"91", x"A0", x"FF", +x"CA", x"F0", x"08", x"C8", x"B9", x"A6", x"F7", x"10", +x"FA", x"30", x"F5", x"C8", x"B9", x"A6", x"F7", x"10", +x"03", x"4C", x"0C", x"C5", x"20", x"6C", x"C9", x"4C", +x"73", x"F9", x"C9", x"60", x"F0", x"07", x"C9", x"80", +x"90", x"02", x"18", x"60", x"38", x"60", x"20", x"9D", +x"F9", x"20", x"97", x"F9", x"4C", x"C5", x"00", x"6C", +x"14", x"00", x"20", x"C5", x"CC", x"20", x"6B", x"CB", +x"20", x"36", x"D5", x"A5", x"14", x"A4", x"15", x"60", +x"A9", x"00", x"85", x"FA", x"4C", x"AD", x"C9", x"48", +x"A9", x"54", x"8D", x"41", x"02", x"68", x"20", x"22", +x"F3", x"20", x"47", x"F3", x"A9", x"4F", x"8D", x"84", +x"02", x"20", x"9A", x"F9", x"85", x"F4", x"8D", x"90", +x"02", x"84", x"F5", x"8C", x"91", x"02", x"20", x"9A", +x"F9", x"85", x"FE", x"8D", x"92", x"02", x"84", x"FF", +x"8C", x"93", x"02", x"A9", x"00", x"8D", x"8F", x"02", +x"A2", x"14", x"A9", x"20", x"9D", x"80", x"02", x"E8", +x"D0", x"FA", x"8E", x"4D", x"02", x"20", x"E4", x"F3", +x"AD", x"4F", x"02", x"E6", x"FE", x"E6", x"FF", x"20", +x"99", x"ED", x"A9", x"20", x"8D", x"41", x"02", x"4C", +x"C5", x"00", x"48", x"A9", x"54", x"8D", x"40", x"02", +x"68", x"20", x"22", x"F3", x"A0", x"4F", x"20", x"49", +x"FA", x"A5", x"7B", x"48", x"A5", x"7C", x"48", x"AD", +x"90", x"02", x"38", x"E9", x"01", x"85", x"7B", x"AD", +x"91", x"02", x"E9", x"00", x"85", x"7C", x"20", x"C5", +x"00", x"F0", x"0D", x"20", x"9A", x"F9", x"38", x"E9", +x"01", x"85", x"7B", x"98", x"E9", x"00", x"85", x"7C", +x"20", x"6D", x"EE", x"A9", x"20", x"8D", x"40", x"02", +x"68", x"85", x"7C", x"68", x"85", x"7B", x"4C", x"C5", +x"00", x"8A", x"48", x"98", x"48", x"4C", x"24", x"F5", +x"20", x"22", x"F3", x"A9", x"00", x"8D", x"4E", x"02", +x"A9", x"80", x"8D", x"5A", x"02", x"20", x"47", x"F3", +x"A9", x"44", x"8D", x"84", x"02", x"A9", x"54", x"8D", +x"41", x"02", x"4C", x"C5", x"00", x"A9", x"00", x"F0", +x"06", x"C9", x"23", x"D0", x"0F", x"A9", x"80", x"A0", +x"00", x"20", x"42", x"B0", x"A2", x"1C", x"20", x"06", +x"B0", x"B0", x"0F", x"60", x"AD", x"41", x"02", x"C9", +x"54", x"D0", x"07", x"2C", x"5A", x"02", x"70", x"02", +x"30", x"08", x"20", x"ED", x"F0", x"A2", x"02", x"4C", +x"59", x"C2", x"20", x"C5", x"00", x"D0", x"03", x"4C", +x"00", x"C9", x"20", x"7F", x"CB", x"24", x"0A", x"30", +x"06", x"20", x"1C", x"DB", x"20", x"C5", x"D1", x"20", +x"4D", x"C9", x"20", x"C5", x"00", x"F0", x"E8", x"C9", +x"2C", x"D0", x"D7", x"20", x"A0", x"F3", x"20", x"BF", +x"00", x"D0", x"DF", x"4C", x"00", x"C9", x"2C", x"5A", +x"02", x"10", x"C7", x"A9", x"1A", x"20", x"A0", x"F3", +x"20", x"A0", x"F3", x"A9", x"00", x"8D", x"5A", x"02", +x"20", x"17", x"F4", x"4C", x"C5", x"00", x"20", x"22", +x"F3", x"A9", x"54", x"8D", x"40", x"02", x"A0", x"44", +x"20", x"49", x"FA", x"A9", x"40", x"8D", x"5A", x"02", +x"4C", x"C5", x"00", x"2C", x"5A", x"02", x"50", x"9A", +x"30", x"98", x"20", x"87", x"F5", x"C9", x"1A", x"F0", +x"01", x"60", x"A9", x"00", x"8D", x"5A", x"02", x"4C", +x"D2", x"F5", x"20", x"54", x"F0", x"8E", x"5B", x"02", +x"20", x"51", x"F0", x"8E", x"5C", x"02", x"AE", x"5B", +x"02", x"A0", x"00", x"F0", x"0B", x"AD", x"00", x"88", +x"88", x"D0", x"05", x"CE", x"5C", x"02", x"F0", x"09", +x"CA", x"D0", x"F5", x"AE", x"5B", x"02", x"4C", x"1D", +x"FB", x"4C", x"C5", x"00", x"A9", x"0C", x"20", x"F1", +x"FF", x"A9", x"00", x"85", x"11", x"20", x"9D", x"E3", +x"4C", x"C5", x"00", x"20", x"C5", x"00", x"F0", x"17", +x"20", x"54", x"F0", x"86", x"EC", x"20", x"51", x"F0", +x"86", x"ED", x"20", x"51", x"F0", x"86", x"EA", x"20", +x"51", x"F0", x"86", x"EB", x"4C", x"C5", x"00", x"20", +x"64", x"FB", x"D0", x"D0", x"A9", x"00", x"85", x"EC", +x"85", x"EA", x"A9", x"1F", x"85", x"ED", x"85", x"EB", +x"60", x"20", x"54", x"F0", x"8A", x"C9", x"02", x"B0", +x"10", x"18", x"6A", x"6A", x"8D", x"10", x"02", x"4C", +x"C5", x"00", x"20", x"54", x"F0", x"E0", x"04", x"90", +x"05", x"A2", x"08", x"4C", x"59", x"C2", x"BD", x"97", +x"FB", x"8D", x"13", x"02", x"4C", x"C5", x"00", x"A7", +x"53", x"2A", x"15", x"00", x"01", x"03", x"07", x"0F", +x"1F", x"3F", x"7F", x"20", x"54", x"F0", x"8A", x"29", +x"1F", x"85", x"11", x"85", x"E9", x"20", x"51", x"F0", +x"8A", x"29", x"1F", x"85", x"E8", x"18", x"69", x"0F", +x"85", x"E7", x"4C", x"3D", x"FB", x"20", x"54", x"F0", +x"8E", x"4F", x"02", x"4C", x"C5", x"00", x"20", x"00", +x"B0", x"90", x"08", x"4C", x"60", x"FD", x"20", x"12", +x"B0", x"B0", x"F8", x"4C", x"C5", x"00", x"4C", x"F6", +x"E7", x"20", x"C5", x"00", x"C9", x"D9", x"F0", x"0B", +x"C9", x"DA", x"F0", x"1F", x"C9", x"DB", x"F0", x"31", +x"4C", x"7F", x"CB", x"20", x"92", x"F1", x"20", x"8D", +x"F2", x"A9", x"01", x"20", x"BB", x"D1", x"A0", x"00", +x"AD", x"48", x"02", x"91", x"AA", x"20", x"08", x"D2", +x"4C", x"BF", x"00", x"20", x"5A", x"FE", x"E8", x"B1", +x"E0", x"2A", x"6A", x"CA", x"D0", x"FC", x"29", x"01", +x"A8", x"A9", x"00", x"20", x"D1", x"D0", x"4C", x"BF", +x"00", x"20", x"9F", x"E7", x"4C", x"11", x"FC", x"20", +x"8C", x"F1", x"20", x"AE", x"F1", x"C6", x"E8", x"20", +x"9D", x"E3", x"20", x"92", x"F1", x"4C", x"A8", x"F1", +x"20", x"54", x"F0", x"8A", x"D0", x"06", x"8D", x"0E", +x"02", x"4C", x"C5", x"00", x"A9", x"FF", x"D0", x"F6", +x"20", x"54", x"F0", x"8A", x"29", x"03", x"18", x"6A", +x"6A", x"6A", x"8D", x"5B", x"02", x"20", x"9A", x"F9", +x"20", x"5A", x"FE", x"18", x"98", x"65", x"E0", x"85", +x"E0", x"8E", x"50", x"02", x"A2", x"00", x"A0", x"00", +x"B1", x"14", x"9D", x"A0", x"02", x"E8", x"C8", x"B1", +x"14", x"9D", x"A0", x"02", x"C8", x"E8", x"A9", x"00", +x"9D", x"A0", x"02", x"E8", x"C0", x"20", x"D0", x"E8", +x"A2", x"00", x"AC", x"50", x"02", x"F0", x"14", x"18", +x"7E", x"A0", x"02", x"7E", x"A1", x"02", x"7E", x"A2", +x"02", x"88", x"D0", x"F3", x"E8", x"E8", x"E8", x"E0", +x"30", x"D0", x"E7", x"A2", x"2F", x"A0", x"08", x"A9", +x"00", x"8D", x"51", x"02", x"18", x"BD", x"A0", x"02", +x"6A", x"2E", x"51", x"02", x"88", x"D0", x"F9", x"AD", +x"51", x"02", x"9D", x"A0", x"02", x"CA", x"10", x"E5", +x"AE", x"50", x"02", x"AD", x"5B", x"02", x"C9", x"40", +x"F0", x"04", x"C9", x"80", x"D0", x"5B", x"BD", x"9B", +x"FB", x"8D", x"51", x"02", x"49", x"FF", x"8D", x"52", +x"02", x"A2", x"00", x"A0", x"00", x"B1", x"E0", x"2D", +x"51", x"02", x"1D", x"A0", x"02", x"2C", x"5B", x"02", +x"10", x"02", x"31", x"E0", x"91", x"E0", x"C8", x"BD", +x"A1", x"02", x"2C", x"5B", x"02", x"10", x"05", x"B1", +x"E0", x"3D", x"A1", x"02", x"91", x"E0", x"C8", x"B1", +x"E0", x"2D", x"52", x"02", x"1D", x"A2", x"02", x"2C", +x"5B", x"02", x"10", x"02", x"31", x"E0", x"91", x"E0", +x"20", x"08", x"FD", x"D0", x"C6", x"4C", x"C5", x"00", +x"18", x"A5", x"E0", x"69", x"20", x"85", x"E0", x"90", +x"02", x"E6", x"E1", x"E8", x"E8", x"E8", x"E0", x"30", +x"60", x"A2", x"00", x"A0", x"00", x"B1", x"E0", x"2C", +x"5B", x"02", x"50", x"05", x"1D", x"A0", x"02", x"70", +x"03", x"5D", x"A0", x"02", x"91", x"E0", x"C8", x"B1", +x"E0", x"50", x"05", x"1D", x"A1", x"02", x"70", x"03", +x"5D", x"A1", x"02", x"91", x"E0", x"C8", x"B1", x"E0", +x"50", x"05", x"1D", x"A2", x"02", x"70", x"03", x"5D", +x"A2", x"02", x"91", x"E0", x"20", x"08", x"FD", x"D0", +x"CA", x"4C", x"C5", x"00", x"A9", x"54", x"8D", x"66", +x"02", x"4C", x"C5", x"00", x"A9", x"44", x"D0", x"F6", +x"A9", x"FF", x"8D", x"00", x"5F", x"4C", x"92", x"FA", +x"20", x"71", x"F6", x"CA", x"F0", x"0A", x"B1", x"6A", +x"99", x"22", x"5F", x"C8", x"C0", x"50", x"D0", x"F3", +x"A9", x"00", x"99", x"22", x"5F", x"A2", x"0A", x"20", +x"06", x"B0", x"B0", x"DC", x"CE", x"21", x"5F", x"20", +x"48", x"B0", x"B0", x"D4", x"4C", x"C5", x"00", x"90", +x"08", x"A2", x"16", x"20", x"06", x"B0", x"B0", x"C8", +x"60", x"A2", x"17", x"D0", x"F6", x"A2", x"19", x"D0", +x"F2", x"90", x"04", x"A2", x"1A", x"D0", x"EC", x"A2", +x"1B", x"D0", x"E8", x"AD", x"5C", x"5E", x"AC", x"5D", +x"5E", x"20", x"42", x"B0", x"20", x"0C", x"B0", x"B0", +x"A7", x"A9", x"00", x"8D", x"5C", x"5E", x"8D", x"5D", +x"5E", x"20", x"ED", x"F0", x"18", x"60", x"20", x"DA", +x"C7", x"AD", x"1A", x"5F", x"29", x"01", x"D0", x"03", +x"4C", x"C5", x"00", x"4C", x"17", x"C7", x"20", x"54", +x"F0", x"E0", x"03", x"90", x"03", x"4C", x"C1", x"F6", +x"8A", x"48", x"20", x"51", x"F0", x"68", x"A8", x"E0", +x"00", x"F0", x"0B", x"E0", x"04", x"90", x"EE", x"8A", +x"99", x"05", x"02", x"4C", x"C5", x"00", x"18", x"98", +x"69", x"E0", x"D0", x"F4", x"A2", x"FF", x"9A", x"20", +x"64", x"FB", x"4C", x"A3", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", x"FF", +x"FF", x"FF", x"FF", x"A5", x"E3", x"49", x"FF", x"AA", +x"4A", x"4A", x"4A", x"20", x"8E", x"EE", x"EA", x"8A", +x"0A", x"0A", x"0A", x"0A", x"0A", x"85", x"E0", x"60", +x"FF", x"FF", x"FF", x"A5", x"E2", x"4A", x"4A", x"4A", +x"A8", x"60", x"01", x"02", x"04", x"08", x"10", x"20", +x"40", x"80", x"20", x"33", x"FE", x"20", x"4B", x"FE", +x"A5", x"E2", x"29", x"07", x"AA", x"BD", x"52", x"FE", +x"60", x"8A", x"48", x"98", x"48", x"20", x"5A", x"FE", +x"18", x"AE", x"0A", x"02", x"30", x"06", x"D0", x"08", +x"11", x"E0", x"90", x"08", x"51", x"E0", x"90", x"04", +x"49", x"FF", x"31", x"E0", x"91", x"E0", x"68", x"A8", +x"68", x"AA", x"60", x"8A", x"48", x"98", x"48", x"A2", +x"01", x"A5", x"E4", x"38", x"E5", x"E2", x"B0", x"06", +x"A2", x"FF", x"49", x"FF", x"69", x"01", x"85", x"F4", +x"85", x"F8", x"4A", x"69", x"00", x"85", x"F7", x"A0", +x"01", x"A5", x"E5", x"38", x"E5", x"E3", x"B0", x"06", +x"A0", x"FF", x"49", x"FF", x"69", x"01", x"85", x"F6", +x"C5", x"F4", x"B0", x"02", x"85", x"F8", x"4A", x"69", +x"00", x"85", x"F5", x"18", x"90", x"2C", x"A5", x"F5", +x"38", x"E5", x"F8", x"85", x"F5", x"90", x"03", x"D0", +x"0B", x"18", x"65", x"F6", x"85", x"F5", x"8A", x"18", +x"65", x"E2", x"85", x"E2", x"A5", x"F7", x"38", x"E5", +x"F8", x"85", x"F7", x"90", x"03", x"D0", x"0B", x"18", +x"65", x"F4", x"85", x"F7", x"98", x"18", x"65", x"E3", +x"85", x"E3", x"20", x"69", x"FE", x"A5", x"E2", x"C5", +x"E4", x"D0", x"CB", x"A5", x"E3", x"C5", x"E5", x"D0", +x"C5", x"68", x"A8", x"68", x"AA", x"60", x"8A", x"48", +x"98", x"48", x"A5", x"E2", x"85", x"E4", x"A5", x"E3", +x"85", x"E5", x"A9", x"00", x"85", x"F6", x"85", x"F7", +x"A9", x"7F", x"85", x"F4", x"A5", x"F8", x"85", x"F5", +x"A2", x"04", x"A0", x"24", x"A5", x"F7", x"0A", x"90", +x"03", x"E6", x"F5", x"18", x"E5", x"F4", x"49", x"FF", +x"85", x"F4", x"90", x"02", x"C6", x"F5", x"A5", x"F5", +x"0A", x"90", x"03", x"C6", x"F7", x"18", x"65", x"F6", +x"85", x"F6", x"90", x"02", x"E6", x"F7", x"A5", x"F5", +x"18", x"65", x"E4", x"85", x"E2", x"EA", x"EA", x"EA", +x"EA", x"A5", x"F7", x"18", x"65", x"E5", x"EA", x"EA", +x"EA", x"EA", x"85", x"E3", x"20", x"69", x"FE", x"88", +x"D0", x"C2", x"CA", x"D0", x"BF", x"A5", x"E4", x"85", +x"E2", x"A5", x"E5", x"85", x"E3", x"68", x"A8", x"68", +x"AA", x"60", x"48", x"8A", x"48", x"98", x"48", x"D8", +x"BA", x"BD", x"04", x"01", x"29", x"10", x"D0", x"06", +x"6C", x"1E", x"02", x"6C", x"20", x"02", x"6C", x"22", +x"02", x"78", x"D8", x"A2", x"FF", x"9A", x"A2", x"0F", +x"BD", x"8C", x"E6", x"95", x"E0", x"CA", x"10", x"F8", +x"20", x"B0", x"EE", x"A9", x"0C", x"20", x"F1", x"FF", +x"EA", x"EA", x"EA", x"A0", x"84", x"A9", x"E6", x"20", +x"3B", x"E6", x"20", x"57", x"E6", x"A2", x"00", x"20", +x"33", x"E6", x"E8", x"C9", x"0D", x"F0", x"EC", x"A0", +x"FF", x"C8", x"B9", x"00", x"E7", x"C9", x"FF", x"F0", +x"17", x"DD", x"7F", x"02", x"D0", x"F3", x"98", x"0A", +x"A8", x"B9", x"C8", x"E6", x"85", x"F6", x"B9", x"C9", +x"E6", x"85", x"F7", x"20", x"0B", x"E9", x"90", x"CB", +x"20", x"F4", x"E4", x"20", x"F6", x"E7", x"A9", x"3F", +x"20", x"F1", x"FF", x"38", x"B0", x"BD", x"FF", x"FF", +x"6C", x"FE", x"00", x"6C", x"14", x"02", x"6C", x"16", +x"02", x"6C", x"18", x"02", x"6C", x"1A", x"02", x"6C", +x"1C", x"02", x"83", x"FF", x"89", x"FF", x"72", x"FF" + ); +begin + process(clk) + begin + if rising_edge(clk) then + data <= romData(conv_integer(addr)); + end if; + end process; +end architecture; + diff --git a/ORAO_MiST/rtl/scandoubler.v b/ORAO_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/ORAO_MiST/rtl/scandoubler.v @@ -0,0 +1,194 @@ +// +// scandoubler.v +// +// Copyright (c) 2015 Till Harbaum +// Copyright (c) 2017 Sorgelig +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// TODO: Delay vsync one line + +module scandoubler #(parameter LENGTH, parameter HALF_DEPTH) +( + // system interface + input clk_sys, + input ce_pix, + input ce_pix_actual, + + input hq2x, + + // shifter video interface + input hs_in, + input vs_in, + input line_start, + + input [DWIDTH:0] r_in, + input [DWIDTH:0] g_in, + input [DWIDTH:0] b_in, + input mono, + + // output interface + output reg hs_out, + output vs_out, + output [DWIDTH:0] r_out, + output [DWIDTH:0] g_out, + output [DWIDTH:0] b_out +); + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +assign vs_out = vs_in; + +reg [2:0] phase; +reg [2:0] ce_div; +reg [7:0] pix_len = 0; +wire [7:0] pl = pix_len + 1'b1; + +reg ce_x1, ce_x4; +reg req_line_reset; +wire ls_in = hs_in | line_start; +always @(negedge clk_sys) begin + reg old_ce; + reg [2:0] ce_cnt; + + reg [7:0] pixsz2, pixsz4 = 0; + + old_ce <= ce_pix; + if(~&pix_len) pix_len <= pix_len + 1'd1; + + ce_x4 <= 0; + ce_x1 <= 0; + + // use such odd comparison to place c_x4 evenly if master clock isn't multiple 4. + if((pl == pixsz4) || (pl == pixsz2) || (pl == (pixsz2+pixsz4))) begin + phase <= phase + 1'd1; + ce_x4 <= 1; + end + + if(~old_ce & ce_pix) begin + pixsz2 <= {1'b0, pl[7:1]}; + pixsz4 <= {2'b00, pl[7:2]}; + ce_x1 <= 1; + ce_x4 <= 1; + pix_len <= 0; + phase <= phase + 1'd1; + + ce_cnt <= ce_cnt + 1'd1; + if(ce_pix_actual) begin + phase <= 0; + ce_div <= ce_cnt + 1'd1; + ce_cnt <= 0; + req_line_reset <= 0; + end + + if(ls_in) req_line_reset <= 1; + end +end + +reg ce_sd; +always @(*) begin + case(ce_div) + 2: ce_sd = !phase[0]; + 4: ce_sd = !phase[1:0]; + default: ce_sd <= 1; + endcase +end + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +Hq2x #(.LENGTH(LENGTH), .HALF_DEPTH(HALF_DEPTH)) Hq2x +( + .clk(clk_sys), + .ce_x4(ce_x4 & ce_sd), + .inputpixel({b_in,g_in,r_in}), + .mono(mono), + .disable_hq2x(~hq2x), + .reset_frame(vs_in), + .reset_line(req_line_reset), + .read_y(sd_line), + .read_x(sd_h_actual), + .outpixel({b_out,g_out,r_out}) +); + +reg [10:0] sd_h_actual; +always @(*) begin + case(ce_div) + 2: sd_h_actual = sd_h[10:1]; + 4: sd_h_actual = sd_h[10:2]; + default: sd_h_actual = sd_h; + endcase +end + +reg [10:0] sd_h; +reg [1:0] sd_line; +always @(posedge clk_sys) begin + + reg [11:0] hs_max,hs_rise,hs_ls; + reg [10:0] hcnt; + reg [11:0] sd_hcnt; + + reg hs, hs2, vs, ls; + + if(ce_x1) begin + hs <= hs_in; + ls <= ls_in; + + if(ls && !ls_in) hs_ls <= {hcnt,1'b1}; + + // falling edge of hsync indicates start of line + if(hs && !hs_in) begin + hs_max <= {hcnt,1'b1}; + hcnt <= 0; + if(ls && !ls_in) hs_ls <= {10'd0,1'b1}; + end else begin + hcnt <= hcnt + 1'd1; + end + + // save position of rising edge + if(!hs && hs_in) hs_rise <= {hcnt,1'b1}; + + vs <= vs_in; + if(vs && ~vs_in) sd_line <= 0; + end + + if(ce_x4) begin + hs2 <= hs_in; + + // output counter synchronous to input and at twice the rate + sd_hcnt <= sd_hcnt + 1'd1; + sd_h <= sd_h + 1'd1; + if(hs2 && !hs_in) sd_hcnt <= hs_max; + if(sd_hcnt == hs_max) sd_hcnt <= 0; + + // replicate horizontal sync at twice the speed + if(sd_hcnt == hs_max) hs_out <= 0; + if(sd_hcnt == hs_rise) hs_out <= 1; + + if(sd_hcnt == hs_ls) sd_h <= 0; + if(sd_hcnt == hs_ls) sd_line <= sd_line + 1'd1; + end +end + +endmodule diff --git a/ORAO_MiST/rtl/video_mixer.sv b/ORAO_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/ORAO_MiST/rtl/video_mixer.sv @@ -0,0 +1,242 @@ +// +// +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +// +// LINE_LENGTH: Length of display line in pixels +// Usually it's length from HSync to HSync. +// May be less if line_start is used. +// +// HALF_DEPTH: If =1 then color dept is 3 bits per component +// For half depth 6 bits monochrome is available with +// mono signal enabled and color = {G, R} + +module video_mixer +#( + parameter LINE_LENGTH = 768, + parameter HALF_DEPTH = 0, + + parameter OSD_COLOR = 3'd4, + parameter OSD_X_OFFSET = 10'd0, + parameter OSD_Y_OFFSET = 10'd0 +) +( + // master clock + // it should be multiple by (ce_pix*4). + input clk_sys, + + // Pixel clock or clock_enable (both are accepted). + input ce_pix, + + // Some systems have multiple resolutions. + // ce_pix_actual should match ce_pix where every second or fourth pulse is enabled, + // thus half or qurter resolutions can be used without brake video sync while switching resolutions. + // For fixed single resolution (or when video sync stability isn't required) ce_pix_actual = ce_pix. + input ce_pix_actual, + + // OSD SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // scanlines (00-none 01-25% 10-50% 11-75%) + input [1:0] scanlines, + + // 0 = HVSync 31KHz, 1 = CSync 15KHz + input scandoubler_disable, + + // High quality 2x scaling + input hq2x, + + // YPbPr always uses composite sync + input ypbpr, + + // 0 = 16-240 range. 1 = 0-255 range. (only for YPbPr color space) + input ypbpr_full, + + // color + input [DWIDTH:0] R, + input [DWIDTH:0] G, + input [DWIDTH:0] B, + + // Monochrome mode (for HALF_DEPTH only) + input mono, + + // interlace sync. Positive pulses. + input HSync, + input VSync, + + // Falling of this signal means start of informative part of line. + // It can be horizontal blank signal. + // This signal can be used to reduce amount of required FPGA RAM for HQ2x scan doubler + // If FPGA RAM is not an issue, then simply set it to 0 for whole line processing. + // Keep in mind: due to algo first and last pixels of line should be black to avoid side artefacts. + // Thus, if blank signal is used to reduce the line, make sure to feed at least one black (or paper) pixel + // before first informative pixel. + input line_start, + + // MiST video output signals + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_VS, + output VGA_HS +); + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +wire [DWIDTH:0] R_sd; +wire [DWIDTH:0] G_sd; +wire [DWIDTH:0] B_sd; +wire hs_sd, vs_sd; + +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(R), + .g_in(G), + .b_in(B), + + .hs_out(hs_sd), + .vs_out(vs_sd), + .r_out(R_sd), + .g_out(G_sd), + .b_out(B_sd) +); + +wire [DWIDTH:0] rt = (scandoubler_disable ? R : R_sd); +wire [DWIDTH:0] gt = (scandoubler_disable ? G : G_sd); +wire [DWIDTH:0] bt = (scandoubler_disable ? B : B_sd); + +generate + if(HALF_DEPTH) begin + wire [5:0] r = mono ? {gt,rt} : {rt,rt}; + wire [5:0] g = mono ? {gt,rt} : {gt,gt}; + wire [5:0] b = mono ? {gt,rt} : {bt,bt}; + end else begin + wire [5:0] r = rt; + wire [5:0] g = gt; + wire [5:0] b = bt; + end +endgenerate + +wire hs = (scandoubler_disable ? HSync : hs_sd); +wire vs = (scandoubler_disable ? VSync : vs_sd); + +reg scanline = 0; +always @(posedge clk_sys) begin + reg old_hs, old_vs; + + old_hs <= hs; + old_vs <= vs; + + if(old_hs && ~hs) scanline <= ~scanline; + if(old_vs && ~vs) scanline <= 0; +end + +wire [5:0] r_out, g_out, b_out; +always @(*) begin + case(scanlines & {scanline, scanline}) + 1: begin // reduce 25% = 1/2 + 1/4 + r_out = {1'b0, r[5:1]} + {2'b00, r[5:2]}; + g_out = {1'b0, g[5:1]} + {2'b00, g[5:2]}; + b_out = {1'b0, b[5:1]} + {2'b00, b[5:2]}; + end + + 2: begin // reduce 50% = 1/2 + r_out = {1'b0, r[5:1]}; + g_out = {1'b0, g[5:1]}; + b_out = {1'b0, b[5:1]}; + end + + 3: begin // reduce 75% = 1/4 + r_out = {2'b00, r[5:2]}; + g_out = {2'b00, g[5:2]}; + b_out = {2'b00, b[5:2]}; + end + + default: begin + r_out = r; + g_out = g; + b_out = b; + end + endcase +end + +wire [5:0] red, green, blue; +osd #(OSD_X_OFFSET, OSD_Y_OFFSET, OSD_COLOR) osd +( + .*, + + .R_in(r_out), + .G_in(g_out), + .B_in(b_out), + .HSync(hs), + .VSync(vs), + + .R_out(red), + .G_out(green), + .B_out(blue) +); + +wire [5:0] yuv_full[225] = '{ + 6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1, + 6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4, + 6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6, + 6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8, + 6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11, + 6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13, + 6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15, + 6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17, + 6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20, + 6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22, + 6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24, + 6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27, + 6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29, + 6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31, + 6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33, + 6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36, + 6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38, + 6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40, + 6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42, + 6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45, + 6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47, + 6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49, + 6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52, + 6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54, + 6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56, + 6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58, + 6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61, + 6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63, + 6'd63 +}; + +// http://marsee101.blog19.fc2.com/blog-entry-2311.html +// Y = 16 + 0.257*R + 0.504*G + 0.098*B (Y = 0.299*R + 0.587*G + 0.114*B) +// Pb = 128 - 0.148*R - 0.291*G + 0.439*B (Pb = -0.169*R - 0.331*G + 0.500*B) +// Pr = 128 + 0.439*R - 0.368*G - 0.071*B (Pr = 0.500*R - 0.419*G - 0.081*B) + +wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0}); +wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0}); +wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0}); + +wire [7:0] y = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8]; +wire [7:0] pb = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8]; +wire [7:0] pr = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8]; + +assign VGA_R = ypbpr ? (ypbpr_full ? yuv_full[pr-8'd16] : pr[7:2]) : red; +assign VGA_G = ypbpr ? (ypbpr_full ? yuv_full[y -8'd16] : y[7:2]) : green; +assign VGA_B = ypbpr ? (ypbpr_full ? yuv_full[pb-8'd16] : pb[7:2]) : blue; +assign VGA_VS = (scandoubler_disable | ypbpr) ? 1'b1 : ~vs_sd; +assign VGA_HS = scandoubler_disable ? ~(HSync ^ VSync) : ypbpr ? ~(hs_sd ^ vs_sd) : ~hs_sd; + +endmodule diff --git a/ORAO_MiST/snapshot/Orao_MiST.rbf b/ORAO_MiST/snapshot/Orao_MiST.rbf new file mode 100644 index 00000000..d1ecd465 Binary files /dev/null and b/ORAO_MiST/snapshot/Orao_MiST.rbf differ